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 | 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 & 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