打开微信,使用扫一扫进入页面后,点击右上角菜单,
点击“发送给朋友”或“分享到朋友圈”完成分享
【寒武纪硬件产品型号】: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);
}
}
热门帖子
精华帖子