Commit 35fac12dfb1a0106331be0990473ed6fd767adff

Authored by Hu Chunming
1 parent a27a9f5b

添加人员徘徊和车辆违停

src/ai_platform/MultiSourceProcess.cpp
@@ -930,8 +930,11 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){ @@ -930,8 +930,11 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){
930 cross_line_process(vec_vptMem, vptResult, algorithm_type_t::HUMAN_CROSSING_LINE); 930 cross_line_process(vec_vptMem, vptResult, algorithm_type_t::HUMAN_CROSSING_LINE);
931 cross_line_process(vec_vptMem, vptResult, algorithm_type_t::HUMAN_CLIMB); 931 cross_line_process(vec_vptMem, vptResult, algorithm_type_t::HUMAN_CLIMB);
932 cross_line_process(vec_vptMem, vptResult, algorithm_type_t::VEHICLE_ILLEGAL_CROSSING_LINE); 932 cross_line_process(vec_vptMem, vptResult, algorithm_type_t::VEHICLE_ILLEGAL_CROSSING_LINE);
  933 +
  934 + wander_detect(vec_vptMem, vptResult, algorithm_type_t::HUMAN_LINGER);
  935 + wander_detect(vec_vptMem, vptResult, algorithm_type_t::VEHICLE_ILLEGAL_PARKING);
933 // 轨迹记录 936 // 轨迹记录
934 - trace_record(vpt_interest_task_id, vptResult); 937 + trace_record(vec_vptMem, vptResult);
935 // 农村违法分析的快照缓存 938 // 农村违法分析的快照缓存
936 m_snapshot_reprocessing->update_village_bestsnapshot(vec_vptMem, vptResult, deleteObjectID); 939 m_snapshot_reprocessing->update_village_bestsnapshot(vec_vptMem, vptResult, deleteObjectID);
937 // 三轮车载人 940 // 三轮车载人
@@ -1319,19 +1322,27 @@ void CMultiSourceProcess::algorthim_trespass(vector<string>& vpt_interest_task_i @@ -1319,19 +1322,27 @@ void CMultiSourceProcess::algorthim_trespass(vector<string>& vpt_interest_task_i
1319 } 1322 }
1320 1323
1321 // 轨迹记录 1324 // 轨迹记录
1322 -void CMultiSourceProcess::trace_record(vector<string>& vpt_interest_task_id, vector<onelevel_det_result>& vptResult) {  
1323 - int bidx = 0;  
1324 - for (auto iter = vpt_interest_task_id.begin(); iter != vpt_interest_task_id.end(); ++ iter, ++ bidx) {  
1325 - auto task_id = *iter; 1325 +void CMultiSourceProcess::trace_record(vector<DeviceMemory*>& vec_gpuMem, vector<onelevel_det_result>& vptResult) {
  1326 +
  1327 + for (size_t bidx = 0; bidx < vec_gpuMem.size(); bidx++){
  1328 + DeviceMemory* gpuMem = vec_gpuMem[bidx];
  1329 + string task_id = gpuMem->getId();
  1330 +
1326 for (int c = 0; c < vptResult[bidx].obj_count; c++) { 1331 for (int c = 0; c < vptResult[bidx].obj_count; c++) {
1327 //计算检测框坐标中心点 1332 //计算检测框坐标中心点
1328 sy_point center_point; 1333 sy_point center_point;
1329 center_point.x_ = vptResult[bidx].obj[c].left + (vptResult[bidx].obj[c].right - vptResult[bidx].obj[c].left) * 0.5; 1334 center_point.x_ = vptResult[bidx].obj[c].left + (vptResult[bidx].obj[c].right - vptResult[bidx].obj[c].left) * 0.5;
1330 // center_point.y_ = vptResult[bidx].obj[c].top + (vptResult[bidx].obj[c].bottom - vptResult[bidx].obj[c].top) * 0.85; 1335 // center_point.y_ = vptResult[bidx].obj[c].top + (vptResult[bidx].obj[c].bottom - vptResult[bidx].obj[c].top) * 0.85;
1331 - center_point.y_ = vptResult[bidx].obj[c].bottom; 1336 + center_point.y_ = vptResult[bidx].obj[c].bottom; // 越线检测以脚越线为标准
1332 1337
1333 OBJ_KEY new_obj = { task_id, vptResult[bidx].obj[c].id }; 1338 OBJ_KEY new_obj = { task_id, vptResult[bidx].obj[c].id };
1334 m_TotalObjMtx.lock(); 1339 m_TotalObjMtx.lock();
  1340 + auto it = m_total_obj_info.find(new_obj);
  1341 + if (it == m_total_obj_info.end())
  1342 + {
  1343 + m_total_obj_info[new_obj].last_frame_nb = gpuMem->getFrameNb();
  1344 + m_total_obj_info[new_obj].last_ts = gpuMem->getTimesstamp();
  1345 + }
1335 m_total_obj_info[new_obj].index = vptResult[bidx].obj[c].index; 1346 m_total_obj_info[new_obj].index = vptResult[bidx].obj[c].index;
1336 m_total_obj_info[new_obj].center_points.push_back(center_point); 1347 m_total_obj_info[new_obj].center_points.push_back(center_point);
1337 m_TotalObjMtx.unlock(); 1348 m_TotalObjMtx.unlock();
@@ -2244,6 +2255,98 @@ void CMultiSourceProcess::cross_line_process(vector&lt;DeviceMemory*&gt; vec_gpuMem, v @@ -2244,6 +2255,98 @@ void CMultiSourceProcess::cross_line_process(vector&lt;DeviceMemory*&gt; vec_gpuMem, v
2244 } 2255 }
2245 } 2256 }
2246 2257
  2258 +void CMultiSourceProcess::wander_detect(vector<DeviceMemory*>& vec_gpuMem, vector<onelevel_det_result>& vptResult, algorithm_type_t eType)
  2259 +{
  2260 + map<string, map<algo_type, task_param_manager::algo_param_type_t_*>> && algor_param = m_task_param_manager->get_task_other_params();
  2261 +
  2262 + for (size_t i = 0; i < vec_gpuMem.size(); i++)
  2263 + {
  2264 + DeviceMemory* gpuMem = vec_gpuMem[i];
  2265 + string task_id = gpuMem->getId();
  2266 + long frame_nb = gpuMem->getFrameNb();
  2267 +
  2268 + task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][eType];
  2269 + if (!cur_task_params)
  2270 + {
  2271 + continue;
  2272 + }
  2273 +
  2274 + algor_config_param_behavior* algor_param = (algor_config_param_behavior*)cur_task_params->algor_param;
  2275 + algor_basic_config_param_t* basic_param = (algor_basic_config_param_t*)cur_task_params->basic_param;
  2276 +
  2277 + long algor_skip_gap = algor_param->duration;
  2278 +
  2279 + std::string cur_src_ts = std::to_string(helpers::timer::get_timestamp<std::chrono::milliseconds>());
  2280 + std::string origin_file_path = basic_param->result_folder + helpers::os::sep + task_id + "_origin_" + cur_src_ts + ".jpg";
  2281 +
  2282 + std::vector<box_t> boxes;
  2283 + for (int c = 0; c < vptResult[i].obj_count; c++) {
  2284 + auto& obj_c = vptResult[i].obj[c];
  2285 +
  2286 + bool bCount = false;
  2287 + if(eType == algorithm_type_t::HUMAN_LINGER && obj_c.index == (int)det_class_label_t::HUMAN) {
  2288 + bCount = true;
  2289 + } else if (eType == algorithm_type_t::VEHICLE_ILLEGAL_PARKING && obj_c.index >= 4 && obj_c.index <= 8) {
  2290 + bCount = true;
  2291 + }
  2292 +
  2293 + if (!bCount || !snapshot_legal_inarea(basic_param->algor_valid_rect, obj_c.left, obj_c.top, obj_c.right, obj_c.bottom))
  2294 + {
  2295 + continue;
  2296 + }
  2297 +
  2298 + if (obj_c.confidence < algor_param->conf_threshold)
  2299 + {
  2300 + continue;
  2301 + }
  2302 +
  2303 + int obj_width = obj_c.right - obj_c.left;
  2304 + int obj_height = obj_c.right - obj_c.left;
  2305 + if (obj_width < algor_param->minmum_width || obj_height < algor_param->minmum_height)
  2306 + {
  2307 + continue;
  2308 + }
  2309 +
  2310 + OBJ_KEY o_key = { task_id, obj_c.id };
  2311 + m_TotalObjMtx.lock();
  2312 + auto it = m_total_obj_info.find(o_key);
  2313 + if (it != m_total_obj_info.end())
  2314 + {
  2315 + long skip_gap = frame_nb - m_total_obj_info[o_key].last_frame_nb;
  2316 + if (skip_gap > algor_skip_gap)
  2317 + {
  2318 + box_t box;
  2319 + box.left = obj_c.left;
  2320 + box.right = obj_c.right;
  2321 + box.top = obj_c.top;
  2322 + box.bottom = obj_c.bottom;
  2323 + box.score = obj_c.confidence;
  2324 + boxes.push_back(box);
  2325 +
  2326 + m_total_obj_info[o_key].last_frame_nb = frame_nb; // 更新帧号以判断下一次逗留
  2327 + }
  2328 + }
  2329 +
  2330 + m_TotalObjMtx.unlock();
  2331 + }
  2332 +
  2333 + if (boxes.size() <= 0)
  2334 + {
  2335 + continue;
  2336 + }
  2337 +
  2338 + int algorithm_type = (int)eType;
  2339 + string json_str = helpers::gen_json::gen_boxes_json(task_id, algorithm_type, boxes, origin_file_path);
  2340 +
  2341 + ImgSaveInfo info_origin;
  2342 + info_origin.img_info = VPCUtil::vpc_devMem2vpcImg(gpuMem);
  2343 + info_origin.file_path = origin_file_path;
  2344 + info_origin.json_str = json_str;
  2345 + m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(info_origin);
  2346 + }
  2347 +
  2348 +}
  2349 +
2247 void CMultiSourceProcess::face_locus_finished(const OBJ_KEY obj_key) { 2350 void CMultiSourceProcess::face_locus_finished(const OBJ_KEY obj_key) {
2248 map<OBJ_KEY, OBJ_VALUE> _total_face_snapshot_info = m_snapshot_reprocessing->get_total_face_snapshot_info(); 2351 map<OBJ_KEY, OBJ_VALUE> _total_face_snapshot_info = m_snapshot_reprocessing->get_total_face_snapshot_info();
2249 2352
src/ai_platform/MultiSourceProcess.h
@@ -75,13 +75,12 @@ private: @@ -75,13 +75,12 @@ private:
75 // 逆行 75 // 逆行
76 void algorthim_retrograde(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); 76 void algorthim_retrograde(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult);
77 // 闯入 77 // 闯入
78 - void algorthim_trespass(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs,  
79 - vector<onelevel_det_result>& vptResult ,vector<vector<int>>& deleteObjectID); 78 + void algorthim_trespass(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult ,vector<vector<int>>& deleteObjectID);
80 79
81 // 道路分割 80 // 道路分割
82 int algorthim_road_seg(vector<DeviceMemory*> vec_gpuMem); 81 int algorthim_road_seg(vector<DeviceMemory*> vec_gpuMem);
83 // 轨迹记录 82 // 轨迹记录
84 - void trace_record(vector<string>& vpt_interest_task_id, vector<onelevel_det_result>& vptResult); 83 + void trace_record(vector<DeviceMemory*>& vec_gpuMem, vector<onelevel_det_result>& vptResult);
85 // 三轮车载人 84 // 三轮车载人
86 void algorithm_tricycle_manned(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); 85 void algorithm_tricycle_manned(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult);
87 // 货车载人 86 // 货车载人
@@ -98,7 +97,6 @@ private: @@ -98,7 +97,6 @@ private:
98 void algorithm_traffic_light_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); 97 void algorithm_traffic_light_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult);
99 // 道路分割相关算法--占用机动车道等 98 // 道路分割相关算法--占用机动车道等
100 void algorithm_roadseg_correlation_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult); 99 void algorithm_roadseg_correlation_process(vector<string>& vpt_interest_task_id, vector<DeviceMemory*> vpt_interest_imgs, vector<onelevel_det_result>& vptResult);
101 -  
102 100
103 private: 101 private:
104 // 工具处理函数 102 // 工具处理函数
@@ -124,6 +122,9 @@ private: @@ -124,6 +122,9 @@ private:
124 int snapshot_task(std::string& uri_or_name, const std::string& file_name, bool bInTask); 122 int snapshot_task(std::string& uri_or_name, const std::string& file_name, bool bInTask);
125 123
126 void cross_line_process(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result>& vptResult, algorithm_type_t eType); 124 void cross_line_process(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result>& vptResult, algorithm_type_t eType);
  125 +
  126 + void wander_detect(vector<DeviceMemory*>& vec_gpuMem, vector<onelevel_det_result>& vptResult, algorithm_type_t eType);
  127 +
127 private: 128 private:
128 int m_devId; 129 int m_devId;
129 130
src/ai_platform/det_obj_header.h
@@ -21,6 +21,8 @@ using namespace std; @@ -21,6 +21,8 @@ using namespace std;
21 struct OBJ_INDEX { 21 struct OBJ_INDEX {
22 int index; 22 int index;
23 int count; //用于对index的计数 23 int count; //用于对index的计数
  24 + int last_frame_nb{0};
  25 + int last_ts{0};
24 vector<sy_point> center_points; //存储轨迹中心点坐标-- 26 vector<sy_point> center_points; //存储轨迹中心点坐标--
25 OBJ_INDEX() : count(0), index(0) {} 27 OBJ_INDEX() : count(0), index(0) {}
26 }; 28 };
src/ai_platform/header.h
@@ -34,6 +34,7 @@ enum class algorithm_type_t { @@ -34,6 +34,7 @@ enum class algorithm_type_t {
34 PEDESTRIAN_TRESPASS = 211, 34 PEDESTRIAN_TRESPASS = 211,
35 ROAD_WORK_DET = 212, // 221026byzsh施工占道 35 ROAD_WORK_DET = 212, // 221026byzsh施工占道
36 36
  37 + HUMAN_LINGER = 214, // 人员徘徊
37 HUMAN_CLIMB = 220, // 人员攀爬 38 HUMAN_CLIMB = 220, // 人员攀爬
38 HUMAN_CROSSING_LINE = 221, // 人员越线 39 HUMAN_CROSSING_LINE = 221, // 人员越线
39 40
@@ -41,6 +42,7 @@ enum class algorithm_type_t { @@ -41,6 +42,7 @@ enum class algorithm_type_t {
41 VEHICLE_RETROGRADE = 310, 42 VEHICLE_RETROGRADE = 310,
42 VEHICLE_TRESPASS = 311, 43 VEHICLE_TRESPASS = 311,
43 VEHICLE_GATHER = 312, // 车辆聚集 44 VEHICLE_GATHER = 312, // 车辆聚集
  45 + VEHICLE_ILLEGAL_PARKING = 313, // 车辆违停
44 VEHICLE_ILLEGAL_CROSSING_LINE = 314, // 车辆压线 46 VEHICLE_ILLEGAL_CROSSING_LINE = 314, // 车辆压线
45 47
46 NONMOTOR_VEHICLE_SNAPSHOT = 401, 48 NONMOTOR_VEHICLE_SNAPSHOT = 401,
@@ -393,7 +395,6 @@ typedef algor_config_param_pedestrian_safety_detector_basic algor_config_param_n @@ -393,7 +395,6 @@ typedef algor_config_param_pedestrian_safety_detector_basic algor_config_param_n
393 #endif // #ifndef ___PEDESTRIAN_SAFETY_DETECTOR_ALGOR_CONFIG_PARAM__ 395 #endif // #ifndef ___PEDESTRIAN_SAFETY_DETECTOR_ALGOR_CONFIG_PARAM__
394 396
395 397
396 -  
397 // 越线类 398 // 越线类
398 typedef struct algor_config_param_illegal_crossing_line { 399 typedef struct algor_config_param_illegal_crossing_line {
399 float conf_threshold{0.0}; // 目标检测阈值,小于该阈值不识别 400 float conf_threshold{0.0}; // 目标检测阈值,小于该阈值不识别
@@ -403,6 +404,17 @@ typedef struct algor_config_param_illegal_crossing_line { @@ -403,6 +404,17 @@ typedef struct algor_config_param_illegal_crossing_line {
403 } algor_config_param_illegal_crossing_line; // 车辆压线/人员越线/人员攀爬 共用 404 } algor_config_param_illegal_crossing_line; // 车辆压线/人员越线/人员攀爬 共用
404 405
405 406
  407 +typedef struct algor_config_param_behavior {
  408 + float conf_threshold; // 目标检测阈值,小于该阈值不识别
  409 + unsigned minmum_height, minmum_width; // 最小目标大小,小于该值不识别
  410 + int duration; // 持续时长
  411 + int moving_distance_threshold; // 像素变动距离阈值
  412 + algor_config_param_behavior()
  413 + : duration(0), conf_threshold(0.0f), minmum_height(0), minmum_width(0), moving_distance_threshold(0) {
  414 + }
  415 +} algor_config_param_behavior;
  416 +
  417 +
406 // 行人安全检测参数 418 // 行人安全检测参数
407 #ifndef ___RETROGRADE_ALGOR_CONFIG_PARAM__ 419 #ifndef ___RETROGRADE_ALGOR_CONFIG_PARAM__
408 #define ___RETROGRADE_ALGOR_CONFIG_PARAM__ 420 #define ___RETROGRADE_ALGOR_CONFIG_PARAM__
src/ai_platform/task_param_manager.cpp
@@ -124,6 +124,16 @@ bool copy_algor_param_aux(const algorithm_type_t &amp;algor_type, const std::string @@ -124,6 +124,16 @@ bool copy_algor_param_aux(const algorithm_type_t &amp;algor_type, const std::string
124 *((algor_config_param_type *)algor_param); // deep copy. 124 *((algor_config_param_type *)algor_param); // deep copy.
125 } break; 125 } break;
126 126
  127 + case algorithm_type_t::HUMAN_LINGER:
  128 + case algorithm_type_t::VEHICLE_ILLEGAL_PARKING:
  129 + {
  130 + m_algor_config_params[task_id].human_algors.insert(algor_type);
  131 + using algor_config_param_type = algor_config_param_behavior;
  132 + copied_algor_param->algor_param = new algor_config_param_type;
  133 + *((algor_config_param_type *)(copied_algor_param->algor_param)) =
  134 + *((algor_config_param_type *)algor_param); // deep copy.
  135 + } break;
  136 +
127 137
128 //221026byzsh--------------------------------------------------------- 138 //221026byzsh---------------------------------------------------------
129 case algorithm_type_t::ROAD_WORK_DET: { 139 case algorithm_type_t::ROAD_WORK_DET: {
@@ -381,6 +391,20 @@ void task_param_manager::delete_task_param(string task_id) { @@ -381,6 +391,20 @@ void task_param_manager::delete_task_param(string task_id) {
381 } 391 }
382 break; 392 break;
383 } 393 }
  394 +
  395 + case algorithm_type_t::HUMAN_LINGER:
  396 + case algorithm_type_t::VEHICLE_ILLEGAL_PARKING:
  397 + {
  398 + algor_config_param_behavior *algor_param =
  399 + (algor_config_param_behavior *)((algor_init_config_param_t *)m_task_params[task_id][iter.first])
  400 + ->algor_param;
  401 + if (algor_param) {
  402 + delete (algor_config_param_behavior *)((algor_init_config_param_t *)m_task_params[task_id][iter.first])
  403 + ->algor_param;
  404 + ((algor_init_config_param_t *)m_task_params[task_id][iter.first])->algor_param = nullptr;
  405 + }
  406 + break;
  407 + }
384 408
385 //221026byzsh--------------------------------------------------------- 409 //221026byzsh---------------------------------------------------------
386 case algorithm_type_t::ROAD_WORK_DET: { 410 case algorithm_type_t::ROAD_WORK_DET: {