From 35fac12dfb1a0106331be0990473ed6fd767adff Mon Sep 17 00:00:00 2001 From: cmhu <2657262686@qq.com> Date: Thu, 19 Jun 2025 18:53:43 +0800 Subject: [PATCH] 添加人员徘徊和车辆违停 --- src/ai_platform/MultiSourceProcess.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ src/ai_platform/MultiSourceProcess.h | 9 +++++---- src/ai_platform/det_obj_header.h | 2 ++ src/ai_platform/header.h | 14 +++++++++++++- src/ai_platform/task_param_manager.cpp | 24 ++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 11 deletions(-) diff --git a/src/ai_platform/MultiSourceProcess.cpp b/src/ai_platform/MultiSourceProcess.cpp index 86e534e..3b6f358 100755 --- a/src/ai_platform/MultiSourceProcess.cpp +++ b/src/ai_platform/MultiSourceProcess.cpp @@ -930,8 +930,11 @@ int CMultiSourceProcess::algorthim_vpt(vector vec_gpuMem){ cross_line_process(vec_vptMem, vptResult, algorithm_type_t::HUMAN_CROSSING_LINE); cross_line_process(vec_vptMem, vptResult, algorithm_type_t::HUMAN_CLIMB); cross_line_process(vec_vptMem, vptResult, algorithm_type_t::VEHICLE_ILLEGAL_CROSSING_LINE); + + wander_detect(vec_vptMem, vptResult, algorithm_type_t::HUMAN_LINGER); + wander_detect(vec_vptMem, vptResult, algorithm_type_t::VEHICLE_ILLEGAL_PARKING); // 轨迹记录 - trace_record(vpt_interest_task_id, vptResult); + trace_record(vec_vptMem, vptResult); // 农村违法分析的快照缓存 m_snapshot_reprocessing->update_village_bestsnapshot(vec_vptMem, vptResult, deleteObjectID); // 三轮车载人 @@ -1319,19 +1322,27 @@ void CMultiSourceProcess::algorthim_trespass(vector& vpt_interest_task_i } // 轨迹记录 -void CMultiSourceProcess::trace_record(vector& vpt_interest_task_id, vector& vptResult) { - int bidx = 0; - for (auto iter = vpt_interest_task_id.begin(); iter != vpt_interest_task_id.end(); ++ iter, ++ bidx) { - auto task_id = *iter; +void CMultiSourceProcess::trace_record(vector& vec_gpuMem, vector& vptResult) { + + for (size_t bidx = 0; bidx < vec_gpuMem.size(); bidx++){ + DeviceMemory* gpuMem = vec_gpuMem[bidx]; + string task_id = gpuMem->getId(); + for (int c = 0; c < vptResult[bidx].obj_count; c++) { //计算检测框坐标中心点 sy_point center_point; center_point.x_ = vptResult[bidx].obj[c].left + (vptResult[bidx].obj[c].right - vptResult[bidx].obj[c].left) * 0.5; // center_point.y_ = vptResult[bidx].obj[c].top + (vptResult[bidx].obj[c].bottom - vptResult[bidx].obj[c].top) * 0.85; - center_point.y_ = vptResult[bidx].obj[c].bottom; + center_point.y_ = vptResult[bidx].obj[c].bottom; // 越线检测以脚越线为标准 OBJ_KEY new_obj = { task_id, vptResult[bidx].obj[c].id }; m_TotalObjMtx.lock(); + auto it = m_total_obj_info.find(new_obj); + if (it == m_total_obj_info.end()) + { + m_total_obj_info[new_obj].last_frame_nb = gpuMem->getFrameNb(); + m_total_obj_info[new_obj].last_ts = gpuMem->getTimesstamp(); + } m_total_obj_info[new_obj].index = vptResult[bidx].obj[c].index; m_total_obj_info[new_obj].center_points.push_back(center_point); m_TotalObjMtx.unlock(); @@ -2244,6 +2255,98 @@ void CMultiSourceProcess::cross_line_process(vector vec_gpuMem, v } } +void CMultiSourceProcess::wander_detect(vector& vec_gpuMem, vector& vptResult, algorithm_type_t eType) +{ + map> && algor_param = m_task_param_manager->get_task_other_params(); + + for (size_t i = 0; i < vec_gpuMem.size(); i++) + { + DeviceMemory* gpuMem = vec_gpuMem[i]; + string task_id = gpuMem->getId(); + long frame_nb = gpuMem->getFrameNb(); + + task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][eType]; + if (!cur_task_params) + { + continue; + } + + algor_config_param_behavior* algor_param = (algor_config_param_behavior*)cur_task_params->algor_param; + algor_basic_config_param_t* basic_param = (algor_basic_config_param_t*)cur_task_params->basic_param; + + long algor_skip_gap = algor_param->duration; + + std::string cur_src_ts = std::to_string(helpers::timer::get_timestamp()); + std::string origin_file_path = basic_param->result_folder + helpers::os::sep + task_id + "_origin_" + cur_src_ts + ".jpg"; + + std::vector boxes; + for (int c = 0; c < vptResult[i].obj_count; c++) { + auto& obj_c = vptResult[i].obj[c]; + + bool bCount = false; + if(eType == algorithm_type_t::HUMAN_LINGER && obj_c.index == (int)det_class_label_t::HUMAN) { + bCount = true; + } else if (eType == algorithm_type_t::VEHICLE_ILLEGAL_PARKING && obj_c.index >= 4 && obj_c.index <= 8) { + bCount = true; + } + + if (!bCount || !snapshot_legal_inarea(basic_param->algor_valid_rect, obj_c.left, obj_c.top, obj_c.right, obj_c.bottom)) + { + continue; + } + + if (obj_c.confidence < algor_param->conf_threshold) + { + continue; + } + + int obj_width = obj_c.right - obj_c.left; + int obj_height = obj_c.right - obj_c.left; + if (obj_width < algor_param->minmum_width || obj_height < algor_param->minmum_height) + { + continue; + } + + OBJ_KEY o_key = { task_id, obj_c.id }; + m_TotalObjMtx.lock(); + auto it = m_total_obj_info.find(o_key); + if (it != m_total_obj_info.end()) + { + long skip_gap = frame_nb - m_total_obj_info[o_key].last_frame_nb; + if (skip_gap > algor_skip_gap) + { + box_t box; + box.left = obj_c.left; + box.right = obj_c.right; + box.top = obj_c.top; + box.bottom = obj_c.bottom; + box.score = obj_c.confidence; + boxes.push_back(box); + + m_total_obj_info[o_key].last_frame_nb = frame_nb; // 更新帧号以判断下一次逗留 + } + } + + m_TotalObjMtx.unlock(); + } + + if (boxes.size() <= 0) + { + continue; + } + + int algorithm_type = (int)eType; + string json_str = helpers::gen_json::gen_boxes_json(task_id, algorithm_type, boxes, origin_file_path); + + ImgSaveInfo info_origin; + info_origin.img_info = VPCUtil::vpc_devMem2vpcImg(gpuMem); + info_origin.file_path = origin_file_path; + info_origin.json_str = json_str; + m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(info_origin); + } + +} + void CMultiSourceProcess::face_locus_finished(const OBJ_KEY obj_key) { map _total_face_snapshot_info = m_snapshot_reprocessing->get_total_face_snapshot_info(); diff --git a/src/ai_platform/MultiSourceProcess.h b/src/ai_platform/MultiSourceProcess.h index cdf9c3a..a12a64d 100755 --- a/src/ai_platform/MultiSourceProcess.h +++ b/src/ai_platform/MultiSourceProcess.h @@ -75,13 +75,12 @@ private: // 逆行 void algorthim_retrograde(vector& vpt_interest_task_id, vector vpt_interest_imgs, vector& vptResult); // 闯入 - void algorthim_trespass(vector& vpt_interest_task_id, vector vpt_interest_imgs, - vector& vptResult ,vector>& deleteObjectID); + void algorthim_trespass(vector& vpt_interest_task_id, vector vpt_interest_imgs, vector& vptResult ,vector>& deleteObjectID); // 道路分割 int algorthim_road_seg(vector vec_gpuMem); // 轨迹记录 - void trace_record(vector& vpt_interest_task_id, vector& vptResult); + void trace_record(vector& vec_gpuMem, vector& vptResult); // 三轮车载人 void algorithm_tricycle_manned(vector& vpt_interest_task_id, vector vpt_interest_imgs, vector& vptResult); // 货车载人 @@ -98,7 +97,6 @@ private: void algorithm_traffic_light_process(vector& vpt_interest_task_id, vector vpt_interest_imgs, vector& vptResult); // 道路分割相关算法--占用机动车道等 void algorithm_roadseg_correlation_process(vector& vpt_interest_task_id, vector vpt_interest_imgs, vector& vptResult); - private: // 工具处理函数 @@ -124,6 +122,9 @@ private: int snapshot_task(std::string& uri_or_name, const std::string& file_name, bool bInTask); void cross_line_process(vector vec_devMem, vector& vptResult, algorithm_type_t eType); + + void wander_detect(vector& vec_gpuMem, vector& vptResult, algorithm_type_t eType); + private: int m_devId; diff --git a/src/ai_platform/det_obj_header.h b/src/ai_platform/det_obj_header.h index 0234f15..4e688dc 100755 --- a/src/ai_platform/det_obj_header.h +++ b/src/ai_platform/det_obj_header.h @@ -21,6 +21,8 @@ using namespace std; struct OBJ_INDEX { int index; int count; //用于对index的计数 + int last_frame_nb{0}; + int last_ts{0}; vector center_points; //存储轨迹中心点坐标-- OBJ_INDEX() : count(0), index(0) {} }; diff --git a/src/ai_platform/header.h b/src/ai_platform/header.h index ce53874..aea9ff6 100755 --- a/src/ai_platform/header.h +++ b/src/ai_platform/header.h @@ -34,6 +34,7 @@ enum class algorithm_type_t { PEDESTRIAN_TRESPASS = 211, ROAD_WORK_DET = 212, // 221026byzsh施工占道 + HUMAN_LINGER = 214, // 人员徘徊 HUMAN_CLIMB = 220, // 人员攀爬 HUMAN_CROSSING_LINE = 221, // 人员越线 @@ -41,6 +42,7 @@ enum class algorithm_type_t { VEHICLE_RETROGRADE = 310, VEHICLE_TRESPASS = 311, VEHICLE_GATHER = 312, // 车辆聚集 + VEHICLE_ILLEGAL_PARKING = 313, // 车辆违停 VEHICLE_ILLEGAL_CROSSING_LINE = 314, // 车辆压线 NONMOTOR_VEHICLE_SNAPSHOT = 401, @@ -393,7 +395,6 @@ typedef algor_config_param_pedestrian_safety_detector_basic algor_config_param_n #endif // #ifndef ___PEDESTRIAN_SAFETY_DETECTOR_ALGOR_CONFIG_PARAM__ - // 越线类 typedef struct algor_config_param_illegal_crossing_line { float conf_threshold{0.0}; // 目标检测阈值,小于该阈值不识别 @@ -403,6 +404,17 @@ typedef struct algor_config_param_illegal_crossing_line { } algor_config_param_illegal_crossing_line; // 车辆压线/人员越线/人员攀爬 共用 +typedef struct algor_config_param_behavior { + float conf_threshold; // 目标检测阈值,小于该阈值不识别 + unsigned minmum_height, minmum_width; // 最小目标大小,小于该值不识别 + int duration; // 持续时长 + int moving_distance_threshold; // 像素变动距离阈值 + algor_config_param_behavior() + : duration(0), conf_threshold(0.0f), minmum_height(0), minmum_width(0), moving_distance_threshold(0) { + } +} algor_config_param_behavior; + + // 行人安全检测参数 #ifndef ___RETROGRADE_ALGOR_CONFIG_PARAM__ #define ___RETROGRADE_ALGOR_CONFIG_PARAM__ diff --git a/src/ai_platform/task_param_manager.cpp b/src/ai_platform/task_param_manager.cpp index 277b040..a9c4173 100755 --- a/src/ai_platform/task_param_manager.cpp +++ b/src/ai_platform/task_param_manager.cpp @@ -124,6 +124,16 @@ bool copy_algor_param_aux(const algorithm_type_t &algor_type, const std::string *((algor_config_param_type *)algor_param); // deep copy. } break; + case algorithm_type_t::HUMAN_LINGER: + case algorithm_type_t::VEHICLE_ILLEGAL_PARKING: + { + m_algor_config_params[task_id].human_algors.insert(algor_type); + using algor_config_param_type = algor_config_param_behavior; + copied_algor_param->algor_param = new algor_config_param_type; + *((algor_config_param_type *)(copied_algor_param->algor_param)) = + *((algor_config_param_type *)algor_param); // deep copy. + } break; + //221026byzsh--------------------------------------------------------- case algorithm_type_t::ROAD_WORK_DET: { @@ -381,6 +391,20 @@ void task_param_manager::delete_task_param(string task_id) { } break; } + + case algorithm_type_t::HUMAN_LINGER: + case algorithm_type_t::VEHICLE_ILLEGAL_PARKING: + { + algor_config_param_behavior *algor_param = + (algor_config_param_behavior *)((algor_init_config_param_t *)m_task_params[task_id][iter.first]) + ->algor_param; + if (algor_param) { + delete (algor_config_param_behavior *)((algor_init_config_param_t *)m_task_params[task_id][iter.first]) + ->algor_param; + ((algor_init_config_param_t *)m_task_params[task_id][iter.first])->algor_param = nullptr; + } + break; + } //221026byzsh--------------------------------------------------------- case algorithm_type_t::ROAD_WORK_DET: { -- libgit2 0.21.4