From 68c9349093a037681546b07d28c00ba34c3e8530 Mon Sep 17 00:00:00 2001 From: cmhu <2657262686@qq.com> Date: Mon, 6 Nov 2023 19:48:32 +0800 Subject: [PATCH] 优化代码,修正跟踪逻辑 --- vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp | 53 ++++++++++++++++++----------------------------------- vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.cpp | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------- vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.h | 7 +++++-- vehicle_structure_platform.git0708-3080-trt-face/src/VPT/common.h | 2 +- 4 files changed, 91 insertions(+), 112 deletions(-) diff --git a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp index 5c47c95..9a03dc0 100644 --- a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp +++ b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp @@ -781,10 +781,6 @@ void CMutliSourceVideoProcess::algorthim_process() cudaDeviceSynchronize(); - - vector> deleteObjectID; - set::iterator iter = TaskinPlayID.begin(); - int cur_batch_size = 0; cur_batch_size = section_batch_size; @@ -805,41 +801,28 @@ void CMutliSourceVideoProcess::algorthim_process() long long start_time_vpt = get_cur_time_ms(); - sy_img batch_img[TaskinPlayID.size()]; - vector> unUsedResult; + set::iterator iter = TaskinPlayID.begin(); + + int task_in_play_size = TaskinPlayID.size(); + vector> deleteObjectID(task_in_play_size); + vector batch_img(task_in_play_size); + vector> unUsedResult(task_in_play_size); + vector VPTResult(task_in_play_size); vector vec_frameIndex; - vector VPTResult(TaskinPlayID.size()); - unUsedResult.resize(TaskinPlayID.size()); - int cycleTimes = curPlayTaskCount / cur_batch_size + (curPlayTaskCount % cur_batch_size == 0 ? 0 : 1); - for (int c = 0; c < cycleTimes; c++) - { - int batchsize = c == cycleTimes - 1 ? (curPlayTaskCount - cur_batch_size*c) : cur_batch_size; - int startbatch = c*cur_batch_size; - vec_frameIndex.clear(); - for (int i = 0; i < batchsize; i++) - { - DxGPUFrame task_algorithm_data = tasks[*iter].task_algorithm_data; - int w = task_algorithm_data.width; - int h = task_algorithm_data.height; - int npitch = task_algorithm_data.size; - - batch_img[i].set_data(w, h, 3, (unsigned char *)task_algorithm_data.frame); - vec_frameIndex.push_back(task_algorithm_data.timestamp); - iter++; - } + for (size_t i = 0; i < TaskinPlayID.size(); i++) { + DxGPUFrame task_algorithm_data = tasks[*iter].task_algorithm_data; + int w = task_algorithm_data.width; + int h = task_algorithm_data.height; + int npitch = task_algorithm_data.size; - vector> tempDeleteObjectID; - tempDeleteObjectID.resize(batchsize); - int flag = m_vptProcess.process(batch_img, startbatch, batchsize, vec_frameIndex, VPTResult, tempDeleteObjectID, unUsedResult); - process_times++ ; - - for (auto iter : tempDeleteObjectID) - { - deleteObjectID.push_back(iter); - } - vector>().swap(tempDeleteObjectID); + batch_img[i].set_data(w, h, 3, (unsigned char *)task_algorithm_data.frame); + vec_frameIndex.push_back(task_algorithm_data.timestamp); + + iter++; } + + int flag = m_vptProcess.process(batch_img.data(), batch_img.size(), vec_frameIndex, VPTResult, deleteObjectID, unUsedResult); #ifdef LOG_INFO2 std::cout << "VPT_Process_GPU time_using: " << get_cur_time_ms() - start_time_vpt << std::endl; diff --git a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.cpp b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.cpp index 9d93315..0b1e50d 100644 --- a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.cpp +++ b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.cpp @@ -195,62 +195,65 @@ void VPTProcess::check_VPT_Result(VPT_Result & vResult) { vResult.objCount = index; } -int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vector vec_frameIndex, vector& result, vector>& deleteObjectID, vector>& unUsedResult) +int VPTProcess::process(sy_img * batch_img, int batchsize, vector vec_frameIndex, vector& result, vector>& deleteObjectID, vector>& unUsedResult) { if(nullptr == det_handle){ return FAILED; } - bool isUseDet = true; - int channels = 3; - long long t1 = get_cur_time_ms(); - ctools_result *detresult; - int res_status = ctools_process(det_handle, batch_img, batchsize, &detresult); - -#ifdef LOG_INFO2 - long long t2 = get_cur_time_ms(); - cout << "ctools_process time_using = "<< t2 - t1 << endl; -#endif - - vector >> detectResult(batchsize); //sort - - for (int b = 0; b < batchsize; b++) - { - ctools_result &cur_result = detresult[b]; + vector >> detectResult(batchsize); + int real_index = 0; - for (int c = 0; c < cur_result.obj_count_ && c < MAX_OBJ_COUNT; c++) - { - float x1 = cur_result.obj_results_[c].data_[2]; - float y1 = cur_result.obj_results_[c].data_[3]; - float x2 = cur_result.obj_results_[c].data_[4]; - float y2 = cur_result.obj_results_[c].data_[5]; + int cycle_time = batchsize / m_max_batch_size; + cycle_time = (batchsize % m_max_batch_size) == 0 ? cycle_time : (cycle_time + 1) ; + vector vec_img; + for (int i = 0; i < cycle_time; i++) { + vec_img.clear(); - float class_id = cur_result.obj_results_[c].data_[0]; - float score = cur_result.obj_results_[c].data_[1]; + int start_index = i * m_max_batch_size; + int end_index = start_index + m_max_batch_size; + if(end_index >= batchsize) { + end_index = batchsize; + } + for (int j = start_index; j < end_index; j++) { + vec_img.push_back(batch_img[j]); + } + + ctools_result *detresult; + int res_status = ctools_process(det_handle, vec_img.data(), vec_img.size(), &detresult); - int imgid = b; - if (score >= THRESHOLD) + for (size_t b = 0; b < vec_img.size(); b++) { + ctools_result &cur_result = detresult[b]; + for (int c = 0; c < cur_result.obj_count_ && c < MAX_OBJ_COUNT; c++) { - vector obj; - - obj.push_back(x1); - obj.push_back(y1); - obj.push_back(x2); - obj.push_back(y2); - obj.push_back(score); - obj.push_back(class_id); - detectResult[imgid].push_back(obj); + float x1 = cur_result.obj_results_[c].data_[2]; + float y1 = cur_result.obj_results_[c].data_[3]; + float x2 = cur_result.obj_results_[c].data_[4]; + float y2 = cur_result.obj_results_[c].data_[5]; + + float class_id = cur_result.obj_results_[c].data_[0]; + float score = cur_result.obj_results_[c].data_[1]; + + if (score >= THRESHOLD) + { + vector obj; + + obj.push_back(x1); + obj.push_back(y1); + obj.push_back(x2); + obj.push_back(y2); + obj.push_back(score); + obj.push_back(class_id); + detectResult[real_index].push_back(obj); + } } + real_index++; } } - - int resIndex = startBatch; - int detectIndex = 0; - - for (int i = startBatch; i < taskTrackers.size(); i++) - { + + for (int i = 0; i < batchsize; i++){ TaskTracker task_tracker = taskTrackers[i]; if (!task_tracker.tracker.GetState()) { continue; @@ -258,19 +261,23 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto if (task_tracker.lastFrameIndex <= 0) { // 第一帧,只做带检测框的跟踪 - int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[detectIndex], result[resIndex].obj, deleteObjectID[detectIndex]); - result[resIndex].objCount = objCount; - vector>().swap(detectResult[detectIndex]); - detectResult[detectIndex].clear(); + int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[i], result[i].obj, deleteObjectID[i]); + result[i].objCount = objCount; - task_tracker.lastFrameIndex = vec_frameIndex[detectIndex]; + check_VPT_Result(result[i]); + + task_tracker.lastFrameIndex = vec_frameIndex[i]; + task_tracker.lastDetectResult = detectResult[i]; + task_tracker.lastUnUsedResult.objCount = result[i].objCount; + memcpy(task_tracker.lastUnUsedResult.obj, result[i].obj, sizeof(VPT_ObjInfo) * MAX_OBJ_COUNT); + task_tracker.lastDeleteObjectID = deleteObjectID[i]; continue; } - int update_times = vec_frameIndex[detectIndex] - task_tracker.lastFrameIndex - 1; + int update_times = vec_frameIndex[i] - task_tracker.lastFrameIndex - 1; if (update_times < 0) { - cout << "FrameIndex error !! lastFrameIndex= "<< task_tracker.lastFrameIndex <<" cur_frameindex = " << vec_frameIndex[detectIndex] << endl; + cout << "FrameIndex error !! lastFrameIndex= "<< task_tracker.lastFrameIndex <<" cur_frameindex = " << vec_frameIndex[i] << endl; } // cout << "lastFrameIndex= " << task_tracker.lastFrameIndex << " cur_frameindex = " << vec_frameIndex[detectIndex] << endl; // cout << "update_times = " << update_times << endl; @@ -278,38 +285,24 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto for (int j = 0; j < update_times; j++) { // 无检测框跟踪 //cout << "taskTrackers size: " << task_tracker.size() << " batchsize:" << detectResult.size() << " update_times: "<< update_times << endl; - VPT_Result unresult; - VPT_ObjInfo obj[MAX_OBJ_COUNT]; - unresult.objCount =task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, false, detectResult[detectIndex], unresult.obj, deleteObjectID[detectIndex]); - check_VPT_Result(unresult); - unUsedResult[resIndex].push_back(unresult); + task_tracker.lastUnUsedResult.objCount =task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, false, task_tracker.lastDetectResult, task_tracker.lastUnUsedResult.obj, task_tracker.lastDeleteObjectID); } //有检测框输入的跟踪 - int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[detectIndex], result[resIndex].obj, deleteObjectID[detectIndex]); - result[resIndex].objCount = objCount; - vector>().swap(detectResult[detectIndex]); - detectResult[detectIndex].clear(); + int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[i], result[i].obj, deleteObjectID[i]); + result[i].objCount = objCount; - // 记录帧序号 - task_tracker.lastFrameIndex = vec_frameIndex[detectIndex]; + check_VPT_Result(result[i]); - check_VPT_Result(result[resIndex]); + task_tracker.lastDetectResult = detectResult[i]; + task_tracker.lastUnUsedResult.objCount = result[i].objCount; + memcpy(task_tracker.lastUnUsedResult.obj, result[i].obj, sizeof(VPT_ObjInfo) * MAX_OBJ_COUNT); + task_tracker.lastDeleteObjectID = deleteObjectID[i]; - resIndex++; - detectIndex++; - if (resIndex == startBatch + batchsize) - break; + // 记录帧序号 + task_tracker.lastFrameIndex = vec_frameIndex[i]; } - -#ifdef LOG_INFO2 - long long t3 = get_cur_time_ms(); - cout << "track time_using = "<< t3 - t2 << endl; -#endif - - vector >>().swap(detectResult); - - return SUCCESS; + } void VPTProcess::release() { diff --git a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.h b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.h index dff315b..2c17336 100644 --- a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.h +++ b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.h @@ -23,6 +23,10 @@ struct TaskTracker double ratioHeight; Sort tracker; unsigned int lastFrameIndex; + + vector< vector > lastDetectResult; + VPT_Result lastUnUsedResult; + vector lastDeleteObjectID; }; @@ -54,8 +58,7 @@ public: * RETURN: -1:图像错误; 其他:检测到的个数 * NOTES: *************************************************************************/ - //startBatch 多batch为了减少显存,串行处理 - add by lm - int process(sy_img * batch_img, int startBatch, int batchsize, vector vec_frameIndex, vector& result, vector>& deleteObjectID, vector>& unUsedResult); + int process(sy_img * batch_img, int batchsize, vector vec_frameIndex, vector& result, vector>& deleteObjectID, vector>& unUsedResult); /************************************************************************* * PURPOSE: 资源释放 diff --git a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/common.h b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/common.h index 14ee8c6..5474617 100644 --- a/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/common.h +++ b/vehicle_structure_platform.git0708-3080-trt-face/src/VPT/common.h @@ -105,7 +105,7 @@ typedef struct VPT_ObjInfo //����ṹ�� long id; // Ŀ��ΨһID��ͬһIDΪͬһĿ�� int num; // ��ID�����µĵ�num֡ double confidence; // ���Ŷ� - int snap_flag; + int snap_flag; }VPT_ObjInfo; typedef struct VPT_Result -- libgit2 0.21.4