Commit d7bafd6794e7caa1a693a52606a404db1c2b4850

Authored by Hu Chunming
1 parent e109b001

添加最优快照截取模式

.gitignore
1 1 bin/vpt_proj
2 2 bin/logs/*
  3 +bin/res/*
  4 +bin/vpt_proj
... ...
src/ai_platform/MultiSourceProcess.cpp
... ... @@ -9,7 +9,6 @@
9 9  
10 10 #include "../decoder/interface/DecoderManager.h"
11 11 #include "../decoder/interface/utiltools.hpp"
12   -#include "../util/crop_process.h"
13 12 #include "../helpers/time_helper.hpp"
14 13 #include "../helpers/os_helper.hpp"
15 14 #include "../helpers/gen_json.hpp"
... ... @@ -18,10 +17,21 @@
18 17 #include "macro_definition.h"
19 18 #include "SourceSingleton.hpp"
20 19  
21   -#define VEHICLE_MULTI_BOXES
  20 +// #define VEHICLE_MULTI_BOXES
22 21  
23 22 using namespace std;
24 23  
  24 +map<int, algo_type> index_to_algo_type = {{0, algorithm_type_t::HUMAN_SNAPSHOT},
  25 + {1, algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT},
  26 + {2, algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT},
  27 + {3, algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT},
  28 + {4, algorithm_type_t::VEHICLE_SNAPSHOT},
  29 + {5, algorithm_type_t::VEHICLE_SNAPSHOT},
  30 + {6, algorithm_type_t::VEHICLE_SNAPSHOT},
  31 + {7, algorithm_type_t::VEHICLE_SNAPSHOT},
  32 + {8, algorithm_type_t::VEHICLE_SNAPSHOT},
  33 + {9, algorithm_type_t::FACE_SNAPSHOT}};
  34 +
25 35  
26 36 struct decode_cbk_userdata{
27 37 string task_id;
... ... @@ -30,7 +40,6 @@ struct decode_cbk_userdata{
30 40 };
31 41  
32 42  
33   -
34 43 /**
35 44 * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
36 45 * */
... ... @@ -62,7 +71,7 @@ CMultiSourceProcess::CMultiSourceProcess(){
62 71 }
63 72  
64 73 CMultiSourceProcess::~CMultiSourceProcess(){
65   - vpc_util.vpc_crop_release();
  74 + vpc_util.release();
66 75 }
67 76  
68 77 int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){
... ... @@ -90,10 +99,10 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){
90 99 }
91 100  
92 101 m_task_param_manager = task_param_manager::getInstance();
93   - m_snapshot_reprocessing = snapshot_reprocessing::getInstance();
  102 + m_snapshot_reprocessing = new snapshot_reprocessing(m_devId);
94 103 m_save_snapshot_reprocessing = new save_snapshot_reprocessing(m_devId);
95 104  
96   - vpc_util.vpc_crop_init(m_devId);
  105 + vpc_util.init(m_devId);
97 106  
98 107 m_pAlgorthimThread = new thread([](void* arg) {
99 108 CMultiSourceProcess* process = (CMultiSourceProcess*)arg ;
... ... @@ -391,7 +400,7 @@ int CMultiSourceProcess::algorthim_process_thread(){
391 400 continue;
392 401 }
393 402  
394   - ACL_CALL(aclrtSetCurrentContext(ctx), ACL_ERROR_NONE, 1);
  403 + aclrtSetCurrentContext(ctx);
395 404 algorthim_vpt(vec_gpuMem);
396 405  
397 406 for(int i=0;i < vec_gpuMem.size(); i++){
... ... @@ -406,6 +415,8 @@ int CMultiSourceProcess::algorthim_process_thread(){
406 415  
407 416 }
408 417  
  418 + aclrtDestroyContext(ctx);
  419 +
409 420 LOG_INFO("algorthim_process_thread exit.");
410 421  
411 422 return 0;
... ... @@ -445,7 +456,10 @@ int CMultiSourceProcess::algorthim_vpt(vector&lt;DeviceMemory*&gt; vec_gpuMem){
445 456  
446 457 #ifndef VEHICLE_MULTI_BOXES
447 458 /* 快照优选(内部可实现不同的快照优选策略) */
448   - m_snapshot_reprocessing->update_bestsnapshot(vpt_interest_task_id, vpt_interest_imgs.data(), vptResult, deleteObjectID);
  459 + m_snapshot_reprocessing->update_bestsnapshot(vec_vptMem, vptResult, deleteObjectID);
  460 +
  461 + /* for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径)*/
  462 + vehicle_snapshot(vpt_interest_task_id, deleteObjectID);
449 463 #else
450 464 algorithm_vehicle_relult(vec_vptMem, vptResult, deleteObjectID);
451 465  
... ... @@ -486,7 +500,7 @@ int CMultiSourceProcess::algorithm_vehicle_relult(vector&lt;DeviceMemory*&gt; vec_devM
486 500 saveInfo.img_info = vpc_util.vpc_devMem2vpcImg(result.memPtr);
487 501 m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(saveInfo);
488 502  
489   - vector<vpc_img_info> vec_obj_info_list = vpc_util.vpc_crop_batch(result.memPtr, result.objs);
  503 + vector<vpc_img_info> vec_obj_info_list = vpc_util.crop_batch(result.memPtr, result.objs);
490 504 if(vec_obj_info_list.size() != result.objs.size()){
491 505 LOG_ERROR("vpc_crop size error !");
492 506 vpc_util.vpc_imgList_release(vec_obj_info_list);
... ... @@ -560,4 +574,99 @@ void CMultiSourceProcess::send_locus_finished_msg(vector&lt;string&gt;&amp; vpt_interest_t
560 574 }
561 575 }
562 576 }
  577 +}
  578 +
  579 +// for snapshot algorithm. 轨迹结束目标 做最后的结果返回(当前返回算法结果+快照保存路径)
  580 +void CMultiSourceProcess::vehicle_snapshot(vector<string>& vpt_interest_task_id, vector<vector<int>> deleteObjectID) {
  581 + auto task_iter = vpt_interest_task_id.begin();
  582 +
  583 + for (int i = 0; i < deleteObjectID.size(); i++, ++task_iter) // loop taskId.
  584 + {
  585 + for (int &j : deleteObjectID[i]) // loop algor type.
  586 + {
  587 + OBJ_KEY obj_key = {*task_iter, j};
  588 + endframe_obj_process(obj_key, algorithm_type_t::PLACEHOLDER);
  589 + }
  590 + }
  591 +}
  592 +
  593 +/* 轨迹结束帧需要做的算法模块 */
  594 +/* 轨迹结束帧需要做的算法模块 */
  595 +int CMultiSourceProcess::endframe_obj_process(const OBJ_KEY &obj_key, algorithm_type_t algor_type) {
  596 + auto task_param_ptr = m_task_param_manager->get_task_algor_param(obj_key.video_id);
  597 + auto task_other_param_ptr = m_task_param_manager->get_task_other_param(obj_key.video_id);
  598 +
  599 + // 该路任务开启了抓拍功能 开始抓拍保存;若未开启抓拍,清空显存资源
  600 + if ((task_param_ptr->human_algors.find(algorithm_type_t::HUMAN_SNAPSHOT) != task_param_ptr->human_algors.end() ||
  601 + task_param_ptr->vehicle_algors.find(algorithm_type_t::VEHICLE_SNAPSHOT) != task_param_ptr->vehicle_algors.end() ||
  602 + task_param_ptr->nonmotor_vehicle_algors.find(algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT) != task_param_ptr->nonmotor_vehicle_algors.end())) {
  603 +
  604 + vehicle_locus_finished(obj_key);
  605 +
  606 + }
  607 +}
  608 +
  609 +void CMultiSourceProcess::vehicle_locus_finished(const OBJ_KEY obj_key){
  610 + map<OBJ_KEY, OBJ_VALUE> _total_snapshot_info = m_snapshot_reprocessing->get_total_snapshot_info();
  611 +
  612 + if (_total_snapshot_info.find(obj_key) == _total_snapshot_info.end()) {
  613 + return;
  614 + }
  615 +
  616 + const OBJ_VALUE obj_value = _total_snapshot_info[obj_key];
  617 + auto task_other_param = m_task_param_manager->get_task_other_params()[obj_key.video_id];
  618 +
  619 + auto algor_type = index_to_algo_type[obj_value.index.index];
  620 +
  621 + auto algor_param = (algor_config_param_snapshot *)task_other_param[algor_type]->algor_param;
  622 + if (obj_value.confidence <= algor_param->threshold) {
  623 + LOG_DEBUG("Snapshot conf filter ({} vs {})", obj_value.confidence, algor_param->threshold);
  624 + // 删除记录,同时释放显存
  625 + m_snapshot_reprocessing->release_finished_locus_snapshot(obj_key.video_id, obj_key.obj_id, true);
  626 + return;
  627 + }
  628 +
  629 + const algor_basic_config_param_t *cur_param = task_other_param[algor_type]->basic_param;
  630 +
  631 + // 原图
  632 + std::string cur_timestamp_ms = std::to_string(helpers::timer::get_cur_time_ms());
  633 + std::string fpath_origin = std::string(cur_param->result_folder) + helpers::os::sep + obj_key.video_id + "_" +
  634 + std::to_string(obj_key.obj_id) + "_" + cur_timestamp_ms + ".jpg";
  635 +
  636 + ImgSaveInfo origin_save_info;
  637 + origin_save_info.file_path = fpath_origin;
  638 + origin_save_info.img_info = obj_value.snapShot;
  639 + origin_save_info.obj_rect = obj_value.obj_pos;
  640 + m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(origin_save_info);
  641 +
  642 + {
  643 + // 抠图
  644 + string json_str = "";
  645 + std::string cur_timestamp_ms = std::to_string(helpers::timer::get_timestamp<std::chrono::milliseconds>());
  646 + string object_file_name = std::string(cur_param->result_folder_little) + helpers::os::sep + obj_key.video_id + "_" +
  647 + std::to_string(obj_key.obj_id) + "_" + cur_timestamp_ms + ".jpg";
  648 +
  649 +#ifdef POST_USE_RABBITMQ
  650 + video_object_snapshot new_obj_ss_info;
  651 + new_obj_ss_info.analysisRes = nullptr;
  652 + new_obj_ss_info.object_id = obj_key.obj_id;
  653 + new_obj_ss_info.obj_info.set_data(obj_value.index.index, obj_value.confidence, obj_value.obj_pos.left_,
  654 + obj_value.obj_pos.top_, obj_value.obj_pos.left_ + obj_value.obj_pos.width_,
  655 + obj_value.obj_pos.top_ + obj_value.obj_pos.height_);
  656 + strcpy(new_obj_ss_info.task_id, obj_key.video_id.c_str());
  657 + strcpy(new_obj_ss_info.video_image_path, fpath_origin.c_str());
  658 + strcpy(new_obj_ss_info.snapshot_image_path, object_file_name.c_str());
  659 + json_str = helpers::gen_json::gen_snapshot_json(algor_type, new_obj_ss_info);
  660 +#endif
  661 +
  662 + ImgSaveInfo obj_save_info;
  663 + obj_save_info.file_path = object_file_name;
  664 + obj_save_info.img_info = obj_value.snapShotLittle;
  665 + obj_save_info.json_str = json_str;
  666 + m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(obj_save_info);
  667 + }
  668 +
  669 + // 仅删除记录,显存会在保存线程中删除
  670 + m_snapshot_reprocessing->release_finished_locus_snapshot(obj_key.video_id, obj_key.obj_id, false);
  671 +
563 672 }
564 673 \ No newline at end of file
... ...
src/ai_platform/MultiSourceProcess.h
... ... @@ -54,6 +54,10 @@ private:
54 54 bool finish_task(const string taskID, const bool delete_snapshot);
55 55 int algorithm_vehicle_relult(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result>& vptResult, vector<vector<int>>& delete_object_id);
56 56 void send_locus_finished_msg(vector<string>& vpt_interest_task_id, vector<vector<int>> deleteObjectID);
  57 + void vehicle_snapshot(vector<string>& vpt_interest_task_id, vector<vector<int>> deleteObjectID);
  58 + void vehicle_locus_finished(const OBJ_KEY obj_key);
  59 +
  60 + int endframe_obj_process(const OBJ_KEY &obj_key, algorithm_type_t algor_type);
57 61  
58 62 private:
59 63 int m_devId;
... ...
src/ai_platform/header.h
... ... @@ -231,7 +231,7 @@ typedef struct video_object_snapshot {
231 231 #ifndef __VIDEO_OBJECT_INFO__
232 232 #define __VIDEO_OBJECT_INFO__
233 233 typedef struct video_object_info {
234   - int task_id; //该物体属于的任务ID号
  234 + char task_id[128]; //该物体属于的任务ID号
235 235 int task_frame_count; //该物体当前出现的帧号
236 236 int object_id; //该物体的ID号
237 237 int left; //该物体位置的左坐标
... ...
src/ai_platform/mvpt_process_assist.cpp
... ... @@ -183,16 +183,6 @@ void CreateResultFolder(char* resultFolder, const char* jointFolder)
183 183 }
184 184 }
185 185  
186   -
187   -bool best_snapshot_judge_algor(const OBJ_KEY& obj_key, const OBJ_VALUE& obj_value, int left, int top, int width, int height, int image_width, int image_height)
188   -{
189   - return snapshot_legal_pos(obj_value.flags, left, top, left + width, top + height, image_width, image_height)
190   - && snapshot_legal_minarea(obj_value.index.index, width, height)
191   - && snapshot_legal_inarea(width, height)
192   - && snapshot_legal_area(obj_value.max_area, obj_value.last_area, left, top, left + width, top + height);
193   - return true;
194   -}
195   -
196 186 bool snapshot_judge_algor(int index, int width, int height)
197 187 {
198 188 return snapshot_legal_minarea(index, width, height) //判断最小面积
... ...
src/ai_platform/mvpt_process_assist.h
... ... @@ -22,39 +22,6 @@
22 22  
23 23 using namespace std;
24 24  
25   -typedef struct DxGPUFrame
26   -{
27   - void * frame;
28   - unsigned int size;
29   - unsigned int width;
30   - unsigned int height;
31   - unsigned long long timestamp;
32   -}DxGPUFrame;
33   -
34   -struct OBJ_VALUE {
35   - bool finishTracker; //轨迹结束可以保存了
36   - int frameCount;
37   - bool isupdate;
38   - int lost;
39   - DxGPUFrame snapShot;
40   - DxGPUFrame snapShotLittle;
41   - sy_rect obj_pos;
42   - double confidence; // 置信度
43   - float last_area;
44   - float max_area;
45   - OBJ_INDEX index;
46   -
47   - bitset< EDGESIZE > flags; //标志位,标记快照框应该如何判断,left:0 top:1 right:2 bottom:3
48   - sy_point landmark_point[25];//人脸关键点位置信息
49   - sy_rect position; //检测实际目标框
50   - //-added by zsh 220719 人脸姿态角-
51   - float roll = 0.0;
52   - float yaw = 0.0;
53   - float pitch = 0.0;
54   - //-------------------------------
55   -
56   -};
57   -
58 25  
59 26 int CreateDir(char *pszDir);
60 27 void CreateResultFolder(char* resultFolder, const char* jointFolder);
... ... @@ -68,7 +35,7 @@ void CreateResultFolder(char* resultFolder, const char* jointFolder);
68 35 bool snapshot_legal_inarea(int width, int height);
69 36 bool snapshot_legal_inarea(sy_rect algor_area, int left, int top, int right, int bottom);
70 37 bool snapshot_legal_minarea(int index, int width, int height);
71   -bool snapshot_algor_open_config(const OBJ_KEY& obj_key);
  38 +// bool snapshot_algor_open_config(const OBJ_KEY& obj_key);
72 39 bool snapshot_legal_pos(bitset<EDGESIZE> flags, int left, int top, int right, int bottom, int image_width, int image_height);
73 40 bool snapshot_legal_area(int max_area, int last_area, int left, int top, int right, int bottom);
74 41 bool snapshot_legal_pose(float last_roll, float last_yaw, float last_pitch, float roll, float yaw, float pitch); // added by zsh 220719 判断人脸姿态角
... ...
src/decoder/dvpp/CircularQueue.hpp
... ... @@ -77,7 +77,7 @@ template &lt;typename T&gt;
77 77 void CircularQueue<T>::addTail()
78 78 {
79 79 std::lock_guard<std::mutex> l(m_mutex);
80   - rear = (rear + 1) % max_size;//队尾指针加1
  80 + rear = (rear + 1) % max_size;//队尾指针加1
81 81 }
82 82  
83 83 //循环队列的出队
... ...
src/decoder/dvpp/DvppDec.cpp
... ... @@ -446,8 +446,10 @@ int DvppDec::sentFrame(aclvdecChannelDesc *vdecChannelDesc, uint64_t frame_count
446 446 CHECK_NOT_RETURN(acldvppDestroyPicDesc(output_pic_desc), "acldvppDestroyPicDesc failed");
447 447 }
448 448  
449   - acldvppFree(vdecOutputBuf);
450   - vdecOutputBuf = nullptr;
  449 + if (vdecOutputBuf){
  450 + acldvppFree(vdecOutputBuf);
  451 + vdecOutputBuf = nullptr;
  452 + }
451 453  
452 454 return 1;
453 455 }
... ...
src/decoder/dvpp/FFReceiver.cpp
... ... @@ -160,12 +160,10 @@ void FFReceiver::read_thread(){
160 160  
161 161 int frame_count = 0;
162 162 int ret = -1;
163   - while (m_bRunning)
164   - {
165   - if (!m_bReal)
166   - {
167   - if (m_bPause)
168   - {
  163 + while (m_bRunning){
  164 +
  165 + if (!m_bReal){
  166 + if (m_bPause){
169 167 std::this_thread::sleep_for(std::chrono::milliseconds(3));
170 168 continue;
171 169 }
... ... @@ -178,8 +176,8 @@ void FFReceiver::read_thread(){
178 176 }
179 177  
180 178 int result = av_read_frame(fmt_ctx, pkt);
181   - if (result == AVERROR_EOF || result < 0)
182   - {
  179 + if (result == AVERROR_EOF || result < 0){
  180 + av_packet_unref(pkt);
183 181 LOG_ERROR("[{}]- Failed to read frame!", m_dec_name);
184 182 break;
185 183 }
... ... @@ -210,6 +208,9 @@ void FFReceiver::read_thread(){
210 208  
211 209 frame_count++;
212 210 }
  211 + } else {
  212 + // 音频等其他分量的情形
  213 + av_packet_unref(pkt);
213 214 }
214 215 }
215 216  
... ...
src/demo/demo.cpp
... ... @@ -478,8 +478,8 @@ static long long get_cur_time(){
478 478 string createTask(void *handle, std::vector<algorithm_type_t> algor_vec, int gi){
479 479 task_param tparam;
480 480 // tparam.ipc_url = "rtsp://admin:ad123456@192.168.60.108:554/cam/realmonitor?channel=1&subtype=0";
481   - // tparam.ipc_url = "/home/huchunming/data/caishenkezhan.mp4";
482   - tparam.ipc_url = "/home/cmhu/data/Street.uvf";
  481 + tparam.ipc_url = "/home/cmhu/data/bayue.mp4";
  482 + // tparam.ipc_url = "/home/cmhu/data/Street.uvf";
483 483 // tparam.ipc_url = "rtsp://122.97.218.170:8604/openUrl/V5nXRHa?params=eyJwcm90b2NhbCI6InJ0c3AiLCJjbGllbnRUeXBlIjoib3Blbl9hcGkiLCJleHByaWVUaW1lIjotMSwicHJvdG9jb2wiOiJydHNwIiwiZXhwaXJlVGltZSI6MzAwLCJlbmFibGVNR0MiOnRydWUsImV4cGFuZCI6InN0YW5kYXJkPXJ0c3Amc3RyZWFtZm9ybT1ydHAiLCJhIjoiMTBjZjM4N2JjY2Y5NDg3YzhjNWYzNjE2M2ViMWUyNTJ8MXwwfDEiLCJ0IjoxfQ==";
484 484 tparam.algor_counts = algor_vec.size();
485 485 tparam.dec_type = 2;
... ... @@ -525,8 +525,8 @@ void test_gpu(int gpuID){
525 525 algorithm_type_t::VEHICLE_SNAPSHOT, algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT, algorithm_type_t::VIDEO_TIMING_SNAPSHOT};
526 526  
527 527 string task_id = createTask(handle, algor_vec, 0 + gpuID * 10);
528   - string task_id1 = createTask(handle, algor_vec, 1 + gpuID * 10);
529   - string task_id2 = createTask(handle, algor_vec, 2 + gpuID * 10);
  528 + // string task_id1 = createTask(handle, algor_vec, 1 + gpuID * 10);
  529 + // string task_id2 = createTask(handle, algor_vec, 2 + gpuID * 10);
530 530  
531 531  
532 532 // finish_task(handle, (char*)task_id.data(), 0);
... ... @@ -549,7 +549,9 @@ int main(int argc, char *argv[]) {
549 549 int gpuID = atoi(argv[4]);
550 550  
551 551 test_gpu(0);
552   - test_gpu(1);
  552 + // test_gpu(1);
  553 + // test_gpu(2);
  554 + // test_gpu(3);
553 555  
554 556 while (getchar() != 'q');
555 557  
... ...
src/reprocessing_module/save_snapshot_reprocessing.h
... ... @@ -31,6 +31,7 @@ struct ImgSaveInfo{
31 31 string file_path {""};
32 32 vpc_img_info img_info;
33 33 string json_str {""};
  34 + sy_rect obj_rect;
34 35 };
35 36  
36 37 class save_snapshot_reprocessing
... ...
src/reprocessing_module/snapshot_reprocessing.cpp
... ... @@ -5,13 +5,20 @@
5 5 #include "../decoder/interface/DeviceMemory.hpp"
6 6  
7 7  
8   -snapshot_reprocessing::snapshot_reprocessing()
  8 +snapshot_reprocessing::snapshot_reprocessing(int devId)
9 9 {
10 10 m_task_param_manager = task_param_manager::getInstance();
11 11  
12 12 algor_index_table["human"] = { (int)det_class_label_t::HUMAN };
13 13 algor_index_table["nonmotor_vehicle"] = { (int)det_class_label_t::BICYCLE, (int)det_class_label_t::MOTOCYCLE, (int)det_class_label_t::TRICYCLE };
14 14 algor_index_table["vehicle"] = { (int)det_class_label_t::SMALL_CAR, (int)det_class_label_t::LARGE_CAR, (int)det_class_label_t::TRUCK, (int)det_class_label_t::TRACTOR, (int)det_class_label_t::MEDIUM_BUS };
  15 +
  16 + vpcUtil.init(devId);
  17 +}
  18 +
  19 +snapshot_reprocessing::~snapshot_reprocessing()
  20 +{
  21 + vpcUtil.release();
15 22 }
16 23  
17 24 static void box_expansion(video_object_info& obj_info, float expand_ratio, int frame_width, int frame_height){
... ... @@ -170,4 +177,216 @@ void snapshot_reprocessing::filter_vehicle(vector&lt;DeviceMemory*&gt; vec_devMem, vec
170 177 _onelevel_det_result[task_idx].obj_count = effective_count;
171 178 task_idx++;
172 179 }
  180 +}
  181 +
  182 +/* 获取人车物目标快照图 */
  183 +void snapshot_reprocessing::update_bestsnapshot(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result> &ol_det_result, vector<vector<int>>& delete_object_id){
  184 + map<string, algor_open_config_param> && algor_config_param = m_task_param_manager->get_task_algor_params();
  185 + map<string, map<algo_type, task_param_manager::algo_param_type_t_*>> && algor_param = m_task_param_manager->get_task_other_params();
  186 +
  187 + for (size_t i = 0; i < vec_devMem.size(); i++){
  188 + DeviceMemory* memPtr = vec_devMem[i];
  189 +
  190 + onelevel_det_result det_result = ol_det_result[i];
  191 +
  192 + if (0 == det_result.obj_count){
  193 + ++i;
  194 + continue;
  195 + }
  196 +
  197 + string task_id = memPtr->getId();
  198 + int frame_height = memPtr->getHeight();
  199 + int frame_width = memPtr->getWidth();
  200 +
  201 + vector<video_object_info> vec_obj_info;
  202 + for (int c = 0; c < det_result.obj_count; c++){
  203 +
  204 + det_objinfo obj_info = det_result.obj[c];
  205 + OBJ_KEY new_obj = { task_id, obj_info.id };
  206 +
  207 + int index = 0;
  208 +
  209 + /* 投票确定目标index */
  210 + if (total_snapshot_info.find(new_obj) == total_snapshot_info.end()){
  211 + index = obj_info.index;
  212 + } else {
  213 + index = total_snapshot_info[new_obj].index.index;
  214 + }
  215 +
  216 + int cur_real_width = (obj_info.right - obj_info.left);
  217 + int cur_real_height = (obj_info.bottom - obj_info.top);
  218 + int cur_real_index = obj_info.index;
  219 +
  220 + int expansion_width = cur_real_width * EXPANSION_PROPORTION;
  221 + int expansion_height = cur_real_height * EXPANSION_PROPORTION;
  222 + // DEBUG-----------------------------------------------------------------
  223 + // 0-行人 1-自行车 2-摩托车 3-三轮车 4-小型车 5-大车 6-卡车 7-拖拉机 8-中巴
  224 + if(index ==0 || index ==1 || index ==2 || index ==3) { //行人和非机动车外扩指定像素即可
  225 + expansion_width = 10;
  226 + expansion_height = 10;
  227 + }
  228 +
  229 + /* 若该目标第一次出现 */
  230 + if (total_snapshot_info.find(new_obj) == total_snapshot_info.end())
  231 + {
  232 + /* manager insert new object. */
  233 + /* 判断目标合法 */
  234 + algorithm_type_t algor_type;
  235 + if (index ==0) algor_type = algorithm_type_t::HUMAN_SNAPSHOT;
  236 + if (index ==1 || index ==2 || index ==3) algor_type = algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT;
  237 + if (index ==4 || index ==5 || index ==6 || index ==7 || index ==8) algor_type = algorithm_type_t::VEHICLE_SNAPSHOT;
  238 + if (!(algor_config_param.count(task_id) && algor_param.count(task_id) && algor_param[task_id].count(algor_type)))
  239 + continue;
  240 + task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][algor_type];
  241 + if (!snapshot_legal_inarea(cur_task_params->basic_param->algor_valid_rect,obj_info.left, obj_info.top, obj_info.right, obj_info.bottom)){
  242 + continue;
  243 + }
  244 +
  245 + if(!snapshot_legal_minarea(index, cur_real_width, cur_real_height)){
  246 + continue;
  247 + }
  248 +
  249 + /* 存入当前抠图目标参数 flags用于判断目标从画面什么位置出现 方便之后排除出画面边缘的快照图 */
  250 + total_snapshot_info[new_obj].index.count++;
  251 + total_snapshot_info[new_obj].index.index = cur_real_index;
  252 + total_snapshot_info[new_obj].confidence = obj_info.confidence;
  253 + total_snapshot_info[new_obj].flags[0] = obj_info.left < minDistance[0] + SCALE_OUT ? 0 : 1; //left
  254 + total_snapshot_info[new_obj].flags[1] = obj_info.top < minDistance[1] + SCALE_OUT ? 0 : 1; //top
  255 + total_snapshot_info[new_obj].flags[2] = obj_info.right > frame_width - minDistance[2] - SCALE_OUT ? 0 : 1; //right
  256 + total_snapshot_info[new_obj].flags[3] = obj_info.bottom > frame_height - minDistance[3] - SCALE_OUT ? 0 : 1; //bottom
  257 +
  258 + int cur_left = max(obj_info.left - 10, 0);
  259 + int cur_top = max(obj_info.top - 10, 0);
  260 + int cur_right = min(obj_info.right + 10, frame_width - 1);
  261 + int cur_bottom = min(obj_info.bottom + 10, frame_height - 1);
  262 + total_snapshot_info[new_obj].obj_pos = { cur_left, cur_top, cur_right - cur_left, cur_bottom - cur_top }; //debug by zsh 推出的坐标外扩10像素
  263 + total_snapshot_info[new_obj].last_area = total_snapshot_info[new_obj].max_area = (cur_right - cur_left) * (cur_bottom - cur_top);
  264 +
  265 + video_object_info info;
  266 + info.left = max(obj_info.left - expansion_width, 0);
  267 + info.top = max(obj_info.top - expansion_height, 0);
  268 + info.right = min(obj_info.right + expansion_width, frame_width - 1);
  269 + info.bottom = min(obj_info.bottom + expansion_height, frame_height - 1);
  270 + strcpy(info.task_id, task_id.c_str());
  271 + info.object_id = obj_info.id;
  272 + info.confidence = obj_info.confidence;
  273 + info.index = index;
  274 +
  275 + vec_obj_info.push_back(info);
  276 + } else {
  277 + total_snapshot_info[new_obj].last_area = (obj_info.right - obj_info.left) * (obj_info.bottom - obj_info.top);
  278 +
  279 + algorithm_type_t algor_type;
  280 + if (index ==0) algor_type = algorithm_type_t::HUMAN_SNAPSHOT;
  281 + if (index ==1 || index ==2 || index ==3) algor_type = algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT;
  282 + if (index ==4 || index ==5 || index ==6 || index ==7 || index ==8) algor_type = algorithm_type_t::VEHICLE_SNAPSHOT;
  283 + if (!(algor_config_param.count(task_id) && algor_param.count(task_id) && algor_param[task_id].count(algor_type)))
  284 + continue;
  285 + task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][algor_type];
  286 + if (!snapshot_legal_inarea(cur_task_params->basic_param->algor_valid_rect,obj_info.left, obj_info.top, obj_info.right, obj_info.bottom))
  287 + continue;
  288 + //---------------------------------------------------------------
  289 + if (!best_snapshot_judge_algor(new_obj, total_snapshot_info[new_obj], obj_info.left, obj_info.top,
  290 + cur_real_width, cur_real_height, frame_width, frame_height))
  291 + {
  292 + continue;
  293 + }
  294 + /* 若更优于之前的快照 做快照的更新 */
  295 + if (total_snapshot_info[new_obj].index.count == 0)
  296 + {
  297 + total_snapshot_info[new_obj].index.count++;
  298 + total_snapshot_info[new_obj].index.index = cur_real_index;
  299 + }
  300 + else
  301 + {
  302 + if (total_snapshot_info[new_obj].index.index == cur_real_index)
  303 + total_snapshot_info[new_obj].index.count++;
  304 + else
  305 + total_snapshot_info[new_obj].index.count--;
  306 + }
  307 +
  308 + int cur_left = max(obj_info.left - 10, 0);
  309 + int cur_top = max(obj_info.top - 10, 0);
  310 + int cur_right = min(obj_info.right + 10, frame_width - 1);
  311 + int cur_bottom = min(obj_info.bottom + 10, frame_height - 1);
  312 + total_snapshot_info[new_obj].obj_pos = { cur_left, cur_top, cur_right - cur_left, cur_bottom - cur_top }; //debug by zsh 推出的坐标外扩10像素
  313 + total_snapshot_info[new_obj].last_area = total_snapshot_info[new_obj].max_area = (cur_right - cur_left) * (cur_bottom - cur_top);
  314 +
  315 + video_object_info info;
  316 + info.left = max(obj_info.left - expansion_width, 0);
  317 + info.top = max(obj_info.top - expansion_height, 0);
  318 + info.right = min(obj_info.right + expansion_width, frame_width - 1);
  319 + info.bottom = min(obj_info.bottom + expansion_height, frame_height - 1);
  320 + strcpy(info.task_id, task_id.c_str());
  321 + info.object_id = obj_info.id;
  322 + info.confidence = obj_info.confidence;
  323 + info.index = index;
  324 +
  325 + vec_obj_info.push_back(info);
  326 + }
  327 + }
  328 +
  329 + vector<vpc_img_info> imgList = vpcUtil.crop_batch(memPtr, vec_obj_info);
  330 +
  331 + if(imgList.size() > 0){
  332 + for (size_t i = 0; i < imgList.size(); i++) {
  333 + vpc_img_info obj_info = imgList[i];
  334 + OBJ_KEY objKey = { obj_info.task_id, obj_info.object_id };
  335 + vpcUtil.vpc_img_release(total_snapshot_info[objKey].snapShot);
  336 + total_snapshot_info[objKey].snapShot = vpcUtil.vpc_devMem2vpcImg(memPtr);
  337 + vpcUtil.vpc_img_release(total_snapshot_info[objKey].snapShotLittle);
  338 + total_snapshot_info[objKey].snapShotLittle = obj_info;
  339 + }
  340 + }
  341 + }
  342 +}
  343 +
  344 +map<OBJ_KEY, OBJ_VALUE> snapshot_reprocessing::get_total_snapshot_info(){
  345 + return total_snapshot_info;
  346 +}
  347 +
  348 +/* 快照判定辅助函数 */
  349 +bool snapshot_reprocessing::best_snapshot_judge_algor(const OBJ_KEY& obj_key, const OBJ_VALUE& obj_value, int left, int top, int width, int height, int image_width, int image_height)
  350 +{
  351 + return snapshot_legal_pos(obj_value.flags, left, top, left + width, top + height, image_width, image_height)
  352 + && snapshot_legal_minarea(obj_value.index.index, width, height)
  353 + && snapshot_legal_inarea(width, height)
  354 + && snapshot_legal_area(obj_value.max_area, obj_value.last_area, left, top, left + width, top + height);
  355 + return true;
  356 +}
  357 +
  358 +/* 删除指定快照 清空资源占用(使用场景:任务结束删除该路任务所有缓存快照;目标轨迹结束,分析保存完,删除该目标快照缓存)*/
  359 +void snapshot_reprocessing::release_finished_locus_snapshot(const string taskid, const int obj_id, bool bRelease)
  360 +{
  361 + LOG_DEBUG("[info] task_id {} delete obj_id {}", taskid, obj_id); //221026
  362 + if (obj_id != -1)
  363 + {
  364 + OBJ_KEY cur_key = { taskid , obj_id };
  365 + auto it = total_snapshot_info.find(cur_key);
  366 + if (it == total_snapshot_info.end()){
  367 + return;
  368 + }
  369 +
  370 + if (bRelease){
  371 + OBJ_VALUE ss = total_snapshot_info[cur_key];
  372 +
  373 + vpcUtil.vpc_img_release(ss.snapShot);
  374 + vpcUtil.vpc_img_release(ss.snapShotLittle);
  375 + }
  376 +
  377 + total_snapshot_info.erase(cur_key);
  378 + return;
  379 + }
  380 +
  381 + for(auto ss = total_snapshot_info.begin(); ss != total_snapshot_info.end(); ss++)
  382 + {
  383 + if (strcmp(ss->first.video_id.c_str(), taskid.c_str()) == 0)
  384 + {
  385 + if (bRelease){
  386 + vpcUtil.vpc_img_release(ss->second.snapShot);
  387 + vpcUtil.vpc_img_release(ss->second.snapShotLittle);
  388 + }
  389 + total_snapshot_info.erase(ss);
  390 + }
  391 + }
173 392 }
174 393 \ No newline at end of file
... ...
src/reprocessing_module/snapshot_reprocessing.h
... ... @@ -9,22 +9,19 @@
9 9  
10 10 #include "../ai_platform/det_obj_header.h"
11 11 #include <vector>
12   -#include <set>
13 12 #include <string>
14 13 #include <map>
15 14 #include <bitset>
16 15 #include "../ai_platform/task_param_manager.h"
17 16 #include "../ai_platform/header.h"
  17 +#include "../util/vpc_util.h"
18 18  
19 19 // #define EXPANSION_PROPORTION 0.1
20 20 #define EXPANSION_PROPORTION 0.25
21 21 #define FACE_EXPANSION_PROPORTION 0.5
22 22 #define IMG_CHANNELS 3
23 23  
24   -// using namespace std;
25   -using std::vector;
26   -using std::map;
27   -using std::set;
  24 +using namespace std;
28 25  
29 26 class DeviceMemory;
30 27  
... ... @@ -35,27 +32,56 @@ typedef struct multi_obj_data_t{
35 32 string task_id;
36 33 } multi_obj_data_t;
37 34  
  35 +
  36 +struct OBJ_VALUE {
  37 + bool finishTracker; //轨迹结束可以保存了
  38 + int frameCount;
  39 + bool isupdate;
  40 + int lost;
  41 + vpc_img_info snapShot;
  42 + vpc_img_info snapShotLittle;
  43 + sy_rect obj_pos;
  44 + double confidence; // 置信度
  45 + float last_area;
  46 + float max_area;
  47 + OBJ_INDEX index;
  48 +
  49 + bitset< EDGESIZE > flags; //标志位,标记快照框应该如何判断,left:0 top:1 right:2 bottom:3
  50 + sy_point landmark_point[25];//人脸关键点位置信息
  51 + sy_rect position; //检测实际目标框
  52 + //-added by zsh 220719 人脸姿态角-
  53 + float roll = 0.0;
  54 + float yaw = 0.0;
  55 + float pitch = 0.0;
  56 + //-------------------------------
  57 +
  58 +};
  59 +
38 60 class snapshot_reprocessing
39 61 {
40 62 public:
41 63 //更新最优快照
42   - static snapshot_reprocessing* getInstance()
43   - {
44   - static snapshot_reprocessing snapshot_reprocessing_instance;
45   - return &snapshot_reprocessing_instance;
46   - }
  64 + snapshot_reprocessing(int devId);
  65 + ~snapshot_reprocessing();
47 66  
48 67 vector<multi_obj_data_t> get_vehicle_snapshot(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result>& ol_det_result, int skip_frame);
49 68  
  69 + void screen_effective_snapshot(const vector<string> &taskid_inplay, vector<onelevel_det_result> &_onelevel_det_result);
  70 + void filter_vehicle(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result> &_onelevel_det_result);
  71 +
  72 + void update_bestsnapshot(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result> &ol_det_result, vector<vector<int>>& delete_object_id);
  73 + map<OBJ_KEY, OBJ_VALUE> get_total_snapshot_info();
  74 +
  75 + void release_finished_locus_snapshot(const string taskid, const int obj_id, bool bRelease);
  76 +
  77 +private:
  78 + bool best_snapshot_judge_algor(const OBJ_KEY& obj_key, const OBJ_VALUE& obj_value, int left, int top, int width, int height, int image_width, int image_height);
  79 +
50 80 private:
51   - snapshot_reprocessing();
  81 + map<OBJ_KEY, OBJ_VALUE> total_snapshot_info;
52 82  
53 83 map<string, set<int>> algor_index_table;
54 84 task_param_manager *m_task_param_manager;
55 85  
56   -public:
57   -
58   - void screen_effective_snapshot(const vector<string> &taskid_inplay, vector<onelevel_det_result> &_onelevel_det_result);
59   - void filter_vehicle(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result> &_onelevel_det_result);
60   -
  86 + VPCUtil vpcUtil;
61 87 };
62 88 \ No newline at end of file
... ...
src/util/crop_process.cpp deleted
1   -/**
2   -* @file dvpp_process.cpp
3   -*
4   -* Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved.
5   -*
6   -* This program is distributed in the hope that it will be useful,
7   -* but WITHOUT ANY WARRANTY; without even the implied warranty of
8   -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9   -*/
10   -#include "crop_process.h"
11   -#include <stdio.h>
12   -#include <vector>
13   -#include <string>
14   -#include <memory>
15   -#include <stdlib.h>
16   -#include "utils.h"
17   -#include "acl/acl_base.h"
18   -#include "acl/acl_rt.h"
19   -#include "acl/acl_op.h"
20   -#include "acl/acl_mdl.h"
21   -#include "acl/ops/acl_dvpp.h"
22   -#include "acl/ops/acl_cblas.h"
23   -#include "../decoder/interface/DeviceMemory.hpp"
24   -
25   -using namespace std;
26   -
27   -namespace {
28   - uint32_t AlignSize(uint32_t origSize, uint32_t alignment)
29   - {
30   - if (alignment == 0) {
31   - return 0;
32   - }
33   - uint32_t alignmentH = alignment - 1;
34   - return (origSize + alignmentH) / alignment * alignment;
35   - }
36   -}
37   -
38   -DvppCropProcess::DvppCropProcess()
39   - : dvppChannelDesc_(nullptr), inputBatchPicDesc_(nullptr),
40   - outputBatchPicDesc_(nullptr), inputBatchSize_(0), outputBatchSize_(0)
41   -{
42   -}
43   -
44   -DvppCropProcess::~DvppCropProcess()
45   -{
46   - DestroyBatchCropResource();
47   -}
48   -
49   -Result DvppCropProcess::InitProcess()
50   -{
51   - // create vpc channel description
52   - dvppChannelDesc_ = acldvppCreateChannelDesc();
53   - if (dvppChannelDesc_ == nullptr) {
54   - ERROR_LOG("acldvppCreateChannelDesc failed");
55   - return FAILED;
56   - }
57   -
58   - // create vpc channel
59   - aclError aclRet = acldvppCreateChannel(dvppChannelDesc_);
60   - if (aclRet != ACL_SUCCESS) {
61   - ERROR_LOG("acldvppCreateChannel failed, errorCode = %d", static_cast<int32_t>(aclRet));
62   - return FAILED;
63   - }
64   -
65   - // create dvpp resize config
66   - resizeConfig_ = acldvppCreateResizeConfig();
67   - if (resizeConfig_ == nullptr) {
68   - ERROR_LOG("acldvppCreateResizeConfig failed");
69   - return FAILED;
70   - }
71   -
72   - INFO_LOG("dvpp init resource success");
73   - return SUCCESS;
74   -}
75   -
76   -Result DvppCropProcess::InitBatchCropInputDesc(DeviceMemory *devMem)
77   -{
78   - inputBatchPicDesc_ = acldvppCreateBatchPicDesc(inputBatchSize_);
79   - if (inputBatchPicDesc_ == nullptr) {
80   - ERROR_LOG("InitBatchCropInputDesc inBatchPicDesc failed");
81   - return FAILED;
82   - }
83   -
84   - acldvppBatchPicDesc *inputBatchPicDesc_ = acldvppCreateBatchPicDesc(1);
85   - acldvppPicDesc *vpcInputDesc_ = acldvppGetPicDesc(inputBatchPicDesc_, 0);
86   - acldvppSetPicDescData(vpcInputDesc_, devMem->getMem());
87   - acldvppSetPicDescFormat(vpcInputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420);
88   - acldvppSetPicDescWidth(vpcInputDesc_, devMem->getWidth());
89   - acldvppSetPicDescHeight(vpcInputDesc_, devMem->getHeight());
90   - acldvppSetPicDescWidthStride(vpcInputDesc_, devMem->getWidthStride());
91   - acldvppSetPicDescHeightStride(vpcInputDesc_, devMem->getHeightStride());
92   - acldvppSetPicDescSize(vpcInputDesc_, devMem->getSize());
93   -
94   - // if (inputBatchSize_ > batchInput_.size()) {
95   - // inputBatchSize_ = batchInput_.size();
96   - // }
97   - // uint32_t inputWidth = devMem->getWidth();
98   - // for (uint32_t i = 0; i < inputBatchSize_; i++) {
99   - // vecInPtr_.push_back(inputBufferDev);
100   - // acldvppPicDesc *vpcInputDesc = acldvppGetPicDesc(inputBatchPicDesc_, i);
101   - // (void)acldvppSetPicDescData(vpcInputDesc, devMem->getMem());
102   - // (void)acldvppSetPicDescFormat(vpcInputDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420);
103   - // (void)acldvppSetPicDescWidth(vpcInputDesc, batchInput_[i].inputWidth);
104   - // (void)acldvppSetPicDescHeight(vpcInputDesc, batchInput_[i].inputHeight);
105   - // (void)acldvppSetPicDescWidthStride(vpcInputDesc, inputWidthStride_);
106   - // (void)acldvppSetPicDescHeightStride(vpcInputDesc, inputHeightStride_);
107   - // (void)acldvppSetPicDescSize(vpcInputDesc, inputBufferSize);
108   - // INFO_LOG("set inputDesc success.");
109   - // }
110   - return SUCCESS;
111   -}
112   -
113   -Result DvppCropProcess::InitBatchCropOutputDesc(vector<video_object_info> objs)
114   -{
115   - const uint32_t widthAlignment = 16;
116   - const uint32_t heightAlignment = 16;
117   - const uint32_t sizeAlignment = 3;
118   - const uint32_t sizeNum = 2;
119   -
120   - outputBatchPicDesc_ = acldvppCreateBatchPicDesc(outputBatchSize_);
121   - if (outputBatchPicDesc_ == nullptr) {
122   - ERROR_LOG("acldvppCreatePicDesc outBatchPicDesc failed");
123   - return FAILED;
124   - }
125   - acldvppPicDesc *vpcOutputDesc = nullptr;
126   - for (uint32_t i = 0; i < outputBatchSize_; i++) {
127   - video_object_info obj = objs[i];
128   -
129   - int outputWidth_ = obj.right - obj.left;
130   - int outputHeight_ = obj.bottom - obj.top;
131   - int modelInputLeft = obj.left;
132   - int modelInputTop = obj.top;
133   -
134   - uint32_t outputWidthStride = AlignSize(outputWidth_, widthAlignment);
135   - uint32_t outputHeightStride = AlignSize(outputHeight_, heightAlignment);
136   - uint32_t outputBufferSize = outputWidthStride * outputHeightStride * sizeAlignment / sizeNum;
137   -
138   - void *vpcBatchOutputBufferDev = nullptr;
139   - auto ret = acldvppMalloc(&vpcBatchOutputBufferDev, outputBufferSize);
140   - if (ret != ACL_SUCCESS) {
141   - ERROR_LOG("acldvppMalloc failed, size = %u, errorCode = %d.",
142   - outputBufferSize, static_cast<int32_t>(ret));
143   - return FAILED;
144   - }
145   - vecOutPtr_.push_back(vpcBatchOutputBufferDev);
146   - vpcOutputDesc = acldvppGetPicDesc(outputBatchPicDesc_, i);
147   - (void)acldvppSetPicDescData(vpcOutputDesc, vpcBatchOutputBufferDev);
148   - (void)acldvppSetPicDescFormat(vpcOutputDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420);
149   - (void)acldvppSetPicDescWidth(vpcOutputDesc, outputWidth_);
150   - (void)acldvppSetPicDescHeight(vpcOutputDesc, outputHeight_);
151   - (void)acldvppSetPicDescWidthStride(vpcOutputDesc, outputWidthStride);
152   - (void)acldvppSetPicDescHeightStride(vpcOutputDesc, outputHeightStride);
153   - (void)acldvppSetPicDescSize(vpcOutputDesc, outputBufferSize);
154   - }
155   - return SUCCESS;
156   -}
157   -
158   -static Result dvpp_jpege_save(char* pcData , uint32_t dataLen, string out_file_name)
159   -{
160   - FILE* fd = nullptr;
161   - fd = fopen(out_file_name.c_str(), "wb");
162   - if (fd == nullptr) {
163   - printf("open output file err\n");
164   - return FAILED;
165   - }
166   -
167   - fwrite(pcData, dataLen, 1, fd);
168   - fflush(fd);
169   -
170   - fclose(fd);
171   - return SUCCESS;
172   -}
173   -
174   -static void dvpp_jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_name){
175   -
176   - // 2.运行管理资源申请(依次申请Device、Context、Stream)
177   - aclrtContext context_;
178   - aclrtStream stream_;
179   - aclrtSetDevice(0);
180   - aclrtCreateContext(&context_, 0);
181   - aclrtCreateStream(&stream_);
182   -
183   - // 3.创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型
184   - acldvppChannelDesc *dvppChannelDesc_ = acldvppCreateChannelDesc();
185   -
186   - // 4.创建图片数据处理的通道
187   - aclError aclRet = acldvppCreateChannel(dvppChannelDesc_);
188   -
189   - // 7. 创建图片编码配置数据,设置编码质量
190   - // 编码质量范围[0, 100],其中level 0编码质量与level 100差不多,而在[1, 100]内数值越小输出图片质量越差。
191   - acldvppJpegeConfig *jpegeConfig_ = acldvppCreateJpegeConfig();
192   - acldvppSetJpegeConfigLevel(jpegeConfig_, 100);
193   -
194   - // 8. 申请输出内存,申请Device内存encodeOutBufferDev_,存放编码后的输出数据
195   - uint32_t outBufferSize= 0;
196   - int ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize);
197   - void *encodeOutBufferDev_ = nullptr;
198   - ret = acldvppMalloc(&encodeOutBufferDev_, outBufferSize);
199   -
200   - // 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成
201   - aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_,
202   - &outBufferSize, jpegeConfig_, stream_);
203   - aclRet = aclrtSynchronizeStream(stream_);
204   -
205   - // 该模式下,由于处理结果在Device侧,因此需要调用内存复制接口传输结果数据后,再释放Device侧内存
206   - // 申请Host内存outputHostBuffer
207   - void* outputHostBuffer = malloc(outBufferSize);
208   - // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host
209   - aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize, encodeOutBufferDev_, outBufferSize, ACL_MEMCPY_DEVICE_TO_HOST);
210   - // 释放掉输入输出的device内存
211   - (void)acldvppFree(encodeOutBufferDev_);
212   - // 数据使用完成后,释放内存
213   - dvpp_jpege_save((char*)outputHostBuffer, outBufferSize, out_file_name);
214   - free(outputHostBuffer);
215   -
216   - acldvppDestroyChannel(dvppChannelDesc_);
217   - (void)acldvppDestroyChannelDesc(dvppChannelDesc_);
218   - dvppChannelDesc_ = nullptr;
219   -
220   - // 11. 释放运行管理资源(依次释放Stream、Context、Device)
221   - aclrtDestroyStream(stream_);
222   - aclrtDestroyContext(context_);
223   - aclrtResetDevice(0);
224   -}
225   -
226   -Result DvppCropProcess::ProcessBatchCrop(DeviceMemory *devMem, vector<video_object_info> objs)
227   -{
228   - inputBatchSize_ = 1;
229   - outputBatchSize_ = objs.size();
230   -
231   - INFO_LOG("ProcessBatchCrop start.");
232   - const uint32_t oddNum = 1;
233   -
234   - std::unique_ptr<acldvppRoiConfig *[]>
235   - cropArea(new(std::nothrow) acldvppRoiConfig *[outputBatchSize_ * sizeof(acldvppRoiConfig *)]);
236   -
237   - for (uint32_t i = 0; i < outputBatchSize_; i++) {
238   - video_object_info obj = objs[i];
239   - cropArea[i] = acldvppCreateRoiConfig(obj.left, obj.right, obj.top, obj.bottom);
240   - if (cropArea[i] == nullptr) {
241   - ERROR_LOG("acldvppCreateRoiConfig cropArea_ failed");
242   - return FAILED;
243   - }
244   - }
245   - Result ret = InitBatchCropInputDesc(devMem);
246   - if (ret != SUCCESS) {
247   - ERROR_LOG("InitBatchCropInputDesc failed");
248   - return FAILED;
249   - }
250   -
251   - ret = InitBatchCropOutputDesc(objs);
252   - if (ret != SUCCESS) {
253   - ERROR_LOG("InitBatchCropOutputDesc failed");
254   - return FAILED;
255   - }
256   -
257   - // calculate total number of crop image
258   - uint32_t totalNum = 0;
259   - std::unique_ptr<uint32_t[]> roiNums(new (std::nothrow) uint32_t[inputBatchSize_]);
260   - if (roiNums != nullptr){
261   - for (int i = 0; i < inputBatchSize_; i++) {
262   - // crop number of images from one source image is outputBatchSize_ / inputBatchSize_
263   - roiNums[i] = outputBatchSize_ / inputBatchSize_;
264   - totalNum += roiNums[i];
265   - }
266   - }
267   - // crop number of images from last source image is
268   - // outputBatchSize_ / inputBatchSize_ + outputBatchSize_ % inputBatchSize_
269   - if (outputBatchSize_ % inputBatchSize_ != 0) {
270   - roiNums[inputBatchSize_ - 1] = (outputBatchSize_ - totalNum) + roiNums[inputBatchSize_ - 1];
271   - }
272   -
273   - aclError aclRet = acldvppSetResizeConfigInterpolation(resizeConfig_, 0);
274   - aclRet = acldvppVpcBatchCropResizeAsync(dvppChannelDesc_, inputBatchPicDesc_,
275   - roiNums.get(), inputBatchSize_,
276   - outputBatchPicDesc_, cropArea.get(), resizeConfig_, stream_);
277   - if (aclRet != ACL_SUCCESS) {
278   - ERROR_LOG("acldvppVpcBatchCropAsync failed, errorCode = %d", static_cast<int32_t>(aclRet));
279   - return FAILED;
280   - }
281   -
282   - aclRet = aclrtSynchronizeStream(stream_);
283   - if (aclRet != ACL_SUCCESS) {
284   - ERROR_LOG("crop aclrtSynchronizeStream failed, errorCode = %d", static_cast<int32_t>(aclRet));
285   - return FAILED;
286   - }
287   -
288   - for (uint32_t i = 0; i < outputBatchSize_; i++) {
289   - acldvppPicDesc *vpcOutputDesc = acldvppGetPicDesc(outputBatchPicDesc_, i);
290   - string file_name = "output";
291   - file_name = file_name + to_string(i) + ".jpg";
292   - dvpp_jpeg_encode(vpcOutputDesc, file_name);
293   - }
294   -
295   - for (uint32_t i = 0; i < outputBatchSize_; i++) {
296   - if (cropArea[i] != nullptr) {
297   - (void)acldvppDestroyRoiConfig(cropArea[i]);
298   - cropArea[i] = nullptr;
299   - }
300   - }
301   - INFO_LOG("ProcessBatchCrop success.");
302   - return SUCCESS;
303   -}
304   -
305   -void DvppCropProcess::DestroyBatchCropResource()
306   -{
307   - INFO_LOG("DestroyBatchCropResource start.");
308   -
309   - if (inputBatchPicDesc_ != nullptr) {
310   - (void)acldvppDestroyBatchPicDesc(inputBatchPicDesc_);
311   - inputBatchPicDesc_ = nullptr;
312   - }
313   - for (auto ptr : vecOutPtr_) {
314   - if (ptr != nullptr) {
315   - (void)acldvppFree(ptr);
316   - }
317   - }
318   - vecOutPtr_.clear();
319   - if (outputBatchPicDesc_ != nullptr) {
320   - (void)acldvppDestroyBatchPicDesc(outputBatchPicDesc_);
321   - outputBatchPicDesc_ = nullptr;
322   - }
323   - if (dvppChannelDesc_ != nullptr) {
324   - aclError aclRet = acldvppDestroyChannel(dvppChannelDesc_);
325   - if (aclRet != ACL_SUCCESS) {
326   - ERROR_LOG("acldvppDestroyChannel failed, errorCode = %d", static_cast<int32_t>(aclRet));
327   - }
328   - (void)acldvppDestroyChannelDesc(dvppChannelDesc_);
329   - dvppChannelDesc_ = nullptr;
330   - }
331   -
332   - if (resizeConfig_ != nullptr) {
333   - (void)acldvppDestroyResizeConfig(resizeConfig_);
334   - resizeConfig_ = nullptr;
335   - }
336   -
337   - INFO_LOG("DestroyBatchCropResource end.");
338   - return;
339   -}
340   -
341   -Result DvppCropProcess::init(int deviceId)
342   -{
343   - deviceId_ = deviceId;
344   -
345   - aclError ret;
346   - // ret = aclInit(NULL);
347   - // if (ret != ACL_SUCCESS) {
348   - // ERROR_LOG("acl init failed, errorCode = %d", static_cast<int32_t>(ret));
349   - // return FAILED;
350   - // }
351   - // INFO_LOG("acl init success");
352   -
353   - // set device
354   - ret = aclrtSetDevice(deviceId_);
355   - if (ret != ACL_SUCCESS) {
356   - ERROR_LOG("acl set device %d failed, errorCode = %d", deviceId_, static_cast<int32_t>(ret));
357   - return FAILED;
358   - }
359   - INFO_LOG("set device %d success", deviceId_);
360   -
361   - // create context (set current)
362   - ret = aclrtCreateContext(&context_, deviceId_);
363   - if (ret != ACL_SUCCESS) {
364   - ERROR_LOG("acl create context failed, deviceId = %d, errorCode = %d",
365   - deviceId_, static_cast<int32_t>(ret));
366   - return FAILED;
367   - }
368   - INFO_LOG("create context success");
369   -
370   - // create stream
371   - ret = aclrtCreateStream(&stream_);
372   - if (ret != ACL_SUCCESS) {
373   - ERROR_LOG("acl create stream failed, deviceId = %d, errorCode = %d",
374   - deviceId_, static_cast<int32_t>(ret));
375   - return FAILED;
376   - }
377   - INFO_LOG("create stream success");
378   -
379   - InitProcess();
380   -
381   - return SUCCESS;
382   -}
383   -
384   -void DvppCropProcess::DestroyResource()
385   -{
386   - aclError ret;
387   - if (stream_ != nullptr) {
388   - ret = aclrtDestroyStream(stream_);
389   - if (ret != ACL_SUCCESS) {
390   - ERROR_LOG("destroy stream failed, errorCode = %d", static_cast<int32_t>(ret));
391   - }
392   - stream_ = nullptr;
393   - }
394   - INFO_LOG("end to destroy stream");
395   -
396   - if (context_ != nullptr) {
397   - ret = aclrtDestroyContext(context_);
398   - if (ret != ACL_SUCCESS) {
399   - ERROR_LOG("destroy context failed, errorCode = %d", static_cast<int32_t>(ret));
400   - }
401   - context_ = nullptr;
402   - }
403   - INFO_LOG("end to destroy context");
404   -
405   - ret = aclrtResetDevice(deviceId_);
406   - if (ret != ACL_SUCCESS) {
407   - ERROR_LOG("reset device %d failed, errorCode = %d", deviceId_, static_cast<int32_t>(ret));
408   - }
409   - INFO_LOG("end to reset device %d", deviceId_);
410   -
411   - ret = aclFinalize();
412   - if (ret != ACL_SUCCESS) {
413   - ERROR_LOG("finalize acl failed, errorCode = %d", static_cast<int32_t>(ret));
414   - }
415   - INFO_LOG("end to finalize acl");
416   -}
src/util/crop_process.h deleted
1   -#ifndef ___CROP_PROCESS_H__
2   -#define ___CROP_PROCESS_H__
3   -
4   -#include <vector>
5   -#include "acl/ops/acl_dvpp.h"
6   -#include "../ai_platform/header.h"
7   -
8   -using namespace std;
9   -
10   -class DeviceMemory;
11   -
12   -typedef enum Result {
13   - SUCCESS = 0,
14   - FAILED = 1
15   -} Result;
16   -
17   -class DvppCropProcess {
18   -public:
19   - /**
20   - * @brief Constructor
21   - * @param [in] stream: stream
22   - */
23   - DvppCropProcess();
24   -
25   - /**
26   - * @brief Destructor
27   - */
28   - ~DvppCropProcess();
29   -
30   -public:
31   - /**
32   - * @brief Process Batch Crop
33   - * @return result
34   - */
35   - Result ProcessBatchCrop(DeviceMemory *devMem, vector<video_object_info> objs);
36   -
37   - /**
38   - * @brief init reousce
39   - * @return result
40   - */
41   - Result init(int deviceId);
42   -
43   -
44   -private:
45   - /**
46   - * @brief InitBatchCropInputDesc
47   - * @return Result
48   - */
49   - Result InitBatchCropInputDesc(DeviceMemory *devMem);
50   -
51   - /**
52   - * @brief InitBatchCropOutputDesc
53   - * @return Result
54   - */
55   - Result InitBatchCropOutputDesc(vector<video_object_info> objs);
56   -
57   - /**
58   - * @brief DestroyBatchCropResource
59   - */
60   - void DestroyBatchCropResource();
61   -
62   -
63   - void DestroyResource();
64   -
65   - /**
66   - * @brief init reousce
67   - * @return result
68   - */
69   - Result InitProcess();
70   -
71   -private:
72   - int32_t deviceId_;
73   - aclrtContext context_;
74   - aclrtStream stream_;
75   -
76   - acldvppChannelDesc *dvppChannelDesc_;
77   - acldvppResizeConfig *resizeConfig_;
78   -
79   - std::vector<void *> vecOutPtr_;
80   -
81   - acldvppBatchPicDesc *inputBatchPicDesc_; // vpc input desc
82   - acldvppBatchPicDesc *outputBatchPicDesc_; // vpc output desc
83   -
84   - uint32_t inputBatchSize_;
85   - uint32_t outputBatchSize_;
86   -};
87   -
88   -#endif // ___CROP_PROCESS_H__
89 0 \ No newline at end of file
src/util/vpc_util.cpp
... ... @@ -16,14 +16,10 @@
16 16 #include "vpc_util.h"
17 17 #include "JpegUtil.h"
18 18 #include "../decoder/interface/DeviceMemory.hpp"
  19 +#include "../common/logger.hpp"
19 20  
20   -#define INFO_LOG(fmt, args...) fprintf(stdout, "[INFO] " fmt "\n", ##args)
21   -#define WARN_LOG(fmt, args...) fprintf(stdout, "[WARN] " fmt "\n", ##args)
22   -#define ERROR_LOG(fmt, args...) fprintf(stderr, "[ERROR] " fmt "\n", ##args)
23 21  
24   -
25   -
26   -void VPCUtil::vpc_crop_release()
  22 +void VPCUtil::release()
27 23 {
28 24 aclError ret;
29 25 // ret = aclrtSetDevice(deviceId_);
... ... @@ -35,26 +31,26 @@ void VPCUtil::vpc_crop_release()
35 31 if (stream_ != nullptr) {
36 32 ret = aclrtDestroyStream(stream_);
37 33 if (ret != ACL_SUCCESS) {
38   - ERROR_LOG("destroy stream failed");
  34 + LOG_ERROR("destroy stream failed");
39 35 }
40 36 stream_ = nullptr;
41 37 }
42   - INFO_LOG("end to destroy stream");
  38 + LOG_INFO("end to destroy stream");
43 39  
44 40 if (context_ != nullptr) {
45 41 ret = aclrtDestroyContext(context_);
46 42 if (ret != ACL_SUCCESS) {
47   - ERROR_LOG("destroy context failed");
  43 + LOG_ERROR("destroy context failed");
48 44 }
49 45 context_ = nullptr;
50 46 }
51   - INFO_LOG("end to destroy context");
  47 + LOG_INFO("end to destroy context");
52 48  
53 49 ret = aclrtResetDevice(deviceId_);
54 50 if (ret != ACL_SUCCESS) {
55   - ERROR_LOG("reset device failed");
  51 + LOG_ERROR("reset device failed");
56 52 }
57   - INFO_LOG("end to reset device is %d", deviceId_);
  53 + LOG_INFO("end to reset device is %d", deviceId_);
58 54 }
59 55  
60 56  
... ... @@ -109,7 +105,7 @@ int VPCUtil::vpc_crop(acldvppPicDesc *input_pic_desc, video_object_info obj)
109 105 return 0;
110 106 }
111 107  
112   -int VPCUtil::vpc_crop_init(int32_t devId){
  108 +int VPCUtil::init(int32_t devId){
113 109 deviceId_ = devId;
114 110  
115 111 aclError ret;
... ... @@ -140,10 +136,15 @@ static void check_coordinate(uint32_t&amp; cropLeftOffset, uint32_t&amp; cropRightOffset
140 136  
141 137 }
142 138  
143   -vector<vpc_img_info> VPCUtil::vpc_crop_batch(DeviceMemory *devMem, vector<video_object_info> objs){
  139 +vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_object_info> objs){
144 140  
145 141 vector<vpc_img_info> vec_img_info;
146 142  
  143 + const uint32_t outputBatchSize_ = objs.size();
  144 + if(outputBatchSize_ <= 0){
  145 + return vec_img_info;
  146 + }
  147 +
147 148 /* 1.ACL initialization */
148 149 // aclInit(nullptr);
149 150 aclError ret;
... ... @@ -161,18 +162,14 @@ vector&lt;vpc_img_info&gt; VPCUtil::vpc_crop_batch(DeviceMemory *devMem, vector&lt;video_
161 162 acldvppSetPicDescHeightStride(vpcInputDesc_, devMem->getHeightStride());
162 163 acldvppSetPicDescSize(vpcInputDesc_, devMem->getSize());
163 164  
164   - const uint32_t outputBatchSize_ = objs.size();
165 165 // 输出
166 166 acldvppBatchPicDesc *outputBatchPicDesc_ = acldvppCreateBatchPicDesc(outputBatchSize_);
167 167 if (outputBatchPicDesc_ == nullptr) {
168   - ERROR_LOG("acldvppCreatePicDesc outBatchPicDesc failed");
  168 + LOG_ERROR("acldvppCreatePicDesc outBatchPicDesc failed");
169 169 return vec_img_info;
170 170 }
171 171 vector<void *> vecOutPtr_;
172 172 acldvppPicDesc *vpcOutputDesc = nullptr;
173   - // acldvppRoiConfig cropAreas[outputBatchSize_];
174   - // std::unique_ptr<acldvppRoiConfig *[]>
175   - // cropAreas(new(std::nothrow) acldvppRoiConfig *[outputBatchSize_ * sizeof(acldvppRoiConfig *)]);
176 173 acldvppRoiConfig *cropAreas[outputBatchSize_];
177 174 for (uint32_t i = 0; i < outputBatchSize_; i++) {
178 175 video_object_info obj = objs[i];
... ... @@ -199,7 +196,7 @@ vector&lt;vpc_img_info&gt; VPCUtil::vpc_crop_batch(DeviceMemory *devMem, vector&lt;video_
199 196 void *vpcBatchOutputBufferDev = nullptr;
200 197 auto ret = acldvppMalloc(&vpcBatchOutputBufferDev, vpcOutBufferSize_);
201 198 if (ret != ACL_SUCCESS) {
202   - ERROR_LOG("acldvppMalloc failed, size = %u, errorCode = %d.", vpcOutBufferSize_, static_cast<int32_t>(ret));
  199 + LOG_ERROR("acldvppMalloc failed, size = %u, errorCode = %d.", vpcOutBufferSize_, static_cast<int32_t>(ret));
203 200 // 释放之前成功的部分 再退出
204 201 for(int i = 0; i < vecOutPtr_.size(); i++){
205 202 if (vecOutPtr_[i] != nullptr){
... ... @@ -304,7 +301,7 @@ vpc_img_info VPCUtil::vpc_devMem2vpcImg(DeviceMemory *devMem){
304 301 void *devBuffer = nullptr;
305 302 auto ret = acldvppMalloc(&devBuffer, nBufferSize);
306 303 if (ret != ACL_SUCCESS) {
307   - ERROR_LOG("acldvppMalloc failed, size = %u, errorCode = %d.", nBufferSize, static_cast<int32_t>(ret));
  304 + LOG_ERROR("acldvppMalloc failed, size = %u, errorCode = %d.", nBufferSize, static_cast<int32_t>(ret));
308 305 // 这里应释放之前成功的部分 再退出
309 306 return img_info;
310 307 }
... ...
src/util/vpc_util.h
... ... @@ -27,15 +27,15 @@ class VPCUtil {
27 27 public:
28 28 int vpc_crop(acldvppPicDesc *input_pic_desc, video_object_info obj);
29 29  
30   - int vpc_crop_init(int32_t devId);
  30 + int init(int32_t devId);
31 31  
32   - vector<vpc_img_info> vpc_crop_batch(DeviceMemory *devMem, vector<video_object_info> objs);
  32 + vector<vpc_img_info> crop_batch(DeviceMemory *devMem, vector<video_object_info> objs);
33 33  
34 34 void vpc_img_release(vpc_img_info );
35 35  
36 36 void vpc_imgList_release(vector<vpc_img_info>& );
37 37  
38   - void vpc_crop_release();
  38 + void release();
39 39  
40 40 vpc_img_info vpc_devMem2vpcImg(DeviceMemory *devMem);
41 41  
... ...