| | |
| | | //
|
| | |
|
| | | #include "ari_manager.h"
|
| | |
|
| | | #include "../additional/fall_run_wander.h"
|
| | |
|
| | | AriManager::AriManager()
|
| | | {
|
| | |
| | |
|
| | | }
|
| | |
|
| | | void AriManager::single_SDK(const int cam_id, const void *img, TResult& t_result)
|
| | | void AriManager::release()
|
| | | {
|
| | | DetecterManager::getInstance()->release();
|
| | | }
|
| | |
|
| | | void AriManager::init_load_model()
|
| | | {
|
| | | DEBUG("::loading detecter model!");
|
| | | DetecterManager::getInstance();
|
| | | }
|
| | |
|
| | | bool AriManager::add_cam(const int cam_id)
|
| | | {
|
| | | if (cam_id==(this->CAMERAS_VCT.size()+1))
|
| | | {
|
| | | auto cam_tracker = std::make_shared<tracker>(max_cosine_distance, nn_budget);
|
| | | this->CAMERAS_VCT.push_back(cam_tracker);
|
| | | return true;
|
| | | }else if(cam_id<this->CAMERAS_VCT.size())
|
| | | {
|
| | | WARN("The camera ID " + to_string(cam_id) + "is occupied!");
|
| | | return false;
|
| | | }else
|
| | | {
|
| | | WARN("Camera ID" + to_string(cam_id) + "discontinuous!");
|
| | | return false;
|
| | | }
|
| | | }
|
| | |
|
| | | void AriManager::single_SDK(const int cam_id, const void *img, TResult *t_result, char* img_time, const char* mode)
|
| | | {
|
| | | TImage *frame_img = (TImage*)img;
|
| | | // DEBUG((boost::format("%f, %f")%frame_img->width %frame_img->height).str());
|
| | | cv::Mat frame(Size(frame_img->width, frame_img->height), CV_8UC3); // size 是w,h Mat是h,w
|
| | | frame.data = (uchar*)frame_img->data; //注意不能写为:(uchar*)pFrameBGR->data
|
| | | cv::Mat draw_frame = frame.clone();
|
| | | Timer s_timer;
|
| | | s_timer.reset();
|
| | | DETECTIONS detections;
|
| | | DetecterManager::getInstance()->detecter_main(draw_frame, detections);
|
| | | s_timer.out("eve detecter_main");
|
| | |
|
| | | std::string mode_type = mode;
|
| | | DEBUG("detections human size::" + to_string(detections.size()));
|
| | | if(detections.size()>0)
|
| | | {
|
| | | if (mode_type == "video")
|
| | | {
|
| | | // if(HUMAN_STRUCT::reid_Extractor->featsEncoder(frame, detections) == false)
|
| | | // {
|
| | | // WARN("Encoder human feature failed!");
|
| | | // }
|
| | | // auto t_strat2 = std::chrono::steady_clock::now();
|
| | | // s_timer.out(to_string(detections.size())+" :eve reid_Extractor");
|
| | | single_tracker(cam_id, detections, img_time);
|
| | | s_timer.out("eve single_tracker");
|
| | | // auto t_strat3 = std::chrono::steady_clock::now();
|
| | | // std::cout<< "detections.size()" << detections.size()<< std::endl;
|
| | | switch_SDK_TResult(cam_id, frame, detections, t_result);
|
| | | // auto t_strat4 = std::chrono::steady_clock::now();
|
| | | s_timer.out("eve switch_SDK_TResult");
|
| | | // double t_9 = std::chrono::duration<double, std::milli>(t_strat8 - t_strat9).count();
|
| | | // double t_8 = std::chrono::duration<double, std::milli>(t_strat7 - t_strat8).count();
|
| | | // double t_7 = std::chrono::duration<double, std::milli>(t_strat6 - t_strat7).count();
|
| | | // double t_6 = std::chrono::duration<double, std::milli>(t_strat1 - t_strat6).count();
|
| | | // double t_1 = std::chrono::duration<double, std::milli>(t_strat2 - t_strat1).count();
|
| | | // double t_2 = std::chrono::duration<double, std::milli>(t_strat3 - t_strat2).count();
|
| | | // double t_3 = std::chrono::duration<double, std::milli>(t_strat4 - t_strat3).count();
|
| | | // double t_0 = std::chrono::duration<double, std::milli>(t_strat4 - t_strat9).count();
|
| | | // std::cout << "fps time:" << to_string(t_9) << " : " << to_string(t_8) << " : " << to_string(t_7) << " : " << to_string(t_6) <<std::endl;
|
| | | // std::cout << "fps runing_time:" << to_string(t_1) << " : " << to_string(t_2) << " : " << to_string(t_3) << std::endl;
|
| | | // std::cout << "fps all time " << t_0<< std::endl;
|
| | | // }
|
| | | DEBUG(":::::::::single_SDK end:::::");
|
| | | }
|
| | | else
|
| | | {
|
| | | switch_SDK_TResult(detections, t_result);
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | void AriManager::single_SDK(const int cam_id, const void *img, TResult* t_result)
|
| | | {
|
| | | TImage *frame_img = (TImage*)img;
|
| | | cv::Mat frame(Size(frame_img->width, frame_img->height), CV_8UC3);
|
| | |
| | | // cv::waitKey(0);
|
| | | this->detector->detect(batch_img, batch_res);
|
| | |
|
| | | t_result.targets = (Target*)malloc(sizeof(Target)*batch_res[0].size());
|
| | | // 将算法结果转化为标准的格式(以目标检测为例)""
|
| | | t_result->targets = (Target*)malloc(sizeof(Target)*batch_res[0].size());
|
| | | int w_count = 0;
|
| | | for (const auto &result_box:batch_res[0])
|
| | | {
|
| | |
| | | target.rect.right = result_box.rect.x + result_box.rect.width;
|
| | | target.rect.bottom = result_box.rect.y + result_box.rect.height;
|
| | |
|
| | | target.confidence = result_box.prob*100; // 置信度转化成百分制
|
| | | target.confidence = result_box.prob*100;
|
| | | // target.id = 1; //
|
| | |
|
| | | // target.attribute 可根据实际情况来添加,输出格式要求是json格式
|
| | |
|
| | | //string attribute_json = "{";
|
| | | //attribute_json += "\"smokingScore\":" + to_string(track->smokeScore)+",";
|
| | | //if(attribute_json.length()>2)
|
| | | //{
|
| | | // attribute_json = attribute_json.substr(0, attribute_json.length()-1) +"}";
|
| | | // target.attribute = new char[strlen(attribute_json.c_str())+1];
|
| | | // target.attribute_size = strlen(attribute_json.c_str());
|
| | | // strcpy(target.attribute, attribute_json.c_str());
|
| | | //}
|
| | | float mv_velocity = 0;
|
| | | int runScore = 0;
|
| | | string attribute_json = "{";
|
| | |
|
| | | t_result.targets[w_count] = target;
|
| | | if (m_staticStruct::fall_rate!=0)
|
| | | {
|
| | | // detect_fall(tmpbox, track);
|
| | | attribute_json += "\"fallScore\":" + to_string(0)+",";
|
| | | }
|
| | |
|
| | | if (m_staticStruct::mv_velocity!=0)
|
| | | {
|
| | | attribute_json += "\"runScore\":" + to_string(0)+",";
|
| | | }
|
| | |
|
| | | attribute_json += "\"hatScore\":" + to_string(0)+",";
|
| | |
|
| | | attribute_json += "\"helmetScore\":" + to_string(0)+",";
|
| | |
|
| | | attribute_json += "\"headScore\":" + to_string(0)+",";
|
| | |
|
| | | attribute_json += "\"maskScore\":" + to_string(0)+",";
|
| | |
|
| | | attribute_json += "\"smokingScore\":" + to_string(0)+",";
|
| | |
|
| | | DEBUG("image attribute_json:: "+ attribute_json);
|
| | |
|
| | | if(attribute_json.length()>2)
|
| | | {
|
| | | //转换输出的json格式 {"fallScore":100,"runScore":15.8,"wanderScore":10}
|
| | | attribute_json = attribute_json.substr(0, attribute_json.length()-1) +"}";
|
| | | target.attribute = new char[strlen(attribute_json.c_str())+1];
|
| | | target.attribute_size = strlen(attribute_json.c_str());
|
| | | strcpy(target.attribute, attribute_json.c_str());
|
| | | }
|
| | |
|
| | | t_result->targets[w_count] = target;
|
| | | w_count ++;
|
| | | }
|
| | | }
|
| | | std::cout << "eve batch_res size:: "<< batch_res[0].size() << " w_count: " << w_count <<std::endl;
|
| | | t_result.count = w_count;
|
| | | draw_SDK_result(cam_id, frame, t_result); //多线程无法调用绘图
|
| | | t_result->count = w_count;
|
| | | // draw_SDK_result(cam_id, frame, t_result);
|
| | | }
|
| | |
|
| | | void AriManager::init_target(Target *t){
|
| | |
|
| | | void AriManager::switch_SDK_TResult(DETECTIONS detections, TResult *t_result)
|
| | | {
|
| | | t_result->targets = (Target*)malloc(sizeof(Target) * detections.size());
|
| | | int w_count = 0;
|
| | | for(auto& detection :detections)
|
| | | {
|
| | | Target target;
|
| | | init_target(&target);
|
| | | // RESULT_STRUCT result;
|
| | |
|
| | | DETECTBOX tmpbox = detection.tlwh;
|
| | |
|
| | | istringstream iss(random_int(6));
|
| | | iss >> target.id;
|
| | |
|
| | | target.rect.left = tmpbox(0);
|
| | | target.rect.top = tmpbox(1);
|
| | | target.rect.right = tmpbox(0) + tmpbox(2);
|
| | | target.rect.bottom = tmpbox(1) + tmpbox(3);
|
| | |
|
| | | target.confidence = detection.confidence*100;
|
| | |
|
| | | float mv_velocity = 0;
|
| | | int runScore = 0;
|
| | | string attribute_json = "{";
|
| | |
|
| | | if (m_staticStruct::fall_rate!=0)
|
| | | {
|
| | | // detect_fall(tmpbox, track);
|
| | | attribute_json += "\"fallScore\":" + to_string(detection.fallScore)+",";
|
| | | }
|
| | |
|
| | | if (m_staticStruct::mv_velocity!=0)
|
| | | {
|
| | | attribute_json += "\"runScore\":" + to_string(detection.runScore)+",";
|
| | | }
|
| | |
|
| | | attribute_json += "\"hatScore\":" + to_string(detection.hatScore)+",";
|
| | |
|
| | | attribute_json += "\"helmetScore\":" + to_string(detection.helmetScore)+",";
|
| | |
|
| | | attribute_json += "\"headScore\":" + to_string(detection.headScore)+",";
|
| | |
|
| | | attribute_json += "\"maskScore\":" + to_string(detection.maskScore)+",";
|
| | |
|
| | | attribute_json += "\"smokingScore\":" + to_string(detection.smokeScore)+",";
|
| | |
|
| | | DEBUG("image attribute_json:: "+ attribute_json);
|
| | |
|
| | | if(attribute_json.length()>2)
|
| | | {
|
| | | //转换输出的json格式 {"fallScore":100,"runScore":15.8,"wanderScore":10}
|
| | | attribute_json = attribute_json.substr(0, attribute_json.length()-1) +"}";
|
| | | target.attribute = new char[strlen(attribute_json.c_str())+1];
|
| | | target.attribute_size = strlen(attribute_json.c_str());
|
| | | strcpy(target.attribute, attribute_json.c_str());
|
| | | }
|
| | |
|
| | | t_result->targets[w_count] = target;
|
| | | w_count ++;
|
| | | }
|
| | |
|
| | | t_result->count = w_count;
|
| | | }
|
| | |
|
| | | // 转换成SDK 想要的结果
|
| | | void AriManager::switch_SDK_TResult(int cam_id, cv::Mat img, DETECTIONS detections, TResult *t_result)
|
| | | {
|
| | | t_result->targets = (Target*)malloc(sizeof(Target) * this->CAMERAS_VCT[cam_id]->tracks.size());
|
| | | int w_count = 0;
|
| | | for(auto& track :this->CAMERAS_VCT[cam_id]->tracks)
|
| | | {
|
| | | // if(not track->isCurrent) //当前画面没有则返回
|
| | | // continue;
|
| | | Target target;
|
| | | init_target(&target);
|
| | | // RESULT_STRUCT result;
|
| | | if(!track->is_confirmed() || track->time_since_update >= 1) continue;
|
| | | // if(track->is_confirmed() && track->time_since_update >= 1) continue;
|
| | |
|
| | | /*
|
| | | * 算法思想:跟踪器跟踪的时候,是否能够强制将预测错位置的box框强制更新成新的box框,而id不发生变化
|
| | | * */
|
| | |
|
| | | // DETECTBOX tmpbox = track->to_tlwh();
|
| | | DETECTBOX tmpbox = track->to_xywh();
|
| | |
|
| | | target.rect.left = tmpbox(0);
|
| | | target.rect.top = tmpbox(1);
|
| | | target.rect.right = tmpbox(0) + tmpbox(2);
|
| | | target.rect.bottom = tmpbox(1) + tmpbox(3);
|
| | | // DEBUG((boost::format("%s:%d, %s:%d, %s:%d, %s:%d") %"id:" %track->track_id %"conf:" %track->confidence %", to tmpbox y:" %tmpbox(1) %", tmpbox(3) h:" %tmpbox(3)).str());
|
| | |
|
| | | target.id = track->track_id;
|
| | | target.confidence = track->confidence;
|
| | |
|
| | | float mv_velocity = 0;
|
| | | int runScore = 0;
|
| | | string attribute_json = "{";
|
| | |
|
| | | if (m_staticStruct::fall_rate!=0)
|
| | | {
|
| | | // detect_fall(tmpbox, track);
|
| | | attribute_json += "\"fallScore\":" + to_string(track->rateScale)+"," + "\"fallTime\":" + to_string(track->fall_total_time) + ",";
|
| | | }
|
| | |
|
| | | if (m_staticStruct::mv_velocity!=0)
|
| | | {
|
| | | if(track->isRuning)
|
| | | {
|
| | | mv_velocity = detect_runing(tmpbox, track, img);
|
| | | float run_velocity = mv_velocity;
|
| | | if(tmpbox(2)/tmpbox(3)<0)
|
| | | {
|
| | | run_velocity*=(img.cols*img.rows)/(tmpbox(2)*tmpbox(3));
|
| | | }else
|
| | | {
|
| | | run_velocity*=10;
|
| | | }
|
| | | // std::cout << mv_velocity << "mv_velocity::::::::::" << run_velocity << "::::::::::::"<<img.cols*img.rows<<":::"<<tmpbox(2)*tmpbox(3)<<std::endl;
|
| | | runScore = (track->confidence+2)*int(std::min(4*run_velocity, 100.0f));
|
| | | attribute_json += "\"runScore\":" + to_string(runScore)+",";
|
| | | }else if(track->is_hat)
|
| | | {
|
| | | mv_velocity = detect_runing(tmpbox, track, img);
|
| | | float run_velocity = mv_velocity;
|
| | | if(tmpbox(2)/tmpbox(3)<0)
|
| | | {
|
| | | run_velocity*=(img.cols*img.rows)/(tmpbox(2)*tmpbox(3));
|
| | | }else
|
| | | {
|
| | | run_velocity*=15;
|
| | | }
|
| | | // std::cout << mv_velocity << "mv_velocity::::::::::" << run_velocity << "::::::::::::"<<img.cols*img.rows<<":::"<<tmpbox(2)*tmpbox(3)<<std::endl;
|
| | | runScore = int(std::min(4*run_velocity, 100.0f));
|
| | | attribute_json += "\"runScore\":" + to_string(runScore)+",";
|
| | | }else
|
| | | attribute_json += "\"runScore\":" + to_string(runScore)+",";
|
| | |
|
| | |
|
| | | }
|
| | |
|
| | | //std::cout << track->track_id <<"-- human wander last time:" << track->last_time << ":" << m_staticStruct::wander_time <<std::endl;
|
| | |
|
| | | if(m_staticStruct::wander_time!=0)
|
| | | {
|
| | | if (track->last_time>m_staticStruct::wander_time)
|
| | | track->isWander = true;
|
| | | else
|
| | | track->isWander = false;
|
| | | attribute_json += "\"wanderTime\":" + to_string(track->last_time)+",";
|
| | | }
|
| | |
|
| | | if(track->is_hat)
|
| | | {
|
| | | attribute_json += "\"hatScore\":" + to_string(track->hatScore)+",";
|
| | | }else
|
| | | {
|
| | | attribute_json += "\"hatScore\":" + to_string(10)+",";
|
| | | }
|
| | |
|
| | | if(track->is_mask)
|
| | | {
|
| | | attribute_json += "\"maskScore\":" + to_string(track->maskScore)+",";
|
| | | }else
|
| | | {
|
| | | attribute_json += "\"maskScore\":" + to_string(10)+",";
|
| | | }
|
| | |
|
| | |
|
| | | if(track->is_smoke)
|
| | | {
|
| | | attribute_json += "\"smokingScore\":" + to_string(track->smokeScore)+",";
|
| | | }else
|
| | | {
|
| | | attribute_json += "\"smokingScore\":" + to_string(10)+",";
|
| | | }
|
| | |
|
| | | // cout << ":::::::::::::"<<attribute_json << endl;
|
| | |
|
| | | if(attribute_json.length()>2)
|
| | | {
|
| | | //转换输出的json格式 {"fallScore":100,"runScore":15.8,"wanderScore":10}
|
| | | attribute_json = attribute_json.substr(0, attribute_json.length()-1) +"}";
|
| | | target.attribute = new char[strlen(attribute_json.c_str())+1];
|
| | | target.attribute_size = strlen(attribute_json.c_str());
|
| | | strcpy(target.attribute, attribute_json.c_str());
|
| | | }
|
| | |
|
| | | t_result->targets[w_count] = target;
|
| | | w_count ++;
|
| | | }
|
| | |
|
| | | t_result->count = w_count;
|
| | | // printf("================================%d\n\n\n\n", t_result->count);
|
| | | #ifdef S_DEBUG
|
| | | draw_SDK_result(cam_id, img, t_result);
|
| | | #endif
|
| | | }
|
| | |
|
| | | void AriManager::single_tracker(int cam_id, DETECTIONS& detections, char* img_time)
|
| | | {
|
| | | // DETECTIONS detections = deal_features(boxes, feats_vec); // 使用传递特征追踪时需要打开该方法
|
| | | // printf("cam_id::::%d",cam_id);
|
| | | std::string str2 = img_time;
|
| | | img_time[str2.find_last_of(":")] = '.';
|
| | |
|
| | | // DEBUG( img_time);
|
| | | auto cam_tracker = this->CAMERAS_VCT[cam_id];
|
| | |
|
| | | DEBUG("single_tracker start:: ");
|
| | | cam_tracker->predict();
|
| | | cam_tracker->update(CAMERAS_VCT, detections, cam_id, img_time);
|
| | | DEBUG("single_tracker::");
|
| | | this->CAMERAS_VCT[cam_id] = cam_tracker;
|
| | | }
|
| | |
|
| | |
|
| | | void AriManager::init_target(Target *t)
|
| | | {
|
| | | t->attribute = NULL;
|
| | | t->feature = NULL;
|
| | | t->id = 0;
|
| | |
| | | t->attribute_size = 0;
|
| | | t->feature_size = 0;
|
| | | }
|
| | |
|