Commit 39b31e88274544bc016a51b96030cb5a9f56246d
1 parent
d2ab26d1
添加人员攀爬、人员越线、车辆压线
Showing
7 changed files
with
222 additions
and
28 deletions
src/ai_platform/MultiSourceProcess.cpp
... | ... | @@ -13,6 +13,7 @@ |
13 | 13 | #include "../helpers/os_helper.hpp" |
14 | 14 | #include "../helpers/gen_json.hpp" |
15 | 15 | #include "../helpers/str_helper.hpp" |
16 | +#include "../helpers/common_tool.h" | |
16 | 17 | #include "../reprocessing_module/save_snapshot_reprocessing.h" |
17 | 18 | |
18 | 19 | #include "macro_definition.h" |
... | ... | @@ -765,9 +766,7 @@ int CMultiSourceProcess::algorthim_process_thread(){ |
765 | 766 | } |
766 | 767 | } |
767 | 768 | } |
768 | - | |
769 | 769 | |
770 | - | |
771 | 770 | } |
772 | 771 | |
773 | 772 | m_RgbDataList.pop_front(); |
... | ... | @@ -890,26 +889,29 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){ |
890 | 889 | } |
891 | 890 | |
892 | 891 | /* 待检测的图片不为空 开始检测 */ |
893 | - if (!vpt_interest_imgs.empty()) { | |
894 | - vector<vector<int>> deleteObjectID; | |
895 | - deleteObjectID.resize(vpt_interest_task_id.size()); | |
896 | - vector<vector<onelevel_det_result>> unUsedResult; | |
897 | - vector<onelevel_det_result> vptResult(0); | |
892 | + if (vpt_interest_imgs.empty()) { | |
893 | + return 1; | |
894 | + } | |
895 | + | |
896 | + vector<vector<int>> deleteObjectID; | |
897 | + deleteObjectID.resize(vpt_interest_task_id.size()); | |
898 | + vector<vector<onelevel_det_result>> unUsedResult; | |
899 | + vector<onelevel_det_result> vptResult(0); | |
898 | 900 | |
899 | - /* 一级检测器,内部已完成跟踪操作 */ | |
900 | - vpt_process.process_gpu(vpt_interest_imgs.data(), vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // do det & track. | |
901 | - // vpt_process.process_gpu(vpt_interest_imgs.data(), vec_vptMem, vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // debug | |
902 | - m_snapshot_reprocessing->screen_effective_snapshot(vptResult); | |
901 | + /* 一级检测器,内部已完成跟踪操作 */ | |
902 | + vpt_process.process_gpu(vpt_interest_imgs.data(), vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // do det & track. | |
903 | + // vpt_process.process_gpu(vpt_interest_imgs.data(), vec_vptMem, vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // debug | |
904 | + m_snapshot_reprocessing->screen_effective_snapshot(vptResult); | |
903 | 905 | |
904 | 906 | #ifndef VEHICLE_MULTI_BOXES |
905 | - /* 快照优选(内部可实现不同的快照优选策略) */ | |
906 | - m_snapshot_reprocessing->update_bestsnapshot(vec_vptMem, vptResult, deleteObjectID); | |
907 | - /* for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径)*/ | |
908 | - vehicle_snapshot(vpt_interest_task_id, deleteObjectID); | |
907 | + /* 快照优选(内部可实现不同的快照优选策略) */ | |
908 | + m_snapshot_reprocessing->update_bestsnapshot(vec_vptMem, vptResult, deleteObjectID); | |
909 | + /* for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径)*/ | |
910 | + vehicle_snapshot(vpt_interest_task_id, deleteObjectID); | |
909 | 911 | #else |
910 | - algorithm_vehicle_relult(vec_vptMem, vptResult, deleteObjectID); | |
912 | + algorithm_vehicle_relult(vec_vptMem, vptResult, deleteObjectID); | |
911 | 913 | |
912 | - send_locus_finished_msg(vpt_interest_task_id, deleteObjectID); | |
914 | + send_locus_finished_msg(vpt_interest_task_id, deleteObjectID); | |
913 | 915 | #endif |
914 | 916 | |
915 | 917 | // #ifdef WITH_SECOND_PROCESS |
... | ... | @@ -925,6 +927,9 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){ |
925 | 927 | |
926 | 928 | // #endif |
927 | 929 | #ifdef USE_VILLAGE |
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); | |
932 | + cross_line_process(vec_vptMem, vptResult, algorithm_type_t::VEHICLE_ILLEGAL_CROSSING_LINE); | |
928 | 933 | // 轨迹记录 |
929 | 934 | trace_record(vpt_interest_task_id, vptResult); |
930 | 935 | // 农村违法分析的快照缓存 |
... | ... | @@ -948,14 +953,13 @@ int CMultiSourceProcess::algorthim_vpt(vector<DeviceMemory*> vec_gpuMem){ |
948 | 953 | village_snapshot(vpt_interest_task_id, vec_vptMem, deleteObjectID); |
949 | 954 | #endif |
950 | 955 | |
951 | - vptResult.clear(); | |
952 | - unUsedResult.clear(); | |
953 | - // deleteObjectID.clear(); | |
954 | - for (int i = 0; i < deleteObjectID.size(); i++) { | |
955 | - vector<int>().swap(deleteObjectID[i]); // free. | |
956 | - } | |
957 | - vector<vector<int>>().swap(deleteObjectID); // free. | |
956 | + vptResult.clear(); | |
957 | + unUsedResult.clear(); | |
958 | + // deleteObjectID.clear(); | |
959 | + for (int i = 0; i < deleteObjectID.size(); i++) { | |
960 | + vector<int>().swap(deleteObjectID[i]); // free. | |
958 | 961 | } |
962 | + vector<vector<int>>().swap(deleteObjectID); // free. | |
959 | 963 | |
960 | 964 | vec_vptMem.clear(); |
961 | 965 | vpt_interest_task_id.clear(); |
... | ... | @@ -1331,7 +1335,6 @@ void CMultiSourceProcess::trace_record(vector<string>& vpt_interest_task_id, vec |
1331 | 1335 | m_total_obj_info[new_obj].index = vptResult[bidx].obj[c].index; |
1332 | 1336 | m_total_obj_info[new_obj].center_points.push_back(center_point); |
1333 | 1337 | m_TotalObjMtx.unlock(); |
1334 | - | |
1335 | 1338 | } |
1336 | 1339 | } |
1337 | 1340 | } |
... | ... | @@ -2141,6 +2144,106 @@ void CMultiSourceProcess::algorthim_face_detect(vector<DeviceMemory*> vec_gpuMem |
2141 | 2144 | } |
2142 | 2145 | } |
2143 | 2146 | |
2147 | +void CMultiSourceProcess::cross_line_process(vector<DeviceMemory*> vec_gpuMem, vector<onelevel_det_result>& vptResult, algorithm_type_t eType) | |
2148 | +{ | |
2149 | + map<string, map<algo_type, task_param_manager::algo_param_type_t_*>> && algor_param = m_task_param_manager->get_task_other_params(); | |
2150 | + | |
2151 | + for (int bidx = 0; bidx < vec_gpuMem.size(); ++ bidx) { | |
2152 | + | |
2153 | + DeviceMemory* gpuMem = vec_gpuMem[bidx]; | |
2154 | + string task_id = gpuMem->getId(); | |
2155 | + | |
2156 | + task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][eType]; | |
2157 | + if (!cur_task_params) | |
2158 | + { | |
2159 | + continue; | |
2160 | + } | |
2161 | + | |
2162 | + bool b_src_saved = false; | |
2163 | + | |
2164 | + algor_config_param_illegal_crossing_line* algor_param = (algor_config_param_illegal_crossing_line*)cur_task_params->algor_param; | |
2165 | + algor_basic_config_param_t* basic_param = (algor_basic_config_param_t*)cur_task_params->basic_param; | |
2166 | + jxline std_line(algor_param->p1.x_, algor_param->p1.y_, algor_param->p2.x_, algor_param->p2.y_); | |
2167 | + | |
2168 | + std::string cur_src_ts = std::to_string(helpers::timer::get_timestamp<std::chrono::milliseconds>()); | |
2169 | + std::string origin_file_path = basic_param->result_folder + helpers::os::sep + task_id + "_origin_" + cur_src_ts + ".jpg"; | |
2170 | + | |
2171 | + std::vector<box_t> boxes; | |
2172 | + for (int c = 0; c < vptResult[bidx].obj_count; c++) { | |
2173 | + auto& obj_c = vptResult[bidx].obj[c]; | |
2174 | + | |
2175 | + bool bHuman = eType == algorithm_type_t::HUMAN_CROSSING_LINE || eType == algorithm_type_t::HUMAN_CLIMB; | |
2176 | + | |
2177 | + bool bCount = false; | |
2178 | + if(bHuman && obj_c.index == (int)det_class_label_t::HUMAN) { | |
2179 | + bCount = true; | |
2180 | + } else if (eType == algorithm_type_t::VEHICLE_ILLEGAL_CROSSING_LINE && obj_c.index >= 4 && obj_c.index <= 8) { | |
2181 | + bCount = true; | |
2182 | + } | |
2183 | + | |
2184 | + if (!bCount || !snapshot_legal_inarea(basic_param->algor_valid_rect, obj_c.left, obj_c.top, obj_c.right, obj_c.bottom)) | |
2185 | + { | |
2186 | + continue; | |
2187 | + } | |
2188 | + | |
2189 | + if (obj_c.confidence < algor_param->conf_threshold) | |
2190 | + { | |
2191 | + continue; | |
2192 | + } | |
2193 | + | |
2194 | + int obj_width = obj_c.right - obj_c.left; | |
2195 | + int obj_height = obj_c.right - obj_c.left; | |
2196 | + if (obj_width < algor_param->minmum_width || obj_height < algor_param->minmum_height) | |
2197 | + { | |
2198 | + continue; | |
2199 | + } | |
2200 | + | |
2201 | + //计算检测框坐标中心点 | |
2202 | + sy_point center_point; | |
2203 | + center_point.x_ = obj_c.left + (obj_c.right - obj_c.left) * 0.5; | |
2204 | + center_point.y_ = obj_c.bottom; | |
2205 | + | |
2206 | + m_TotalObjMtx.lock(); | |
2207 | + | |
2208 | + OBJ_KEY obj_key = { task_id, obj_c.id }; | |
2209 | + auto it = m_total_obj_info.find(obj_key); | |
2210 | + if (it != m_total_obj_info.end()) | |
2211 | + { | |
2212 | + vector<sy_point> center_points = m_total_obj_info[obj_key].center_points; | |
2213 | + sy_point last_pt = center_points[center_points.size() - 1]; | |
2214 | + // 计算越线 | |
2215 | + jxline cur_line(last_pt.x_, last_pt.y_, center_point.x_, center_point.y_); | |
2216 | + bool bflag = common::is_intersect(cur_line, std_line); | |
2217 | + if (bflag) | |
2218 | + { | |
2219 | + box_t box; | |
2220 | + box.left = obj_c.left; | |
2221 | + box.right = obj_c.right; | |
2222 | + box.top = obj_c.top; | |
2223 | + box.bottom = obj_c.bottom; | |
2224 | + box.score = obj_c.confidence; | |
2225 | + boxes.push_back(box); | |
2226 | + } | |
2227 | + } | |
2228 | + m_TotalObjMtx.unlock(); | |
2229 | + } | |
2230 | + | |
2231 | + if (boxes.size() <= 0) | |
2232 | + { | |
2233 | + continue; | |
2234 | + } | |
2235 | + | |
2236 | + int algorithm_type = (int)eType; | |
2237 | + string json_str = helpers::gen_json::gen_boxes_json(task_id, algorithm_type, boxes, origin_file_path); | |
2238 | + | |
2239 | + ImgSaveInfo info_origin; | |
2240 | + info_origin.img_info = VPCUtil::vpc_devMem2vpcImg(gpuMem); | |
2241 | + info_origin.file_path = origin_file_path; | |
2242 | + info_origin.json_str = json_str; | |
2243 | + m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(info_origin); | |
2244 | + } | |
2245 | +} | |
2246 | + | |
2144 | 2247 | void CMultiSourceProcess::face_locus_finished(const OBJ_KEY obj_key) { |
2145 | 2248 | map<OBJ_KEY, OBJ_VALUE> _total_face_snapshot_info = m_snapshot_reprocessing->get_total_face_snapshot_info(); |
2146 | 2249 | ... | ... |
src/ai_platform/MultiSourceProcess.h
... | ... | @@ -122,6 +122,8 @@ private: |
122 | 122 | void face_locus_finished(const OBJ_KEY obj_key); |
123 | 123 | |
124 | 124 | int snapshot_task(std::string& uri_or_name, const std::string& file_name, bool bInTask); |
125 | + | |
126 | + void cross_line_process(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result>& vptResult, algorithm_type_t eType); | |
125 | 127 | private: |
126 | 128 | int m_devId; |
127 | 129 | ... | ... |
src/ai_platform/header.h
... | ... | @@ -34,10 +34,14 @@ enum class algorithm_type_t { |
34 | 34 | PEDESTRIAN_TRESPASS = 211, |
35 | 35 | ROAD_WORK_DET = 212, // 221026byzsh施工占道 |
36 | 36 | |
37 | + HUMAN_CLIMB = 220, // 人员攀爬 | |
38 | + HUMAN_CROSSING_LINE = 221, // 人员越线 | |
39 | + | |
37 | 40 | VEHICLE_SNAPSHOT = 301, |
38 | 41 | VEHICLE_RETROGRADE = 310, |
39 | 42 | VEHICLE_TRESPASS = 311, |
40 | 43 | VEHICLE_GATHER = 312, // 车辆聚集 |
44 | + VEHICLE_ILLEGAL_CROSSING_LINE = 314, // 车辆压线 | |
41 | 45 | |
42 | 46 | NONMOTOR_VEHICLE_SNAPSHOT = 401, |
43 | 47 | TAKEAWAY_MEMBER_CLASSIFICATION = 402, |
... | ... | @@ -390,6 +394,15 @@ typedef algor_config_param_pedestrian_safety_detector_basic algor_config_param_n |
390 | 394 | |
391 | 395 | |
392 | 396 | |
397 | +// 越线类 | |
398 | +typedef struct algor_config_param_illegal_crossing_line { | |
399 | + float conf_threshold{0.0}; // 目标检测阈值,小于该阈值不识别 | |
400 | + unsigned minmum_height, minmum_width; // 最小目标大小,小于该值不识别 | |
401 | + sy_point p1; // 线段起点 | |
402 | + sy_point p2; // 线段终点 | |
403 | +} algor_config_param_illegal_crossing_line; // 车辆压线/人员越线/人员攀爬 共用 | |
404 | + | |
405 | + | |
393 | 406 | // 行人安全检测参数 |
394 | 407 | #ifndef ___RETROGRADE_ALGOR_CONFIG_PARAM__ |
395 | 408 | #define ___RETROGRADE_ALGOR_CONFIG_PARAM__ | ... | ... |
src/helpers/common_tool.cpp
0 → 100644
1 | +#include "common_tool.h" | |
2 | + | |
3 | + | |
4 | +namespace common { | |
5 | + | |
6 | + bool is_intersect(jxline myline1, jxline myline2) | |
7 | + { | |
8 | + // 快速排斥实验 | |
9 | + if (myline1.get_max_x() < myline2.get_min_x() || | |
10 | + myline2.get_max_x() < myline1.get_min_x() || | |
11 | + myline1.get_max_y() < myline2.get_min_y() || | |
12 | + myline2.get_max_y() < myline1.get_min_y()) | |
13 | + return false; | |
14 | + | |
15 | + // 跨立实验(叉积异号) | |
16 | + if (((((float)myline1.xa - (float)myline2.xa)*((float)myline2.yb - (float)myline2.ya) - ((float)myline1.ya - (float)myline2.ya)*((float)myline2.xb - (float)myline2.xa))* | |
17 | + (((float)myline1.xb - (float)myline2.xa)*((float)myline2.yb - (float)myline2.ya) - ((float)myline1.yb - (float)myline2.ya)*((float)myline2.xb - (float)myline2.xa))) > 0 || | |
18 | + ((((float)myline2.xa - (float)myline1.xa)*((float)myline1.yb - (float)myline1.ya) - ((float)myline2.ya - (float)myline1.ya)*((float)myline1.xb - (float)myline1.xa))* | |
19 | + (((float)myline2.xb - (float)myline1.xa)*((float)myline1.yb - (float)myline1.ya) - ((float)myline2.yb - (float)myline1.ya)*((float)myline1.xb - (float)myline1.xa))) > 0) | |
20 | + return false; | |
21 | + | |
22 | + return true; | |
23 | + } | |
24 | +} | ... | ... |
src/helpers/common_tool.h
0 → 100644
1 | +#ifndef __COMMON_TOOL_H__ | |
2 | +#define __COMMON_TOOL_H__ | |
3 | + | |
4 | + | |
5 | +struct jxline | |
6 | +{ | |
7 | + int xa; | |
8 | + int ya; | |
9 | + int xb; | |
10 | + int yb; | |
11 | + | |
12 | + jxline() {} | |
13 | + jxline(int xa, int ya, int xb, int yb) | |
14 | + { | |
15 | + this->xa = xa; | |
16 | + this->ya = ya; | |
17 | + this->xb = xb; | |
18 | + this->yb = yb; | |
19 | + } | |
20 | + int get_max_x() | |
21 | + { | |
22 | + return xa > xb ? xa : xb; | |
23 | + } | |
24 | + int get_min_x() | |
25 | + { | |
26 | + return xa > xb ? xb : xa; | |
27 | + } | |
28 | + int get_max_y() | |
29 | + { | |
30 | + return ya > yb ? ya : yb; | |
31 | + } | |
32 | + int get_min_y() | |
33 | + { | |
34 | + return ya > yb ? yb : ya; | |
35 | + } | |
36 | +}; | |
37 | + | |
38 | +namespace common { | |
39 | + bool is_intersect(jxline myline1, jxline myline2); | |
40 | +} | |
41 | + | |
42 | + | |
43 | +#endif | |
0 | 44 | \ No newline at end of file | ... | ... |
src/reprocessing_module/save_snapshot_reprocessing.cpp
... | ... | @@ -24,7 +24,11 @@ save_snapshot_reprocessing::save_snapshot_reprocessing(int devId) { |
24 | 24 | #endif |
25 | 25 | |
26 | 26 | bFinish = false; |
27 | - m_save_img_thread = std::thread(save_img_thread_process, this); | |
27 | + | |
28 | + for (size_t i = 0; i < SAVE_THREAD_COUNT; i++) | |
29 | + { | |
30 | + m_save_img_thread[i] = std::thread(save_img_thread_process, this); | |
31 | + } | |
28 | 32 | |
29 | 33 | m_devId = devId; |
30 | 34 | jpegUtil.jpeg_init(m_devId); |
... | ... | @@ -33,7 +37,10 @@ save_snapshot_reprocessing::save_snapshot_reprocessing(int devId) { |
33 | 37 | save_snapshot_reprocessing::~save_snapshot_reprocessing(){ |
34 | 38 | // 结束线程 |
35 | 39 | bFinish = true; |
36 | - m_save_img_thread.join(); | |
40 | + for (size_t i = 0; i < SAVE_THREAD_COUNT; i++) | |
41 | + { | |
42 | + m_save_img_thread[i].join(); | |
43 | + } | |
37 | 44 | jpegUtil.jpeg_release(); |
38 | 45 | } |
39 | 46 | ... | ... |
src/reprocessing_module/save_snapshot_reprocessing.h
... | ... | @@ -25,6 +25,8 @@ |
25 | 25 | |
26 | 26 | using namespace std; |
27 | 27 | |
28 | +#define SAVE_THREAD_COUNT 32 | |
29 | + | |
28 | 30 | class DeviceMemory; |
29 | 31 | |
30 | 32 | struct ImgSaveInfo{ |
... | ... | @@ -55,7 +57,7 @@ private: |
55 | 57 | |
56 | 58 | queue<ImgSaveInfo> waitforsave_img_queue; |
57 | 59 | mutable std::mutex waitforsave_img_queue_mutex; |
58 | - std::thread m_save_img_thread; | |
60 | + std::thread m_save_img_thread[SAVE_THREAD_COUNT]; | |
59 | 61 | |
60 | 62 | bool bFinish = false; |
61 | 63 | int m_devId; | ... | ... |