一、重複顯示
1. 背景
- 首先使用openvino的模型轉換命令得到模型
python3 /opt/intel/openvino/deployment_tools/model_optimizer/mo.py --input_model models/xxx.caffemodel
-
然後在super-resolution-demo裏添加rgb轉yuv的代碼,使demo支持y通道輸入,參考
-
然後將y通道輸入結果顯示出來,觀察結果是否符合預期。
2. 問題描述
如下圖所示,左側爲輸入Y通道圖片,經過openvino-super-resolution-demo跑出來的結果爲右圖,明顯結果顯示不正常
3. 分析思路
a. 輸出原始數據與顯示數據是否有差異
輸出原始數據存放在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);
b. 3通道正常,單通道異常
現象:
- 3通道輸入輸出的dbpn-caffe和官方給的模型,經過openvino可以將每個通道都正常顯示
- ar兩個版本的模型都無法正常顯示,sr也不正常
猜測原因:
- openvino-demo對於單通道輸出單通道輸出的調用方式不對,或底層支持有問題
- 自研模型從cafe轉換到openvino可能存在問題,要麼是模型本身,要麼是轉換腳本本身
c. 模型轉換有問題
- 用XXX的單通道模型+Official-demo,依然有問題,說明 模型轉換本身應該沒啥問題,應該是demo調用的方式不對。
- tf直接轉成caffe模型,由於tf模型有兩個輸入,需要改demo裏調用函數,過於麻煩,暫不考慮這一條路,且上一步基本證明不太可能是模型轉換問題。
- 用caffe模型,控制輸出節點,只轉換一個conv,依然有問題,有可能是底層支持有問題,但底層調用opencv的前饋,出錯概率很小
d. demo調用有問題
對比xxx的開源代碼,排查demo的寫法,發現xxx使用memmove進行內存拷貝,而非官方demo的matU8ToBlob,最後發現是內存拷貝的問題。
4. 結論
官方給的sample代碼,提供的Mat內存拷貝到Blob的函數matU8ToBlob,對於三通道數據採用了Vec3b的方式去賦值,所以三通道會顯示正常,給單通道後,就會出現1張圖變三張的情況
二、一半黑色顯示
1. 問題描述
2. 原因分析
上半部分黑色部分問題已解決,原因是我加的調試代碼裏,有一條語句:
memmove(input_data, yImg.data, (img.rows*img.cols)*sizeof(unsigned char));
跟demo裏的內存拷貝matU8ToBlob<float_t>(yImg, lrInputBlob, i);
重複
完整語句是:
matU8ToBlob<float_t>(yImg, lrInputBlob, i);
memmove(input_data, yImg.data, (img.rows*img.cols)*sizeof(unsigned char));
相當於matU8ToBlob用yImg.data對input_data進行了一次賦值,調試代碼memmove又進行了一次同樣的操作。
3. 解決辦法
刪除memmove(input_data, yImg.data, (img.rows*img.cols)*sizeof(unsigned char));
三、 空白圖片
1. 問題描述
輸出圖片一篇空白
2. 原因分析及結論
有些模型先對圖片進行歸一化,再送入網絡,然後對輸出採用img.convertTo(img, CV_8UC1, 255);
恢復到255的值域。
而自研模型本身不需要歸一化,因此,將255改成1即可