Commit fa8183035cd924444e5c5fcfba9f11f3e6b4cb7e
1 parent
b5aaf53a
增加闯红灯功能(特定场景);优化货车载人效果(检测框行人及非机动车过滤)
Showing
17 changed files
with
995 additions
and
36 deletions
bin/libSYTSLSystemInfoNativeJNI.so
No preview for this file type
bin/libtraffic_light_vdec.so
0 → 100755
No preview for this file type
bin/models/village/trlight_det_310p.om
0 → 100644
No preview for this file type
src/Makefile
@@ -38,7 +38,7 @@ lib=-lacl_dvpp -lascendcl -lacl_dvpp_mpi -lruntime -lascendalog -lc_sec -lmsprof | @@ -38,7 +38,7 @@ lib=-lacl_dvpp -lascendcl -lacl_dvpp_mpi -lruntime -lascendalog -lc_sec -lmsprof | ||
38 | -lplatform -lgraph_base -lqos_manager | 38 | -lplatform -lgraph_base -lqos_manager |
39 | 39 | ||
40 | LIBS= -L $(SPDLOG_ROOT)/lib -l:libspdlog.a \ | 40 | LIBS= -L $(SPDLOG_ROOT)/lib -l:libspdlog.a \ |
41 | - -L $(DEPEND_DIR) -lvpt_det_vdec -lsycheck -lface_det_vdec -lhs_tri_process -lhs_truck_process -lphone_motor_det -lhcp_vdec -lmotor_rainshed_vdec -lhs_motor_process\ | 41 | + -L $(DEPEND_DIR) -lvpt_det_vdec -lsycheck -lface_det_vdec -lhs_tri_process -lhs_truck_process -lphone_motor_det -lhcp_vdec -lmotor_rainshed_vdec -ltraffic_light_vdec -lhs_motor_process\ |
42 | -L $(OPENCV_ROOT)/lib -lopencv_world\ | 42 | -L $(OPENCV_ROOT)/lib -lopencv_world\ |
43 | -L $(JSON_ROOT)/lib -ljsoncpp \ | 43 | -L $(JSON_ROOT)/lib -ljsoncpp \ |
44 | -L $(FFMPEG_ROOT)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \ | 44 | -L $(FFMPEG_ROOT)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \ |
src/ai_engine_module/ai_engine_module.h
0 → 100644
1 | +#pragma once | ||
2 | + | ||
3 | +#include "./VPTProcess.h" | ||
4 | +#include "./face_det_ai_engine.h" | ||
5 | +#include "./pedestrian_vehicle_retrograde.h" | ||
6 | +#include "./pedestrian_vehicle_trespass.h" | ||
7 | +#include "./tricycle_manned_process.h" | ||
8 | +#include "./truck_manned_process.h" | ||
9 | +#include "./motocycle_hs_process.h" | ||
10 | +#include "./motocycle_refit_phone_process.h" | ||
11 | +#include "./motocycle_phone_process.h" | ||
12 | +#include "./motocycle_refit_process.h" | ||
13 | +#include "./traffic_light_process.h" | ||
0 | \ No newline at end of file | 14 | \ No newline at end of file |
src/ai_engine_module/traffic_light_det.h
0 → 100644
1 | +/******************************************************************************************* | ||
2 | +* Version: triffic_light_det_x64_v0.0.1 | ||
3 | +* CopyRight: 中科视语(北京)科技有限公司 | ||
4 | +* UpdateDate: 20230922 | ||
5 | +* Content:头肩检测_货车 | ||
6 | +********************************************************************************************/ | ||
7 | +#ifndef TRAFFIC_LIGHT_H_ | ||
8 | +#define TRAFFIC_LIGHT_H_ | ||
9 | + | ||
10 | +#ifdef _MSC_VER | ||
11 | +#ifdef TRAFFIC_LIGHT_EXPORTS | ||
12 | +#define TRAFFIC_LIGHT_API __declspec(dllexport) | ||
13 | +#else | ||
14 | +#define TRAFFIC_LIGHT_API __declspec(dllimport) | ||
15 | +#endif | ||
16 | +#else | ||
17 | +#define TRAFFIC_LIGHT_API __attribute__ ((visibility ("default"))) | ||
18 | +#endif | ||
19 | + | ||
20 | +#include "sy_common.h" | ||
21 | + | ||
22 | +#define MAX_OBJ_COUNT 1000 | ||
23 | + | ||
24 | +#ifdef __cplusplus | ||
25 | +extern "C" | ||
26 | +{ | ||
27 | +#endif | ||
28 | + | ||
29 | + typedef struct traffic_light_info //结果结构体 | ||
30 | + { | ||
31 | + int left; | ||
32 | + int top; | ||
33 | + int right; | ||
34 | + int bottom; | ||
35 | + double confidence; // 置信度 | ||
36 | + int index; // 类别索引 | ||
37 | + }traffic_light_info; | ||
38 | + | ||
39 | + typedef struct traffic_light_result | ||
40 | + { | ||
41 | + traffic_light_info objinfo[MAX_OBJ_COUNT]; | ||
42 | + int objcount; | ||
43 | + }; | ||
44 | + | ||
45 | + typedef struct traffic_light_param | ||
46 | + { | ||
47 | + //int mode; //运行模式 GPU_MODE 或者 CPU_MODE | ||
48 | + int devId; //运行卡号 GPU模式下有效 | ||
49 | + char* modelNames; | ||
50 | + float thresld; //检测阈值 默认为0.3 | ||
51 | + | ||
52 | + //int engine; //指定运行引擎(ENGINE_MCAFFE2 / ENGINE_TENSORRT) | ||
53 | + //int max_batch; //ָ指定trt最大batch数 | ||
54 | + //char* trt_serialize_file; | ||
55 | + //traffic_light_param() :mode(DEVICE_GPU), gpuid(0), thresld(0.4), engine(ENGINE_MCAFFE2), max_batch(10){}; | ||
56 | + }traffic_light_param; | ||
57 | + | ||
58 | + /************************************************************************* | ||
59 | + * FUNCTION: hst_init | ||
60 | + * PURPOSE: 初始化 | ||
61 | + * PARAM: | ||
62 | + [in] handle -处理句柄 | ||
63 | + [in] param -初始化参数 | ||
64 | + * RETURN: handle | ||
65 | + * NOTES:成功(0)或者错误代码(<0) | ||
66 | + *************************************************************************/ | ||
67 | + TRAFFIC_LIGHT_API int traffic_light_init(void **handle, traffic_light_param param); | ||
68 | + TRAFFIC_LIGHT_API int traffic_light_process_batch(void * handle, sy_img *image_data_array, int batchsize, traffic_light_result *result); | ||
69 | + | ||
70 | + /************************************************************************* | ||
71 | + * FUNCTION: hst_release | ||
72 | + * PURPOSE: 资源释放 | ||
73 | + * PARAM: | ||
74 | + [in] handle - 处理句柄 | ||
75 | + * RETURN: NULL | ||
76 | + * NOTES: | ||
77 | + *************************************************************************/ | ||
78 | + TRAFFIC_LIGHT_API void traffic_light_release(void **handle); | ||
79 | + | ||
80 | + | ||
81 | + /************************************************************************* | ||
82 | + * FUNCTION: hst_process_gpu | ||
83 | + * PURPOSE: | ||
84 | + * PARAM: | ||
85 | + [in] handle - 处理句柄 | ||
86 | + [in] rgb - 图片数据(3通道BGR数据 cv::Mat格式) | ||
87 | + [in] width - 图片宽度 | ||
88 | + [in] height - 图片高度 | ||
89 | + [in] result - 搜索结果,在外部申请足够内存 | ||
90 | + * RETURN: -1:图像错误; 其他:检测到的个数 | ||
91 | + * NOTES: | ||
92 | + *************************************************************************/ | ||
93 | + TRAFFIC_LIGHT_API int traffic_light_process(void * handle, sy_img image, traffic_light_result *result); | ||
94 | + | ||
95 | + /************************************************************************* | ||
96 | + * FUNCTION: hst_getversion | ||
97 | + * PURPOSE: 释放 | ||
98 | + * PARAM: NULL | ||
99 | + * RETURN: 版本号 | ||
100 | + * NOTES: | ||
101 | + *************************************************************************/ | ||
102 | + TRAFFIC_LIGHT_API const char * traffic_light_getversion(); | ||
103 | + | ||
104 | +#ifdef __cplusplus | ||
105 | +}; | ||
106 | +#endif | ||
107 | + | ||
108 | +#endif |
src/ai_engine_module/traffic_light_process.cpp
0 → 100644
1 | +#include <algorithm> | ||
2 | +#include "./traffic_light_process.h" | ||
3 | +#include <cmath> | ||
4 | +#include "../decoder/interface/DeviceMemory.hpp" | ||
5 | +#include "../common/logger.hpp" | ||
6 | +#include "../ai_platform/mvpt_process_assist.h" | ||
7 | + | ||
8 | +#if 0 | ||
9 | +#include "opencv2/opencv.hpp" | ||
10 | +#include "opencv2/imgcodecs/legacy/constants_c.h" | ||
11 | +#endif | ||
12 | + | ||
13 | +namespace ai_engine_module | ||
14 | +{ | ||
15 | + namespace traffic_light_process | ||
16 | + { | ||
17 | + static std::set<algorithm_type_t> algor_type_list_ = { | ||
18 | + algorithm_type_t::PERSON_RUNNING_REDLIGHTS, | ||
19 | + algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS, | ||
20 | + }; | ||
21 | + | ||
22 | + inline bool is_valid_label(const label_t &label) { | ||
23 | + return ((label == label_t::red)); | ||
24 | + } | ||
25 | + | ||
26 | + std::set<algorithm_type_t> task_id_to_algorithm_type_seq(const task_id_t &task_id, | ||
27 | + task_param_manager *const task_param) { | ||
28 | + std::set<algorithm_type_t> seq; | ||
29 | + auto &&algor_map = task_param->get_task_other_param(task_id); | ||
30 | + if (algor_map) { | ||
31 | + // LOG_TRACE("task id is {} size algor type {}", task_id, algor_map->size()); | ||
32 | + for (auto iter = algor_map->begin(); iter != algor_map->end(); ++iter) { | ||
33 | + if (algor_type_list_.count(iter->first) > 0) | ||
34 | + seq.emplace(iter->first); | ||
35 | + } | ||
36 | + } | ||
37 | + return seq; // N(RVO) | ||
38 | + } | ||
39 | + | ||
40 | + bool is_valid_box(const int top, const int left, const int right, const int bottom, const float score, | ||
41 | + const algorithm_type_t &algor_type, | ||
42 | + const task_param_manager::algo_param_type_t_ *params_ptr = nullptr) { | ||
43 | + if (!params_ptr) | ||
44 | + return false; | ||
45 | + | ||
46 | + if (!snapshot_legal_inarea(params_ptr->basic_param->algor_valid_rect, left, top, right, bottom)) | ||
47 | + return false; | ||
48 | + | ||
49 | + if (params_ptr->algor_param == nullptr) | ||
50 | + return false; | ||
51 | + | ||
52 | + | ||
53 | + const unsigned width = right - left; | ||
54 | + const unsigned height = bottom - top; | ||
55 | + | ||
56 | + if (width == 0 || height == 0) | ||
57 | + return false; | ||
58 | + | ||
59 | + //! TODO: use switch to replace. | ||
60 | + using data_t = algor_config_param_manned_incident; | ||
61 | + data_t *algor_params_ptr = (data_t *) (params_ptr->algor_param); | ||
62 | + | ||
63 | + if ((width < algor_params_ptr->obj_min_width || height < algor_params_ptr->obj_min_height || score < algor_params_ptr->obj_confidence_threshold)) | ||
64 | + return false; | ||
65 | + | ||
66 | + return true; | ||
67 | + } | ||
68 | + | ||
69 | + vector<tr_point> Mbuild_area(vector<int> args) | ||
70 | + { | ||
71 | + vector<tr_point> result; | ||
72 | + int points_check = args.size(); | ||
73 | + //需x y作为一组,是偶数 | ||
74 | + if (points_check % 2 == 1) { | ||
75 | + LOG_ERROR("points need x and y, but only get one"); | ||
76 | + exit(0); | ||
77 | + } | ||
78 | + | ||
79 | + for (int i = 0; i < points_check; i++) { | ||
80 | + if (i % 2 == 0) { | ||
81 | + tr_point tmp_point; | ||
82 | + tmp_point.x = args[i]; | ||
83 | + result.push_back(tmp_point); | ||
84 | + } | ||
85 | + else { | ||
86 | + result[result.size() - 1].y = args[i]; | ||
87 | + } | ||
88 | + } | ||
89 | + | ||
90 | + return result; | ||
91 | + } | ||
92 | + | ||
93 | + bool McheckPointPolygon(vector<tr_point> tr_boxes, tr_point pCur) { | ||
94 | + //任意四边形有4个顶点 | ||
95 | + int nCount = tr_boxes.size(); | ||
96 | + tr_point RectPoints[MAX_LANE_NUM]; | ||
97 | + | ||
98 | + // std::cout << "ponits: "; | ||
99 | + for (int i = 0; i < nCount; i++) { | ||
100 | + RectPoints[i] = tr_boxes[i]; | ||
101 | + // std::cout << tr_boxes[i].x << " " << tr_boxes[i].y << " "; | ||
102 | + } | ||
103 | + // std::cout << std::endl; | ||
104 | + | ||
105 | + int nCross = 0; | ||
106 | + pCur.y += 0.1; | ||
107 | + for (int i = 0; i < nCount; i++) { | ||
108 | + //依次取相邻的两个点 | ||
109 | + tr_point pStart = RectPoints[i]; | ||
110 | + tr_point pEnd = RectPoints[(i + 1) % nCount]; | ||
111 | + | ||
112 | + //相邻的两个点是平行于x轴的,肯定不相交,忽略 | ||
113 | + if (pStart.y == pEnd.y) continue; | ||
114 | + | ||
115 | + //交点在pStart,pEnd的延长线上,pCur肯定不会与pStart.pEnd相交,忽略 | ||
116 | + if (pCur.y < min(pStart.y, pEnd.y) || pCur.y > max(pStart.y, pEnd.y)) continue; | ||
117 | + | ||
118 | + //求当前点和x轴的平行线与pStart,pEnd直线的交点的x坐标 | ||
119 | + double x = (double)(pCur.y - pStart.y) * (double)(pEnd.x - pStart.x) / (double)(pEnd.y - pStart.y) + pStart.x; | ||
120 | + | ||
121 | + //若x坐标大于当前点的坐标,则有交点 | ||
122 | + if (x > pCur.x) nCross++; | ||
123 | + } | ||
124 | + | ||
125 | + // 单边交点为偶数,点在多边形之外 | ||
126 | + return (nCross % 2 == 1); | ||
127 | + } | ||
128 | + | ||
129 | +#if 0 | ||
130 | + void CvtYuvToBgr(sy_img src, sy_img dst) { | ||
131 | + const int uvStart = src.w_ * src.h_; | ||
132 | + for (int h = 0; h < dst.h_; h++) { | ||
133 | + for (int w = 0; w < dst.w_; w++) { | ||
134 | + int uvIndex = h / 2 * src.w_ + w - w % 2; | ||
135 | + unsigned char y = *(src.data_ + w + h * src.w_); | ||
136 | + unsigned char u = *(src.data_ + uvStart + uvIndex); | ||
137 | + unsigned char v = *(src.data_ + uvStart + uvIndex + 1); | ||
138 | + | ||
139 | + int r = (int)(y + 1.402 * (v - 128)); | ||
140 | + int g = (int)(y - 0.34414 * (u - 128) - 0.71414 * (v - 128)); | ||
141 | + int b = (int)(y + 1.772 * (u -128)); | ||
142 | + | ||
143 | + if (r > 255) r = 255; | ||
144 | + if (g > 255) g = 255; | ||
145 | + if (b > 255) b = 255; | ||
146 | + if (r < 0) r = 0; | ||
147 | + if (g < 0) g = 0; | ||
148 | + if (b < 0) b = 0; | ||
149 | + *(dst.data_ + h * dst.w_ * 3 + w * 3) = b; | ||
150 | + *(dst.data_ + h * dst.w_ * 3 + w * 3 + 1) = g; | ||
151 | + *(dst.data_ + h * dst.w_ * 3 + w * 3 + 2) = r; | ||
152 | + } | ||
153 | + } | ||
154 | + } | ||
155 | +#endif | ||
156 | + | ||
157 | + TrafficLightProcess::TrafficLightProcess() | ||
158 | + : task_param_manager_(nullptr) | ||
159 | + { | ||
160 | + | ||
161 | + } | ||
162 | + | ||
163 | + TrafficLightProcess::~TrafficLightProcess() | ||
164 | + { | ||
165 | + if (tools_) { | ||
166 | + traffic_light_release(&tools_); | ||
167 | + tools_ = nullptr; | ||
168 | + } | ||
169 | + if (m_algorthim_ctx) { | ||
170 | + aclrtDestroyContext(m_algorthim_ctx); | ||
171 | + } | ||
172 | + } | ||
173 | + | ||
174 | + bool TrafficLightProcess::init(int gpu_id, string models_dir) | ||
175 | + { | ||
176 | + init_ = false; | ||
177 | + | ||
178 | + string model_path = models_dir + "/models/village/trlight_det_310p.om" ; | ||
179 | + LOG_INFO("traffic_light 版本:{} 模型路径:{}", traffic_light_getversion(), model_path); | ||
180 | + | ||
181 | + traffic_light_param param; | ||
182 | + char modelNames[100]; | ||
183 | + strcpy(modelNames, model_path.c_str()); | ||
184 | + param.modelNames = modelNames; | ||
185 | + param.thresld = 0.25; | ||
186 | + param.devId = gpu_id; | ||
187 | + | ||
188 | + m_devId = param.devId; | ||
189 | + ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); | ||
190 | + ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); | ||
191 | + | ||
192 | + int status; | ||
193 | + if (!(init_ = (0 == (status = traffic_light_init(&tools_, param))))) | ||
194 | + LOG_ERROR("Init TrafficLightProcessSdk failed error code is {}", status); | ||
195 | + else | ||
196 | + if (!task_param_manager_) | ||
197 | + task_param_manager_ = task_param_manager::getInstance(); | ||
198 | + return init_; | ||
199 | + } | ||
200 | + | ||
201 | + | ||
202 | + bool TrafficLightProcess::check_initied() | ||
203 | + { | ||
204 | + if (!init_) | ||
205 | + LOG_ERROR("[%s:%d] call init function please.", __FILE__, __LINE__); | ||
206 | + return init_; | ||
207 | + } | ||
208 | + | ||
209 | + | ||
210 | + void TrafficLightProcess::force_release_result(const task_id_t& task_id) { | ||
211 | + for (auto iter = id_to_result_.begin(); iter != id_to_result_.end();) { | ||
212 | + const auto& key = iter->first; | ||
213 | + if (key.task_id == task_id) { | ||
214 | + auto& value = iter->second; | ||
215 | + if (value.origin_img_desc != nullptr) { | ||
216 | + VPCUtil::vpc_pic_desc_release(value.origin_img_desc); | ||
217 | + } | ||
218 | + | ||
219 | + if (value.roi_img_desc != nullptr) { | ||
220 | + VPCUtil::vpc_pic_desc_release(value.roi_img_desc); | ||
221 | + } | ||
222 | + iter = id_to_result_.erase(iter); | ||
223 | + } | ||
224 | + else { | ||
225 | + ++iter; | ||
226 | + } | ||
227 | + | ||
228 | + } | ||
229 | + } | ||
230 | + | ||
231 | + std::shared_ptr<results_data_t> TrafficLightProcess::get_result_by_objectid(const id_t& id, bool do_erase) | ||
232 | + { | ||
233 | + auto it = id_to_result_.find(id); | ||
234 | + if (it == id_to_result_.end()) | ||
235 | + return std::shared_ptr<results_data_t>(nullptr); | ||
236 | + std::shared_ptr<results_data_t> res = std::make_shared<results_data_t>(it->second); | ||
237 | + if (do_erase) | ||
238 | + id_to_result_.erase(id); | ||
239 | + return res; | ||
240 | + } | ||
241 | + | ||
242 | + bool TrafficLightProcess::update_mstreams(const std::vector<task_id_t>& taskIds, vector<sy_img> src_interest_imgs, vector<DeviceMemory*> vec_det_input_images, const std::vector<onelevel_det_result> &det_results) | ||
243 | + { | ||
244 | + if (!check_initied()) | ||
245 | + return false; | ||
246 | + | ||
247 | + if (det_results.empty()) | ||
248 | + { | ||
249 | + LOG_DEBUG("detection result is empty."); | ||
250 | + return false; | ||
251 | + } | ||
252 | + | ||
253 | + struct stream_idx_and_algor_seq_t { | ||
254 | + unsigned stream_idx; | ||
255 | + std::set<algorithm_type_t> algors; | ||
256 | + }; | ||
257 | + | ||
258 | + int n_images = det_results.size(); // or n_stream | ||
259 | + | ||
260 | + unsigned flattened_idx = 0; | ||
261 | + std::map<int, int> flattened_idx_to_batch_idx; | ||
262 | + //! 记录每个box对应的算法以及流id. | ||
263 | + std::map<unsigned, stream_idx_and_algor_seq_t> flattened_idx_to_algor_seq; | ||
264 | + | ||
265 | + /* 1. Crop & keep some interest class. */ | ||
266 | + auto taskId_iter = taskIds.begin(); | ||
267 | + std::vector<sy_img> flattened_imgs(0); | ||
268 | + std::vector<vpc_img_info> flattened_vpc_imgs(0); | ||
269 | + std::vector<input_data_wrap_t> flattened_interest_data(0); // | ||
270 | + VPCUtil* pVpcUtil = VPCUtil::getInstance(); | ||
271 | + for (int n = 0; n < n_images; ++n) | ||
272 | + { | ||
273 | + int n_interest_obj = 0; | ||
274 | + auto& src_img = vec_det_input_images[n]; | ||
275 | + int src_img_w = src_img->getWidth(); | ||
276 | + int src_img_h = src_img->getHeight(); | ||
277 | + | ||
278 | + auto& boxes_of_one_image = det_results[n].obj; | ||
279 | + for (int i = 0; i < det_results[n].obj_count; ++i) | ||
280 | + { | ||
281 | + auto& box = boxes_of_one_image[i]; | ||
282 | + if (static_cast<det_class_label_t>(box.index) == det_class_label_t::MOTOCYCLE || static_cast<det_class_label_t>(box.index) == det_class_label_t::BICYCLE || static_cast<det_class_label_t>(box.index) == det_class_label_t::HUMAN) | ||
283 | + { | ||
284 | + auto& taskId = *taskId_iter; | ||
285 | + input_data_wrap_t data; | ||
286 | + int top = std::max(int(box.top - (IMAGE_CROP_EXPAND_RATIO * box.top)), 0); | ||
287 | + int left = std::max(int(box.left - (IMAGE_CROP_EXPAND_RATIO * box.left)), 0); | ||
288 | + int right = std::min(int(box.right + (IMAGE_CROP_EXPAND_RATIO * box.right)), src_img_w); | ||
289 | + int bottom = std::min(int(box.bottom + (IMAGE_CROP_EXPAND_RATIO * box.bottom)), src_img_h); | ||
290 | + | ||
291 | + //! loop per algor from set. | ||
292 | + stream_idx_and_algor_seq_t stream_idx_and_algor_seq{n, {}}; | ||
293 | + std::set<algorithm_type_t> algorithm_type_seq = task_id_to_algorithm_type_seq(taskId, | ||
294 | + task_param_manager_); // N(RVO). | ||
295 | + | ||
296 | + for (auto algor_iter = algorithm_type_seq.begin();algor_iter != algorithm_type_seq.end(); ++algor_iter) { | ||
297 | + const algorithm_type_t algor_type = *algor_iter; | ||
298 | + auto &&algor_param_wrap = task_param_manager_->get_task_other_param(taskId, algor_type); | ||
299 | + if (!algor_param_wrap) { | ||
300 | + LOG_ERROR("{} is nullptr when get algor param from task_param", taskId.c_str()); | ||
301 | + continue; | ||
302 | + } | ||
303 | + | ||
304 | + if (!is_valid_box(top, left, right, bottom, box.confidence, algor_type, algor_param_wrap)) | ||
305 | + continue; | ||
306 | + | ||
307 | + //DEBUG增加多边形区域选择及判断================================================================ | ||
308 | + tr_point curpos; | ||
309 | + curpos.x = (left + right) * 0.5; curpos.y = bottom; | ||
310 | + vector<int> args = {1552,435,1756,537,1915,537,1915,499,1725,435}; //区域(泰兴黄桥锦润福府路口) | ||
311 | + // vector<int> args = {0,0,0,1080,1920,1080,1920,0}; //区域 | ||
312 | + vector<tr_point> tr_boxes = Mbuild_area(args); | ||
313 | + int cur_flag = McheckPointPolygon(tr_boxes, curpos); //cur_flag==true表示在区域内 | ||
314 | + if (!cur_flag) continue; | ||
315 | + //DEBUG END================================================================================== | ||
316 | + stream_idx_and_algor_seq.algors.emplace(algor_type); | ||
317 | + } | ||
318 | + | ||
319 | + if (stream_idx_and_algor_seq.algors.empty()) | ||
320 | + continue; | ||
321 | + | ||
322 | + int width = right - left; | ||
323 | + int height = bottom - top; | ||
324 | + | ||
325 | + data.box.top = top; data.box.left = left; | ||
326 | + data.box.right = right; data.box.bottom = bottom; | ||
327 | + data.box.score = box.confidence; data.box.cls = box.index; | ||
328 | + data.taskId = taskId; data.objId = box.id; | ||
329 | + | ||
330 | + // 抠图 | ||
331 | + video_object_info obj; | ||
332 | + strcpy(obj.task_id, taskId.c_str()); | ||
333 | + obj.object_id = box.id; | ||
334 | + obj.left = left; obj.top = top; | ||
335 | + obj.right = right; obj.bottom = bottom; | ||
336 | + | ||
337 | + vpc_img_info img_info = pVpcUtil->crop(src_img, obj); | ||
338 | + | ||
339 | + sy_img img; | ||
340 | + img.w_ = width; | ||
341 | + img.h_ = height; | ||
342 | + img.c_ = src_img->getChannel(); | ||
343 | + | ||
344 | + if (img_info.pic_desc != nullptr) { | ||
345 | + void *outputDataDev = acldvppGetPicDescData(img_info.pic_desc); | ||
346 | + img.data_ = reinterpret_cast<unsigned char*>(outputDataDev); | ||
347 | + } | ||
348 | + else { | ||
349 | + LOG_ERROR("Crop image NPU failed wh is [{}, {}] ltrb is [{} {} {} {}]", | ||
350 | + src_img_w, src_img_h, data.box.left, data.box.top, data.box.right, data.box.bottom); | ||
351 | + continue; | ||
352 | + } | ||
353 | + | ||
354 | + flattened_imgs.emplace_back(std::move(img)); | ||
355 | + flattened_vpc_imgs.emplace_back(std::move(img_info)); | ||
356 | + flattened_interest_data.emplace_back(std::move(data)); | ||
357 | + flattened_idx_to_algor_seq[flattened_idx] = std::move(stream_idx_and_algor_seq); | ||
358 | + flattened_idx_to_batch_idx[flattened_idx++] = n; | ||
359 | + } | ||
360 | + } | ||
361 | + ++taskId_iter; | ||
362 | + } | ||
363 | + | ||
364 | + int ret = aclrtSetCurrentContext(m_algorthim_ctx); | ||
365 | + if (ACL_SUCCESS != ret) { | ||
366 | + return false; | ||
367 | + } | ||
368 | + /* 2. collection result. */ | ||
369 | + int n_input_image = flattened_imgs.size(); | ||
370 | + int n_input_src_image = src_interest_imgs.size(); | ||
371 | + traffic_light_result model_results[n_input_src_image]; | ||
372 | + { | ||
373 | + int steps = (n_input_src_image + MAX_BATCH - 1) / MAX_BATCH; | ||
374 | + for (int step = 0; step < steps; ++step) | ||
375 | + { | ||
376 | + int offset = step * MAX_BATCH; | ||
377 | + int batch_size = (step == steps - 1) ? n_input_src_image - offset : MAX_BATCH; | ||
378 | + traffic_light_process_batch(tools_, src_interest_imgs.data() + offset, batch_size, model_results + offset); | ||
379 | + } | ||
380 | + } | ||
381 | + | ||
382 | + /* 3. postprocess. */ | ||
383 | + { | ||
384 | + for (int n = 0; n < n_input_image; ++n) | ||
385 | + { | ||
386 | + auto& det_result = flattened_interest_data[n]; | ||
387 | + auto& objId = det_result.objId; | ||
388 | + auto& task_id = det_result.taskId; | ||
389 | + | ||
390 | + auto &stream_idx_and_algor_seq = flattened_idx_to_algor_seq[n]; | ||
391 | + auto &algors = stream_idx_and_algor_seq.algors; | ||
392 | + // auto &steram_idx = stream_idx_and_algor_seq.stream_idx; | ||
393 | + | ||
394 | + const auto& src_img = vec_det_input_images[flattened_idx_to_batch_idx[n]]; | ||
395 | + auto &model_result = model_results[flattened_idx_to_batch_idx[n]]; | ||
396 | + int red_cnt = 0; //统计直行红灯个数 | ||
397 | + for (unsigned i = 0; i < model_result.objcount; ++i) { | ||
398 | + auto &box = model_result.objinfo[i]; | ||
399 | + const label_t label = static_cast<label_t>(box.index); | ||
400 | + if (!is_valid_label(label)) | ||
401 | + continue; | ||
402 | + if (box.left < 1200 || box.top < 159 || box.right > 1307 || box.bottom > 212) continue; // 限制红绿灯的出现位置(泰兴黄桥锦润福府路口) | ||
403 | + LOG_TRACE("task id is {} obj_id {} label {} index {} score {}", task_id, objId, label, box.index, box.confidence); | ||
404 | + red_cnt ++; | ||
405 | + } | ||
406 | +#if 0 | ||
407 | + if (red_cnt > 0) { | ||
408 | + sy_img img = src_interest_imgs[flattened_idx_to_batch_idx[n]]; | ||
409 | + int dataSize = img.w_ * img.h_ * 3 / 2; | ||
410 | + uint8_t* buffer = new uint8_t[dataSize]; | ||
411 | + uint8_t* imgBgr = new uint8_t[dataSize]; | ||
412 | + aclError aclRet = aclrtMemcpy(buffer, dataSize, img.data_, dataSize, ACL_MEMCPY_DEVICE_TO_HOST); | ||
413 | + | ||
414 | + sy_img imgyuv_local, tmpbgr; | ||
415 | + imgyuv_local.data_ = (unsigned char*)buffer; imgyuv_local.w_ = img.w_; imgyuv_local.h_ = img.h_; | ||
416 | + tmpbgr.w_ = img.w_; tmpbgr.h_ = img.h_; tmpbgr.data_ = imgBgr; | ||
417 | + CvtYuvToBgr(imgyuv_local, tmpbgr); | ||
418 | + | ||
419 | + cv::Mat cvImg = cv::Mat(tmpbgr.h_, tmpbgr.w_, CV_8UC3, tmpbgr.data_); | ||
420 | + string jpgSaveName1 = "result/oral/" + task_id + "_" + to_string(objId) + ".jpg"; | ||
421 | + cv::imwrite(jpgSaveName1, cvImg); | ||
422 | + for (unsigned i = 0; i < model_result.objcount; ++i) { | ||
423 | + cv::Point lt(model_result.objinfo[i].left, model_result.objinfo[i].top); | ||
424 | + cv::Point rb(model_result.objinfo[i].right, model_result.objinfo[i].bottom); | ||
425 | + cv::rectangle(cvImg, lt, rb, cv::Scalar(0, 0, 255), 3); | ||
426 | + | ||
427 | + char buffer[50]; int fontface = cv::FONT_HERSHEY_SIMPLEX; double scale = 0.8; int thickness = 2; int baseline = 0; | ||
428 | + snprintf(buffer, sizeof(buffer), "%d:%.2f", model_result.objinfo[i].index, model_result.objinfo[i].confidence); | ||
429 | + cv::Size text = cv::getTextSize(buffer, fontface, scale, thickness, &baseline); | ||
430 | + cv::putText(cvImg, buffer, lt - cv::Point(0, baseline), fontface, scale, cv::Scalar(0, 0, 255), thickness, 8); | ||
431 | + } | ||
432 | + string jpgSaveName2 = "result/draw/" + task_id + "_" + to_string(objId) + ".jpg"; | ||
433 | + cv::imwrite(jpgSaveName2, cvImg); | ||
434 | + | ||
435 | + delete[] buffer; buffer = NULL; | ||
436 | + delete[] imgBgr; imgBgr = NULL; | ||
437 | + } | ||
438 | +#endif | ||
439 | + | ||
440 | + for (auto algor_type_iter = algors.begin();algor_type_iter != algors.end(); ++algor_type_iter) { | ||
441 | + const algorithm_type_t algor_type = *algor_type_iter; | ||
442 | + | ||
443 | + auto &&algor_param_wrap = task_param_manager_->get_task_other_param(task_id, algor_type); | ||
444 | + if (!algor_param_wrap) { | ||
445 | + LOG_ERROR("{} is nullptr when get algor param from task_param", task_id); | ||
446 | + continue; | ||
447 | + } | ||
448 | + auto algor_param = ((algor_param_type)algor_param_wrap->algor_param); | ||
449 | + | ||
450 | + id_t obj_key = obj_key_t{ objId, task_id, algor_type}; | ||
451 | + if (id_to_result_.find(obj_key) != id_to_result_.end()) | ||
452 | + continue; | ||
453 | + | ||
454 | + // LOG_TRACE("task id is {} algor type is {} obj_id {}", task_id, int(algor_type), objId); | ||
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 | + 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)) | ||
459 | + continue; | ||
460 | + | ||
461 | + auto& e = id_to_mn_[obj_key]; | ||
462 | + ++e.m_frame; | ||
463 | + | ||
464 | + // 数量小于设定阈值不报警 | ||
465 | + if (red_cnt < 1) | ||
466 | + continue; | ||
467 | + | ||
468 | + { | ||
469 | + if (++e.n_frame == algor_param->n) | ||
470 | + { | ||
471 | + results_data_t result; | ||
472 | + { LOG_TRACE("task id is {} obj_id {} red_cnt {}", task_id, det_result.objId, red_cnt); | ||
473 | + result.box = det_result.box; | ||
474 | + result.taskId = det_result.taskId; | ||
475 | + result.objId = det_result.objId; | ||
476 | + result.algor_type = algor_type; | ||
477 | + // 原图 | ||
478 | + vpc_img_info src_img_info = VPCUtil::vpc_devMem2vpcImg(src_img); | ||
479 | + result.origin_img_desc = src_img_info.pic_desc; | ||
480 | + // 抠图--拷贝后赋值 | ||
481 | + void *outputDataDev = acldvppGetPicDescData(flattened_vpc_imgs[n].pic_desc); | ||
482 | + int nBufferSize = acldvppGetPicDescSize(flattened_vpc_imgs[n].pic_desc); | ||
483 | + | ||
484 | + void *devBuffer = nullptr; | ||
485 | + auto ret = acldvppMalloc(&devBuffer, nBufferSize); | ||
486 | + if (ret != ACL_SUCCESS) { | ||
487 | + LOG_ERROR("acldvppMalloc failed, size = %u, errorCode = %d.", nBufferSize, static_cast<int32_t>(ret)); | ||
488 | + return false; | ||
489 | + } | ||
490 | + aclrtMemcpy(devBuffer, nBufferSize, outputDataDev, nBufferSize, ACL_MEMCPY_DEVICE_TO_DEVICE); | ||
491 | + | ||
492 | + acldvppPicDesc *vpcInputDesc_= acldvppCreatePicDesc(); | ||
493 | + acldvppSetPicDescData(vpcInputDesc_, devBuffer); | ||
494 | + acldvppSetPicDescFormat(vpcInputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); | ||
495 | + acldvppSetPicDescWidth(vpcInputDesc_, acldvppGetPicDescWidth(flattened_vpc_imgs[n].pic_desc)); | ||
496 | + acldvppSetPicDescHeight(vpcInputDesc_, acldvppGetPicDescHeight(flattened_vpc_imgs[n].pic_desc)); | ||
497 | + acldvppSetPicDescWidthStride(vpcInputDesc_, acldvppGetPicDescWidthStride(flattened_vpc_imgs[n].pic_desc)); | ||
498 | + acldvppSetPicDescHeightStride(vpcInputDesc_, acldvppGetPicDescHeightStride(flattened_vpc_imgs[n].pic_desc)); | ||
499 | + acldvppSetPicDescSize(vpcInputDesc_, nBufferSize); | ||
500 | + | ||
501 | + result.roi_img_desc = vpcInputDesc_; //需复制 | ||
502 | + } | ||
503 | + id_to_result_.emplace(obj_key, std::move(result)); | ||
504 | + } | ||
505 | + } | ||
506 | + | ||
507 | + if (e.m_frame == algor_param->m) | ||
508 | + e.reset(); | ||
509 | + | ||
510 | + } | ||
511 | + | ||
512 | + VPCUtil::vpc_img_release(flattened_vpc_imgs[n]); //flattened_imgs[n].data_ | ||
513 | + | ||
514 | + } | ||
515 | + } | ||
516 | + | ||
517 | + return true; | ||
518 | + } | ||
519 | + | ||
520 | + } // namespace traffic_light_process | ||
521 | + | ||
522 | +} // namespace ai_engine_module | ||
523 | + |
src/ai_engine_module/traffic_light_process.h
0 → 100644
1 | +#pragma once | ||
2 | +#include <deque> | ||
3 | +#include <map> | ||
4 | +#include <vector> | ||
5 | +#include <memory> | ||
6 | +#include "../util/vpc_util.h" | ||
7 | +#include "../ai_platform/task_param_manager.h" | ||
8 | +#include "../ai_platform/macro_definition.h" | ||
9 | +#include "ai_engine_header.h" | ||
10 | +#include "traffic_light_det.h" | ||
11 | +#include "acl/acl.h" | ||
12 | +#include "acl/ops/acl_dvpp.h" | ||
13 | + | ||
14 | +#define MAX_BATCH 20 | ||
15 | +#define IMAGE_CROP_EXPAND_RATIO 0 | ||
16 | +#define MAX_OBJ_BOX_COUNT 100 | ||
17 | +#define MAX_LANE_NUM 100 | ||
18 | + | ||
19 | +namespace ai_engine_module | ||
20 | +{ | ||
21 | + namespace traffic_light_process | ||
22 | + { | ||
23 | + // typedef long id_t; | ||
24 | + using id_t = obj_key_t; | ||
25 | + using task_id_t = std::string; | ||
26 | + using algor_param_type = algor_config_param_manned_incident*; | ||
27 | + | ||
28 | + enum class label_t { | ||
29 | + PLACEHOLDER = -1, | ||
30 | + red = 0, //直行红灯 | ||
31 | + green = 1, //直行绿灯 | ||
32 | + yellow = 2, //直行黄灯 | ||
33 | + wred = 3, //转向红灯 | ||
34 | + wgreen = 4, //转向绿灯 | ||
35 | + wyellow = 5, //转向黄灯 | ||
36 | + pred = 6, //行人红灯 | ||
37 | + pyellow = 7, //行人黄灯 | ||
38 | + pgreen = 8, //行人绿灯 | ||
39 | + bred = 9, //自行车红灯 | ||
40 | + byellow = 10, //自行车黄灯 | ||
41 | + bgreen = 11, //自行车绿灯 | ||
42 | + no = 12, //灭灯 | ||
43 | + }; | ||
44 | + | ||
45 | + typedef struct input_data_wrap_t | ||
46 | + { | ||
47 | + id_t id; | ||
48 | + long objId; | ||
49 | + std::string taskId; | ||
50 | + box_t box; | ||
51 | + } input_data_wrap_t; | ||
52 | + | ||
53 | + typedef struct tr_point { | ||
54 | + float x, y; | ||
55 | + }tr_point; | ||
56 | + | ||
57 | + | ||
58 | + typedef struct mn_frame_t | ||
59 | + { | ||
60 | + uint m_frame; | ||
61 | + uint n_frame; | ||
62 | + | ||
63 | + // explicit | ||
64 | + mn_frame_t(uint m = 0, uint n = 0) | ||
65 | + : m_frame(m) | ||
66 | + , n_frame(n) | ||
67 | + {} | ||
68 | + | ||
69 | + void reset() | ||
70 | + { | ||
71 | + m_frame = 0; | ||
72 | + n_frame = 0; | ||
73 | + } | ||
74 | + | ||
75 | + } mn_frame_t; | ||
76 | + | ||
77 | + | ||
78 | + typedef struct results_data_t | ||
79 | + { | ||
80 | + box_t box; | ||
81 | + acldvppPicDesc* origin_img_desc{nullptr}; | ||
82 | + acldvppPicDesc* roi_img_desc{nullptr}; | ||
83 | + id_t id; | ||
84 | + long objId; | ||
85 | + std::string taskId; | ||
86 | + algorithm_type_t algor_type; | ||
87 | + } results_data_t; | ||
88 | + | ||
89 | + class TrafficLightProcess | ||
90 | + { | ||
91 | + /** | ||
92 | + * @brief | ||
93 | + * 1. move able | ||
94 | + */ | ||
95 | + public: | ||
96 | + TrafficLightProcess(); | ||
97 | + | ||
98 | + ~TrafficLightProcess(); | ||
99 | + | ||
100 | + bool check_initied(); | ||
101 | + bool init(int gpu_id, string models_dir); | ||
102 | + bool update_mstreams(const std::vector<task_id_t>& taskIds, vector<sy_img> src_interest_imgs, vector<DeviceMemory*> vec_det_input_images, const std::vector<onelevel_det_result> &det_results); | ||
103 | + std::shared_ptr<results_data_t> get_result_by_objectid(const id_t& id, bool do_erase = true); | ||
104 | + | ||
105 | + void force_release_result(const task_id_t& task_id); | ||
106 | + | ||
107 | + TrafficLightProcess(const TrafficLightProcess&) = delete; | ||
108 | + TrafficLightProcess& operator=(const TrafficLightProcess&) = delete; | ||
109 | + | ||
110 | + private: | ||
111 | + static algorithm_type_t algor_type_; | ||
112 | + int m_devId; | ||
113 | + aclrtContext m_algorthim_ctx; | ||
114 | + | ||
115 | + bool init_; | ||
116 | + void* tools_; | ||
117 | + task_param_manager* task_param_manager_; | ||
118 | + std::map<id_t, mn_frame_t> id_to_mn_; | ||
119 | + std::map<id_t, results_data_t> id_to_result_; | ||
120 | + }; | ||
121 | + } // namespace traffic_light_process | ||
122 | +} // namespace ai_engine_module | ||
123 | + |
src/ai_engine_module/truck_manned_process.cpp
@@ -12,6 +12,28 @@ namespace ai_engine_module | @@ -12,6 +12,28 @@ namespace ai_engine_module | ||
12 | { | 12 | { |
13 | algorithm_type_t TruckMannedProcess::algor_type_ = algorithm_type_t::TRUCK_MANNED; | 13 | algorithm_type_t TruckMannedProcess::algor_type_ = algorithm_type_t::TRUCK_MANNED; |
14 | 14 | ||
15 | + int legal_person_motocycle_inarea(const std::vector<input_data_wrap_t>& person_motocycle_data, int left, int top, int right, int bottom) { | ||
16 | + int legal_person_motocycle_count = 0; | ||
17 | + for (const auto& det_result : person_motocycle_data) { | ||
18 | + int x1_intersection = std::max(det_result.box.left, left); | ||
19 | + int y1_intersection = std::max(det_result.box.top, top); | ||
20 | + int x2_intersection = std::min(det_result.box.right, right); | ||
21 | + int y2_intersection = std::min(det_result.box.bottom, bottom); | ||
22 | + | ||
23 | + if (x2_intersection <= x1_intersection || y2_intersection <= y1_intersection) continue; // 没有交集 | ||
24 | + float area_a = float(det_result.box.right - det_result.box.left) * float(det_result.box.bottom - det_result.box.top); | ||
25 | + float area_b = float(right - left) * float(bottom - top); | ||
26 | + float area_intersection = float(x2_intersection - x1_intersection) * float(y2_intersection - y1_intersection); | ||
27 | + | ||
28 | + if (area_a > area_b || area_a <= 0) continue; //暂不考虑非机动车目标比货车大的情况 | ||
29 | + // float iou = area_intersection / (area_a + area_b - area_intersection); | ||
30 | + float small_overlap_ratio = area_intersection / area_a; //计算非机动车目标相对于自身的重叠程度 | ||
31 | + if (small_overlap_ratio > 0.2) legal_person_motocycle_count ++; | ||
32 | + } | ||
33 | + return legal_person_motocycle_count; | ||
34 | + | ||
35 | + } | ||
36 | + | ||
15 | TruckMannedProcess::TruckMannedProcess() | 37 | TruckMannedProcess::TruckMannedProcess() |
16 | : task_param_manager_(nullptr) | 38 | : task_param_manager_(nullptr) |
17 | { | 39 | { |
@@ -127,6 +149,34 @@ namespace ai_engine_module | @@ -127,6 +149,34 @@ namespace ai_engine_module | ||
127 | int src_img_h = src_img->getHeight(); | 149 | int src_img_h = src_img->getHeight(); |
128 | 150 | ||
129 | auto& boxes_of_one_image = det_results[n].obj; | 151 | auto& boxes_of_one_image = det_results[n].obj; |
152 | + | ||
153 | + //汇总当前帧的行人/非机动车目标 | ||
154 | + std::vector<input_data_wrap_t> person_motocycle_data(0); | ||
155 | + for (int i = 0; i < det_results[n].obj_count; ++i) | ||
156 | + { | ||
157 | + auto& box = boxes_of_one_image[i]; | ||
158 | + if (static_cast<det_class_label_t>(box.index) == det_class_label_t::MOTOCYCLE || static_cast<det_class_label_t>(box.index) == det_class_label_t::BICYCLE || | ||
159 | + static_cast<det_class_label_t>(box.index) == det_class_label_t::HUMAN || static_cast<det_class_label_t>(box.index) == det_class_label_t::TRICYCLE) | ||
160 | + { | ||
161 | + auto& taskId = *taskId_iter; | ||
162 | + input_data_wrap_t data; | ||
163 | + int top = std::max(int(box.top), 0); int left = std::max(int(box.left), 0); | ||
164 | + int right = std::min(int(box.right), src_img_w); int bottom = std::min(int(box.bottom), src_img_h); | ||
165 | + int width = right - left; int height = bottom - top; | ||
166 | + | ||
167 | + if (static_cast<det_class_label_t>(box.index) == det_class_label_t::HUMAN && width >= 0.9*height) //基于载人只能看到半身的假设 | ||
168 | + continue; | ||
169 | + | ||
170 | + data.box.top = top; data.box.left = left; | ||
171 | + data.box.right = right; data.box.bottom = bottom; | ||
172 | + data.box.score = box.confidence; data.box.cls = box.index; | ||
173 | + data.taskId = taskId; data.objId = box.id; | ||
174 | + | ||
175 | + person_motocycle_data.emplace_back(std::move(data)); | ||
176 | + } | ||
177 | + } | ||
178 | + | ||
179 | + | ||
130 | for (int i = 0; i < det_results[n].obj_count; ++i) | 180 | for (int i = 0; i < det_results[n].obj_count; ++i) |
131 | { | 181 | { |
132 | auto& box = boxes_of_one_image[i]; | 182 | auto& box = boxes_of_one_image[i]; |
@@ -154,14 +204,15 @@ namespace ai_engine_module | @@ -154,14 +204,15 @@ namespace ai_engine_module | ||
154 | !snapshot_legal_inarea(algor_param_wrap->basic_param->algor_valid_rect, left, top, right, bottom)) | 204 | !snapshot_legal_inarea(algor_param_wrap->basic_param->algor_valid_rect, left, top, right, bottom)) |
155 | continue; | 205 | continue; |
156 | 206 | ||
157 | - data.box.top = top; | ||
158 | - data.box.left = left; | ||
159 | - data.box.right = right; | ||
160 | - data.box.bottom = bottom; | 207 | + //统计货车检测框内行人及非机动车的数量 |
208 | + int person_motocycle_inarea = legal_person_motocycle_inarea(person_motocycle_data, left, top, right, bottom); | ||
209 | + | ||
210 | + data.box.top = top; data.box.left = left; | ||
211 | + data.box.right = right; data.box.bottom = bottom; | ||
161 | data.box.score = box.confidence; | 212 | data.box.score = box.confidence; |
162 | - data.taskId = taskId; | ||
163 | - data.objId = box.id; | 213 | + data.taskId = taskId; data.objId = box.id; |
164 | data.id = obj_key_t{ box.id, taskId, algorithm_type_t::TRUCK_MANNED }; | 214 | data.id = obj_key_t{ box.id, taskId, algorithm_type_t::TRUCK_MANNED }; |
215 | + data.person_motocycle_cnt = person_motocycle_inarea; | ||
165 | 216 | ||
166 | // 抠图 | 217 | // 抠图 |
167 | video_object_info obj; | 218 | video_object_info obj; |
@@ -193,6 +244,7 @@ namespace ai_engine_module | @@ -193,6 +244,7 @@ namespace ai_engine_module | ||
193 | flattened_idx_to_batch_idx[flattened_idx++] = n; | 244 | flattened_idx_to_batch_idx[flattened_idx++] = n; |
194 | } | 245 | } |
195 | } | 246 | } |
247 | + std::vector<input_data_wrap_t>().swap(person_motocycle_data); | ||
196 | ++taskId_iter; | 248 | ++taskId_iter; |
197 | } | 249 | } |
198 | 250 | ||
@@ -246,7 +298,8 @@ namespace ai_engine_module | @@ -246,7 +298,8 @@ namespace ai_engine_module | ||
246 | auto& e = id_to_mn_[obj_key]; | 298 | auto& e = id_to_mn_[obj_key]; |
247 | ++e.m_frame; | 299 | ++e.m_frame; |
248 | 300 | ||
249 | - if (hs_count >= algor_param->hs_count_threshold) | 301 | + // if (hs_count >= algor_param->hs_count_threshold) |
302 | + if (hs_count - det_result.person_motocycle_cnt >= algor_param->hs_count_threshold) //头肩数量去除包含的行人和非机动车数量 | ||
250 | { | 303 | { |
251 | if (++e.n_frame == algor_param->n) | 304 | if (++e.n_frame == algor_param->n) |
252 | { | 305 | { |
src/ai_engine_module/truck_manned_process.h
@@ -28,6 +28,7 @@ namespace ai_engine_module | @@ -28,6 +28,7 @@ namespace ai_engine_module | ||
28 | { | 28 | { |
29 | id_t id; | 29 | id_t id; |
30 | long objId; | 30 | long objId; |
31 | + int person_motocycle_cnt; | ||
31 | std::string taskId; | 32 | std::string taskId; |
32 | box_t box; | 33 | box_t box; |
33 | } input_data_wrap_t; | 34 | } input_data_wrap_t; |
src/ai_platform/MultiSourceProcess.cpp
@@ -195,6 +195,11 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){ | @@ -195,6 +195,11 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){ | ||
195 | LOG_FATAL("Init motor_refit failed"); | 195 | LOG_FATAL("Init motor_refit failed"); |
196 | return -1; | 196 | return -1; |
197 | } | 197 | } |
198 | + // 行人/二轮车闯红灯 | ||
199 | + if (!traffic_lightprocess_.init(vptParam.gpuid, models_dir)) { | ||
200 | + LOG_FATAL("Init traffic_light failed"); | ||
201 | + return -1; | ||
202 | + } | ||
198 | #endif | 203 | #endif |
199 | 204 | ||
200 | #ifdef WITH_FACE_DET_SS | 205 | #ifdef WITH_FACE_DET_SS |
@@ -711,6 +716,7 @@ bool CMultiSourceProcess::finish_task(const string taskID, const bool delete_sna | @@ -711,6 +716,7 @@ bool CMultiSourceProcess::finish_task(const string taskID, const bool delete_sna | ||
711 | motor_refit_phoneprocess_.force_release_result(taskID); | 716 | motor_refit_phoneprocess_.force_release_result(taskID); |
712 | // motor_phoneprocess_.force_release_result(taskID); | 717 | // motor_phoneprocess_.force_release_result(taskID); |
713 | motor_refitprocess_.force_release_result(taskID); | 718 | motor_refitprocess_.force_release_result(taskID); |
719 | + traffic_lightprocess_.force_release_result(taskID); | ||
714 | 720 | ||
715 | m_task_param_manager->delete_task_param(taskID); | 721 | m_task_param_manager->delete_task_param(taskID); |
716 | #endif | 722 | #endif |
@@ -905,6 +911,8 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){ | @@ -905,6 +911,8 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){ | ||
905 | algorithm_motor_phone_process(vpt_interest_task_id, vec_vptMem, vptResult);*/ | 911 | algorithm_motor_phone_process(vpt_interest_task_id, vec_vptMem, vptResult);*/ |
906 | // 电动车改装(加雨棚) | 912 | // 电动车改装(加雨棚) |
907 | algorithm_motor_refit_process(vpt_interest_task_id, vec_vptMem, vptResult); | 913 | algorithm_motor_refit_process(vpt_interest_task_id, vec_vptMem, vptResult); |
914 | + // 行人/二轮车闯红灯 | ||
915 | + algorithm_traffic_light_process(vpt_interest_task_id, vec_vptMem, vptResult); | ||
908 | village_snapshot(vpt_interest_task_id, vec_vptMem, deleteObjectID); | 916 | village_snapshot(vpt_interest_task_id, vec_vptMem, deleteObjectID); |
909 | #endif | 917 | #endif |
910 | 918 | ||
@@ -1439,6 +1447,42 @@ void CMultiSourceProcess::algorithm_motor_refit_process(vector<string>& vpt_inte | @@ -1439,6 +1447,42 @@ void CMultiSourceProcess::algorithm_motor_refit_process(vector<string>& vpt_inte | ||
1439 | } | 1447 | } |
1440 | } | 1448 | } |
1441 | 1449 | ||
1450 | + | ||
1451 | +// 行人/二轮车闯红灯 | ||
1452 | +void CMultiSourceProcess::algorithm_traffic_light_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, | ||
1453 | + vector<onelevel_det_result>& vptResult) { | ||
1454 | + | ||
1455 | + vector<string> interest_task_id; | ||
1456 | + vector<onelevel_det_result> interest_vpt_result; | ||
1457 | + vector<DeviceMemory*> interest_imgs; | ||
1458 | + vector<sy_img> sy_interest_imgs; | ||
1459 | + | ||
1460 | + int _idx = 0; | ||
1461 | + for (auto _task_id_iter = vpt_interest_task_id.begin(); _task_id_iter != vpt_interest_task_id.end(); | ||
1462 | + ++_task_id_iter, ++_idx) // loop task_id; | ||
1463 | + { | ||
1464 | + auto task_id = *_task_id_iter; | ||
1465 | + auto algor_map = m_task_param_manager->get_task_other_param(task_id); | ||
1466 | + | ||
1467 | + if (algor_map->find(algorithm_type_t::PERSON_RUNNING_REDLIGHTS) != algor_map->end() || | ||
1468 | + algor_map->find(algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS) != algor_map->end()) { | ||
1469 | + DeviceMemory* mem = vpt_interest_imgs[_idx]; | ||
1470 | + sy_img img; | ||
1471 | + img.w_ = mem->getWidth(); img.h_ = mem->getHeight(); | ||
1472 | + img.c_ = mem->getChannel(); img.data_ = mem->getMem(); | ||
1473 | + sy_interest_imgs.push_back(img); | ||
1474 | + | ||
1475 | + interest_task_id.emplace_back(task_id); | ||
1476 | + interest_imgs.emplace_back(vpt_interest_imgs[_idx]); | ||
1477 | + interest_vpt_result.emplace_back(vptResult[_idx]); | ||
1478 | + } | ||
1479 | + } | ||
1480 | + | ||
1481 | + if (!interest_imgs.empty()){ | ||
1482 | + traffic_lightprocess_.update_mstreams(interest_task_id, sy_interest_imgs, interest_imgs, interest_vpt_result); | ||
1483 | + } | ||
1484 | +} | ||
1485 | + | ||
1442 | // for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径) | 1486 | // for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径) |
1443 | void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vec_vptMem, vector<vector<int>> deleteObjectID) { | 1487 | void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vec_vptMem, vector<vector<int>> deleteObjectID) { |
1444 | auto task_iter = vpt_interest_task_id.begin(); | 1488 | auto task_iter = vpt_interest_task_id.begin(); |
@@ -1472,8 +1516,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | @@ -1472,8 +1516,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | ||
1472 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::TRICYCLE_MANNED); | 1516 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::TRICYCLE_MANNED); |
1473 | save_snapshot_process(obj_key, algorithm_type_t::TRICYCLE_MANNED, src_img, roi_img, 0, json_str); | 1517 | save_snapshot_process(obj_key, algorithm_type_t::TRICYCLE_MANNED, src_img, roi_img, 0, json_str); |
1474 | } else { | 1518 | } else { |
1475 | - VPCUtil::vpc_img_release(src_img); | ||
1476 | - VPCUtil::vpc_img_release(roi_img); | 1519 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); |
1477 | } | 1520 | } |
1478 | 1521 | ||
1479 | } | 1522 | } |
@@ -1496,8 +1539,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | @@ -1496,8 +1539,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | ||
1496 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::TRUCK_MANNED); | 1539 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::TRUCK_MANNED); |
1497 | save_snapshot_process(obj_key, algorithm_type_t::TRUCK_MANNED, src_img, roi_img, 0, json_str); | 1540 | save_snapshot_process(obj_key, algorithm_type_t::TRUCK_MANNED, src_img, roi_img, 0, json_str); |
1498 | } else { | 1541 | } else { |
1499 | - VPCUtil::vpc_img_release(src_img); | ||
1500 | - VPCUtil::vpc_img_release(roi_img); | 1542 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); |
1501 | } | 1543 | } |
1502 | 1544 | ||
1503 | } | 1545 | } |
@@ -1520,8 +1562,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | @@ -1520,8 +1562,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | ||
1520 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET); | 1562 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET); |
1521 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET, src_img, roi_img, 0, json_str); | 1563 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET, src_img, roi_img, 0, json_str); |
1522 | } else { | 1564 | } else { |
1523 | - VPCUtil::vpc_img_release(src_img); | ||
1524 | - VPCUtil::vpc_img_release(roi_img); | 1565 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); |
1525 | } | 1566 | } |
1526 | 1567 | ||
1527 | } | 1568 | } |
@@ -1544,8 +1585,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | @@ -1544,8 +1585,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | ||
1544 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN); | 1585 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN); |
1545 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN, src_img, roi_img, 0, json_str); | 1586 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN, src_img, roi_img, 0, json_str); |
1546 | } else { | 1587 | } else { |
1547 | - VPCUtil::vpc_img_release(src_img); | ||
1548 | - VPCUtil::vpc_img_release(roi_img); | 1588 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); |
1549 | } | 1589 | } |
1550 | 1590 | ||
1551 | } | 1591 | } |
@@ -1569,8 +1609,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | @@ -1569,8 +1609,7 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | ||
1569 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE); | 1609 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE); |
1570 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE, src_img, roi_img, 0, json_str); | 1610 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE, src_img, roi_img, 0, json_str); |
1571 | } else { | 1611 | } else { |
1572 | - VPCUtil::vpc_img_release(src_img); | ||
1573 | - VPCUtil::vpc_img_release(roi_img); | 1612 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); |
1574 | } | 1613 | } |
1575 | 1614 | ||
1576 | } | 1615 | } |
@@ -1594,8 +1633,53 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | @@ -1594,8 +1633,53 @@ void CMultiSourceProcess::village_snapshot(vector<string>& vpt_interest_task_id, | ||
1594 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_REFIT); | 1633 | auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_VEHICLE_REFIT); |
1595 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_REFIT, src_img, roi_img, 0, json_str); | 1634 | save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_REFIT, src_img, roi_img, 0, json_str); |
1596 | } else { | 1635 | } else { |
1597 | - VPCUtil::vpc_img_release(src_img); | ||
1598 | - VPCUtil::vpc_img_release(roi_img); | 1636 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); |
1637 | + } | ||
1638 | + | ||
1639 | + } | ||
1640 | + } | ||
1641 | + | ||
1642 | + if (task_param_ptr->nonmotor_vehicle_algors.find(algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS) != task_param_ptr->nonmotor_vehicle_algors.end()) { | ||
1643 | + const auto &algor_other_params = task_other_params->find(algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS); | ||
1644 | + const algor_basic_config_param_t *basic_param = algor_other_params->second->basic_param; | ||
1645 | + | ||
1646 | + auto result = traffic_lightprocess_.get_result_by_objectid(ai_engine_module::obj_key_t{obj_key.obj_id, obj_key.video_id, algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS}); | ||
1647 | + if (result.get()) { | ||
1648 | + village_alarm = true; | ||
1649 | + algorithm_types.push_back((int)algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS); | ||
1650 | + video_folder = basic_param->video_folder; result_folder = basic_param->result_folder; result_folder_little = basic_param->result_folder_little; | ||
1651 | + // 原图及抠图 | ||
1652 | + vpc_img_info src_img; src_img.pic_desc = result->origin_img_desc; src_img.task_id = obj_key.video_id; | ||
1653 | + vpc_img_info roi_img; roi_img.pic_desc = result->roi_img_desc; roi_img.task_id = obj_key.video_id; roi_img.object_id = obj_key.obj_id; | ||
1654 | + | ||
1655 | + if (save_single_algor_pic) { | ||
1656 | + auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS); | ||
1657 | + save_snapshot_process(obj_key, algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS, src_img, roi_img, 0, json_str); | ||
1658 | + } else { | ||
1659 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); | ||
1660 | + } | ||
1661 | + | ||
1662 | + } | ||
1663 | + } | ||
1664 | + | ||
1665 | + if (task_param_ptr->human_algors.find(algorithm_type_t::PERSON_RUNNING_REDLIGHTS) != task_param_ptr->human_algors.end()) { | ||
1666 | + const auto &algor_other_params = task_other_params->find(algorithm_type_t::PERSON_RUNNING_REDLIGHTS); | ||
1667 | + const algor_basic_config_param_t *basic_param = algor_other_params->second->basic_param; | ||
1668 | + | ||
1669 | + auto result = traffic_lightprocess_.get_result_by_objectid(ai_engine_module::obj_key_t{obj_key.obj_id, obj_key.video_id, algorithm_type_t::PERSON_RUNNING_REDLIGHTS}); | ||
1670 | + if (result.get()) { | ||
1671 | + village_alarm = true; | ||
1672 | + algorithm_types.push_back((int)algorithm_type_t::PERSON_RUNNING_REDLIGHTS); | ||
1673 | + video_folder = basic_param->video_folder; result_folder = basic_param->result_folder; result_folder_little = basic_param->result_folder_little; | ||
1674 | + // 原图及抠图 | ||
1675 | + vpc_img_info src_img; src_img.pic_desc = result->origin_img_desc; src_img.task_id = obj_key.video_id; | ||
1676 | + vpc_img_info roi_img; roi_img.pic_desc = result->roi_img_desc; roi_img.task_id = obj_key.video_id; roi_img.object_id = obj_key.obj_id; | ||
1677 | + | ||
1678 | + if (save_single_algor_pic) { | ||
1679 | + auto json_str = helpers::gen_json::gen_manned_json(obj_key.video_id, obj_key.obj_id, result->box, algorithm_type_t::PERSON_RUNNING_REDLIGHTS); | ||
1680 | + save_snapshot_process(obj_key, algorithm_type_t::PERSON_RUNNING_REDLIGHTS, src_img, roi_img, 0, json_str); | ||
1681 | + } else { | ||
1682 | + VPCUtil::vpc_img_release(src_img); VPCUtil::vpc_img_release(roi_img); | ||
1599 | } | 1683 | } |
1600 | 1684 | ||
1601 | } | 1685 | } |
@@ -1966,7 +2050,7 @@ bool CMultiSourceProcess::CheckTime() { | @@ -1966,7 +2050,7 @@ bool CMultiSourceProcess::CheckTime() { | ||
1966 | nYear = info->tm_year + 1900; | 2050 | nYear = info->tm_year + 1900; |
1967 | nMonth = info->tm_mon + 1; | 2051 | nMonth = info->tm_mon + 1; |
1968 | nDay = info->tm_mday; | 2052 | nDay = info->tm_mday; |
1969 | - if ((nYear == 2023 && nMonth <= 9) || (nYear == 2023 && nMonth <= 10 && nDay <= 31)) | 2053 | + if ((nYear == 2023 && nMonth <= 10) || (nYear == 2023 && nMonth <= 11 && nDay <= 30)) |
1970 | { | 2054 | { |
1971 | return true; | 2055 | return true; |
1972 | } | 2056 | } |
src/ai_platform/MultiSourceProcess.h
@@ -12,16 +12,7 @@ | @@ -12,16 +12,7 @@ | ||
12 | #include "task_param_manager.h" | 12 | #include "task_param_manager.h" |
13 | #include "../reprocessing_module/snapshot_reprocessing.h" | 13 | #include "../reprocessing_module/snapshot_reprocessing.h" |
14 | #include "../reprocessing_module/save_snapshot_reprocessing.h" | 14 | #include "../reprocessing_module/save_snapshot_reprocessing.h" |
15 | -#include "../ai_engine_module/VPTProcess.h" | ||
16 | -#include "../ai_engine_module/face_det_ai_engine.h" | ||
17 | -#include "../ai_engine_module/pedestrian_vehicle_retrograde.h" | ||
18 | -#include "../ai_engine_module/pedestrian_vehicle_trespass.h" | ||
19 | -#include "../ai_engine_module/tricycle_manned_process.h" | ||
20 | -#include "../ai_engine_module/truck_manned_process.h" | ||
21 | -#include "../ai_engine_module/motocycle_hs_process.h" | ||
22 | -#include "../ai_engine_module/motocycle_refit_phone_process.h" | ||
23 | -#include "../ai_engine_module/motocycle_phone_process.h" | ||
24 | -#include "../ai_engine_module/motocycle_refit_process.h" | 15 | +#include "../ai_engine_module/ai_engine_module.h" |
25 | #include "../util/JpegUtil.h" | 16 | #include "../util/JpegUtil.h" |
26 | #include "atlas_licence.h"//授权文件 | 17 | #include "atlas_licence.h"//授权文件 |
27 | 18 | ||
@@ -84,6 +75,8 @@ private: | @@ -84,6 +75,8 @@ private: | ||
84 | void algorithm_motor_phone_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); | 75 | void algorithm_motor_phone_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); |
85 | // 电动车改装(加雨棚) | 76 | // 电动车改装(加雨棚) |
86 | void algorithm_motor_refit_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); | 77 | void algorithm_motor_refit_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); |
78 | + // 行人/二轮车闯红灯 | ||
79 | + void algorithm_traffic_light_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); | ||
87 | 80 | ||
88 | 81 | ||
89 | private: | 82 | private: |
@@ -152,6 +145,7 @@ private: | @@ -152,6 +145,7 @@ private: | ||
152 | ai_engine_module::motocycle_refit_phone_process::MotorRefitPhoneProcess motor_refit_phoneprocess_; | 145 | ai_engine_module::motocycle_refit_phone_process::MotorRefitPhoneProcess motor_refit_phoneprocess_; |
153 | // ai_engine_module::motocycle_phone_process::MotorPhoneProcess motor_phoneprocess_; | 146 | // ai_engine_module::motocycle_phone_process::MotorPhoneProcess motor_phoneprocess_; |
154 | ai_engine_module::motocycle_refit_process::MotorRefitProcess motor_refitprocess_; | 147 | ai_engine_module::motocycle_refit_process::MotorRefitProcess motor_refitprocess_; |
148 | + ai_engine_module::traffic_light_process::TrafficLightProcess traffic_lightprocess_; | ||
155 | 149 | ||
156 | face_det_ai_engine m_face_det_ai_engine; // 人脸检测 | 150 | face_det_ai_engine m_face_det_ai_engine; // 人脸检测 |
157 | 151 |
src/ai_platform/header.h
@@ -46,7 +46,9 @@ enum class algorithm_type_t { | @@ -46,7 +46,9 @@ enum class algorithm_type_t { | ||
46 | TRICYCLE_MANNED = 503, // 三轮车载人 | 46 | TRICYCLE_MANNED = 503, // 三轮车载人 |
47 | TRUCK_MANNED = 504, // 货车货箱载人 | 47 | TRUCK_MANNED = 504, // 货车货箱载人 |
48 | NONMOTOR_VEHICLE_USEPHONE = 505,// 电动/摩托车驾乘人员使用手机 | 48 | NONMOTOR_VEHICLE_USEPHONE = 505,// 电动/摩托车驾乘人员使用手机 |
49 | - NONMOTOR_VEHICLE_REFIT = 506, // 电动车改装(加雨棚) | 49 | + NONMOTOR_VEHICLE_REFIT = 506, // 电动车改装(加雨棚) |
50 | + PERSON_RUNNING_REDLIGHTS = 507, // 行人闯红灯 | ||
51 | + NONMOTOR_RUNNING_REDLIGHTS = 508, // 非机动车闯红灯 | ||
50 | }; | 52 | }; |
51 | 53 | ||
52 | 54 |
src/ai_platform/task_param_manager.cpp
@@ -58,9 +58,15 @@ bool copy_algor_param_aux(const algorithm_type_t &algor_type, const std::string | @@ -58,9 +58,15 @@ bool copy_algor_param_aux(const algorithm_type_t &algor_type, const std::string | ||
58 | case algorithm_type_t::NONMOTOR_VEHICLE_REFIT: | 58 | case algorithm_type_t::NONMOTOR_VEHICLE_REFIT: |
59 | m_algor_config_params[task_id].nonmotor_vehicle_algors.insert(algor_type); | 59 | m_algor_config_params[task_id].nonmotor_vehicle_algors.insert(algor_type); |
60 | goto _manned_param_copy; | 60 | goto _manned_param_copy; |
61 | + case algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS: | ||
62 | + m_algor_config_params[task_id].nonmotor_vehicle_algors.insert(algor_type); | ||
63 | + goto _manned_param_copy; | ||
61 | case algorithm_type_t::TRICYCLE_MANNED: | 64 | case algorithm_type_t::TRICYCLE_MANNED: |
62 | m_algor_config_params[task_id].nonmotor_vehicle_algors.insert(algor_type); | 65 | m_algor_config_params[task_id].nonmotor_vehicle_algors.insert(algor_type); |
63 | goto _manned_param_copy; | 66 | goto _manned_param_copy; |
67 | + case algorithm_type_t::PERSON_RUNNING_REDLIGHTS: | ||
68 | + m_algor_config_params[task_id].human_algors.insert(algor_type); | ||
69 | + goto _manned_param_copy; | ||
64 | case algorithm_type_t::TRUCK_MANNED: { | 70 | case algorithm_type_t::TRUCK_MANNED: { |
65 | m_algor_config_params[task_id].vehicle_algors.insert(algor_type); | 71 | m_algor_config_params[task_id].vehicle_algors.insert(algor_type); |
66 | _manned_param_copy : { | 72 | _manned_param_copy : { |
src/demo/Makefile
@@ -33,7 +33,7 @@ lib_dir=-L/usr/local/Ascend/ascend-toolkit/6.3.RC1/runtime/lib64 \ | @@ -33,7 +33,7 @@ lib_dir=-L/usr/local/Ascend/ascend-toolkit/6.3.RC1/runtime/lib64 \ | ||
33 | lib=-lacl_dvpp -lascendcl -lacl_dvpp_mpi -lruntime -lascendalog -lc_sec -lmsprofiler -lgert -lmmpa -lascend_hal -lexe_graph -lge_executor -lgraph -lprofapi -lascend_protobuf -lerror_manager -lhybrid_executor -lregister -ldavinci_executor -lge_common -lge_common_base \ | 33 | lib=-lacl_dvpp -lascendcl -lacl_dvpp_mpi -lruntime -lascendalog -lc_sec -lmsprofiler -lgert -lmmpa -lascend_hal -lexe_graph -lge_executor -lgraph -lprofapi -lascend_protobuf -lerror_manager -lhybrid_executor -lregister -ldavinci_executor -lge_common -lge_common_base \ |
34 | -lplatform -lgraph_base -lqos_manager | 34 | -lplatform -lgraph_base -lqos_manager |
35 | 35 | ||
36 | -LIBS= -L $(DEPEND_DIR) -lvpt_det_vdec -lsycheck -lface_det_vdec -lhs_tri_process -lhs_truck_process -lhs_motor_process -lphone_motor_det -lhcp_vdec -lmotor_rainshed_vdec -latlaslic -lvpt_ascend\ | 36 | +LIBS= -L $(DEPEND_DIR) -lvpt_det_vdec -lsycheck -lface_det_vdec -lhs_tri_process -lhs_truck_process -lhs_motor_process -lphone_motor_det -lhcp_vdec -lmotor_rainshed_vdec -ltraffic_light_vdec -latlaslic -lvpt_ascend\ |
37 | -L $(OPENCV_ROOT)/lib -lopencv_world\ | 37 | -L $(OPENCV_ROOT)/lib -lopencv_world\ |
38 | -L $(JSON_ROOT)/lib -ljsoncpp \ | 38 | -L $(JSON_ROOT)/lib -ljsoncpp \ |
39 | -L $(FFMPEG_ROOT)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \ | 39 | -L $(FFMPEG_ROOT)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \ |
src/demo/demo.cpp
@@ -223,6 +223,56 @@ void set_task_params(task_param &tparam, const unsigned &idx, const algorithm_ty | @@ -223,6 +223,56 @@ void set_task_params(task_param &tparam, const unsigned &idx, const algorithm_ty | ||
223 | algor_init_params->basic_param = basic_params; | 223 | algor_init_params->basic_param = basic_params; |
224 | } break; | 224 | } break; |
225 | 225 | ||
226 | + case algorithm_type_t::PERSON_RUNNING_REDLIGHTS: { | ||
227 | + auto algor_params = new algor_config_param_manned_incident; | ||
228 | + { | ||
229 | + algor_params->m = 10; | ||
230 | + algor_params->n = 8; | ||
231 | + algor_params->obj_confidence_threshold = 0.5f; | ||
232 | + algor_params->obj_min_height = 6; | ||
233 | + algor_params->obj_min_width = 32; | ||
234 | + } | ||
235 | + | ||
236 | + auto basic_params = new algor_basic_config_param_t; | ||
237 | + { | ||
238 | + // basic_params->algor_valid_rect.top_ = 0; | ||
239 | + // basic_params->algor_valid_rect.left_ = 0; | ||
240 | + // basic_params->algor_valid_rect.width_ = 1920; | ||
241 | + // basic_params->algor_valid_rect.height_ = 1080; | ||
242 | + basic_params->video_folder = "res/video_recode"; | ||
243 | + basic_params->result_folder = "res/person_runred"; | ||
244 | + basic_params->result_folder_little = "res/person_runred_little"; | ||
245 | + } | ||
246 | + | ||
247 | + algor_init_params->algor_param = algor_params; | ||
248 | + algor_init_params->basic_param = basic_params; | ||
249 | + } break; | ||
250 | + | ||
251 | + case algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS: { | ||
252 | + auto algor_params = new algor_config_param_manned_incident; | ||
253 | + { | ||
254 | + algor_params->m = 10; | ||
255 | + algor_params->n = 8; | ||
256 | + algor_params->obj_confidence_threshold = 0.5f; | ||
257 | + algor_params->obj_min_height = 6; | ||
258 | + algor_params->obj_min_width = 32; | ||
259 | + } | ||
260 | + | ||
261 | + auto basic_params = new algor_basic_config_param_t; | ||
262 | + { | ||
263 | + // basic_params->algor_valid_rect.top_ = 0; | ||
264 | + // basic_params->algor_valid_rect.left_ = 0; | ||
265 | + // basic_params->algor_valid_rect.width_ = 1920; | ||
266 | + // basic_params->algor_valid_rect.height_ = 1080; | ||
267 | + basic_params->video_folder = "res/video_recode"; | ||
268 | + basic_params->result_folder = "res/motor_runred"; | ||
269 | + basic_params->result_folder_little = "res/motor_runred_little"; | ||
270 | + } | ||
271 | + | ||
272 | + algor_init_params->algor_param = algor_params; | ||
273 | + algor_init_params->basic_param = basic_params; | ||
274 | + } break; | ||
275 | + | ||
226 | case algorithm_type_t::FACE_SNAPSHOT: { | 276 | case algorithm_type_t::FACE_SNAPSHOT: { |
227 | auto basic_params = new algor_basic_config_param_t; | 277 | auto basic_params = new algor_basic_config_param_t; |
228 | { | 278 | { |
@@ -721,7 +771,7 @@ string createTask(void *handle, std::vector<algorithm_type_t> algor_vec, int gi, | @@ -721,7 +771,7 @@ string createTask(void *handle, std::vector<algorithm_type_t> algor_vec, int gi, | ||
721 | tparam.ipc_url = "/data/share/data/hczr1.mp4"; | 771 | tparam.ipc_url = "/data/share/data/hczr1.mp4"; |
722 | break; | 772 | break; |
723 | case 8: | 773 | case 8: |
724 | - tparam.ipc_url = "/opt/share/data/1-00000001d9.mp4"; | 774 | + tparam.ipc_url = "/data/share/data/燕高路口高点_CVR_2015-12-30_09-00-00_2015-12-30.mp4"; |
725 | break; | 775 | break; |
726 | case 9: | 776 | case 9: |
727 | tparam.ipc_url = "/opt/share/data/1-00000002d55_h265.mp4"; | 777 | tparam.ipc_url = "/opt/share/data/1-00000002d55_h265.mp4"; |
@@ -843,7 +893,7 @@ void test_gpu(int gpuID){ | @@ -843,7 +893,7 @@ void test_gpu(int gpuID){ | ||
843 | 893 | ||
844 | 894 | ||
845 | 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, | 895 | 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, |
846 | - algorithm_type_t::NONMOTOR_VEHICLE_REFIT}; | 896 | + algorithm_type_t::NONMOTOR_VEHICLE_REFIT, algorithm_type_t::PERSON_RUNNING_REDLIGHTS, algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS}; |
847 | std::vector<algorithm_type_t> algor_vec3 = {algorithm_type_t::FACE_SNAPSHOT}; | 897 | std::vector<algorithm_type_t> algor_vec3 = {algorithm_type_t::FACE_SNAPSHOT}; |
848 | 898 | ||
849 | /* | 899 | /* |
@@ -870,7 +920,7 @@ void test_gpu(int gpuID){ | @@ -870,7 +920,7 @@ void test_gpu(int gpuID){ | ||
870 | createTask(handle, algor_vec2, 5); | 920 | createTask(handle, algor_vec2, 5); |
871 | createTask(handle, algor_vec2, 6); | 921 | createTask(handle, algor_vec2, 6); |
872 | createTask(handle, algor_vec2, 7); | 922 | createTask(handle, algor_vec2, 7); |
873 | - // createTask(handle, algor_vec, 8); | 923 | + createTask(handle, algor_vec2, 8); |
874 | // createTask(handle, algor_vec, 9); | 924 | // createTask(handle, algor_vec, 9); |
875 | // createTask(handle, algor_vec, 10); | 925 | // createTask(handle, algor_vec, 10); |
876 | // createTask(handle, algor_vec, 11); | 926 | // createTask(handle, algor_vec, 11); |
src/tsl_aiplatform_jni/AiEngineNativeInterface.cpp
@@ -382,6 +382,8 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_TSLAiEngineNativeInter | @@ -382,6 +382,8 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_TSLAiEngineNativeInter | ||
382 | case algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN: | 382 | case algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN: |
383 | case algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE: | 383 | case algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE: |
384 | case algorithm_type_t::NONMOTOR_VEHICLE_REFIT: | 384 | case algorithm_type_t::NONMOTOR_VEHICLE_REFIT: |
385 | + case algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS: | ||
386 | + case algorithm_type_t::PERSON_RUNNING_REDLIGHTS: | ||
385 | case algorithm_type_t::TRICYCLE_MANNED: | 387 | case algorithm_type_t::TRICYCLE_MANNED: |
386 | case algorithm_type_t::TRUCK_MANNED: { | 388 | case algorithm_type_t::TRUCK_MANNED: { |
387 | jfieldID fid = env->GetFieldID(cls_AlgorConfigParam, "hs_threshold", "I"); | 389 | jfieldID fid = env->GetFieldID(cls_AlgorConfigParam, "hs_threshold", "I"); |