Hi3559AV100 NNIE开发(7) Ruyistudio 输出mobileface_func.wk与板载运行mobileface_chip.wk输出中间层数据对比

时间:2024-01-28 20:28:31

  前面随笔讲了关于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,达到预期效果。