Commit 68c9349093a037681546b07d28c00ba34c3e8530
1 parent
3318f8fc
优化代码,修正跟踪逻辑
Showing
4 changed files
with
91 additions
and
112 deletions
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 & vResult) { | @@ -195,62 +195,65 @@ void VPTProcess::check_VPT_Result(VPT_Result & 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 |