python3 /opt/intel/openvino/deployment_tools/model_optimizer/mo.py --input_model models/xxx.caffemodel
然后在super-resolution-demo里添加rgb转yuv的代码,使demo支持y通道输入,参考
然后将y通道输入结果显示出来,观察结果是否符合预期。
如下图所示,左侧为输入Y通道图片,经过openvino-super-resolution-demo跑出来的结果为右图,明显结果显示不正常
输出原始数据存放在outputData
里,由于计算是fp32,要显示出来需要转成CV_32FC1,再转成CV_8UC1,因此怀疑是否是转换的时候漏掉了参数。
cv::Mat output_y(h, w, CV_32FC1, &(outputData[i * nunOfPixels * numOfChannels]));
output_y.convertTo(output_y, CV_8UC1);
cv::imshow("yArImg", output_y);
现象:
猜测原因:
对比xxx的开源代码,排查demo的写法,发现xxx使用memmove进行内存拷贝,而非官方demo的matU8ToBlob,最后发现是内存拷贝的问题。
官方给的sample代码,提供的Mat内存拷贝到Blob的函数matU8ToBlob,对于三通道数据采用了Vec3b的方式去赋值,所以三通道会显示正常,给单通道后,就会出现1张图变三张的情况
上半部分黑色部分问题已解决,原因是我加的调试代码里,有一条语句:
memmove(input_data, yImg.data, (img.rows*img.cols)*sizeof(unsigned char));
跟demo里的内存拷贝matU8ToBlob
重复
完整语句是:
matU8ToBlob(yImg, lrInputBlob, i);
memmove(input_data, yImg.data, (img.rows*img.cols)*sizeof(unsigned char));
相当于matU8ToBlob用yImg.data对input_data进行了一次赋值,调试代码memmove又进行了一次同样的操作。
删除memmove(input_data, yImg.data, (img.rows*img.cols)*sizeof(unsigned char));
输出图片一篇空白
有些模型先对图片进行归一化,再送入网络,然后对输出采用img.convertTo(img, CV_8UC1, 255);
恢复到255的值域。
而自研模型本身不需要归一化,因此,将255改成1即可