diff --git a/src/ai_engine_module/VPTProcess.cpp b/src/ai_engine_module/VPTProcess.cpp index b1e8632..1a1b440 100755 --- a/src/ai_engine_module/VPTProcess.cpp +++ b/src/ai_engine_module/VPTProcess.cpp @@ -138,7 +138,8 @@ int VPTProcess::process_gpu(sy_img * batch_img, vector& tasklist, /* 跟踪:第一帧 带检测框信息的跟踪,取结果返回 */ if (j == 0) { - int objCount = cur_sort.update_v2(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); + // int objCount = cur_sort.update_v2(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); + int objCount = cur_sort.update_v3(isUseDet, /*save lk = */false, /*center_dist = */false, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); result[detectIndex].obj_count = objCount; result[detectIndex].task_id = task_id; @@ -149,7 +150,8 @@ int VPTProcess::process_gpu(sy_img * batch_img, vector& tasklist, { onelevel_det_result un_result; //un_result.obj_count = cur_sort.update(isUseDet, false, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); - un_result.obj_count = cur_sort.update_v2(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); + // un_result.obj_count = cur_sort.update_v2(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); + un_result.obj_count = cur_sort.update_v3(isUseDet, false, false, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); } } } diff --git a/src/ai_engine_module/VPTProcess.cpp_debug b/src/ai_engine_module/VPTProcess.cpp_debug new file mode 100755 index 0000000..b4ff5fa --- /dev/null +++ b/src/ai_engine_module/VPTProcess.cpp_debug @@ -0,0 +1,259 @@ +#include "VPTProcess.h" +#include "../common/logger.hpp" +#include "../ai_platform/task_param_manager.h" + +#include +#include +#include + +#include "vpt.h" +#include "../ai_platform/macro_definition.h" +#include "../ai_platform/det_obj_header.h" + +#include "opencv2/opencv.hpp" + +#include "../util/vpc_util.h" + +VPTProcess::VPTProcess(){ + m_max_batchsize = 16; +} + +VPTProcess::~VPTProcess(){ + release(); +} + +/* 算法初始化 */ +int VPTProcess::init(VPTProcess_PARAM vparam){ + + string model_path = vparam.model_dir + "/models/vpt230323_310p.om" ; + + LOG_INFO("vpt 版本:{} 模型路径:{}", vpt_get_version(), model_path); + + vpt_param param; + char modelNames[100]; + strcpy(modelNames, model_path.c_str()); + param.modelNames = modelNames; + param.threshold = vparam.threshold; + param.devId = vparam.gpuid; + param.isTrk = false; + + m_devId = param.devId; + ACL_CALL(aclrtSetDevice(m_devId), ACL_ERROR_NONE, -1); + ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_ERROR_NONE, -1); + + int ret = vpt_init(&m_det_handle, param); + if(ret != 0){ + LOG_DEBUG("vpt init error."); + return -1; + } + jpegUtil.jpeg_init(m_devId); + + return 0; +} + +/* 算法计算 */ +// int VPTProcess::process_gpu(sy_img * batch_img, vector& tasklist, +// vector& result, vector>& deleteObjectID, vector>& unUsedResult) +int VPTProcess::process_gpu(sy_img * batch_img, vector vec_vptMem, vector& tasklist, + vector& result, vector>& deleteObjectID, vector>& unUsedResult) +{ + int batchsize = tasklist.size(); + + if (result.empty()) + result.resize(batchsize); + + /* 结果结构体初始化 */ + vpt_result *vpt_det_result = new vpt_result[batchsize]; + for (int b = 0; b < batchsize; b++){ + vpt_det_result[b].obj_count_ = 0; + vpt_det_result[b].obj_results_ = new vpt_obj_result[MAX_DET_COUNT]; + } + + do{ + /* 路数太多时 按照最大batchsize数 拆批次运行 */ + int cur_batch_size = m_max_batchsize; + int cycleTimes = batchsize / cur_batch_size + (batchsize % cur_batch_size == 0 ? 0 : 1); + + for (int c = 0; c < cycleTimes; c++){ + + int real_batchsize = c == cycleTimes - 1 ? (batchsize - cur_batch_size*c) : cur_batch_size; + int startbatch = c*cur_batch_size; + + vpt_result *real_res = vpt_det_result + startbatch; + + aclrtSetDevice(m_devId); + int ret = aclrtSetCurrentContext(m_algorthim_ctx); + if(ACL_ERROR_NONE != ret){ + break; + } + ret = vpt_batch(m_det_handle, batch_img + startbatch, real_batchsize, real_res); + if(ret != 0){ + break; + } + } + + vector >> detectResult(batchsize); // sort + + /* 将检测的结果放进数组 转换为跟踪的输入需要(若为人脸 则检测结果可能跟多,比如需要带上ldmk点) */ + // filter by threshold. + for (int b = 0; b < batchsize; b++) + { + vpt_result cur_result = vpt_det_result[b]; + + for (int c = 0; c < cur_result.obj_count_ && c < MAX_OBJ_COUNT; c++) + { + float x1 = vpt_det_result[b].obj_results_[c].obj_rect.left_; + float y1 = vpt_det_result[b].obj_results_[c].obj_rect.top_; + float x2 = vpt_det_result[b].obj_results_[c].obj_rect.left_ + vpt_det_result[b].obj_results_[c].obj_rect.width_; + float y2 = vpt_det_result[b].obj_results_[c].obj_rect.top_ + vpt_det_result[b].obj_results_[c].obj_rect.height_; + + float class_id = vpt_det_result[b].obj_results_[c].obj_index; + float score = vpt_det_result[b].obj_results_[c].obj_score; + + if (score >= THRESHOLD) + { + vector obj; + obj.push_back(x1); + obj.push_back(y1); + obj.push_back(x2); + obj.push_back(y2); + obj.push_back(score); + obj.push_back(class_id); + detectResult[b].push_back(obj); + } + } + } + +#if 0 + for (int b = 0; b < batchsize; b++) + { + std::string file_path = "res/vpt_test/"; + auto time_now = std::chrono::system_clock::now(); + std::string cur_timestamp_us = std::to_string(std::chrono::duration_cast(time_now.time_since_epoch()).count()); + std::string img_filename = file_path + cur_timestamp_us + "_" + std::to_string(detectResult[b].size()) + ".jpg"; + + vpc_img_info src_img_info = VPCUtil::vpc_devMem2vpcImg(vec_vptMem[b]); + bool bSaved = jpegUtil.jpeg_encode(src_img_info.pic_desc, img_filename); + + cv::Mat big_img = cv::imread(img_filename); + for (int c = 0; c < detectResult[b].size(); c++) { + cv::rectangle(big_img, cv::Rect(detectResult[b][c][0], detectResult[b][c][1], detectResult[b][c][2] - detectResult[b][c][0], + detectResult[b][c][3] - detectResult[b][c][1]), cv::Scalar(158, 52, 254), 3, 1, 0); + } + cv::imwrite(img_filename, big_img); + + VPCUtil::vpc_img_release(src_img_info); + } +#endif + + bool isUseDet = true; + for (size_t detectIndex = 0; detectIndex < batchsize; detectIndex++) { + string task_id = tasklist[detectIndex]; + + if (! taskTrackers[task_id].tracker.GetState()) + continue; + + Sort &cur_sort = taskTrackers[task_id].tracker; + isUseDet = true; + + const float maxLen = std::sqrt(batch_img[detectIndex].w_ * batch_img[detectIndex].w_ + batch_img[detectIndex].h_ * batch_img[detectIndex].h_); //-modified by zsh 220719 + /* FusionInterval是跳帧参数,以十类人车物为例,一般跳5帧,所以第一帧检测,后续四帧纯跟踪 */ + for (int j = 0; j < taskTrackers[task_id].tracker.FusionInterval; j++) + { + /* 跟踪:第一帧 带检测框信息的跟踪,取结果返回 */ + if (j == 0) + { + // int objCount = cur_sort.update_v2(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); + int objCount = cur_sort.update_v3(isUseDet, /*save lk = */false, /*center_dist = */true, maxLen, detectResult[detectIndex], result[detectIndex].obj, deleteObjectID[detectIndex]); + result[detectIndex].obj_count = objCount; + result[detectIndex].task_id = task_id; + + // vector>().swap(detectResult[detectIndex]); + // detectResult[detectIndex].clear(); + isUseDet = false; + } else /* 跟踪:后四帧 纯粹跟踪 纯跟踪结果不返回 */ + { + onelevel_det_result un_result; + //un_result.obj_count = cur_sort.update(isUseDet, false, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); + // un_result.obj_count = cur_sort.update_v2(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); + un_result.obj_count = cur_sort.update_v3(isUseDet, false, true, maxLen, detectResult[detectIndex], un_result.obj, deleteObjectID[detectIndex]); + } + } + } +#if 1 + for (int b = 0; b < batchsize; b++) + { + std::string file_path = "res/vpt_track/"; + auto time_now = std::chrono::system_clock::now(); + std::string cur_timestamp_us = std::to_string(std::chrono::duration_cast(time_now.time_since_epoch()).count()); + std::string img_filename = file_path + cur_timestamp_us + "_" + std::to_string(result[b].obj_count) + ".jpg"; + vpc_img_info src_img_info = VPCUtil::vpc_devMem2vpcImg(vec_vptMem[b]); + bool flag = false; + for (int c = 0; c < result[b].obj_count; c++) { + if (result[b].obj[c].id > 7700 && result[b].obj[c].id < 8000) flag = true; + } + + if (flag) { + bool bSaved = jpegUtil.jpeg_encode(src_img_info.pic_desc, img_filename); + cv::Mat big_img = cv::imread(img_filename); + + for (int c = 0; c < result[b].obj_count; c++) { + cv::putText(big_img, std::to_string(result[b].obj[c].id), cv::Point(result[b].obj[c].left, result[b].obj[c].top-5), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(255,0,0),2,8); + cv::rectangle(big_img, cv::Rect(result[b].obj[c].left, result[b].obj[c].top, result[b].obj[c].right - result[b].obj[c].left, + result[b].obj[c].bottom - result[b].obj[c].top), cv::Scalar(158, 52, 254), 3, 1, 0); + } + + for (int c = 0; c < detectResult[b].size(); c++) { + cv::rectangle(big_img, cv::Rect(detectResult[b][c][0], detectResult[b][c][1], detectResult[b][c][2] - detectResult[b][c][0], + detectResult[b][c][3] - detectResult[b][c][1]), cv::Scalar(0, 0, 255), 3, 1, 0); + } + cv::imwrite(img_filename, big_img); + } + VPCUtil::vpc_img_release(src_img_info); + } +#endif + + vector >>().swap(detectResult); // free memory. + } while (0); + + if(vpt_det_result){ + for (int b = 0; b < batchsize; b++){ + delete[] vpt_det_result[b].obj_results_; + } + delete[] vpt_det_result; + } + + return 0; +} + + +/* 算法句柄 资源释放 */ +void VPTProcess::release(){ + if (m_det_handle){ + vpt_release(&m_det_handle); + m_det_handle = NULL; + } + jpegUtil.jpeg_release(); + if(m_algorthim_ctx){ + aclrtDestroyContext(m_algorthim_ctx); + } +} + +// 221117byzsh +void VPTProcess::addTaskTracker(const string taskID, double rWidth, double rHeight, int skip_frame) +{ + TaskTracker t; + t.TaskID = taskID; + t.ratioWidth = rWidth; + t.ratioHeight = rHeight; + t.tracker.FusionInterval = skip_frame; + + taskTrackers[taskID] = t; +} + +/* 任务结束跟踪器 */ +bool VPTProcess::finishTaskTracker(const string taskID) +{ + taskTrackers.erase(taskID); + return true; +} \ No newline at end of file diff --git a/src/ai_engine_module/VPTProcess.h b/src/ai_engine_module/VPTProcess.h index c826475..75c0161 100755 --- a/src/ai_engine_module/VPTProcess.h +++ b/src/ai_engine_module/VPTProcess.h @@ -11,6 +11,8 @@ #include "sort/Sort.h" #include "acl/acl.h" #include "acl/ops/acl_dvpp.h" +#include "../util/vpc_util.h" +#include "../util/JpegUtil.h" using namespace std; @@ -68,7 +70,8 @@ public: */ int process_gpu(sy_img * batch_img, vector& tasklist, vector& result, vector>& deleteObjectID, vector>& unUsedResult); - + int process_gpu(sy_img * batch_img, vector vec_vptMem, vector& tasklist, + vector& result, vector>& deleteObjectID, vector>& unUsedResult); /************************************************************************* * FUNCTION: VPT_Release @@ -87,7 +90,7 @@ public: private: int m_devId; aclrtContext m_algorthim_ctx; - + JpegUtil jpegUtil; void* m_det_handle{nullptr}; float threshold{0.6}; int m_max_batchsize; diff --git a/src/ai_engine_module/sort/Sort.cpp b/src/ai_engine_module/sort/Sort.cpp index d64bc90..c926d55 100755 --- a/src/ai_engine_module/sort/Sort.cpp +++ b/src/ai_engine_module/sort/Sort.cpp @@ -380,6 +380,232 @@ int Sort::update_v2(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLe } +int Sort::update_v3(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLen, vector< vector > &dets, det_objinfo *result, vector &deleteObjectID) +{ + //get predicted locations from existing trackers. + vector< vector > trks; + vector pos; + int ObjCount = 0; //by zl 本帧图像中的有效前景个数 + vector bbox; + + for (int i = 0; i < trackers.size(); i++ ) + { + pos = trackers[i].predict(); // 对跟踪列表中的框进行预测(包含初始化的和匹配后update的) + pos.push_back(1); + pos.push_back(trackers[i].cls); + trks.push_back(pos); + pos.clear(); + } + + if (isUseDet == true) + { + vector< vector > matched; + vector unmatched_dets; + vector unmatched_trks; + + if(center_dist) { + Sort::associate_detections_to_trackers_v2(matched, unmatched_dets, unmatched_trks, dets, trks, maxLen); // 中心距离匹配 + } + else { + Sort::associate_detections_to_trackers(matched, unmatched_dets, unmatched_trks, dets, trks, 0.3); // iou匹配 + } + //update matched trackers with assigned detections----匹配上的更新跟踪信息 + for (int matched_number = 0; matched_number < matched.size(); matched_number++) + { + trackers[matched[matched_number][1]].update(dets[matched[matched_number][0]]); + trackers[matched[matched_number][1]].score = dets[matched[matched_number][0]][4]; + trackers[matched[matched_number][1]].cls = dets[matched[matched_number][0]][5]; + if (copy_ldmk)//存入关键点信息 + { + for (int m = 0; m < 50; ++m) + { + trackers[matched[matched_number][1]].ldmk.push_back(dets[matched[matched_number][0]][m + 6]); + } + // added by zsh 姿态角信息-------------------------------------------------------- + trackers[matched[matched_number][1]].roll = dets[matched[matched_number][0]][56]; + trackers[matched[matched_number][1]].yaw = dets[matched[matched_number][0]][57]; + trackers[matched[matched_number][1]].pitch = dets[matched[matched_number][0]][58]; + //-------------------------------------------------------------------------------- + } +#if 1 + //返回加上ID信息的检测框=================================================================== + if (ObjCount < MAX_OBJ_COUNT) { + // if (ObjCount < MAX_OBJ_COUNT && (trackers[matched[matched_number][1]].time_since_update < FusionInterval) && ((trackers[matched[matched_number][1]].hit_streak >= min_hits) || (frame_count <= (min_hits * FusionInterval)))) { + if (trackers[matched[matched_number][1]].id == -1) + trackers[matched[matched_number][1]].id = trackcount++; + result[ObjCount].id = trackers[matched[matched_number][1]].id; + result[ObjCount].num = trackers[matched[matched_number][1]].frame_count; + + result[ObjCount].left = dets[matched[matched_number][0]][0]; + result[ObjCount].top = dets[matched[matched_number][0]][1]; + result[ObjCount].right = dets[matched[matched_number][0]][2]; + result[ObjCount].bottom = dets[matched[matched_number][0]][3]; + result[ObjCount].confidence = dets[matched[matched_number][0]][4]; + result[ObjCount].index = dets[matched[matched_number][0]][5]; + result[ObjCount].center_x = result[ObjCount].left + (result[ObjCount].right - result[ObjCount].left) * 0.5; // 中心点 add by 20170227 + result[ObjCount].center_y = result[ObjCount].top + (result[ObjCount].bottom - result[ObjCount].top) * 0.5; // 中心点 + if (trackers[matched[matched_number][1]].age == 2 * FusionInterval) { + result[ObjCount].snap_flag = 1; // 中心点 + } + else { + result[ObjCount].snap_flag = 0; // 中心点 + } + + if (copy_ldmk) // 存入关键点信息 + { + for (int m = 0; m < 25; ++m) + { + result[ObjCount].landmark_point[m].x_ = trackers[matched[matched_number][1]].ldmk[2 * m]; + result[ObjCount].landmark_point[m].y_ = trackers[matched[matched_number][1]].ldmk[2 * m + 1]; + } + // added by zsh 姿态角信息-------------------------------- + result[ObjCount].roll = trackers[matched[matched_number][1]].roll; + result[ObjCount].yaw = trackers[matched[matched_number][1]].yaw; + result[ObjCount].pitch = trackers[matched[matched_number][1]].pitch; + //-------------------------------------------------------- + } + + ObjCount++; + } + //=================================================================================== +#endif + } + + //create and initialise new trackers for unmatched detections----为未匹配上的检测框分配新tracker + for (int unmatched_dets_number = 0; unmatched_dets_number < unmatched_dets.size(); unmatched_dets_number++) + { + KalmanBoxTracker tracker = KalmanBoxTracker(dets[unmatched_dets[unmatched_dets_number]], max_track_length); + tracker.id = -1; + tracker.FusionInterval = FusionInterval; //221117byzsh + trackers.push_back(tracker); + trackers[trackers.size() - 1].score = dets[unmatched_dets[unmatched_dets_number]][4];//by zl 20170525 解决第一次检测时置信度为0问题 + + if (copy_ldmk)//存入关键点信息 + { + for (int m = 0; m < 50; ++m) + { + trackers[trackers.size() - 1].ldmk.push_back(dets[unmatched_dets[unmatched_dets_number]][m + 6]); + } + // added by zsh 姿态角信息------------------------------------------------------------ + trackers[trackers.size() - 1].roll = dets[unmatched_dets[unmatched_dets_number]][56]; + trackers[trackers.size() - 1].yaw = dets[unmatched_dets[unmatched_dets_number]][57]; + trackers[trackers.size() - 1].pitch = dets[unmatched_dets[unmatched_dets_number]][58]; + //----------------------------------------------------------------------------------- + } + + // cout << "trackers size: " << trackers.size() << endl; + + } + + for (int trackers_number = 0; trackers_number < trackers.size();) + { + // cout << trackers[trackers_number].id << " " < max_age) // 失配次数超过max_age,放入轨迹消失列表,从跟踪列表中删除 + { + if (trackers[trackers_number].id != -1) + { + deleteObjectID.push_back(trackers[trackers_number].id); + } + + trackcount++; + std::vector().swap(trackers[trackers_number].ldmk); + trackers.erase(trackers.begin() + trackers_number); + continue; + } +#if 0 + // 失配次数小于FusionInterval且满足最小匹配次数则返回 + if (ObjCount < MAX_OBJ_COUNT && (trackers[trackers_number].time_since_update < FusionInterval) && ((trackers[trackers_number].hit_streak >= min_hits) || (frame_count <= (min_hits * FusionInterval)))) + { + if (trackers[trackers_number].id == -1) + trackers[trackers_number].id = trackcount++; + result[ObjCount].id = trackers[trackers_number].id; + result[ObjCount].num = trackers[trackers_number].frame_count; + + bbox = trackers[trackers_number].get_state(); // 跟踪框 + result[ObjCount].left = bbox[0]; // bbout[i][0]; + result[ObjCount].top = bbox[1]; //bbout[i][1]; + result[ObjCount].right = bbox[2]; //bbout[i][2]; + result[ObjCount].bottom = bbox[3]; //bbout[i][3]; + result[ObjCount].confidence = trackers[trackers_number].score; // bbout[i][4]; + result[ObjCount].index = trackers[trackers_number].cls; // bbout[i][5] - 1; + result[ObjCount].center_x = result[ObjCount].left + (result[ObjCount].right - result[ObjCount].left) * 0.5; // 中心点 add by 20170227 + result[ObjCount].center_y = result[ObjCount].top + (result[ObjCount].bottom - result[ObjCount].top) * 0.5; // 中心点 + if (trackers[trackers_number].age == 2 * FusionInterval) + { + result[ObjCount].snap_flag = 1; // 中心点 + } + else + { + result[ObjCount].snap_flag = 0; // 中心点 + } + + if (copy_ldmk) // 存入关键点信息 + { + for (int m = 0; m < 25; ++m) + { + result[ObjCount].landmark_point[m].x_ = trackers[trackers_number].ldmk[2 * m]; + result[ObjCount].landmark_point[m].y_ = trackers[trackers_number].ldmk[2 * m + 1]; + } + // added by zsh 姿态角信息-------------------------------- + result[ObjCount].roll = trackers[trackers_number].roll; + result[ObjCount].yaw = trackers[trackers_number].yaw; + result[ObjCount].pitch = trackers[trackers_number].pitch; + //-------------------------------------------------------- + } +#if _Debug + printf("trackers_number = %d, trackers.size() = %d, update: index = %d, id = %d, (%d, %d), (%d, %d)\n", trackers_number, trackers.size(), result[ObjCount].index, result[ObjCount].id, result[ObjCount].left, result[ObjCount].top, result[ObjCount].right, result[ObjCount].bottom); +#endif + ObjCount++; + } +#endif + trackers_number++;//共多少条轨迹 + } + } + else + { + for (int trackers_number = 0; trackers_number < trackers.size() && ObjCount < MAX_OBJ_COUNT; trackers_number++) + { + if (trackers[trackers_number].id == -1) + trackers[trackers_number].id = trackcount++; + result[trackers_number].num = trackers[trackers_number].frame_count; + bbox = trackers[trackers_number].get_state(); + result[trackers_number].id = trackers[trackers_number].id; + result[trackers_number].left = bbox[0]; // bbout[i][0]; + result[trackers_number].top = bbox[1]; //bbout[i][1]; + result[trackers_number].right = bbox[2]; //bbout[i][2]; + result[trackers_number].bottom = bbox[3]; //bbout[i][3]; + result[trackers_number].confidence = trackers[trackers_number].score; // bbout[i][4]; + result[trackers_number].index = trackers[trackers_number].cls;//bbox[5] - 1;// trackers[trackers_number].cls - 1; // bbout[i][5] - 1; + result[trackers_number].center_x = (int)(result[trackers_number].left + (result[trackers_number].right - result[trackers_number].left) * 0.5); // 中心点 add by 20170227 + result[trackers_number].center_y = (int)(result[trackers_number].top + (result[trackers_number].bottom - result[trackers_number].top) * 0.5); // 中心点 + + if (copy_ldmk)//存入关键点信息 + { + for (int m = 0; m < 25; ++m) + { + result[trackers_number].landmark_point[m].x_ = trackers[trackers_number].ldmk[2 * m]; + result[trackers_number].landmark_point[m].y_ = trackers[trackers_number].ldmk[2 * m + 1]; + } + // added by zsh 姿态角信息--------------------------------------- + result[trackers_number].roll = trackers[trackers_number].roll; + result[trackers_number].yaw = trackers[trackers_number].yaw; + result[trackers_number].pitch = trackers[trackers_number].pitch; + //-------------------------------------------------------------- + } + + result[ObjCount].snap_flag = 0; // 中心点 + + ObjCount++; + } + } + + //---------------------------注释掉了这步操作 用了新的绘制轨迹的函数 需要绘制调用addTracker(Mat *img)方法 by lm---------------------------------------------/ + //addTracker(result, ObjCount); + + frame_count += 1; //帧数加一 + return ObjCount; + +} //---------------------------利用trackers中的history 绘制路径 -by lm ---------------------------------------------/ //固定长度的轨迹,采用循环队列,仅保存目前最前N length的轨迹,避免对于停留在画面中目标 导致的内存一直增长 diff --git a/src/ai_engine_module/sort/Sort.h b/src/ai_engine_module/sort/Sort.h index 5cb8b2d..2205a97 100755 --- a/src/ai_engine_module/sort/Sort.h +++ b/src/ai_engine_module/sort/Sort.h @@ -47,6 +47,7 @@ public: Sort(); int update(bool isUseDet, bool copy_ldmk, vector< vector > &dets, det_objinfo *result, vector &deleteObjectID); int update_v2(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLen, vector< vector > &dets, det_objinfo *result, vector &deleteObjectID); // added by zsh 220719 + int update_v3(bool isUseDet, bool copy_ldmk, bool center_dist, float maxLen, vector< vector > &dets, det_objinfo *result, vector &deleteObjectID); void Release(); void ReSet(); void Pause(); diff --git a/src/ai_engine_module/traffic_light_process.cpp b/src/ai_engine_module/traffic_light_process.cpp index c25a05c..0f6fa7f 100644 --- a/src/ai_engine_module/traffic_light_process.cpp +++ b/src/ai_engine_module/traffic_light_process.cpp @@ -454,8 +454,11 @@ namespace ai_engine_module // LOG_TRACE("task id is {} algor type is {} obj_id {}", task_id, int(algor_type), objId); if (algor_type == algorithm_type_t::PERSON_RUNNING_REDLIGHTS && static_cast(det_result.box.cls) != det_class_label_t::HUMAN) continue; - if (algor_type == algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS && (static_cast(det_result.box.cls) != det_class_label_t::MOTOCYCLE || - static_cast(det_result.box.cls) != det_class_label_t::BICYCLE)) + // if (algor_type == algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS && (static_cast(det_result.box.cls) != det_class_label_t::MOTOCYCLE || + // static_cast(det_result.box.cls) != det_class_label_t::BICYCLE)) + // continue; + + if (algor_type == algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS && static_cast(det_result.box.cls) == det_class_label_t::HUMAN) continue; auto& e = id_to_mn_[obj_key]; diff --git a/src/ai_platform/MultiSourceProcess.cpp b/src/ai_platform/MultiSourceProcess.cpp index b2aebb1..3546956 100755 --- a/src/ai_platform/MultiSourceProcess.cpp +++ b/src/ai_platform/MultiSourceProcess.cpp @@ -869,7 +869,7 @@ int CMultiSourceProcess::algorthim_vpt(vector vec_gpuMem){ /* 一级检测器,内部已完成跟踪操作 */ vpt_process.process_gpu(vpt_interest_imgs.data(), vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // do det & track. - + // vpt_process.process_gpu(vpt_interest_imgs.data(), vec_vptMem, vpt_interest_task_id, vptResult, deleteObjectID, unUsedResult); // debug m_snapshot_reprocessing->screen_effective_snapshot(vptResult); #ifndef VEHICLE_MULTI_BOXES @@ -1698,6 +1698,27 @@ void CMultiSourceProcess::village_snapshot(vector& vpt_interest_task_id, } + // 推送轨迹结束的目标用于数量统计 + { + const OBJ_VALUES obj_value = it->second; + std::vector algo_results; + std::vector algorithm_types; + algorithm_types.push_back((int)algorithm_type_t::FLOW_STATISTICS); +#ifdef POST_USE_RABBITMQ + video_object_snapshot new_obj_ss_info; + new_obj_ss_info.analysisRes = nullptr; + new_obj_ss_info.object_id = obj_key.obj_id; + new_obj_ss_info.obj_info.set_data(obj_value.snapShots[1].index.index, obj_value.snapShots[1].confidence, 0, 0, 0, 0); + strcpy(new_obj_ss_info.task_id, obj_key.video_id.c_str()); + strcpy(new_obj_ss_info.video_image_path, ""); + strcpy(new_obj_ss_info.snapshot_image_path, ""); + algo_results.push_back(new_obj_ss_info); + auto json_str = helpers::gen_json::gen_village_json(task_id, obj_key.obj_id, algorithm_types, algo_results, ""); + mq_manager_->publish(mq_type_t::ALARM_MQ, json_str.c_str(), true); +#endif + } + + if (village_alarm) { const OBJ_VALUES obj_value = it->second; std::string cur_timestamp_ms = std::to_string(helpers::timer::get_cur_time_ms()); diff --git a/src/ai_platform/header.h b/src/ai_platform/header.h index 2f728a2..b99421e 100755 --- a/src/ai_platform/header.h +++ b/src/ai_platform/header.h @@ -41,6 +41,7 @@ enum class algorithm_type_t { NONMOTOR_VEHICLE_SNAPSHOT = 401, TAKEAWAY_MEMBER_CLASSIFICATION = 402, + FLOW_STATISTICS = 500, // 用于数量统计 NONMOTOR_VEHICLE_NOHELMET = 501,// 电动/摩托车不戴头盔 NONMOTOR_VEHICLE_OVERMAN = 502, // 电动/摩托车超员 TRICYCLE_MANNED = 503, // 三轮车载人 diff --git a/src/demo/demo.cpp b/src/demo/demo.cpp index 42c3a2d..d7d40cf 100755 --- a/src/demo/demo.cpp +++ b/src/demo/demo.cpp @@ -774,7 +774,8 @@ string createTask(void *handle, std::vector algor_vec, int gi, tparam.ipc_url = "/data/share/data/燕高路口高点_CVR_2015-12-30_09-00-00_2015-12-30.mp4"; break; case 9: - tparam.ipc_url = "/opt/share/data/1-00000002d55_h265.mp4"; + // tparam.ipc_url = "/opt/share/data/1-00000002d55_h265.mp4"; + tparam.ipc_url = "/data/share/data/燕高路口高点_CVR_2015-12-30_09-00-00_2015-12-30.mp4"; break; case 10: tparam.ipc_url = "/opt/share/data/1-00000002d55.mp4"; @@ -894,7 +895,7 @@ void test_gpu(int gpuID){ std::vector algor_vec2 = {algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET, algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN, algorithm_type_t::TRICYCLE_MANNED, algorithm_type_t::TRUCK_MANNED, algorithm_type_t::NONMOTOR_VEHICLE_USEPHONE, algorithm_type_t::NONMOTOR_VEHICLE_REFIT, algorithm_type_t::PERSON_RUNNING_REDLIGHTS, algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS}; - std::vector algor_vec3 = {algorithm_type_t::FACE_SNAPSHOT}; + std::vector algor_vec3 = {algorithm_type_t::NONMOTOR_VEHICLE_OVERMAN}; /* int repeat_num = 1000; @@ -921,7 +922,7 @@ void test_gpu(int gpuID){ createTask(handle, algor_vec2, 6); createTask(handle, algor_vec2, 7); createTask(handle, algor_vec2, 8); - // createTask(handle, algor_vec, 9); + createTask(handle, algor_vec2, 9); // createTask(handle, algor_vec, 10); // createTask(handle, algor_vec, 11); // createTask(handle, algor_vec, 12);