【openvino系列教程(二)】demo問題集錦——異常顯示

一、重複顯示

1. 背景

  1. 首先使用openvino的模型轉換命令得到模型
python3 /opt/intel/openvino/deployment_tools/model_optimizer/mo.py --input_model models/xxx.caffemodel
  1. 然後在super-resolution-demo裏添加rgb轉yuv的代碼,使demo支持y通道輸入,參考

  2. 然後將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即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章