一.前提:
1.模型:yolov5-6
2.框架:Tengine
3.FT2000:系统为国产版的linux二次开发系统,arm64
4.开发环境:虚拟机linux20.04
5.编译环境:git, g++, cmake, make
二.开发环境搭建
虚拟机linux下:
编译工具下载与安装:
sudo apt-get install cmake make g++ git
注意:此处有个坑apt install安装的cmake,版本最高为3.10,但是我们需要的cmake版本一般最低需要3.13,所以要先源码安装cmake.我安装的是cmake-3.15.5版本,有需要的小伙伴下面有链接可自取。
链接:https://pan.baidu.com/s/1AJHDFS3EQiEhuXP6XD2hSQ
提取码:1024
--来自百度网盘超级会员V3的分享
开发环境为x86的linux系统,但是模型需要部署在FT2000上,内核为arm64,所以需要交叉编译环境。
先在x86系统下拉取Tengine框架的源码,命令行键入:
git clone -b tengine-lite https://github.com/OAID/Tengine.git Tengine
安装交叉编译的工具,分为arm32和arm64的,自己看自己的嵌入式板子是哪种
Arm64 linux 交叉编译工具:
sudo apt install g++-aarch64-linux-gnu
Arm32 linux 交叉编译工具:
sudo apt install g++-arm-linux-gnueabihf
交叉编译x86 下的linux系统中的源码:
cd Tengine
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake ..
make
make install
注意:如果没有安装opencv以上编译只能编译一部分文件,无法编译完全,比如:yolov3,yolov5等需要opencv库的模型,因此需要先交叉编译opencv。
安装依赖环境:
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libcanberra-gtk-module
sudo apt-get install pkg-config
下载opencv源码
官方地址:Releases - OpenCV,我下载的是4.2版本,选择sources安装包下载.
下载完成后解压到ubuntu中
进入opencv源码目录中,创建build文件夹。
进入build文件夹中,命令行键入:
sudo cmake -DCMAKE_MAKE_PROGRAM:PATH=/usr/bin/make -DCMAKE_INSTALL_PREFIX=../aarch_64_install -DWITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake -DCUDA_GENERATION=Kepler ..
-DCMAKE_INSTALL_PREFIX 指定编译文件make install后保存的路径
执行完成后,键入make,注意不要加sudo,不要加sudo
make -j2
时间比较长,等待几十分钟.完成后执行
make install
大功告成后,重新开始编译源码。
先打开Tengine目录下的exmple文件夹下的cmakelist.txt文件
再上图中的位置加上一行set代码,用于寻找opencv库,然后按一下部骤开始编译。
cd Tengine
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake ..
make
make install
编译成功后会在build/install/bin下看到很多编译好的执行文件。
在build/install/lib文件下还会生成静态链接库和动态链接库。
然后将我们训练好的.pt文件转换成Tengine可用的.tmfile文件
分为几步:不管用什么框架训练的网络模型都可以首先把我们训练好的权重文件,比如我用的pytorch框架做的训练,那我就将.pt文件转换为.onnx文件。
只需要一句代码就可以搞定。
torch.onnx.export(model, args, path, export_params, verbose, input_names, output_names, do_constant_folding, dynamic_axes, opset_version)
参数说明:
model——需要导出的pytorch模型
args——模型的输入参数,满足输入层的shape正确即可。
path——输出的onnx模型的位置。例如‘yolov5.onnx’。
export_params——输出模型是否可训练。default=True,表示导出trained model,否则untrained。
verbose——是否打印模型转换信息。default=False。
input_names——输入节点名称。default=None。
output_names——输出节点名称。default=None。
do_constant_folding——是否使用常量折叠,默认即可。default=True。
dynamic_axes——模型的输入输出有时是可变的,如Rnn,或者输出图像的batch可变,可通过该参数设置。如输入层的shape为(b,3,h,w),batch,height,width是可变的,但是chancel是固定三通道。
格式如下 :
1)仅list(int) dynamic_axes={‘input’:[0,2,3],‘output’:[0,1]}
2)仅dict dynamic_axes={‘input’:{0:‘batch’,2:‘height’,3:‘width’},‘output’:{0:‘batch’,1:‘c’}}
3)mixed dynamic_axes={‘input’:{0:‘batch’,2:‘height’,3:‘width’},‘output’:[0,1]}
opset_version——opset的版本,低版本不支持upsample等操作。
注意:如果只用原参数转为.onnx文件,会出现一些Tengine不支持的算子,因此我们需要用onnx的内置的一些api,在我们转换时,要加上 --train=True 和 --simplifier,加上后我们转换后的onnx文件才不会包含一些Tengine框架不支持的算子,并且取消掉了后处理操作。
生成.onnx文件后,需要把他转换为适用于Tengine框架的.tmfile文件。需要用到Tengine框架的convert_tool转换工具。
注意:转换工具只能在x86的环境下编译,才能生成。因此,我们需要在x86环境下重新再做一次编译。将Tengine源码复制一份,重新编译。
cd build
cmake ..
make
make install
编译成功后,安装转换工具需要的依赖:
sudo apt install libprotobuf-dev protobuf-compiler
编译完成后,生成的可执行文件 convert_tool
存放在 ./build/install/bin/
目录下。将需要转换的.onnx文件,复制到convert_tool工具的同目录下。执行以下命令进行转换。
./convert_tool -f onnx -m best.onnx -o best.tmfile
//-f 被转换文件的类型
//-m 被转换的文件
//-o 生成的.tmfile文件名
现在将这几个文件拷到FT2000的板子上,如下:
交叉编译后的.so链接库文件: libtengine-lite.so
复制到FT2000后,终端打开,cd到存放上述四个文件的地址下。
命令行键入:
export LD_LIBRARY_PATH= 你所存放的文件夹的绝对路径
./tm_yolov5s -m best.tmfile -i dog.jpg -r 1 -t 1
至此,我们的模型已经基本在FT2000上跑起来了,但这里的执行文件只是识别一张照片,后续会改成实时检测的实现,未完待续~~