×
分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

关于多batch如何在前处理和后处理进行拼接或分离图片 解决中 mcj2022-09-20 14:36:33 回复 2 查看 技术答疑 使用求助 经验交流
关于多batch如何在前处理和后处理进行拼接或分离图片
分享到:

【寒武纪硬件产品型号】:MLU220

问题描述:用语义分割模型进行多batch推理,但在前/后处理过程中对图片拼接/分离后,推理结果一直不对。想请教下拼接/分离方式是不是哪里出了问题。前后处理代码如下:

//数据预处理函数

void Data_obj::preProcess(int height , int width, std::vector<string>& img_names, void **inputCpuPtrS, int64_t *inputSizeS) {
    //读取图片为矩阵
    vector<cv::Mat> imgs;
    unsigned char *ptr=(unsigned char *)inputCpuPtrS[0];
    string infilename;
    for(int i = 0; i<4;i++){

        //读图片

        infilename = img_names[i];
        cv::Mat input_image = cv::imread(infilename);

        //将图片改成416x416,灰边填充

        cv::Mat sample_temp;
        float img_w = input_image.cols;
        float img_h = input_image.rows;
        realImg_width = static_cast<int>(img_w);
        realImg_height = static_cast<int>(img_h);
        cv::Mat sample_temp_bgr(img_w, img_h, CV_32FC3);
        float img_scale = img_w < img_h ? (height/ img_h) : (width / img_w);
        new_w = std::floor(img_w * img_scale);
        new_h = std::floor(img_h * img_scale);
        cv::cvtColor(input_image, sample_temp_bgr, CV_BGR2RGB);
        cv::resize(sample_temp_bgr, sample_temp, cv::Size(new_w,new_h),0,0,CV_INTER_AREA);
        cv::Mat net_input_data_rgba(height, width, CV_32FC3,cv::Scalar(128,128,128));
        sample_temp.copyTo(net_input_data_rgba(cv::Range((static_cast<float>(height) - new_h) / 2, (static_cast<float>(height) - new_h) / 2 + new_h), cv::Range((static_cast<float>(width) - new_w) / 2, (static_cast<float>(width) - new_w) / 2 + new_w)));

        net_input_data_rgba /= 255.0;

        //将图片进行拼接
        memcpy(ptr,net_input_data_rgba.data,416*416*3*4);
        ptr+=inputSizeS[0]*2/4;

    }
}


//结果后处理函数
void Data_obj::resultDeal(float*result, float* outputCpuNchwPtrS, int64_t outputSizeS,int height, int width, std::vector<string>& img_names,std::vector<string>& img_names_save){

    //从float16转为float32

    cnrtCastDataType(reinterpret_cast<void*>(result),CNRT_FLOAT16,reinterpret_cast<void*>(outputCpuNchwPtrS), CNRT_FLOAT32,outputSizeS/2,nullptr);
    //用一个大的Mat来接受4x416x416x2的输出
    int size3[3] = {4,416,416};
    cv::Mat result_(3,size3,CV_32FC2,cv::Scalar(0));
    memcpy(result_.data,outputCpuNchwPtrS , 416 * 416 * 4 * 2 * 4);
    for(int i = 0; i<4;i++){

        //获取第i张结果图制作mask
        Mat result_0(416,416,CV_32FC2,result_.ptr<float>(i));
        cv::Mat roi = result_0(cv::Range((416 - 171)/2,(416 - 171)/2 + 171),cv::Range((416 - 416)/2,(416 - 416)/2 + 416));
        cv::Mat rst(cv::Size(416, 171), CV_8UC3, Scalar::all(0));
        for(int i = 0; i < 171; i++){
            for(int j = 0; j < 416; j++){
                    rst.at<Vec3b>(i,j)[2] = roi.at<Vec2f>(i,j)[0] < roi.at<Vec2f>(i,j)[1] ? 128 : 0;
            }
        }
        cv::imwrite(img_names_save[i],rst);
    }
}

image.png

版权所有 © 2022 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭