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