声明:本文参考链接:http://t.csdnimg.cn/CF6gw (感谢玺哥)
yolov5的代码我用的是https://github.com/ultralytics/yolov5的master分支,目前应该是版本7.0,后续作者更新后,可以切换到6.2分支来使用。
本教程使用的一些文件参考1- BPU开发_免费高速下载|百度网盘-分享无限制 (baidu.com)
提取码:0a09
一 环境配置
-
1.1 安装依赖包
如果在当前python环境下能利用
pip install onnx
轻松安装onnx,那就直接配置yolov5的环境就行了。
直接根据requirements.txt文件配置yolov5虚拟环境
pip install -r requirements.txt
1.2 运行Yolov5
下载百度云中提供的文件,按照如下流程操作:
解压yolov5-master.zip。
将zidane.jpg放到yolov5-master文件夹中。
将yolov5s.pt放到yolov5-master/models文件夹中。
进入yolov5-master文件夹,输入python .\detect.py --weights .\models\yolov5s.pt --source zidane.jpg,代码会输出检测结果保存路径,比如我的就是Results saved to runs\detect\exp,检测结果如下所示。
我这里把文件夹命名为yolov5-bpu以区别于我之前的文件
1.3 pytorch的pt模型文件转onnx
在yolov5-bpu虚拟文件夹下输入
python .\export.py --weights .\models\yolov5s.pt --include onnx --opset 11
转换后,控制台会输出一些log信息,如图所示
二 ONNX模型转换
模型转换要在docker中转换,怎么安装docker,怎么进入OE,怎么挂载硬盘,我是参考http://t.csdnimg.cn/4A5Pc
进行部署的。
新建一个文件夹,我这里沿用前人叫bpucodes
,把前面转好的yolov5s.onnx
放进这个文件夹里,百度云里也提供了相关的代码。
这里提一点,docker默认的安装地点在C盘,如果有C盘和我一样爆满的朋友可以参考这篇文章
注意如果显示: 系统找不到指定的路径。就需要在对应地方创建文件夹
docker pull openexplorer/ai_toolchain_centos_7:v1.13.6
报错案例:error during connect: In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect.: Post "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/images/create?fromImage=openexplorer%2Fai_toolchain_centos_7&tag=v1
解决方案:以管理员的身份打开cmd,运行下面两行代码,重启docker后在运行docker pull openexplorer/ai_toolchain_centos_7:v1.13.6即可成功
cd C:\Program Files\Docker\Docker
DockerCli.exe -SwitchDaemon
参考解决方案:http://t.csdnimg.cn/I92VW
之后打开docker就会看到对应镜像。
因为我是根据大佬的网盘直接下载的,需要进行软连接重构,在docker中运行以下两行代码
rm /open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/model_zoo
ln -s /open_explorer/ddk/samples/ai_toolchain/model_zoo /open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/model_zoo
按照要求安装完成后,在docker中,进入bpucodes
文件夹,开始我们的模型转换。
按照教程,启动docker要执行run_docker.sh,我是点击了一下
在进入docker之前,先记录两个内容:
天工开物OpenExplorer根目录:
我的环境是"D:\xurix3gongju\horizon_xj3_open_explorer_v2.2.3_20220617",记得加双引号防止出现空格,该目录要挂载在docker中/open_explorer目录下
dataset根目录:我的环境下是"D:\xurix3gongju\dataset",记得加双引号防止出现空格,该目录需要挂载在docker中的/data/horizon_x3/data目录下。
*辅助文件夹根目录:官方教程其实是没有这个过程的,我把这个挂载在docker里,就是充当个类似U盘的介质。比如在我的环境下是"D:\xurix3gongju\BPUCodes",我可以在windows里面往这个文件夹拷贝数据,这些数据就可以在docker中使用,在docker中的路径为/data/horizon_x3/codes。
由于cmd不支持换行,以下代码需按照图片中运行的把每行\删除并连成一行
docker run -it --rm -v "D:\xurix3gongju\horizon_xj3_open_explorer_v2.2.3_20220617":/open_explorer -v "D:\xurix3gongju\dataset":/data/horizon_x3/data -v "D:\xurix3gongju\bpucodes":/data/horizon_x3/codes openexplorer/ai_toolchain_centos_7:v1.13.6
docker run -it --rm \
-v "D:\xurix3gongju\horizon_xj3_open_explorer_v2.2.3_20220617":/open_explorer \
-v "D:\xurix3gongju\dataset":/data/horizon_x3/data \
-v "D:\xurix3gongju\bpucodes":/data/horizon_x3/codes \
openexplorer/ai_toolchain_centos_7:v1.13.6
在cmd(管理员)中输入以下指令即可进入docker,记住要提前打开桌面的docker
三、模型检测
模型检测的目的是检测有没有不支持的算子,输入指令开始检查模型,显示如下内容表示模型检查通过。
hb_mapper checker --model-type onnx --march bernoulli2 --model yolov5s.onnx
出现下图所示结果即成功。
四、校准数据准备
官方示例:Yolov3部署
官方提供的yolov3放置在docker中 的路径如下:
/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/02_yolov3_darknet53/mapper
4.1模型准备
模型所需要的prototxt和caffemodel文件放置在docker中的/open_explorer/ddk/samples/ai_toolchain/model_zoo/mapper/detection/yolov3_darknet53
路径下。
4.2验证模型
进入以下路径,并输入
/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/02_yolov3_darknet53/mapper
./01_check.sh
出现下面画面就是转换成功了。
4.3转换模型
转换模型之前我们需要准备校准数据,输入以下代码会自动从docker的open_explorer包中抽取数据。
./02_preprocess.sh
再输入以下代码,输出一大堆的命令行,等待一段时间之后会输出。这里我们可以发现每一层网络都要评估一个相似度。这就可以解释为什么要准备校准数据,因为BPU是INT8计算,所以注定会有精度损失。而且这些误差也是可以传递的,所以到后面精度是越来越低的。如果网络深度过高,也会导致整体精度的下降。
./03_build.sh
最终结果
为了更好的理解这些转换流程,大家可以去参考链接看看玺佬的博客:http://t.csdnimg.cn/mDsKR
4.4准备校准数据
进入 prepare_calibration_data.py文件中修改一下两点,/data/horizon_x3/codes为固定路径,后面是你的文件夹位置
# 修改输入图像大小为640x640
img = imequalresize(img, (640, 640))
# 指定输出的校准图像根目录
dst_root = '/data/horizon_x3/codes/calibration_data
然后用下面这行代码运行该文件(切记要在该文件所在目录运行),如图则为校准数据成功
python3 ./prepare_calibration_data.py
4.5转换BPU模型
转换模型需要yaml参数文件,具体含义参考yolov3的教程,这里我直接使用网盘下载的convert_yolov5s.yaml
文件。
随后在对应目录下输入命令,开始转换我们的模型!校准过后会输出每一层的量化损失。
转换成功后,得到model_output/yolov5s.bin
,这个文件拿出来,拷贝到旭日X3派上使用,它也是我们上板运行所需要的模型文件。
hb_mapper makertbin --config convert_yolov5s.yaml --model-type onnx
如图所示,完美收官!
4.6 模型推理
可能有的友友怕文件不能使用,那么接下来可以验证一下,这里我就以官方的yolov3历程演示一下。
首先进入文件修改下面第十四行代码文件路径,改成
yolov3_darknet53_416x416_nv12_quantized_model.onnx
之后运行下面这行代码就可以实现检测图片
python3 ./inference_model.py
如下图生成了一个detected.png图片
运行之后,我们可以得到如下检测结果。
五、板载测试
5.1开发板部署
打开docker输入
cd /open_explorer/ddk/package/board/
bash install.sh 192.168.101.125
这时候再打开板子输入
hrt_model_exec
如果有如下输出,说明开发板部署完成。
5.2开发板运行(案例yolov3)
我们将下图所示的test_yolov3文件夹直接拖到旭日X3派开发板中
下图即为拷贝完成
在执行前要安装一些包sudo pip3 install EasyDict pycocotools
,切记要加sudo,这样安装的
路径不是用户目录,在运行BPU模型时候,也是必须要加sudo的。
随后在对应目录下运行inference_model_bpu.py文件
sudo python3 ./inference_model_bpu.py
BPU上的检测结果如下图所示,推理耗时178ms,已经是相当快了。
5.3开发板运行(yolov5)
下载百度云的x3pcodes文件,直接拖拽拷贝到旭日X3派开发板中,其中yolov5s.bin
就是我们转换后的模型
首先确保安装了opencv库
sudo apt-get install libopencv-dev
在转到文件目录下运行代码
python3 setup.py build_ext --inplace
最后在运行推理代码,推理结果保存为res.png
sudo python3 inference_model_bpu.py
相关结果如下所示,可以看出,后处理部分耗时为25ms,C++和Python混编有效提升了代码的运行速度。