Commit 83f4facfb2f8b0767d740687bd436ccb15bcb79c
1 parent
27f0a463
目标消失时增加一次推送;修复算法框和目标不匹配问题,改善跟踪效果
Showing
9 changed files
with
527 additions
and
10 deletions
src/ai_engine_module/VPTProcess.cpp
... | ... | @@ -138,7 +138,8 @@ int VPTProcess::process_gpu(sy_img * batch_img, vector<string>& tasklist, |
138 | 138 | /* 跟踪:第一帧 带检测框信息的跟踪,取结果返回 */ |
139 | 139 | if (j == 0) |
140 | 140 | { |
141 | - int objCount = cur_sort.update_v2(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); | |
141 | + // int objCount = cur_sort.update_v2(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); | |
142 | + int objCount = cur_sort.update_v3(isUseDet, /*save lk = */false, /*center_dist = */false, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); | |
142 | 143 | result[detectIndex].obj_count = objCount; |
143 | 144 | result[detectIndex].task_id = task_id; |
144 | 145 | |
... | ... | @@ -149,7 +150,8 @@ int VPTProcess::process_gpu(sy_img * batch_img, vector<string>& tasklist, |
149 | 150 | { |
150 | 151 | onelevel_det_result un_result; |
151 | 152 | //un_result.obj_count = cur_sort.update(isUseDet, false, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); |
152 | - un_result.obj_count = cur_sort.update_v2(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); | |
153 | + // un_result.obj_count = cur_sort.update_v2(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); | |
154 | + un_result.obj_count = cur_sort.update_v3(isUseDet, false, false, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); | |
153 | 155 | } |
154 | 156 | } |
155 | 157 | } | ... | ... |
src/ai_engine_module/VPTProcess.cpp_debug
0 → 100755
1 | +#include "VPTProcess.h" | |
2 | +#include "../common/logger.hpp" | |
3 | +#include "../ai_platform/task_param_manager.h" | |
4 | + | |
5 | +#include <stdlib.h> | |
6 | +#include <time.h> | |
7 | +#include <fstream> | |
8 | + | |
9 | +#include "vpt.h" | |
10 | +#include "../ai_platform/macro_definition.h" | |
11 | +#include "../ai_platform/det_obj_header.h" | |
12 | + | |
13 | +#include "opencv2/opencv.hpp" | |
14 | + | |
15 | +#include "../util/vpc_util.h" | |
16 | + | |
17 | +VPTProcess::VPTProcess(){ | |
18 | + m_max_batchsize = 16; | |
19 | +} | |
20 | + | |
21 | +VPTProcess::~VPTProcess(){ | |
22 | + release(); | |
23 | +} | |
24 | + | |
25 | +/* 算法初始化 */ | |
26 | +int VPTProcess::init(VPTProcess_PARAM vparam){ | |
27 | + | |
28 | + string model_path = vparam.model_dir + "/models/vpt230323_310p.om" ; | |
29 | + | |
30 | + LOG_INFO("vpt 版本:{} 模型路径:{}", vpt_get_version(), model_path); | |
31 | + | |
32 | + vpt_param param; | |
33 | + char modelNames[100]; | |
34 | + strcpy(modelNames, model_path.c_str()); | |
35 | + param.modelNames = modelNames; | |
36 | + param.threshold = vparam.threshold; | |
37 | + param.devId = vparam.gpuid; | |
38 | + param.isTrk = false; | |
39 | + | |
40 | + m_devId = param.devId; | |
41 | + ACL_CALL(aclrtSetDevice(m_devId), ACL_ERROR_NONE, -1); | |
42 | + ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_ERROR_NONE, -1); | |
43 | + | |
44 | + int ret = vpt_init(&m_det_handle, param); | |
45 | + if(ret != 0){ | |
46 | + LOG_DEBUG("vpt init error."); | |
47 | + return -1; | |
48 | + } | |
49 | + jpegUtil.jpeg_init(m_devId); | |
50 | + | |
51 | + return 0; | |
52 | +} | |
53 | + | |
54 | +/* 算法计算 */ | |
55 | +// int VPTProcess::process_gpu(sy_img * batch_img, vector<string>& tasklist, | |
56 | +// vector<onelevel_det_result>& result, vector<vector<int>>& deleteObjectID, vector<vector<onelevel_det_result>>& unUsedResult) | |
57 | +int VPTProcess::process_gpu(sy_img * batch_img, vector<DeviceMemory*> vec_vptMem, vector<string>& tasklist, | |
58 | + vector<onelevel_det_result>& result, vector<vector<int>>& deleteObjectID, vector<vector<onelevel_det_result>>& unUsedResult) | |
59 | +{ | |
60 | + int batchsize = tasklist.size(); | |
61 | + | |
62 | + if (result.empty()) | |
63 | + result.resize(batchsize); | |
64 | + | |
65 | + /* 结果结构体初始化 */ | |
66 | + vpt_result *vpt_det_result = new vpt_result[batchsize]; | |
67 | + for (int b = 0; b < batchsize; b++){ | |
68 | + vpt_det_result[b].obj_count_ = 0; | |
69 | + vpt_det_result[b].obj_results_ = new vpt_obj_result[MAX_DET_COUNT]; | |
70 | + } | |
71 | + | |
72 | + do{ | |
73 | + /* 路数太多时 按照最大batchsize数 拆批次运行 */ | |
74 | + int cur_batch_size = m_max_batchsize; | |
75 | + int cycleTimes = batchsize / cur_batch_size + (batchsize % cur_batch_size == 0 ? 0 : 1); | |
76 | + | |
77 | + for (int c = 0; c < cycleTimes; c++){ | |
78 | + | |
79 | + int real_batchsize = c == cycleTimes - 1 ? (batchsize - cur_batch_size*c) : cur_batch_size; | |
80 | + int startbatch = c*cur_batch_size; | |
81 | + | |
82 | + vpt_result *real_res = vpt_det_result + startbatch; | |
83 | + | |
84 | + aclrtSetDevice(m_devId); | |
85 | + int ret = aclrtSetCurrentContext(m_algorthim_ctx); | |
86 | + if(ACL_ERROR_NONE != ret){ | |
87 | + break; | |
88 | + } | |
89 | + ret = vpt_batch(m_det_handle, batch_img + startbatch, real_batchsize, real_res); | |
90 | + if(ret != 0){ | |
91 | + break; | |
92 | + } | |
93 | + } | |
94 | + | |
95 | + vector <vector< vector <float>>> detectResult(batchsize); // sort | |
96 | + | |
97 | + /* 将检测的结果放进数组 转换为跟踪的输入需要(若为人脸 则检测结果可能跟多,比如需要带上ldmk点) */ | |
98 | + // filter by threshold. | |
99 | + for (int b = 0; b < batchsize; b++) | |
100 | + { | |
101 | + vpt_result cur_result = vpt_det_result[b]; | |
102 | + | |
103 | + for (int c = 0; c < cur_result.obj_count_ && c < MAX_OBJ_COUNT; c++) | |
104 | + { | |
105 | + float x1 = vpt_det_result[b].obj_results_[c].obj_rect.left_; | |
106 | + float y1 = vpt_det_result[b].obj_results_[c].obj_rect.top_; | |
107 | + float x2 = vpt_det_result[b].obj_results_[c].obj_rect.left_ + vpt_det_result[b].obj_results_[c].obj_rect.width_; | |
108 | + float y2 = vpt_det_result[b].obj_results_[c].obj_rect.top_ + vpt_det_result[b].obj_results_[c].obj_rect.height_; | |
109 | + | |
110 | + float class_id = vpt_det_result[b].obj_results_[c].obj_index; | |
111 | + float score = vpt_det_result[b].obj_results_[c].obj_score; | |
112 | + | |
113 | + if (score >= THRESHOLD) | |
114 | + { | |
115 | + vector <float> obj; | |
116 | + obj.push_back(x1); | |
117 | + obj.push_back(y1); | |
118 | + obj.push_back(x2); | |
119 | + obj.push_back(y2); | |
120 | + obj.push_back(score); | |
121 | + obj.push_back(class_id); | |
122 | + detectResult[b].push_back(obj); | |
123 | + } | |
124 | + } | |
125 | + } | |
126 | + | |
127 | +#if 0 | |
128 | + for (int b = 0; b < batchsize; b++) | |
129 | + { | |
130 | + std::string file_path = "res/vpt_test/"; | |
131 | + auto time_now = std::chrono::system_clock::now(); | |
132 | + std::string cur_timestamp_us = std::to_string(std::chrono::duration_cast<std::chrono::microseconds>(time_now.time_since_epoch()).count()); | |
133 | + std::string img_filename = file_path + cur_timestamp_us + "_" + std::to_string(detectResult[b].size()) + ".jpg"; | |
134 | + | |
135 | + vpc_img_info src_img_info = VPCUtil::vpc_devMem2vpcImg(vec_vptMem[b]); | |
136 | + bool bSaved = jpegUtil.jpeg_encode(src_img_info.pic_desc, img_filename); | |
137 | + | |
138 | + cv::Mat big_img = cv::imread(img_filename); | |
139 | + for (int c = 0; c < detectResult[b].size(); c++) { | |
140 | + cv::rectangle(big_img, cv::Rect(detectResult[b][c][0], detectResult[b][c][1], detectResult[b][c][2] - detectResult[b][c][0], | |
141 | + detectResult[b][c][3] - detectResult[b][c][1]), cv::Scalar(158, 52, 254), 3, 1, 0); | |
142 | + } | |
143 | + cv::imwrite(img_filename, big_img); | |
144 | + | |
145 | + VPCUtil::vpc_img_release(src_img_info); | |
146 | + } | |
147 | +#endif | |
148 | + | |
149 | + bool isUseDet = true; | |
150 | + for (size_t detectIndex = 0; detectIndex < batchsize; detectIndex++) { | |
151 | + string task_id = tasklist[detectIndex]; | |
152 | + | |
153 | + if (! taskTrackers[task_id].tracker.GetState()) | |
154 | + continue; | |
155 | + | |
156 | + Sort &cur_sort = taskTrackers[task_id].tracker; | |
157 | + isUseDet = true; | |
158 | + | |
159 | + const float maxLen = std::sqrt(batch_img[detectIndex].w_ * batch_img[detectIndex].w_ + batch_img[detectIndex].h_ * batch_img[detectIndex].h_); //-modified by zsh 220719 | |
160 | + /* FusionInterval是跳帧参数,以十类人车物为例,一般跳5帧,所以第一帧检测,后续四帧纯跟踪 */ | |
161 | + for (int j = 0; j < taskTrackers[task_id].tracker.FusionInterval; j++) | |
162 | + { | |
163 | + /* 跟踪:第一帧 带检测框信息的跟踪,取结果返回 */ | |
164 | + if (j == 0) | |
165 | + { | |
166 | + // int objCount = cur_sort.update_v2(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); | |
167 | + int objCount = cur_sort.update_v3(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); | |
168 | + result[detectIndex].obj_count = objCount; | |
169 | + result[detectIndex].task_id = task_id; | |
170 | + | |
171 | + // vector<vector<float>>().swap(detectResult[detectIndex]); | |
172 | + // detectResult[detectIndex].clear(); | |
173 | + isUseDet = false; | |
174 | + } else /* 跟踪:后四帧 纯粹跟踪 纯跟踪结果不返回 */ | |
175 | + { | |
176 | + onelevel_det_result un_result; | |
177 | + //un_result.obj_count = cur_sort.update(isUseDet, false, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); | |
178 | + // un_result.obj_count = cur_sort.update_v2(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); | |
179 | + un_result.obj_count = cur_sort.update_v3(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); | |
180 | + } | |
181 | + } | |
182 | + } | |
183 | +#if 1 | |
184 | + for (int b = 0; b < batchsize; b++) | |
185 | + { | |
186 | + std::string file_path = "res/vpt_track/"; | |
187 | + auto time_now = std::chrono::system_clock::now(); | |
188 | + std::string cur_timestamp_us = std::to_string(std::chrono::duration_cast<std::chrono::microseconds>(time_now.time_since_epoch()).count()); | |
189 | + std::string img_filename = file_path + cur_timestamp_us + "_" + std::to_string(result[b].obj_count) + ".jpg"; | |
190 | + vpc_img_info src_img_info = VPCUtil::vpc_devMem2vpcImg(vec_vptMem[b]); | |
191 | + bool flag = false; | |
192 | + for (int c = 0; c < result[b].obj_count; c++) { | |
193 | + if (result[b].obj[c].id > 7700 && result[b].obj[c].id < 8000) flag = true; | |
194 | + } | |
195 | + | |
196 | + if (flag) { | |
197 | + bool bSaved = jpegUtil.jpeg_encode(src_img_info.pic_desc, img_filename); | |
198 | + cv::Mat big_img = cv::imread(img_filename); | |
199 | + | |
200 | + for (int c = 0; c < result[b].obj_count; c++) { | |
201 | + cv::putText(big_img, std::to_string(result[b].obj[c].id), cv::Point(result[b].obj[c].left, result[b].obj[c].top-5), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(255,0,0),2,8); | |
202 | + cv::rectangle(big_img, cv::Rect(result[b].obj[c].left, result[b].obj[c].top, result[b].obj[c].right - result[b].obj[c].left, | |
203 | + result[b].obj[c].bottom - result[b].obj[c].top), cv::Scalar(158, 52, 254), 3, 1, 0); | |
204 | + } | |
205 | + | |
206 | + for (int c = 0; c < detectResult[b].size(); c++) { | |
207 | + cv::rectangle(big_img, cv::Rect(detectResult[b][c][0], detectResult[b][c][1], detectResult[b][c][2] - detectResult[b][c][0], | |
208 | + detectResult[b][c][3] - detectResult[b][c][1]), cv::Scalar(0, 0, 255), 3, 1, 0); | |
209 | + } | |
210 | + cv::imwrite(img_filename, big_img); | |
211 | + } | |
212 | + VPCUtil::vpc_img_release(src_img_info); | |
213 | + } | |
214 | +#endif | |
215 | + | |
216 | + vector <vector< vector <float>>>().swap(detectResult); // free memory. | |
217 | + } while (0); | |
218 | + | |
219 | + if(vpt_det_result){ | |
220 | + for (int b = 0; b < batchsize; b++){ | |
221 | + delete[] vpt_det_result[b].obj_results_; | |
222 | + } | |
223 | + delete[] vpt_det_result; | |
224 | + } | |
225 | + | |
226 | + return 0; | |
227 | +} | |
228 | + | |
229 | + | |
230 | +/* 算法句柄 资源释放 */ | |
231 | +void VPTProcess::release(){ | |
232 | + if (m_det_handle){ | |
233 | + vpt_release(&m_det_handle); | |
234 | + m_det_handle = NULL; | |
235 | + } | |
236 | + jpegUtil.jpeg_release(); | |
237 | + if(m_algorthim_ctx){ | |
238 | + aclrtDestroyContext(m_algorthim_ctx); | |
239 | + } | |
240 | +} | |
241 | + | |
242 | +// 221117byzsh | |
243 | +void VPTProcess::addTaskTracker(const string taskID, double rWidth, double rHeight, int skip_frame) | |
244 | +{ | |
245 | + TaskTracker t; | |
246 | + t.TaskID = taskID; | |
247 | + t.ratioWidth = rWidth; | |
248 | + t.ratioHeight = rHeight; | |
249 | + t.tracker.FusionInterval = skip_frame; | |
250 | + | |
251 | + taskTrackers[taskID] = t; | |
252 | +} | |
253 | + | |
254 | +/* 任务结束跟踪器 */ | |
255 | +bool VPTProcess::finishTaskTracker(const string taskID) | |
256 | +{ | |
257 | + taskTrackers.erase(taskID); | |
258 | + return true; | |
259 | +} | |
0 | 260 | \ No newline at end of file | ... | ... |
src/ai_engine_module/VPTProcess.h
... | ... | @@ -11,6 +11,8 @@ |
11 | 11 | #include "sort/Sort.h" |
12 | 12 | #include "acl/acl.h" |
13 | 13 | #include "acl/ops/acl_dvpp.h" |
14 | +#include "../util/vpc_util.h" | |
15 | +#include "../util/JpegUtil.h" | |
14 | 16 | |
15 | 17 | using namespace std; |
16 | 18 | |
... | ... | @@ -68,7 +70,8 @@ public: |
68 | 70 | */ |
69 | 71 | int process_gpu(sy_img * batch_img, vector<string>& tasklist, |
70 | 72 | vector<onelevel_det_result>& result, vector<vector<int>>& deleteObjectID, vector<vector<onelevel_det_result>>& unUsedResult); |
71 | - | |
73 | + int process_gpu(sy_img * batch_img, vector<DeviceMemory*> vec_vptMem, vector<string>& tasklist, | |
74 | + vector<onelevel_det_result>& result, vector<vector<int>>& deleteObjectID, vector<vector<onelevel_det_result>>& unUsedResult); | |
72 | 75 | |
73 | 76 | /************************************************************************* |
74 | 77 | * FUNCTION: VPT_Release |
... | ... | @@ -87,7 +90,7 @@ public: |
87 | 90 | private: |
88 | 91 | int m_devId; |
89 | 92 | aclrtContext m_algorthim_ctx; |
90 | - | |
93 | + JpegUtil jpegUtil; | |
91 | 94 | void* m_det_handle{nullptr}; |
92 | 95 | float threshold{0.6}; |
93 | 96 | int m_max_batchsize; | ... | ... |
src/ai_engine_module/sort/Sort.cpp
... | ... | @@ -380,6 +380,232 @@ int Sort::update_v2(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLe |
380 | 380 | |
381 | 381 | } |
382 | 382 | |
383 | +int Sort::update_v3(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLen, vector< vector<float> > &dets, det_objinfo *result, vector<int> &deleteObjectID) | |
384 | +{ | |
385 | + //get predicted locations from existing trackers. | |
386 | + vector< vector<float> > trks; | |
387 | + vector<float> pos; | |
388 | + int ObjCount = 0; //by zl 本帧图像中的有效前景个数 | |
389 | + vector<float> bbox; | |
390 | + | |
391 | + for (int i = 0; i < trackers.size(); i++ ) | |
392 | + { | |
393 | + pos = trackers[i].predict(); // 对跟踪列表中的框进行预测(包含初始化的和匹配后update的) | |
394 | + pos.push_back(1); | |
395 | + pos.push_back(trackers[i].cls); | |
396 | + trks.push_back(pos); | |
397 | + pos.clear(); | |
398 | + } | |
399 | + | |
400 | + if (isUseDet == true) | |
401 | + { | |
402 | + vector< vector<int> > matched; | |
403 | + vector<int> unmatched_dets; | |
404 | + vector<int> unmatched_trks; | |
405 | + | |
406 | + if(center_dist) { | |
407 | + Sort::associate_detections_to_trackers_v2(matched, unmatched_dets, unmatched_trks, dets, trks, maxLen); // 中心距离匹配 | |
408 | + } | |
409 | + else { | |
410 | + Sort::associate_detections_to_trackers(matched, unmatched_dets, unmatched_trks, dets, trks, 0.3); // iou匹配 | |
411 | + } | |
412 | + //update matched trackers with assigned detections----匹配上的更新跟踪信息 | |
413 | + for (int matched_number = 0; matched_number < matched.size(); matched_number++) | |
414 | + { | |
415 | + trackers[matched[matched_number][1]].update(dets[matched[matched_number][0]]); | |
416 | + trackers[matched[matched_number][1]].score = dets[matched[matched_number][0]][4]; | |
417 | + trackers[matched[matched_number][1]].cls = dets[matched[matched_number][0]][5]; | |
418 | + if (copy_ldmk)//存入关键点信息 | |
419 | + { | |
420 | + for (int m = 0; m < 50; ++m) | |
421 | + { | |
422 | + trackers[matched[matched_number][1]].ldmk.push_back(dets[matched[matched_number][0]][m + 6]); | |
423 | + } | |
424 | + // added by zsh 姿态角信息-------------------------------------------------------- | |
425 | + trackers[matched[matched_number][1]].roll = dets[matched[matched_number][0]][56]; | |
426 | + trackers[matched[matched_number][1]].yaw = dets[matched[matched_number][0]][57]; | |
427 | + trackers[matched[matched_number][1]].pitch = dets[matched[matched_number][0]][58]; | |
428 | + //-------------------------------------------------------------------------------- | |
429 | + } | |
430 | +#if 1 | |
431 | + //返回加上ID信息的检测框=================================================================== | |
432 | + if (ObjCount < MAX_OBJ_COUNT) { | |
433 | + // if (ObjCount < MAX_OBJ_COUNT && (trackers[matched[matched_number][1]].time_since_update < FusionInterval) && ((trackers[matched[matched_number][1]].hit_streak >= min_hits) || (frame_count <= (min_hits * FusionInterval)))) { | |
434 | + if (trackers[matched[matched_number][1]].id == -1) | |
435 | + trackers[matched[matched_number][1]].id = trackcount++; | |
436 | + result[ObjCount].id = trackers[matched[matched_number][1]].id; | |
437 | + result[ObjCount].num = trackers[matched[matched_number][1]].frame_count; | |
438 | + | |
439 | + result[ObjCount].left = dets[matched[matched_number][0]][0]; | |
440 | + result[ObjCount].top = dets[matched[matched_number][0]][1]; | |
441 | + result[ObjCount].right = dets[matched[matched_number][0]][2]; | |
442 | + result[ObjCount].bottom = dets[matched[matched_number][0]][3]; | |
443 | + result[ObjCount].confidence = dets[matched[matched_number][0]][4]; | |
444 | + result[ObjCount].index = dets[matched[matched_number][0]][5]; | |
445 | + result[ObjCount].center_x = result[ObjCount].left + (result[ObjCount].right - result[ObjCount].left) * 0.5; // 中心点 add by 20170227 | |
446 | + result[ObjCount].center_y = result[ObjCount].top + (result[ObjCount].bottom - result[ObjCount].top) * 0.5; // 中心点 | |
447 | + if (trackers[matched[matched_number][1]].age == 2 * FusionInterval) { | |
448 | + result[ObjCount].snap_flag = 1; // 中心点 | |
449 | + } | |
450 | + else { | |
451 | + result[ObjCount].snap_flag = 0; // 中心点 | |
452 | + } | |
453 | + | |
454 | + if (copy_ldmk) // 存入关键点信息 | |
455 | + { | |
456 | + for (int m = 0; m < 25; ++m) | |
457 | + { | |
458 | + result[ObjCount].landmark_point[m].x_ = trackers[matched[matched_number][1]].ldmk[2 * m]; | |
459 | + result[ObjCount].landmark_point[m].y_ = trackers[matched[matched_number][1]].ldmk[2 * m + 1]; | |
460 | + } | |
461 | + // added by zsh 姿态角信息-------------------------------- | |
462 | + result[ObjCount].roll = trackers[matched[matched_number][1]].roll; | |
463 | + result[ObjCount].yaw = trackers[matched[matched_number][1]].yaw; | |
464 | + result[ObjCount].pitch = trackers[matched[matched_number][1]].pitch; | |
465 | + //-------------------------------------------------------- | |
466 | + } | |
467 | + | |
468 | + ObjCount++; | |
469 | + } | |
470 | + //=================================================================================== | |
471 | +#endif | |
472 | + } | |
473 | + | |
474 | + //create and initialise new trackers for unmatched detections----为未匹配上的检测框分配新tracker | |
475 | + for (int unmatched_dets_number = 0; unmatched_dets_number < unmatched_dets.size(); unmatched_dets_number++) | |
476 | + { | |
477 | + KalmanBoxTracker tracker = KalmanBoxTracker(dets[unmatched_dets[unmatched_dets_number]], max_track_length); | |
478 | + tracker.id = -1; | |
479 | + tracker.FusionInterval = FusionInterval; //221117byzsh | |
480 | + trackers.push_back(tracker); | |
481 | + trackers[trackers.size() - 1].score = dets[unmatched_dets[unmatched_dets_number]][4];//by zl 20170525 解决第一次检测时置信度为0问题 | |
482 | + | |
483 | + if (copy_ldmk)//存入关键点信息 | |
484 | + { | |
485 | + for (int m = 0; m < 50; ++m) | |
486 | + { | |
487 | + trackers[trackers.size() - 1].ldmk.push_back(dets[unmatched_dets[unmatched_dets_number]][m + 6]); | |
488 | + } | |
489 | + // added by zsh 姿态角信息------------------------------------------------------------ | |
490 | + trackers[trackers.size() - 1].roll = dets[unmatched_dets[unmatched_dets_number]][56]; | |
491 | + trackers[trackers.size() - 1].yaw = dets[unmatched_dets[unmatched_dets_number]][57]; | |
492 | + trackers[trackers.size() - 1].pitch = dets[unmatched_dets[unmatched_dets_number]][58]; | |
493 | + //----------------------------------------------------------------------------------- | |
494 | + } | |
495 | + | |
496 | + // cout << "trackers size: " << trackers.size() << endl; | |
497 | + | |
498 | + } | |
499 | + | |
500 | + for (int trackers_number = 0; trackers_number < trackers.size();) | |
501 | + { | |
502 | + // cout << trackers[trackers_number].id << " " <<trackers[trackers_number].time_since_update << " " << trackers[trackers_number].hit_streak << " " << min_hits << " " << frame_count << endl; | |
503 | + if (trackers[trackers_number].time_since_update > max_age) // 失配次数超过max_age,放入轨迹消失列表,从跟踪列表中删除 | |
504 | + { | |
505 | + if (trackers[trackers_number].id != -1) | |
506 | + { | |
507 | + deleteObjectID.push_back(trackers[trackers_number].id); | |
508 | + } | |
509 | + | |
510 | + trackcount++; | |
511 | + std::vector<float>().swap(trackers[trackers_number].ldmk); | |
512 | + trackers.erase(trackers.begin() + trackers_number); | |
513 | + continue; | |
514 | + } | |
515 | +#if 0 | |
516 | + // 失配次数小于FusionInterval且满足最小匹配次数则返回 | |
517 | + if (ObjCount < MAX_OBJ_COUNT && (trackers[trackers_number].time_since_update < FusionInterval) && ((trackers[trackers_number].hit_streak >= min_hits) || (frame_count <= (min_hits * FusionInterval)))) | |
518 | + { | |
519 | + if (trackers[trackers_number].id == -1) | |
520 | + trackers[trackers_number].id = trackcount++; | |
521 | + result[ObjCount].id = trackers[trackers_number].id; | |
522 | + result[ObjCount].num = trackers[trackers_number].frame_count; | |
523 | + | |
524 | + bbox = trackers[trackers_number].get_state(); // 跟踪框 | |
525 | + result[ObjCount].left = bbox[0]; // bbout[i][0]; | |
526 | + result[ObjCount].top = bbox[1]; //bbout[i][1]; | |
527 | + result[ObjCount].right = bbox[2]; //bbout[i][2]; | |
528 | + result[ObjCount].bottom = bbox[3]; //bbout[i][3]; | |
529 | + result[ObjCount].confidence = trackers[trackers_number].score; // bbout[i][4]; | |
530 | + result[ObjCount].index = trackers[trackers_number].cls; // bbout[i][5] - 1; | |
531 | + result[ObjCount].center_x = result[ObjCount].left + (result[ObjCount].right - result[ObjCount].left) * 0.5; // 中心点 add by 20170227 | |
532 | + result[ObjCount].center_y = result[ObjCount].top + (result[ObjCount].bottom - result[ObjCount].top) * 0.5; // 中心点 | |
533 | + if (trackers[trackers_number].age == 2 * FusionInterval) | |
534 | + { | |
535 | + result[ObjCount].snap_flag = 1; // 中心点 | |
536 | + } | |
537 | + else | |
538 | + { | |
539 | + result[ObjCount].snap_flag = 0; // 中心点 | |
540 | + } | |
541 | + | |
542 | + if (copy_ldmk) // 存入关键点信息 | |
543 | + { | |
544 | + for (int m = 0; m < 25; ++m) | |
545 | + { | |
546 | + result[ObjCount].landmark_point[m].x_ = trackers[trackers_number].ldmk[2 * m]; | |
547 | + result[ObjCount].landmark_point[m].y_ = trackers[trackers_number].ldmk[2 * m + 1]; | |
548 | + } | |
549 | + // added by zsh 姿态角信息-------------------------------- | |
550 | + result[ObjCount].roll = trackers[trackers_number].roll; | |
551 | + result[ObjCount].yaw = trackers[trackers_number].yaw; | |
552 | + result[ObjCount].pitch = trackers[trackers_number].pitch; | |
553 | + //-------------------------------------------------------- | |
554 | + } | |
555 | +#if _Debug | |
556 | + printf("trackers_number = %d, trackers.size() = %d, update: index = %d, id = %d, (%d, %d), (%d, %d)\n", trackers_number, trackers.size(), result[ObjCount].index, result[ObjCount].id, result[ObjCount].left, result[ObjCount].top, result[ObjCount].right, result[ObjCount].bottom); | |
557 | +#endif | |
558 | + ObjCount++; | |
559 | + } | |
560 | +#endif | |
561 | + trackers_number++;//共多少条轨迹 | |
562 | + } | |
563 | + } | |
564 | + else | |
565 | + { | |
566 | + for (int trackers_number = 0; trackers_number < trackers.size() && ObjCount < MAX_OBJ_COUNT; trackers_number++) | |
567 | + { | |
568 | + if (trackers[trackers_number].id == -1) | |
569 | + trackers[trackers_number].id = trackcount++; | |
570 | + result[trackers_number].num = trackers[trackers_number].frame_count; | |
571 | + bbox = trackers[trackers_number].get_state(); | |
572 | + result[trackers_number].id = trackers[trackers_number].id; | |
573 | + result[trackers_number].left = bbox[0]; // bbout[i][0]; | |
574 | + result[trackers_number].top = bbox[1]; //bbout[i][1]; | |
575 | + result[trackers_number].right = bbox[2]; //bbout[i][2]; | |
576 | + result[trackers_number].bottom = bbox[3]; //bbout[i][3]; | |
577 | + result[trackers_number].confidence = trackers[trackers_number].score; // bbout[i][4]; | |
578 | + result[trackers_number].index = trackers[trackers_number].cls;//bbox[5] - 1;// trackers[trackers_number].cls - 1; // bbout[i][5] - 1; | |
579 | + result[trackers_number].center_x = (int)(result[trackers_number].left + (result[trackers_number].right - result[trackers_number].left) * 0.5); // 中心点 add by 20170227 | |
580 | + result[trackers_number].center_y = (int)(result[trackers_number].top + (result[trackers_number].bottom - result[trackers_number].top) * 0.5); // 中心点 | |
581 | + | |
582 | + if (copy_ldmk)//存入关键点信息 | |
583 | + { | |
584 | + for (int m = 0; m < 25; ++m) | |
585 | + { | |
586 | + result[trackers_number].landmark_point[m].x_ = trackers[trackers_number].ldmk[2 * m]; | |
587 | + result[trackers_number].landmark_point[m].y_ = trackers[trackers_number].ldmk[2 * m + 1]; | |
588 | + } | |
589 | + // added by zsh 姿态角信息--------------------------------------- | |
590 | + result[trackers_number].roll = trackers[trackers_number].roll; | |
591 | + result[trackers_number].yaw = trackers[trackers_number].yaw; | |
592 | + result[trackers_number].pitch = trackers[trackers_number].pitch; | |
593 | + //-------------------------------------------------------------- | |
594 | + } | |
595 | + | |
596 | + result[ObjCount].snap_flag = 0; // 中心点 | |
597 | + | |
598 | + ObjCount++; | |
599 | + } | |
600 | + } | |
601 | + | |
602 | + //---------------------------注释掉了这步操作 用了新的绘制轨迹的函数 需要绘制调用addTracker(Mat *img)方法 by lm---------------------------------------------/ | |
603 | + //addTracker(result, ObjCount); | |
604 | + | |
605 | + frame_count += 1; //帧数加一 | |
606 | + return ObjCount; | |
607 | + | |
608 | +} | |
383 | 609 | |
384 | 610 | //---------------------------利用trackers中的history 绘制路径 -by lm ---------------------------------------------/ |
385 | 611 | //固定长度的轨迹,采用循环队列,仅保存目前最前N length的轨迹,避免对于停留在画面中目标 导致的内存一直增长 | ... | ... |
src/ai_engine_module/sort/Sort.h
... | ... | @@ -47,6 +47,7 @@ public: |
47 | 47 | Sort(); |
48 | 48 | int update(bool isUseDet, bool copy_ldmk, vector< vector<float> > &dets, det_objinfo *result, vector<int> &deleteObjectID); |
49 | 49 | int update_v2(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLen, vector< vector<float> > &dets, det_objinfo *result, vector<int> &deleteObjectID); // added by zsh 220719 |
50 | + int update_v3(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLen, vector< vector<float> > &dets, det_objinfo *result, vector<int> &deleteObjectID); | |
50 | 51 | void Release(); |
51 | 52 | void ReSet(); |
52 | 53 | void Pause(); | ... | ... |
src/ai_engine_module/traffic_light_process.cpp
... | ... | @@ -454,8 +454,11 @@ namespace ai_engine_module |
454 | 454 | // LOG_TRACE("task id is {} algor type is {} obj_id {}", task_id, int(algor_type), objId); |
455 | 455 | if (algor_type == algorithm_type_t::PERSON_RUNNING_REDLIGHTS && static_cast<det_class_label_t>(det_result.box.cls) != det_class_label_t::HUMAN) |
456 | 456 | continue; |
457 | - if (algor_type == algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS && (static_cast<det_class_label_t>(det_result.box.cls) != det_class_label_t::MOTOCYCLE || | |
458 | - static_cast<det_class_label_t>(det_result.box.cls) != det_class_label_t::BICYCLE)) | |
457 | + // if (algor_type == algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS && (static_cast<det_class_label_t>(det_result.box.cls) != det_class_label_t::MOTOCYCLE || | |
458 | + // static_cast<det_class_label_t>(det_result.box.cls) != det_class_label_t::BICYCLE)) | |
459 | + // continue; | |
460 | + | |
461 | + if (algor_type == algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS && static_cast<det_class_label_t>(det_result.box.cls) == det_class_label_t::HUMAN) | |
459 | 462 | continue; |
460 | 463 | |
461 | 464 | auto& e = id_to_mn_[obj_key]; | ... | ... |
src/ai_platform/MultiSourceProcess.cpp
... | ... | @@ -869,7 +869,7 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){ |
869 | 869 | |
870 | 870 | /* 一级检测器,内部已完成跟踪操作 */ |
871 | 871 | vpt_process.process_gpu(vpt_interest_imgs.data(), vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // do det & track. |
872 | - | |
872 | + // vpt_process.process_gpu(vpt_interest_imgs.data(), vec_vptMem, vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // debug | |
873 | 873 | m_snapshot_reprocessing->screen_effective_snapshot(vptResult); |
874 | 874 | |
875 | 875 | #ifndef VEHICLE_MULTI_BOXES |
... | ... | @@ -1698,6 +1698,27 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, |
1698 | 1698 | } |
1699 | 1699 | |
1700 | 1700 | |
1701 | + // 推送轨迹结束的目标用于数量统计 | |
1702 | + { | |
1703 | + const OBJ_VALUES obj_value = it->second; | |
1704 | + std::vector<video_object_snapshot> algo_results; | |
1705 | + std::vector<int> algorithm_types; | |
1706 | + algorithm_types.push_back((int)algorithm_type_t::FLOW_STATISTICS); | |
1707 | +#ifdef POST_USE_RABBITMQ | |
1708 | + video_object_snapshot new_obj_ss_info; | |
1709 | + new_obj_ss_info.analysisRes = nullptr; | |
1710 | + new_obj_ss_info.object_id = obj_key.obj_id; | |
1711 | + new_obj_ss_info.obj_info.set_data(obj_value.snapShots[1].index.index, obj_value.snapShots[1].confidence, 0, 0, 0, 0); | |
1712 | + strcpy(new_obj_ss_info.task_id, obj_key.video_id.c_str()); | |
1713 | + strcpy(new_obj_ss_info.video_image_path, ""); | |
1714 | + strcpy(new_obj_ss_info.snapshot_image_path, ""); | |
1715 | + algo_results.push_back(new_obj_ss_info); | |
1716 | + auto json_str = helpers::gen_json::gen_village_json(task_id, obj_key.obj_id, algorithm_types, algo_results, ""); | |
1717 | + mq_manager_->publish(mq_type_t::ALARM_MQ, json_str.c_str(), true); | |
1718 | +#endif | |
1719 | + } | |
1720 | + | |
1721 | + | |
1701 | 1722 | if (village_alarm) { |
1702 | 1723 | const OBJ_VALUES obj_value = it->second; |
1703 | 1724 | std::string cur_timestamp_ms = std::to_string(helpers::timer::get_cur_time_ms()); | ... | ... |
src/ai_platform/header.h
... | ... | @@ -41,6 +41,7 @@ enum class algorithm_type_t { |
41 | 41 | NONMOTOR_VEHICLE_SNAPSHOT = 401, |
42 | 42 | TAKEAWAY_MEMBER_CLASSIFICATION = 402, |
43 | 43 | |
44 | + FLOW_STATISTICS = 500, // 用于数量统计 | |
44 | 45 | NONMOTOR_VEHICLE_NOHELMET = 501,// 电动/摩托车不戴头盔 |
45 | 46 | NONMOTOR_VEHICLE_OVERMAN = 502, // 电动/摩托车超员 |
46 | 47 | TRICYCLE_MANNED = 503, // 三轮车载人 | ... | ... |
src/demo/demo.cpp
... | ... | @@ -774,7 +774,8 @@ string createTask(void *handle, std::vector<algorithm_type_t> algor_vec, int gi, |
774 | 774 | tparam.ipc_url = "/data/share/data/燕高路口高点_CVR_2015-12-30_09-00-00_2015-12-30.mp4"; |
775 | 775 | break; |
776 | 776 | case 9: |
777 | - tparam.ipc_url = "/opt/share/data/1-00000002d55_h265.mp4"; | |
777 | + // tparam.ipc_url = "/opt/share/data/1-00000002d55_h265.mp4"; | |
778 | + tparam.ipc_url = "/data/share/data/燕高路口高点_CVR_2015-12-30_09-00-00_2015-12-30.mp4"; | |
778 | 779 | break; |
779 | 780 | case 10: |
780 | 781 | tparam.ipc_url = "/opt/share/data/1-00000002d55.mp4"; |
... | ... | @@ -894,7 +895,7 @@ void test_gpu(int gpuID){ |
894 | 895 | |
895 | 896 | std::vector<algorithm_type_t> algor_vec2 = {algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET, algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN, algorithm_type_t::TRICYCLE_MANNED, algorithm_type_t::TRUCK_MANNED, algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE, |
896 | 897 | algorithm_type_t::NONMOTOR_VEHICLE_REFIT, algorithm_type_t::PERSON_RUNNING_REDLIGHTS, algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS}; |
897 | - std::vector<algorithm_type_t> algor_vec3 = {algorithm_type_t::FACE_SNAPSHOT}; | |
898 | + std::vector<algorithm_type_t> algor_vec3 = {algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN}; | |
898 | 899 | |
899 | 900 | /* |
900 | 901 | int repeat_num = 1000; |
... | ... | @@ -921,7 +922,7 @@ void test_gpu(int gpuID){ |
921 | 922 | createTask(handle, algor_vec2, 6); |
922 | 923 | createTask(handle, algor_vec2, 7); |
923 | 924 | createTask(handle, algor_vec2, 8); |
924 | - // createTask(handle, algor_vec, 9); | |
925 | + createTask(handle, algor_vec2, 9); | |
925 | 926 | // createTask(handle, algor_vec, 10); |
926 | 927 | // createTask(handle, algor_vec, 11); |
927 | 928 | // createTask(handle, algor_vec, 12); | ... | ... |