目录
海思NNIE Hi3559量化部署Mobileface模型
参考博文
Hanson:海思NNIE之Mobilefacenet量化部署
刘山:海思芯片基本教程系列
知乎专栏:AI移动端优化
环境介绍
- 操作系统:Windows 10
- 仿真工具: Ruyi Studio 2.0.31
- 开发平台: Hi3559AV100
- 模型: Mobilefacenet
- 框架:caffe
前言
海思NNIE全称Neural Network Inference Engine,神经网络推理引擎,是海思媒体SoC中专门针对神经网络特别是深度学习卷积神经网络进行加速处理的硬件单元,支持当前大部分公开网络。
目前NNIE只支持Caffe框架。使用其他框架的网络模型需要先转化为Caffe框架下的模型。
某些特定网络层不受NNIE支持,需要进行修改,或分段到CPU上执行。
NNIE通过将caffe模型量化为其专用的wk格式文件在板上进行读取运行。
准备工作
在进行量化部署之前,需要完成的一些准备工作如下:
1、完成Ruyi Studio的安装
在这一步中,会在windows环境中安装好以下工具
- Ruyi Studio
- python
参考官方手册《HiSVP开发指南》
直接使用官方SDK包中的脚本安装可能会出现一系列问题,包括Path设置不正确,Python相关库下载失败等等,因此推荐在运行一次脚本之后,对照生成的setup_error.log文件逐一解决问题。
一些常见的问题可以参考博文https://blog.csdn.net/u011728480/article/details/91125581中的解决方法。
path设置的问题
若使用提供的脚本一键安装,path的自动设置可能会出现问题,建议根据手册中的手动安装指南自行设置环境变量。
python一键安装的问题
python一键安装会报很多错误,如下图所示,主要的原因是脚本中设置的许多包的下载地址已经失效了,解决办法是自行下载对应的包并解压在python35路径中,具体的路参考上文博客。
完成安装后,在Ruyi Studio中导入sample_simulator工程后,查看Properties->C/C++ Build->Environment,其中的环境变量应当被正常设置,其中的MYSY_HOME变量可能未自动设置,需要自己手动设置为对应路径
尝试编译并调试sample_simulator工程,若没有出现问题则安装成功。
tips:
1、Ruyi Studio中无法读取头文件,大片错误提示
检查环境变量设置,右键工程,Index->Freshen All Files
2、下载模型、数据集
海思NNIE目前只支持Caffe模型,这里提供一个已完成Caffe转换的模型。
github
从LFW下载一些人脸数据集用于量化、测试
LFW人脸数据集
NNIE量化
量化的一般流程如下:
- 转换对应模型到caffe
- 配置仿真量化参数进行PC仿真量化,获得中间层输出结果A
- 使用官方提供的python中间层输出工具,获得中间层输出结果B
- 使用Ruyi Studio的向量对比工具对A和B进行对比,观察误差,使误差控制在一定范围。
- 配置板上运行量化参数生成wk文件,上板运行获得输出结果C
- 对比结果C和A,使误差控制在可接受范围内
1、创建工程
依次点击File->New->NNIE Project,设置项目名称,检查芯片选择为Hi3559AV100,Project type选择Empty Project,ToolChains选择MinGW GCC,点击Finish。
创建完成后的工程目录如图,其中
-
includes包含了一些外部引用文件
-
mapper中会保存导入prototxt后生成的对应网络
-
sim_out为项目设置文件,若电脑已安装CUDA ,可以通过勾选nnie_sim.ini中的Enable CUDA选项来加速量化过程
-
MobileFace.cfg为量化参数配置文件
在根目录下创建一个data文件夹,放入下载的mobilefacenet的prototxt和caffemodel文件。在data下创建images文件夹,放入量化用的人脸图片。放入的人脸图片应进行预处理,裁剪背景,使图片仅包含正脸,并resize到112x112大小(量化的resize的插值方法跟python不同,可能会导致数据输入出现微小误差,也可以不做。)
根据官方文档介绍,量化用的图片应选择典型场景图片,一般从网络模型的测试场景中选择20-50张作为参考图片进行量化。且选择的图片要尽量覆盖模型的各个场景。不要选择偏僻场景,过度曝光、纯黑、纯白的图片,选择识别率高,色彩均匀的典型场景图片。
2、配置cfg文件并生成仿真wk
在创建项目时,会自动生成一个与项目名称相同的cfg文件,也可以自己通过在项目右键添加新的cfg文件。双击cfg文件后会显示其图形界面配置,可以通过在下方选项卡切换到文本配置模式,配置参数如下。
可以通过官方手册《HiSVP开发指南》p102~p106的配置文件说明查看每个配置参数的具体介绍。
需要特别注意的几点:
- 首先选择is_simulation为Simulation进行仿真测试,对比结果正确后再进行Inst/Chip生成板上运行的wk文件。
- 因为mobilefacenet的所有网络层都是NNIE支持的网络层,所以不需要手动修改、增加或者删除操作,可以通过marked_prototxt中的mark和check操作查看是否正确生成对应的网络结构。
- log_level选择Function_level可以输出所有中间层的结果,在进行仿真对比调试时应当开启,方便进行向量对比调试,在进行inst wk生成时应当选择No Print,加快生成速度。
- data部分中的设置十分关键,其决定了你实际输入给模型的图片数据是怎么样的。其中image_type默认选择U8,RGB_order表示输入给网络的RGB图像的RGB三通道顺序,norm_type是对图像数据的预处理,这里我们选择channel mean_value with data_scale,对输入图像的数据进行减均值并归一。设置data_scale为0.0078125,即1/128,pixel_mean.txt如下图所示。即让原本[0,255]区间的像素值转换到[-1,1]的区间内。
配置完成后,点击上方工具栏的Make WK即可进行生成
运行完成后,项目目录下会出现几个新文件和新文件夹
其中mapper_quant中保存了所有的输出信息,MobileFace_fun.wk是生成的仿真wk文件。
注意:mapper_quant中保存的输出信息是选择的image_list文件的最后一张图片的输出
3、中间层结果对比验证
Ruyi Studio提供了Vector Comparision工具,能够对比输出向量的相似度、绝对误差等信息,可用于验证模型量化后的输出精度误差大小。
同时海思提供了一个中间层输出脚本,其路径如下。该工具可以通过读取cfg文件输出中间层结果。
HiSVP_PC_V1.1.2.0/tools/nnie/windows/RuyiStudio-2.0.31/Resources/pythonScript/CNN_convert_bin_and_print_featuremap.py
将该脚本复制到工程的data目录下,同时复制一份MobileFace.cfg文件到data目录下,脚本运行时需要读取cfg文件。
此处的cfg文件有两处需要修改的地方。
删除image_list选项,增加image_file选项,路径为量化时使用的image_list文件的最后一张图片的路径。
- [image_list] ./data/images/imageList.txt
+ [image_file] ./images/9.jpg
修改mean_file路径为
- [mean_file] ./data/pixel_mean.txt
+ [mean_file] ./pixel_mean.txt
CNN_convert_bin_and_print_featuremap.py脚本中也有几处需要修改的地方**
1、第438行,此处用于从mean.txt文件中读取mean参数并设置,但是在运行时正则表达式没有正常工作,无法获取均值。
tr