Ruyi环境搭建与NNIE模型转换与使用

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 他会在相应目录下生成

20210805144000.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 20210806142854.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 20210805144000.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/107548509

首先要修改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) ---真机调试(实例分析)》

https://blog.csdn.net/u011728480/article/details/92069793

就是修改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),那些基础知识真的找遍全网都没他全。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值