diff --git a/src/ai_engine_module/ai_engine_module.h b/src/ai_engine_module/ai_engine_module.h index 9a3d962..cffbe4e 100644 --- a/src/ai_engine_module/ai_engine_module.h +++ b/src/ai_engine_module/ai_engine_module.h @@ -1,5 +1,7 @@ #pragma once +#include "./ai_engine_header.h" + #include "./VPTProcess.h" #include "./face_det_ai_engine.h" #include "./pedestrian_vehicle_retrograde.h" diff --git a/src/ai_engine_module/face_detect.h b/src/ai_engine_module/face_detect.h old mode 100755 new mode 100644 index cddb023..cddb023 --- a/src/ai_engine_module/face_detect.h +++ b/src/ai_engine_module/face_detect.h diff --git a/src/ai_platform/MultiSourceProcess.cpp b/src/ai_platform/MultiSourceProcess.cpp index ffd87a2..83d5c67 100644 --- a/src/ai_platform/MultiSourceProcess.cpp +++ b/src/ai_platform/MultiSourceProcess.cpp @@ -631,7 +631,9 @@ int CMultiSourceProcess::algorthim_vpt(vector vec_gpuMem){ /* for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径)*/ vehicle_snapshot(vpt_interest_task_id, deleteObjectID); #else - algorithm_vehicle_relult(vec_vptMem, vptResult, deleteObjectID); + algorithm_timing_snapshot(vec_vptMem, vptResult, algorithm_type_t::HUMAN_TIMING_SNAPSHOT); + algorithm_timing_snapshot(vec_vptMem, vptResult, algorithm_type_t::VEHICLE_TIMING_SNAPSHOT); + algorithm_timing_snapshot(vec_vptMem, vptResult, algorithm_type_t::NONMOTOR_VEHICLE_TIMING_SNAPSHOT); send_locus_finished_msg(vpt_interest_task_id, deleteObjectID); #endif @@ -706,9 +708,9 @@ void CMultiSourceProcess::trace_record(vector& vec_gpuMem, vector } } -int CMultiSourceProcess::algorithm_vehicle_relult(vector vec_devMem, vector& vptResult, vector>& delete_object_id) { +int CMultiSourceProcess::algorithm_timing_snapshot(vector vec_devMem, vector& vptResult, algorithm_type_t algor_type) { - vector results = m_snapshot_reprocessing->get_vehicle_snapshot(vec_devMem, vptResult, skip_frame_); + vector results = m_snapshot_reprocessing->get_timing_snapshot(vec_devMem, vptResult, algor_type); VPCUtil* pVPCUtil = VPCUtil::getInstance(); for (auto &result : results) { @@ -717,9 +719,9 @@ int CMultiSourceProcess::algorithm_vehicle_relult(vector vec_devM } auto task_id = result.task_id; auto task_other_params = m_task_param_manager->get_task_other_param(task_id); - const auto &algor_other_params = task_other_params->find(algorithm_type_t::VEHICLE_SNAPSHOT); + const auto &algor_other_params = task_other_params->find(algor_type); if (algor_other_params == task_other_params->end()) { - LOG_ERROR("[Error] taskId {} not found algor {}", task_id.c_str(), (int)algorithm_type_t::VEHICLE_SNAPSHOT); + LOG_ERROR("[Error] taskId {} not found algor {}", task_id.c_str(), (int)algor_type); continue; } const algor_basic_config_param_t *basic_param = algor_other_params->second->basic_param; @@ -756,7 +758,7 @@ int CMultiSourceProcess::algorithm_vehicle_relult(vector vec_devM strcpy(new_obj_ss_info.video_image_path, fpath_origin.c_str()); strcpy(new_obj_ss_info.snapshot_image_path, fpath_roi.c_str()); new_obj_ss_info.nFinished = 0; - string json_str = helpers::gen_json::gen_multi_obj_json(algorithm_type_t::VEHICLE_SNAPSHOT, new_obj_ss_info); + string json_str = helpers::gen_json::gen_multi_obj_json(algor_type, new_obj_ss_info); ImgSaveInfo save_info; save_info.file_path = fpath_roi; @@ -764,7 +766,7 @@ int CMultiSourceProcess::algorithm_vehicle_relult(vector vec_devM save_info.json_str = json_str; m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(save_info); - OBJ_KEY obj_key{task_id, obj.object_id}; + ai_engine_module::obj_key_t obj_key{obj.object_id, task_id, algor_type}; // 保存有轨迹的object记录,轨迹结束时需要发消息 std::lock_guard l(m_total_mutex); m_total_snapshot_info_multi_object.insert(obj_key); @@ -784,31 +786,44 @@ void CMultiSourceProcess::send_locus_finished_msg(vector& vpt_interest_t string task_id = *task_iter; for (int &j : deleteObjectID[i]) // loop algor type. { - OBJ_KEY obj_key = {task_id, j}; - auto task_param_ptr = m_task_param_manager->get_task_algor_param(task_id); // 该路任务开启了抓拍功能 开始抓拍保存;若未开启抓拍,清空显存资源 - if (task_param_ptr->vehicle_algors.find(algorithm_type_t::VEHICLE_SNAPSHOT) != task_param_ptr->vehicle_algors.end()) { - std::lock_guard l(m_total_mutex); - if (m_total_snapshot_info_multi_object.find(obj_key) != m_total_snapshot_info_multi_object.end()) { - video_object_snapshot new_obj_ss_info; - new_obj_ss_info.object_id = j; - new_obj_ss_info.nFinished = 1; - strcpy(new_obj_ss_info.task_id, task_id.c_str()); - string json_str = helpers::gen_json::gen_multi_obj_json(algorithm_type_t::VEHICLE_SNAPSHOT, new_obj_ss_info); - // 通知结束的轨迹 - ImgSaveInfo save_info; - save_info.json_str = json_str; - m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(save_info); - - m_total_snapshot_info_multi_object.erase(obj_key); - } + if (task_param_ptr->vehicle_algors.find(algorithm_type_t::VEHICLE_TIMING_SNAPSHOT) != task_param_ptr->vehicle_algors.end()) { + ai_engine_module::obj_key_t obj_key = {j, task_id, algorithm_type_t::VEHICLE_TIMING_SNAPSHOT}; + timing_snapshot_finish_msg(obj_key, algorithm_type_t::VEHICLE_TIMING_SNAPSHOT); + } + + if (task_param_ptr->vehicle_algors.find(algorithm_type_t::NONMOTOR_VEHICLE_TIMING_SNAPSHOT) != task_param_ptr->vehicle_algors.end()) { + ai_engine_module::obj_key_t obj_key = {j, task_id, algorithm_type_t::NONMOTOR_VEHICLE_TIMING_SNAPSHOT}; + timing_snapshot_finish_msg(obj_key, algorithm_type_t::NONMOTOR_VEHICLE_TIMING_SNAPSHOT); + } + + if (task_param_ptr->vehicle_algors.find(algorithm_type_t::HUMAN_TIMING_SNAPSHOT) != task_param_ptr->vehicle_algors.end()) { + ai_engine_module::obj_key_t obj_key = {j, task_id, algorithm_type_t::HUMAN_TIMING_SNAPSHOT}; + timing_snapshot_finish_msg(obj_key, algorithm_type_t::HUMAN_TIMING_SNAPSHOT); } } } } +void CMultiSourceProcess::timing_snapshot_finish_msg(ai_engine_module::obj_key_t obj_key, algorithm_type_t algor_type) { + std::lock_guard l(m_total_mutex); + if (m_total_snapshot_info_multi_object.find(obj_key) != m_total_snapshot_info_multi_object.end()) { + video_object_snapshot new_obj_ss_info; + new_obj_ss_info.object_id = obj_key.obj_id; + new_obj_ss_info.nFinished = 1; + strcpy(new_obj_ss_info.task_id, obj_key.task_id.c_str()); + string json_str = helpers::gen_json::gen_multi_obj_json(algor_type, new_obj_ss_info); + // 通知结束的轨迹 + ImgSaveInfo save_info; + save_info.json_str = json_str; + m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(save_info); + + m_total_snapshot_info_multi_object.erase(obj_key); + } +} + // for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径) void CMultiSourceProcess::vehicle_snapshot(vector& vpt_interest_task_id, vector> deleteObjectID) { auto task_iter = vpt_interest_task_id.begin(); diff --git a/src/ai_platform/MultiSourceProcess.h b/src/ai_platform/MultiSourceProcess.h index 159323c..574fdae 100644 --- a/src/ai_platform/MultiSourceProcess.h +++ b/src/ai_platform/MultiSourceProcess.h @@ -69,8 +69,12 @@ private: bool task_has_vpt_algor(const std::string &task_id); void clear_finished_task(); bool finish_task(const string taskID, const bool delete_snapshot); - int algorithm_vehicle_relult(vector vec_devMem, vector& vptResult, vector>& delete_object_id); + + int algorithm_timing_snapshot(vector vec_devMem, vector& vptResult, algorithm_type_t algor_type); + void send_locus_finished_msg(vector& vpt_interest_task_id, vector> deleteObjectID); + void timing_snapshot_finish_msg(ai_engine_module::obj_key_t obj_key, algorithm_type_t algor_type); + void vehicle_snapshot(vector& vpt_interest_task_id, vector> deleteObjectID); void vehicle_locus_finished(const OBJ_KEY obj_key); @@ -115,7 +119,7 @@ private: int m_batch_size{1}; - set m_total_snapshot_info_multi_object; + set m_total_snapshot_info_multi_object; mutex m_total_mutex; mutex m_TotalObjMtx ; diff --git a/src/ai_platform/header.h b/src/ai_platform/header.h index 6c17e3b..ab76f08 100644 --- 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_TIMING_SNAPSHOT = 213, // 行人轨迹定时抓拍 HUMAN_LINGER = 214, // 人员徘徊 HUMAN_REGION_GATHER = 215, // 区域人员聚集 HUMAN_REGION_DISMISS = 216, // 人员逃散 @@ -44,6 +45,7 @@ enum class algorithm_type_t { HUMAN_LEAVE_REGION = 222, // 区域离开 VEHICLE_SNAPSHOT = 301, + VEHICLE_TIMING_SNAPSHOT = 302, // 车辆轨迹定时抓拍 VEHICLE_RETROGRADE = 310, VEHICLE_TRESPASS = 311, VEHICLE_GATHER = 312, // 车辆聚集 @@ -53,6 +55,7 @@ enum class algorithm_type_t { NONMOTOR_VEHICLE_SNAPSHOT = 401, TAKEAWAY_MEMBER_CLASSIFICATION = 402, + NONMOTOR_VEHICLE_TIMING_SNAPSHOT = 403, // 非机动车轨迹定时抓拍 FLOW_STATISTICS = 500, // 用于数量统计 NONMOTOR_VEHICLE_NOHELMET = 501,// 电动/摩托车不戴头盔 diff --git a/src/reprocessing_module/snapshot_reprocessing.cpp b/src/reprocessing_module/snapshot_reprocessing.cpp index 86721dd..bfc2d7e 100644 --- a/src/reprocessing_module/snapshot_reprocessing.cpp +++ b/src/reprocessing_module/snapshot_reprocessing.cpp @@ -32,91 +32,6 @@ static void box_expansion(video_object_info& obj_info, float expand_ratio, int f obj_info.bottom = min(obj_info.bottom + expansion_height, frame_height - 1); } -/* 获取人车物目标快照图 */ -vector snapshot_reprocessing::get_vehicle_snapshot(vector vec_devMem, vector& ol_det_result, int skip_frame) -{ - // 过滤出车辆 - filter_vehicle(ol_det_result); - - map && algor_config_param = m_task_param_manager->get_task_algor_params(); - map> && algor_param = m_task_param_manager->get_task_other_params(); - - vector results; - int idx = 0; - for (auto memPtr : vec_devMem) - { - string task_id = memPtr->getId(); - map> taskid_to_obj; - if (algor_config_param.count(task_id) && algor_config_param[task_id].vehicle_algors.count(algorithm_type_t::VEHICLE_SNAPSHOT)) - { - task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][algorithm_type_t::VEHICLE_SNAPSHOT]; - if (!cur_task_params || !cur_task_params->basic_param || !cur_task_params->basic_param->adapt_param) - { - continue; - } - - // 多边形区域 - auto adapt_param = cur_task_params->basic_param->adapt_param; - if (adapt_param->points_count <= 0) { - continue; - } - - // 同一目标间隔多少帧保存 - int snap_frame_interval = ((algor_config_param_snapshot*)cur_task_params->algor_param)->snap_frame_interval; - - onelevel_det_result &cur_task_ol_detres = ol_det_result[idx]; - - for (int c = 0; c < cur_task_ol_detres.obj_count; c++) - { - det_objinfo det_obj = cur_task_ol_detres.obj[c]; - if(snap_frame_interval > 0 && det_obj.num % snap_frame_interval >= skip_frame){ - continue; - } - - sy_point center; - center.x_ = (det_obj.left + det_obj.right) * 0.5; - center.y_ = det_obj.bottom; - - int type_index = det_obj.index; - if ((type_index == 4 || type_index == 5 || type_index == 6 || type_index ==7 || type_index ==8) - && common::isInPolygon(adapt_param->points, adapt_param->points_count, center)) - { - video_object_info obj_info; - obj_info.top = det_obj.top; - obj_info.left = det_obj.left; - obj_info.right = det_obj.right; - obj_info.bottom = det_obj.bottom; - obj_info.confidence = det_obj.confidence; - obj_info.index = type_index; - obj_info.object_id = det_obj.id; - - int frame_height = memPtr->getHeight(); - int frame_width = memPtr->getWidth(); - box_expansion(obj_info, EXPANSION_PROPORTION, frame_width, frame_height); - - taskid_to_obj[task_id].emplace_back(std::move(obj_info)); - } - } - - if (taskid_to_obj.size() > 0) - { - static long long gid_ = 0; - - multi_obj_data_t data; - data.memPtr = memPtr; - data.task_id = task_id; - data.objs = std::move(taskid_to_obj[task_id]); - data.id = gid_++; - results.emplace_back(std::move(data)); - LOG_TRACE("{} {} snap_frame_interval:{}", task_id.c_str(), (int)algorithm_type_t::VEHICLE_SNAPSHOT, snap_frame_interval); - } - } - - idx++; - } - return results; -} - void snapshot_reprocessing::screen_effective_snapshot(vector &_onelevel_det_result){ map algor_param = m_task_param_manager->get_task_algor_params(); @@ -775,6 +690,97 @@ int snapshot_reprocessing::update_face_bestsnapshot(vector vec_de return 0; } +// algor_type: HUMAN_TIMING_SNAPSHOT、NONMOTOR_VEHICLE_TIMING_SNAPSHOT、VEHICLE_TIMING_SNAPSHOT +vector snapshot_reprocessing::get_timing_snapshot(vector vec_devMem, vector& ol_det_result, algorithm_type_t algor_type) +{ + map && algor_config_param = m_task_param_manager->get_task_algor_params(); + map> && algor_param = m_task_param_manager->get_task_other_params(); + + vector results; + for (size_t idx = 0; idx < vec_devMem.size(); idx++) + { + DeviceMemory* memPtr = vec_devMem[idx]; + std::string task_id = memPtr->getId(); + + map> taskid_to_obj; + if (algor_config_param.count(task_id) && algor_config_param[task_id].vehicle_algors.count(algor_type)) + { + task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][algor_type]; + if (!cur_task_params || !cur_task_params->basic_param || !cur_task_params->basic_param->adapt_param) + { + continue; + } + + // 多边形区域 + auto adapt_param = cur_task_params->basic_param->adapt_param; + if (adapt_param->points_count <= 0) { + continue; + } + + // 同一目标间隔多少帧保存 + int snap_frame_interval = ((algor_config_param_snapshot*)cur_task_params->algor_param)->snap_frame_interval; + + onelevel_det_result &cur_task_ol_detres = ol_det_result[idx]; + + for (int c = 0; c < cur_task_ol_detres.obj_count; c++) + { + det_objinfo det_obj = cur_task_ol_detres.obj[c]; + if(snap_frame_interval > 0 && det_obj.num % snap_frame_interval){ + continue; + } + + int type_index = det_obj.index; + if (algor_type == algorithm_type_t::HUMAN_TIMING_SNAPSHOT && algor_index_table["human"].find(type_index) == algor_index_table["human"].end()) { + continue; + } else if (algor_type == algorithm_type_t::NONMOTOR_VEHICLE_TIMING_SNAPSHOT && algor_index_table["nonmotor_vehicle"].find(type_index) == algor_index_table["nonmotor_vehicle"].end()) { + continue; + } else if (algor_type == algorithm_type_t::VEHICLE_TIMING_SNAPSHOT && algor_index_table["vehicle"].find(type_index) == algor_index_table["vehicle"].end()) { + continue; + } else { + continue; + } + + sy_point center; + center.x_ = (det_obj.left + det_obj.right) * 0.5; + center.y_ = det_obj.bottom; + if (!common::isInPolygon(adapt_param->points, adapt_param->points_count, center)) { + continue; + } + + video_object_info obj_info; + obj_info.top = det_obj.top; + obj_info.left = det_obj.left; + obj_info.right = det_obj.right; + obj_info.bottom = det_obj.bottom; + obj_info.confidence = det_obj.confidence; + obj_info.index = type_index; + obj_info.object_id = det_obj.id; + + int frame_height = memPtr->getHeight(); + int frame_width = memPtr->getWidth(); + box_expansion(obj_info, EXPANSION_PROPORTION, frame_width, frame_height); + + taskid_to_obj[task_id].emplace_back(std::move(obj_info)); + } + + if (taskid_to_obj.size() > 0) + { + static long long gid_ = 0; + + multi_obj_data_t data; + data.memPtr = memPtr; + data.task_id = task_id; + data.objs = std::move(taskid_to_obj[task_id]); + data.id = gid_++; + results.emplace_back(std::move(data)); + } + } + } + + return results; +} + + map snapshot_reprocessing::get_total_snapshot_info(){ return total_snapshot_info; } diff --git a/src/reprocessing_module/snapshot_reprocessing.h b/src/reprocessing_module/snapshot_reprocessing.h index 3171da8..a0764c3 100644 --- a/src/reprocessing_module/snapshot_reprocessing.h +++ b/src/reprocessing_module/snapshot_reprocessing.h @@ -68,7 +68,7 @@ public: snapshot_reprocessing(int devId); ~snapshot_reprocessing(); - vector get_vehicle_snapshot(vector vec_devMem, vector& ol_det_result, int skip_frame); + vector get_timing_snapshot(vector vec_devMem, vector& ol_det_result, algorithm_type_t algor_type); void screen_effective_snapshot(vector &_onelevel_det_result); void filter_vehicle(vector &_onelevel_det_result); diff --git a/src/tsl_aiplatform_jni/AiEngineNativeInterface.cpp b/src/tsl_aiplatform_jni/AiEngineNativeInterface.cpp index 658a466..8b9ea8b 100644 --- a/src/tsl_aiplatform_jni/AiEngineNativeInterface.cpp +++ b/src/tsl_aiplatform_jni/AiEngineNativeInterface.cpp @@ -404,9 +404,9 @@ JNIEXPORT jint JNICALL Java_com_objecteye_nativeinterface_TSLAiEngineNativeInter case algorithm_type_t::FACE_SNAPSHOT: case algorithm_type_t::HUMAN_SNAPSHOT: case algorithm_type_t::VEHICLE_SNAPSHOT: - // case algorithm_type_t::HUMAN_TIMING_SNAPSHOT: - // case algorithm_type_t::VEHICLE_TIMING_SNAPSHOT: - // case algorithm_type_t::NONMOTOR_VEHICLE_TIMING_SNAPSHOT: + case algorithm_type_t::HUMAN_TIMING_SNAPSHOT: + case algorithm_type_t::VEHICLE_TIMING_SNAPSHOT: + case algorithm_type_t::NONMOTOR_VEHICLE_TIMING_SNAPSHOT: case algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT: { jfieldID fid = env->GetFieldID(cls_AlgorConfigParam, "threshold", "F"); jfieldID fid_snap_frame_interval = env->GetFieldID(cls_AlgorConfigParam, "snap_frame_interval", "I");