VPDProcess.cpp 2.73 KB
#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<VPDResult> VPDProcess::process(vector<DeviceMemory*> vec_gpuMem) 
{
    int ret = aclrtSetCurrentContext(m_algorthim_ctx);

    vector<VPDResult> vec_res;

    int batchsize = vec_gpuMem.size();

    vector<sy_img> 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;
    }
}