#include "VPDProcess.h" #include "vpd.h" VPDProcess::VPDProcess(/* args */) { } VPDProcess::~VPDProcess() { release(); } int VPDProcess::init(int dev_id, string model_dir){ string model_path = model_dir + "/models/vpd2/vpd0707_310p.om" ; LOG_INFO("hp 版本:{} 模型路径:{}", vpd_get_version(), model_path); vehicle_pendant_det_param param; char modelNames[100]; strcpy(modelNames, model_path.c_str()); param.dmodelNames = modelNames; param.devId = dev_id; param.dthresld = 0.3; param.dlogo_thresld = 0.5; m_devId = param.devId; ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int ret = vpd_init(&m_handle, param); if(ret != 0){ LOG_ERROR("vpd_init error."); return -1; } return 0; } vector VPDProcess::process(vector vec_gpuMem) { int ret = aclrtSetCurrentContext(m_algorthim_ctx); vector vec_res; int batchsize = vec_gpuMem.size(); vector batch_img; for (int i = 0; i < vec_gpuMem.size(); i++) { DeviceMemory* mem = vec_gpuMem[i]; sy_img img; img.w_ = mem->getWidth(); img.h_ = mem->getHeight(); img.c_ = mem->getChannel(); img.data_ = mem->getMem(); batch_img.push_back(img); } vpd_result * results = new vpd_result[batchsize]; for (int b = 0; b < batchsize; b++) { results[b].vpd_res = new vpd_info[OBJ_MAX_COUNT]; } ret = vpd_process(m_handle, batch_img.data(), batchsize, results); if (SY_SUCCESS != ret) { printf("vpd detection process failed!"); return vec_res; } for(int b = 0; b < batchsize; b ++){ VPDResult res; for (int i = 0; i < results[b].count; i++) { if(results[b].vpd_res[i].confidence < 0.0) { continue; } VPDInfo info; info.confidence = results[b].vpd_res[i].confidence; info.index = results[b].vpd_res[i].index; info.left_ = results[b].vpd_res[i].rect.left_; info.top_ = results[b].vpd_res[i].rect.top_; info.width_ = results[b].vpd_res[i].rect.width_; info.height_ = results[b].vpd_res[i].rect.height_; res.vec_vpd_res.push_back(info); } vec_res.push_back(res); } for (int i = 0; i < batchsize; i++) { delete [] results[i].vpd_res; } delete [] results; return vec_res; } void VPDProcess::release(){ if (m_handle){ vpd_release(&m_handle); m_handle = NULL; } if(m_algorthim_ctx){ aclrtDestroyContext(m_algorthim_ctx); m_algorthim_ctx = nullptr; } }