前面隨筆講了關於NNIE的整個開發流程,並給出了Hi3559AV100 NNIE開發(5)mobilefacenet.wk模擬成功量化及與CNN_convert_bin_and_print_featuremap.py輸出中間層資料對比過程:https://www.cnblogs.com/iFrank/p/14528882.html,下文是Hi3559AV100 NNIE開發(7) Ruyistudio 輸出mobileface_func.wk與板載執行mobileface_chip.wk輸出中間層資料對比,通過在Hi3559AV100平臺上跑mobileface NNIE,來驗證mobileface.caffemodel模型的正確性,便於後續MPP開發。
1、開發環境
作業系統:Windows 10
模擬工具: Ruyi Studio 2.0.28
開發平臺: Hi3559AV100(SDK020)
網路模型: Mobilefacenet(CNN)
框架:Caffe1.0
2、NNIE開發流程
3、基於Hi3559AV100的mobileface網路的MPP開發流程
在測試前先給出NNIE一般量化流程,並給出我的測試結果:
(1)需要把其他非caffemodel模型對應轉換到caffemodel模型,因為Hi35xx系列NNIE只支援caffemodel模型;
(2)配置模擬量化引數(即配置mobilefacenet.cfg)進行PC模擬量化,獲得中間層輸出結果A(mapper_quant目錄下);
(3)使用RuyiStudio提供的python中間層輸出工具,獲得中間層輸出結果B(data/ouput目錄下);
(4)使用Ruyi Studio的向量對比工具Vector Comparison對A和B進行對比,觀察誤差,使誤差控制在一定範圍(利用CosineSimilarity引數),目前我測試的正確率為0.9914857;
(5)配置板載chip執行量化引數生成mobilefacenet.wk檔案,上板執行獲得輸出結果C;
(6)對比結果A和C,使模擬與板載誤差控制在可接受範圍內,目前我測試的正確率為0.9946077;
(7)之後進行MPP開發,關鍵在於對NNIE Blob資料的處理;
因為Mobileface.wk在板載執行時,輸入的為.bgr格式圖形,之前寫的隨筆VS2015上OpenCV-2.4.13安裝與Hi35xx .jpg/.bmp格式轉.bgr格式開發 :https://www.cnblogs.com/iFrank/p/14552094.html,也已經給出實現過程,現再次給出基於OpenCV實現的.jpg轉.bgr的實現程式碼:
1 #include <stdio.h> 2 #include <windows.h> 3 #include <math.h> 4 #include <iostream> 5 #include <string> 6 7 #include "opencv2/opencv.hpp" 8 #include "opencv2/highgui/highgui.hpp" 9 #include "opencv2/imgproc/imgproc.hpp" 10 11 using namespace cv; 12 13 typedef unsigned char U_CHAR; 14 15 int main() 16 { 17 const char *filename = "C:/Users/PC/Desktop/jpg_bgr/10_MariaCallas_28_f.jpg"; 18 char *outname = "C:/Users/PC/Desktop/jpg_bgr/10_MariaCallas_28_f.bgr"; 19 int flag = 1; 20 21 cv::Mat img = cv::imread(filename); 22 if (!img.data) 23 { 24 printf("read image error\n"); 25 return -1; 26 } 27 28 //縮放 29 resize(img, img, Size(112, 112)); //224x224 30 //imshow("img",img); 31 //waitKey(0); 32 33 U_CHAR *data = (U_CHAR*)img.data; 34 int step = img.step; 35 printf("Step: %d, height: %d, width: %d\n", 36 step, img.rows, img.cols); 37 38 FILE *fp = fopen(outname, "wb"); 39 int h = img.rows; 40 int w = img.cols; 41 int c = img.channels(); 42 43 for (int k = 0; k<c; k++) { 44 for (int i = 0; i<h; i++) { 45 for (int j = 0; j<w; j++) { 46 fwrite(&data[i*step + j*c + k], sizeof(U_CHAR), 1, fp); 47 } 48 } 49 } 50 fclose(fp); 51 52 return 0; 53 }
4、RuyiStudio mobileface_func.wk模擬輸出與板載mobileface_chip.wk輸出比較過程
4.1、程式碼修改(其他NNIE引數配置根據自己板子set)
首先修改程式碼,主要是修改SAMPLE_SVP_NNIE_Cnn函式,具體如下(之後在加入結果輸出就行):
其他引數配置根據自己的需要和板載進行調整,這裡就不多說了,之後在板載終端執行之後,會產生output.hex檔案,這個就是後面用來比較的資料。裡面都是16進位制資料,用來表示浮點數:
4.2、mobileface_chip.wk輸出比較
RuyiStudio軟體的Vector Comparsion設定及比較結果如下,並結合了.prototxt Graph View的圖解。在 Compare 完後,雙擊選擇需要檢視的行,會彈出詳細對比介面,從結果可以看出,資料資料比較精度為0.99460775,達到預期效果。