大家好,欢迎来到IT知识分享网。
Ruyi环境搭建与NNIE模型转换与使用
一、
Ruyi是一个集成 开发环境 ,主 要用于模拟程序运行,模型转换,验证对比。模型转换后,Ruyi提供了一些仿真库,让Ruyi可以仿真模型转换后的模块一样,运行得到相同结果。
常用功能仿真即可,我们只需要知道结果,然后跟原模型输出结果做对比即可,甚至更多时候我们只是直接在目标板上跑。
关于模型转换后是否精度正确,那么他就需要运行caffe,来加载模型,并跑一张图的检测,然后把中间结果输出到文件,以便后续对比。
二、windows caffe环境
因为NNIE使用Caffe框架,所以需要搭建python-3.5+caffe环境
参考《HiSVP 开发指南.pdf》5.1 RuyiStudio安装
SVP_PC\HiSVP_PC_V1.3.0.7\tools\nnie\windows\ruyi_env_setup-2.0.46\requirements.txt
下有个网盘包
整个包可以从
链接:https://pan.baidu.com/s/1jHoz8_hVZgxv3HnvkV5RDg
提取码:1986
如下百度云网盘处下载
这个就是python-3.5+caffe环境,下下来,解压替换放在ruyi_env_setup-2.0.46\python35
然后参考文档配置环境变量。
模型转换有个重要步骤,就是对比转换后的精度是否符合。那首先得先运行PC版本的Caffe,加载运行,得到验证结果。即运行SVP\RuyiStudio-2.0.46\Resources\pythonScript的
CNN_convert_bin_and_print_featuremap.py
如何运行?
然后配置
就会跳到相应的目录执行CNN_convert_bin_and_print_featuremap.py
其实Ruyi 他会在相应目录下生成
000.ini
[data_scale] 0.0039062
[RGB_order] BGR
[image_file] G:\SDK\HI3531DV200\SVP\data\face\images\10.jpg
[mean_file] null
[norm_type] 3
其中data的Norm Type实质是跟真实网络需要的数据预处理有关,而我发现这个.ini经常修改了都不会跟.cfg模型转换里的对上,所以验证量化结果时,我先不管数据输入是否是网络想要的,就默认是data_scale,BGR,0.0039062。
实际执行了就是CNN_convert_bin_and_print_featuremap.py
Python CNN_convert_bin_and_print_featuremap.py -i 854.ini -m mobilefacenet.prototxt -w Gmobilefacenet.prototxt.caffemodel -o PC-c 0
一般都不需要命令行运行,linux可以参考一下
生成中间结果就放在相应配置的目录下:
只需要后面用mapper转换量化后的模块,再运行仿真测试程序生成的结果,就可以做转换精度对比。
三、linux caffe环境
Linux下运行,也可以
首先搭建python2.7+caffe,python3.5出现问题无法编译通过
安装caffe,使用python2.7,用3.5编译不过
https://github.com/BVLC/caffe/tags 下载caffe1.0
cp Makefile.config.sample Makefile.config
修改Makefile.config
开启CPU_ONLY :=1
In file included from /usr/local/include/google/protobuf/arena.h:48:0,
from .build_release/src/caffe/proto/caffe.pb.h:23,
from .build_release/src/caffe/proto/caffe.pb.cc:4:
/usr/include/c++/5/typeinfo:39:37: error: expected ‘}’ before end of line
/usr/include/c++/5/typeinfo:39:37: error: expected unqualified-id before end of line
/usr/include/c++/5/typeinfo:39:37: error: expected ‘}’ before end of line
/usr/include/c++/5/typeinfo:39:37: error: expected ‘}’ before end of line
/usr/include/c++/5/typeinfo:39:37: error: expected ‘}’ before end of line
/usr/include/c++/5/typeinfo:39:37: error: expected declaration before end of line
Makefile:588: recipe for target ‘.build_release/src/caffe/proto/caffe.pb.o’ failed
原因是新版本protobuf使用了-std=c++11
修改Makefile
CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) -std=c++11
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) -std=c++11
LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) -std=c++11
增加-std=c++11
./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: No such file or directory
apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
./include/caffe/util/mkl_alternate.hpp:14:19: fatal error: cblas.h: No such file or directory
apt-get install libblas-dev
./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory
Step 1
在Makefile.config文件的第85行,添加/usr/include/hdf5/serial/ 到 INCLUDE_DIRS,也就是把下面第一行代码改为第二行代码。
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
Step 2
在Makefile文件的第173行,把 hdf5_hl 和hdf5修改为hdf5_serial_hl 和 hdf5_serial,也就是把下面第一行代码改为第二行代码。
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
./include/caffe/util/db_leveldb.hpp:7:24: fatal error: leveldb/db.h: No such file or directory
apt-get install libleveldb-dev
/usr/bin/ld: cannot find -lboost_system
/usr/bin/ld: cannot find -lboost_filesystem
/usr/bin/ld: cannot find -lsnappy
/usr/bin/ld: cannot find -lboost_thread
/usr/bin/ld: cannot find -lcblas
/usr/bin/ld: cannot find -latlas
collect2: error: ld returned 1 exit status
apt-get install libatlas-base-dev libboost-all-dev libsnappy-dev
安装完后测试:
需要配置环境找到CAFFE,可配置~/.bashrc
export PYTHONPATH=/opt/mydata/SDK2/AI/caffe-1.0/python/:$PYTHONPATH
有一些模块需要安装
sudo apt-get install python-numpy python-scipy python-matplotlib python-sklearn python-skimage
python-h5py python-protobuf python-leveldb python-networkx python-nose python-pandas python-gflags
python
import caffe
root@ubuntu:/opt/mydata/SDK2/AI/face# python CNN_convert_bin_and_print_featuremap.py -i 000.ini -m mobilefacenet.prototxt -w mobilefacenet.prototxt.caffemodel -o ./out/ -c 0
运行成功,当前目录out下即是结果
运行成功,当前目录out下即是结果,其中fc1_output0_128_caffe.linear.float跟Ruyi生成的结果对比,一致。
- 模型转换
参考大神文章《海思NNIE之Mobilefacenet量化部署》
《海思NNIE之RetinaFace量化部署》
https://zhuanlan.zhihu.com/p/
首先要修改mobilefacenet.prototxt的输入层以符合NNIE caffe网络的结构标准,有些特殊层是没有的,如何处理。还有个输入的data的格式需要修改到nnie支持的样子。
首先看有没有xxx.cfg,没有就新建,或者拷贝一下。打开
后面在转换模型时,加载时会验证,如果有错会提示
其中针对data输入,由于Ruyi的配置默认是3的(在跑caffe仿真时),所以为了保证验证一致,所以就采用了data_scal模式。
这个Mark可以调用 启动图形看网络结构,并可以修改
转换后就生成
先要选择相应 NNIE版本,否则硬件一些奇怪错。
点击生成
其中inst.wk就可以放到板子上运行的。但前提是得转换成功,验证正确。
五、加载模型
参考《HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸鱼记录(3) —真机调试(实例分析)》
Ruyi环境搭建与NNIE模型转换与使用
就是修改sample_svp_nnie_cnn.c,然后在目标板上运行,打印结果。
六、对比结果
首先对比量化与caffe运行结果
评价是否误差在允许范围,如果不是,对应找各个模块结果,看哪里有问题
跑板子sample后,生成了一个seg0_layer3605_output0_inst.linear.hex文件 ,拿这个文件 与量化的结果或者是caffe的结果对比,是误差范围内,那就证明板子上跑的结果一样(当然输入必须得一样,我这里用了跑caffe验证时生成的PC/test_input_img_3_112_112.bgr)。
七、模型与深度学习知识
在深度学习中,模型里有很多概念,包括achor box,cnn ,pooling,模型,权重等概念,如何区分是CNN,RPNN,什么是目标检测,什么是分类网络,之间有什么关系。这里有很多深度学习的基础知识,很多人像我一样是半路出家的,我之前找到了一个车长大佬的课程,分享给大家。特别是第4章,高级后(需要每章简单考试到第4),那些基础知识真的找遍全网都没他全。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/158077.html