Hi3559AV100 NNIE開發(7) Ruyistudio 輸出mobileface_func.wk與板載執行mobileface_chip.wk輸出中間層資料對比

流星斬月發表於2021-03-29

  前面隨筆講了關於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開發流程

  目前 NNIE 配套軟體及工具鏈僅支援以 Caffe 框架,使用其他框架的網路模型需要轉化為 Caffe 框架下的模型,而且目前NNIE 工具鏈目前只支援 Caffe 框架,且以 Caffe1.0 版本為基礎。
  以 Caffe 框架上訓練的模型為例,NNIE 的開發流程如圖所示。在 Caffe 上訓練、使用 NNIE 的 mapper 工具轉化都是離線的。通過設定不同的模式,mapper 將*.caffemodel 轉化成在模擬器、模擬庫或板端上可載入執行的資料指令檔案。一般在開發前期,使用者可使用模擬器對訓練出來的模型進行精度、效能、頻寬進行初步評估,符合使用者預期後再使用模擬庫進行完整功能的模擬,最後將程式移植到板端。 

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,達到預期效果。

 

 

 

 

 

 

 

  

相關文章