Commit 68c9349093a037681546b07d28c00ba34c3e8530

Authored by Hu Chunming
1 parent 3318f8fc

优化代码,修正跟踪逻辑

vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp
... ... @@ -781,10 +781,6 @@ void CMutliSourceVideoProcess::algorthim_process()
781 781  
782 782 cudaDeviceSynchronize();
783 783  
784   -
785   - vector<vector<int>> deleteObjectID;
786   - set<int>::iterator iter = TaskinPlayID.begin();
787   -
788 784 int cur_batch_size = 0;
789 785 cur_batch_size = section_batch_size;
790 786  
... ... @@ -805,41 +801,28 @@ void CMutliSourceVideoProcess::algorthim_process()
805 801  
806 802 long long start_time_vpt = get_cur_time_ms();
807 803  
808   - sy_img batch_img[TaskinPlayID.size()];
809   - vector<vector<VPT_Result>> unUsedResult;
  804 + set<int>::iterator iter = TaskinPlayID.begin();
  805 +
  806 + int task_in_play_size = TaskinPlayID.size();
  807 + vector<vector<int>> deleteObjectID(task_in_play_size);
  808 + vector<sy_img> batch_img(task_in_play_size);
  809 + vector<vector<VPT_Result>> unUsedResult(task_in_play_size);
  810 + vector<VPT_Result> VPTResult(task_in_play_size);
810 811 vector<unsigned long long> vec_frameIndex;
811   - vector<VPT_Result> VPTResult(TaskinPlayID.size());
812   - unUsedResult.resize(TaskinPlayID.size());
813   - int cycleTimes = curPlayTaskCount / cur_batch_size + (curPlayTaskCount % cur_batch_size == 0 ? 0 : 1);
814   - for (int c = 0; c < cycleTimes; c++)
815   - {
816   - int batchsize = c == cycleTimes - 1 ? (curPlayTaskCount - cur_batch_size*c) : cur_batch_size;
817   - int startbatch = c*cur_batch_size;
818 812  
819   - vec_frameIndex.clear();
820   - for (int i = 0; i < batchsize; i++)
821   - {
822   - DxGPUFrame task_algorithm_data = tasks[*iter].task_algorithm_data;
823   - int w = task_algorithm_data.width;
824   - int h = task_algorithm_data.height;
825   - int npitch = task_algorithm_data.size;
826   -
827   - batch_img[i].set_data(w, h, 3, (unsigned char *)task_algorithm_data.frame);
828   - vec_frameIndex.push_back(task_algorithm_data.timestamp);
829   - iter++;
830   - }
  813 + for (size_t i = 0; i < TaskinPlayID.size(); i++) {
  814 + DxGPUFrame task_algorithm_data = tasks[*iter].task_algorithm_data;
  815 + int w = task_algorithm_data.width;
  816 + int h = task_algorithm_data.height;
  817 + int npitch = task_algorithm_data.size;
831 818  
832   - vector<vector<int>> tempDeleteObjectID;
833   - tempDeleteObjectID.resize(batchsize);
834   - int flag = m_vptProcess.process(batch_img, startbatch, batchsize, vec_frameIndex, VPTResult, tempDeleteObjectID, unUsedResult);
835   - process_times++ ;
836   -
837   - for (auto iter : tempDeleteObjectID)
838   - {
839   - deleteObjectID.push_back(iter);
840   - }
841   - vector<vector<int>>().swap(tempDeleteObjectID);
  819 + batch_img[i].set_data(w, h, 3, (unsigned char *)task_algorithm_data.frame);
  820 + vec_frameIndex.push_back(task_algorithm_data.timestamp);
  821 +
  822 + iter++;
842 823 }
  824 +
  825 + int flag = m_vptProcess.process(batch_img.data(), batch_img.size(), vec_frameIndex, VPTResult, deleteObjectID, unUsedResult);
843 826  
844 827 #ifdef LOG_INFO2
845 828 std::cout << "VPT_Process_GPU time_using: " << get_cur_time_ms() - start_time_vpt << std::endl;
... ...
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.cpp
... ... @@ -195,62 +195,65 @@ void VPTProcess::check_VPT_Result(VPT_Result &amp; vResult) {
195 195 vResult.objCount = index;
196 196 }
197 197  
198   -int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vector<unsigned long long> vec_frameIndex, vector<VPT_Result>& result, vector<vector<int>>& deleteObjectID, vector<vector<VPT_Result>>& unUsedResult)
  198 +int VPTProcess::process(sy_img * batch_img, int batchsize, vector<unsigned long long> vec_frameIndex, vector<VPT_Result>& result, vector<vector<int>>& deleteObjectID, vector<vector<VPT_Result>>& unUsedResult)
199 199 {
200 200 if(nullptr == det_handle){
201 201 return FAILED;
202 202 }
203 203  
204   - bool isUseDet = true;
205   - int channels = 3;
206   -
207 204 long long t1 = get_cur_time_ms();
208 205  
209   - ctools_result *detresult;
210   - int res_status = ctools_process(det_handle, batch_img, batchsize, &detresult);
211   -
212   -#ifdef LOG_INFO2
213   - long long t2 = get_cur_time_ms();
214   - cout << "ctools_process time_using = "<< t2 - t1 << endl;
215   -#endif
216   -
217   - vector <vector< vector <float>>> detectResult(batchsize); //sort
218   -
219   - for (int b = 0; b < batchsize; b++)
220   - {
221   - ctools_result &cur_result = detresult[b];
  206 + vector <vector< vector <float>>> detectResult(batchsize);
  207 + int real_index = 0;
222 208  
223   - for (int c = 0; c < cur_result.obj_count_ && c < MAX_OBJ_COUNT; c++)
224   - {
225   - float x1 = cur_result.obj_results_[c].data_[2];
226   - float y1 = cur_result.obj_results_[c].data_[3];
227   - float x2 = cur_result.obj_results_[c].data_[4];
228   - float y2 = cur_result.obj_results_[c].data_[5];
  209 + int cycle_time = batchsize / m_max_batch_size;
  210 + cycle_time = (batchsize % m_max_batch_size) == 0 ? cycle_time : (cycle_time + 1) ;
  211 + vector<sy_img> vec_img;
  212 + for (int i = 0; i < cycle_time; i++) {
  213 + vec_img.clear();
229 214  
230   - float class_id = cur_result.obj_results_[c].data_[0];
231   - float score = cur_result.obj_results_[c].data_[1];
  215 + int start_index = i * m_max_batch_size;
  216 + int end_index = start_index + m_max_batch_size;
  217 + if(end_index >= batchsize) {
  218 + end_index = batchsize;
  219 + }
  220 + for (int j = start_index; j < end_index; j++) {
  221 + vec_img.push_back(batch_img[j]);
  222 + }
  223 +
  224 + ctools_result *detresult;
  225 + int res_status = ctools_process(det_handle, vec_img.data(), vec_img.size(), &detresult);
232 226  
233   - int imgid = b;
234   - if (score >= THRESHOLD)
  227 + for (size_t b = 0; b < vec_img.size(); b++) {
  228 + ctools_result &cur_result = detresult[b];
  229 + for (int c = 0; c < cur_result.obj_count_ && c < MAX_OBJ_COUNT; c++)
235 230 {
236   - vector <float> obj;
237   -
238   - obj.push_back(x1);
239   - obj.push_back(y1);
240   - obj.push_back(x2);
241   - obj.push_back(y2);
242   - obj.push_back(score);
243   - obj.push_back(class_id);
244   - detectResult[imgid].push_back(obj);
  231 + float x1 = cur_result.obj_results_[c].data_[2];
  232 + float y1 = cur_result.obj_results_[c].data_[3];
  233 + float x2 = cur_result.obj_results_[c].data_[4];
  234 + float y2 = cur_result.obj_results_[c].data_[5];
  235 +
  236 + float class_id = cur_result.obj_results_[c].data_[0];
  237 + float score = cur_result.obj_results_[c].data_[1];
  238 +
  239 + if (score >= THRESHOLD)
  240 + {
  241 + vector <float> obj;
  242 +
  243 + obj.push_back(x1);
  244 + obj.push_back(y1);
  245 + obj.push_back(x2);
  246 + obj.push_back(y2);
  247 + obj.push_back(score);
  248 + obj.push_back(class_id);
  249 + detectResult[real_index].push_back(obj);
  250 + }
245 251 }
  252 + real_index++;
246 253 }
247 254 }
248   -
249   - int resIndex = startBatch;
250   - int detectIndex = 0;
251   -
252   - for (int i = startBatch; i < taskTrackers.size(); i++)
253   - {
  255 +
  256 + for (int i = 0; i < batchsize; i++){
254 257 TaskTracker task_tracker = taskTrackers[i];
255 258 if (!task_tracker.tracker.GetState()) {
256 259 continue;
... ... @@ -258,19 +261,23 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto
258 261  
259 262 if (task_tracker.lastFrameIndex <= 0) {
260 263 // 第一帧,只做带检测框的跟踪
261   - int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[detectIndex], result[resIndex].obj, deleteObjectID[detectIndex]);
262   - result[resIndex].objCount = objCount;
263   - vector<vector<float>>().swap(detectResult[detectIndex]);
264   - detectResult[detectIndex].clear();
  264 + int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[i], result[i].obj, deleteObjectID[i]);
  265 + result[i].objCount = objCount;
265 266  
266   - task_tracker.lastFrameIndex = vec_frameIndex[detectIndex];
  267 + check_VPT_Result(result[i]);
  268 +
  269 + task_tracker.lastFrameIndex = vec_frameIndex[i];
  270 + task_tracker.lastDetectResult = detectResult[i];
  271 + task_tracker.lastUnUsedResult.objCount = result[i].objCount;
  272 + memcpy(task_tracker.lastUnUsedResult.obj, result[i].obj, sizeof(VPT_ObjInfo) * MAX_OBJ_COUNT);
  273 + task_tracker.lastDeleteObjectID = deleteObjectID[i];
267 274 continue;
268 275 }
269 276  
270   - int update_times = vec_frameIndex[detectIndex] - task_tracker.lastFrameIndex - 1;
  277 + int update_times = vec_frameIndex[i] - task_tracker.lastFrameIndex - 1;
271 278 if (update_times < 0)
272 279 {
273   - cout << "FrameIndex error !! lastFrameIndex= "<< task_tracker.lastFrameIndex <<" cur_frameindex = " << vec_frameIndex[detectIndex] << endl;
  280 + cout << "FrameIndex error !! lastFrameIndex= "<< task_tracker.lastFrameIndex <<" cur_frameindex = " << vec_frameIndex[i] << endl;
274 281 }
275 282 // cout << "lastFrameIndex= " << task_tracker.lastFrameIndex << " cur_frameindex = " << vec_frameIndex[detectIndex] << endl;
276 283 // cout << "update_times = " << update_times << endl;
... ... @@ -278,38 +285,24 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto
278 285 for (int j = 0; j < update_times; j++)
279 286 { // 无检测框跟踪
280 287 //cout << "taskTrackers size: " << task_tracker.size() << " batchsize:" << detectResult.size() << " update_times: "<< update_times << endl;
281   - VPT_Result unresult;
282   - VPT_ObjInfo obj[MAX_OBJ_COUNT];
283   - unresult.objCount =task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, false, detectResult[detectIndex], unresult.obj, deleteObjectID[detectIndex]);
284   - check_VPT_Result(unresult);
285   - unUsedResult[resIndex].push_back(unresult);
  288 + 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);
286 289 }
287 290  
288 291 //有检测框输入的跟踪
289   - int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[detectIndex], result[resIndex].obj, deleteObjectID[detectIndex]);
290   - result[resIndex].objCount = objCount;
291   - vector<vector<float>>().swap(detectResult[detectIndex]);
292   - detectResult[detectIndex].clear();
  292 + int objCount = task_tracker.tracker.update(task_tracker.ratioWidth, task_tracker.ratioHeight, true, detectResult[i], result[i].obj, deleteObjectID[i]);
  293 + result[i].objCount = objCount;
293 294  
294   - // 记录帧序号
295   - task_tracker.lastFrameIndex = vec_frameIndex[detectIndex];
  295 + check_VPT_Result(result[i]);
296 296  
297   - check_VPT_Result(result[resIndex]);
  297 + task_tracker.lastDetectResult = detectResult[i];
  298 + task_tracker.lastUnUsedResult.objCount = result[i].objCount;
  299 + memcpy(task_tracker.lastUnUsedResult.obj, result[i].obj, sizeof(VPT_ObjInfo) * MAX_OBJ_COUNT);
  300 + task_tracker.lastDeleteObjectID = deleteObjectID[i];
298 301  
299   - resIndex++;
300   - detectIndex++;
301   - if (resIndex == startBatch + batchsize)
302   - break;
  302 + // 记录帧序号
  303 + task_tracker.lastFrameIndex = vec_frameIndex[i];
303 304 }
304   -
305   -#ifdef LOG_INFO2
306   - long long t3 = get_cur_time_ms();
307   - cout << "track time_using = "<< t3 - t2 << endl;
308   -#endif
309   -
310   - vector <vector< vector <float>>>().swap(detectResult);
311   -
312   - return SUCCESS;
  305 +
313 306 }
314 307  
315 308 void VPTProcess::release() {
... ...
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.h
... ... @@ -23,6 +23,10 @@ struct TaskTracker
23 23 double ratioHeight;
24 24 Sort tracker;
25 25 unsigned int lastFrameIndex;
  26 +
  27 + vector< vector <float>> lastDetectResult;
  28 + VPT_Result lastUnUsedResult;
  29 + vector<int> lastDeleteObjectID;
26 30 };
27 31  
28 32  
... ... @@ -54,8 +58,7 @@ public:
54 58 * RETURN: -1:图像错误; 其他:检测到的个数
55 59 * NOTES:
56 60 *************************************************************************/
57   - //startBatch 多batch为了减少显存,串行处理 - add by lm
58   - int process(sy_img * batch_img, int startBatch, int batchsize, vector<unsigned long long> vec_frameIndex, vector<VPT_Result>& result, vector<vector<int>>& deleteObjectID, vector<vector<VPT_Result>>& unUsedResult);
  61 + int process(sy_img * batch_img, int batchsize, vector<unsigned long long> vec_frameIndex, vector<VPT_Result>& result, vector<vector<int>>& deleteObjectID, vector<vector<VPT_Result>>& unUsedResult);
59 62  
60 63 /*************************************************************************
61 64 * PURPOSE: 资源释放
... ...
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/common.h
... ... @@ -105,7 +105,7 @@ typedef struct VPT_ObjInfo //����ṹ��
105 105 long id; // Ŀ��ΨһID��ͬһIDΪͬһĿ��
106 106 int num; // ��ID�����µĵ�num֡
107 107 double confidence; // ���Ŷ�
108   - int snap_flag;
  108 + int snap_flag;
109 109 }VPT_ObjInfo;
110 110  
111 111 typedef struct VPT_Result
... ...