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,10 +781,6 @@ void CMutliSourceVideoProcess::algorthim_process()
781 781
782 cudaDeviceSynchronize(); 782 cudaDeviceSynchronize();
783 783
784 -  
785 - vector<vector<int>> deleteObjectID;  
786 - set<int>::iterator iter = TaskinPlayID.begin();  
787 -  
788 int cur_batch_size = 0; 784 int cur_batch_size = 0;
789 cur_batch_size = section_batch_size; 785 cur_batch_size = section_batch_size;
790 786
@@ -805,41 +801,28 @@ void CMutliSourceVideoProcess::algorthim_process() @@ -805,41 +801,28 @@ void CMutliSourceVideoProcess::algorthim_process()
805 801
806 long long start_time_vpt = get_cur_time_ms(); 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 vector<unsigned long long> vec_frameIndex; 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 #ifdef LOG_INFO2 827 #ifdef LOG_INFO2
845 std::cout << "VPT_Process_GPU time_using: " << get_cur_time_ms() - start_time_vpt << std::endl; 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,62 +195,65 @@ void VPTProcess::check_VPT_Result(VPT_Result &amp; vResult) {
195 vResult.objCount = index; 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 if(nullptr == det_handle){ 200 if(nullptr == det_handle){
201 return FAILED; 201 return FAILED;
202 } 202 }
203 203
204 - bool isUseDet = true;  
205 - int channels = 3;  
206 -  
207 long long t1 = get_cur_time_ms(); 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 TaskTracker task_tracker = taskTrackers[i]; 257 TaskTracker task_tracker = taskTrackers[i];
255 if (!task_tracker.tracker.GetState()) { 258 if (!task_tracker.tracker.GetState()) {
256 continue; 259 continue;
@@ -258,19 +261,23 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto @@ -258,19 +261,23 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto
258 261
259 if (task_tracker.lastFrameIndex <= 0) { 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 continue; 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 if (update_times < 0) 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 // cout << "lastFrameIndex= " << task_tracker.lastFrameIndex << " cur_frameindex = " << vec_frameIndex[detectIndex] << endl; 282 // cout << "lastFrameIndex= " << task_tracker.lastFrameIndex << " cur_frameindex = " << vec_frameIndex[detectIndex] << endl;
276 // cout << "update_times = " << update_times << endl; 283 // cout << "update_times = " << update_times << endl;
@@ -278,38 +285,24 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto @@ -278,38 +285,24 @@ int VPTProcess::process(sy_img * batch_img, int startBatch, int batchsize, vecto
278 for (int j = 0; j < update_times; j++) 285 for (int j = 0; j < update_times; j++)
279 { // 无检测框跟踪 286 { // 无检测框跟踪
280 //cout << "taskTrackers size: " << task_tracker.size() << " batchsize:" << detectResult.size() << " update_times: "<< update_times << endl; 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 void VPTProcess::release() { 308 void VPTProcess::release() {
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.h
@@ -23,6 +23,10 @@ struct TaskTracker @@ -23,6 +23,10 @@ struct TaskTracker
23 double ratioHeight; 23 double ratioHeight;
24 Sort tracker; 24 Sort tracker;
25 unsigned int lastFrameIndex; 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,8 +58,7 @@ public:
54 * RETURN: -1:图像错误; 其他:检测到的个数 58 * RETURN: -1:图像错误; 其他:检测到的个数
55 * NOTES: 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 * PURPOSE: 资源释放 64 * PURPOSE: 资源释放
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/common.h
@@ -105,7 +105,7 @@ typedef struct VPT_ObjInfo //����ṹ�� @@ -105,7 +105,7 @@ typedef struct VPT_ObjInfo //����ṹ��
105 long id; // Ŀ��ΨһID��ͬһIDΪͬһĿ�� 105 long id; // Ŀ��ΨһID��ͬһIDΪͬһĿ��
106 int num; // ��ID�����µĵ�num֡ 106 int num; // ��ID�����µĵ�num֡
107 double confidence; // ���Ŷ� 107 double confidence; // ���Ŷ�
108 - int snap_flag; 108 + int snap_flag;
109 }VPT_ObjInfo; 109 }VPT_ObjInfo;
110 110
111 typedef struct VPT_Result 111 typedef struct VPT_Result