#include "FeatureAnalysis.h" #include "../decoder/dvpp/DvppDataMemory.hpp" struct ObjKey { string task_id; int object_id; }; FeatureAnalysis::FeatureAnalysis(/* args */) { } FeatureAnalysis::~FeatureAnalysis() { } int FeatureAnalysis::init(int dev_id, string model_dir) { m_dev_id = dev_id; int ret = m_human_feature.init(dev_id, model_dir); if (ret < 0){ return ret; } ret = m_human_parsing.init(dev_id, model_dir); if (ret < 0){ return ret; } ret = m_vehicle_color.init(dev_id, model_dir); if (ret < 0){ return ret; } ret = m_vehicle_plate.init(dev_id, model_dir); if (ret < 0){ return ret; } ret = m_vpd.init(dev_id, model_dir); if (ret < 0){ return ret; } return 0; } int FeatureAnalysis::update_object_info(ObjectInfo& res_obj, vpc_img_info img_info) { if (img_info.index == 0) { update_human_info(res_obj, img_info); } else if (img_info.index >= 4 && img_info.index <= 8) { update_car_info(res_obj, img_info); } } void FeatureAnalysis::update_human_info(ObjectInfo& res_obj, vpc_img_info& img_info){ vector vec_Mem; unsigned char * pHwData = (unsigned char *)acldvppGetPicDescData(img_info.pic_desc); int width = acldvppGetPicDescWidth(img_info.pic_desc); int width_stride = acldvppGetPicDescWidthStride(img_info.pic_desc); int height = acldvppGetPicDescHeight(img_info.pic_desc); int height_stride = acldvppGetPicDescHeightStride(img_info.pic_desc); int _size = acldvppGetPicDescSize(img_info.pic_desc); DeviceMemory* mem = new DvppDataMemory(width, width_stride, height, height_stride, _size, img_info.task_id, to_string(m_dev_id), false, img_info.task_frame_count, pHwData); if (mem) { vec_Mem.push_back(mem); } if (vec_Mem.size() == 1) { vector vec_hp_res = m_human_parsing.process(vec_Mem); if (vec_hp_res.size() > 0) { hp_analysis_res hp_res = vec_hp_res[0]; for (size_t j = 0; j < HP_ATTRI_INDEX_SIZE; j++) { res_obj.hp_cls[j].res_index = hp_res.res_objs[j].res_index; res_obj.hp_cls[j].res_prob = hp_res.res_objs[j].res_prob; } } vector vec_hf_res = m_human_feature.process(vec_Mem); if (vec_hf_res.size() > 0) { HFResult hf_res = vec_hf_res[0]; memcpy(res_obj.hp_feature, hf_res.feature, sizeof(float) * HUMANREID_FEATURE_SIZE); } } delete mem; mem = nullptr; } void FeatureAnalysis::update_car_info(ObjectInfo& res_obj, vpc_img_info& img_info){ vector vec_Mem; unsigned char * pHwData = (unsigned char *)acldvppGetPicDescData(img_info.pic_desc); int width = acldvppGetPicDescWidth(img_info.pic_desc); int width_stride = acldvppGetPicDescWidthStride(img_info.pic_desc); int height = acldvppGetPicDescHeight(img_info.pic_desc); int height_stride = acldvppGetPicDescHeightStride(img_info.pic_desc); int _size = acldvppGetPicDescSize(img_info.pic_desc); DeviceMemory* mem = new DvppDataMemory(width, width_stride, height, height_stride, _size, img_info.task_id, to_string(m_dev_id), false, img_info.task_frame_count, pHwData); if (mem) { vec_Mem.push_back(mem); } if (vec_Mem.size() == 1) { vector vec_vc_res = m_vehicle_color.process(vec_Mem); if (vec_vc_res.size() > 0) { VehicleColorResult vc_res = vec_vc_res[0]; res_obj.vehicle_color_index = vc_res.index; res_obj.vehicle_color_prob = vc_res.prob; } vector vec_vpd_res = m_vpd.process(vec_Mem); if (vec_vpd_res.size() > 0) { VPDResult res = vec_vpd_res[0]; for (size_t i = 0; i < res.vec_vpd_res.size(); i++) { auto& info = res.vec_vpd_res[i]; info.left_ = res_obj.left + info.left_; info.top_ = res_obj.top + info.top_; } res_obj.vec_vpd_cls = res.vec_vpd_res; } vector vec_plate_res = m_vehicle_plate.process(vec_Mem); if (vec_plate_res.size() > 0) { for (size_t i = 0; i < vec_plate_res.size(); i++) { auto& info = vec_plate_res[i]; info.left_ = res_obj.left + info.left_; info.top_ = res_obj.top + info.top_; } res_obj.vehicle_plate = vec_plate_res[0]; } } delete mem; mem = nullptr; }