算丰SE5计算盒子YOLOX移植文档

1.环境的搭建

环境分为开发环境和运行环境,开发环境即是服务器,用于模型转换或验证以及程序编译等开发过程的环境,目前只支持x86,需要使用我们提供的基于Ubuntu16.04的docker镜像.运行环境则是计算盒子,是具备Sophon设备的平台上实际使用设备进行算法应用部署的环境。

1.需要先在服务器上安装docker,具体docker如何安装,参考官方教程,比较简单。
2.下载SDK软件包,一个是开发docker基础镜像,一个是SDK软件包
算丰SE5计算盒子YOLOX移植文档_第1张图片
3.将两个压缩包下载到服务器后,解压缩。先加载docker镜像,再解压缩SDK,之后创建docker容器,将SDK挂载映射到容器内部使用。
算丰SE5计算盒子YOLOX移植文档_第2张图片
4.进入docker容器中安装库
算丰SE5计算盒子YOLOX移植文档_第3张图片

2.模型的移植

计算盒子要运行的模型需要进行转换,转换的全部工作可在服务器上进行。BMNNSDK2中的PyTorch模型编译工具BMNETP只接受PyTorch的JIT模型(TorchScript模型)。因此转换分为两大步,第一步是将原始pytorch模型转成JIT模型;第二步是将JIT模型转换成FP32 BModel或者是INT8 BModel。
先在docker环境中安装bmnetp:
在这里插入图片描述

2.1FP32 BModel 的转换

1.生成JIT模型,这一步需要在yolox的源码中进行,用到export_trace.py,根据需要选择合适的参数。此文件已经放到了yolox源码tools文件夹下(yolox源码更新完后,tools下有export_torchscript.py一样的功能),生成的模型在models文件夹下。

python3 tools/export_trace.py --output-name models/yolox_l.pth -n yolox-l -c YOLOX_outputs/yolox_voc_l_0801_petrol_station/best_ckpt.pth --exp_file exps/example/yolox_voc/yolox_voc_l_0801_petrol_station.py

2.上述步骤操作完成后,将转换后的模型放到docker环境中,可进行fp32bmodel转换。在docker环境里输入以下命令行

python3 -m bmnetp --net_name=yolox_l --target=BM1648 --opt=1 --cmp=true --shapes="[1,3,640,640]" --model=/workspace/pytorch_model/yolox_l.pth --out_dir=/workspace/FP32_BModel --dyn=false

bmnetp若成功,输出的 log 最后会看到以下信息
在这里插入图片描述
bmnetp成功后,将在指定的文件夹中生成一个compilation.bmodel的文件,该文件则是转换成功的 bmodel,用户可以重命名。
相关参数介绍:
算丰SE5计算盒子YOLOX移植文档_第4张图片

2.2INT8 BModel的转换

要依次用到create_imagelist.py、create_lmdb.sh、 yolox_to_fp32umodel.py、convert_to_int8bmodel.sh,这些文件都已经放在了docker工作环境/workspace/YOLOX下,
1.创建 lmdb 数据集文件列表
使用 create_imagelist.py 创建文件列表文件,IMG_DIR 表示图片文件夹路径,
max_image_count 表示创建最多使用的额图片数量,转换时并不需要太多的图片,
默认是 1000 张。
算丰SE5计算盒子YOLOX移植文档_第5张图片
2.创建 lmdb 文件
使用脚本 create_lmdb.sh 创建 lmdb 文件,IMG_DIR 表示图片文件夹路径,执行完
之后会在图片文件夹生成 img_lmdb 文件夹,即为 lmdb 文件。
在这里插入图片描述
算丰SE5计算盒子YOLOX移植文档_第6张图片

3.生成 fp32umodel
使用 yolox_to_fp32umodel.py 生成 fp32umodel,参数对应如下:
-m:输入 pytorch 路径
-s:网络的输入维度
-d:结果保存的文件夹
-D:lmdb 数据文件位置
算丰SE5计算盒子YOLOX移植文档_第7张图片
4.生成 int8umodel
在生成 fp32umodel 之后,会生成一个*bmnetp_test_fp32.prototxt,修改此文件,使
网络最后的输出类型为 float , 具 体 操 作 为 在 最 后 一 层 总 添 加
“forward_with_float:true”。
算丰SE5计算盒子YOLOX移植文档_第8张图片
执行 convert_to_int8umodel.sh 生成 int8umodel,最终生成的 int8umodel 和
fp32umodel 在同一个文件夹下面。
算丰SE5计算盒子YOLOX移植文档_第9张图片
5.生成 int8bmodel
执行 convert_to_int8bmodel.sh 生成 int8bmodel,其中 max_n 表述网络输入的最大
batch。
算丰SE5计算盒子YOLOX移植文档_第10张图片

3.推理代码

我们采用python测试代码推理,用到的文件是det_yolox_sail.py
我们将转换后的模型、Python文件以及需要用的数据集等都放到盒子环境内,盒子自身已经搭好了环境,因此只需要执行相应命令就可以操作。
1.输入为rtsp流:

python3 python/det_yolox_sail.py --bmodel_path=int8model/yolox_l_int8_b1.bmodel --is_video=1 --file_name="rtsp://admin:[email protected]:554/Streaming/Channels/1" --device_id=0 --detect_threshold=0.25 --nms_threshold=0.45 --save_path=result/

2.输入为视频文件:

python3 python/det_yolox_sail.py --bmodel_path=fp32model/yolox_l_fp32_b1.bmodel --is_video=1 --file_name=/data/data/video/jiayou.mp4 --loops=16 --device_id=0 --detect_threshold=0.25 --nms_threshold=0.45 --save_path=result/

3.输入为图片:

python3 python/det_yolox_sail.py --bmodel_path=int8model/yolox_l_int8_b1.bmodel --is_video=0 --file_name=/data/data/gas_tmp --device_id=0 --detect_threshold=0.25 --nms_threshold=0.45 --save_path=result/

注意测试时的一些参数,如在测试视频和图片时–is_video分别为1和0,测试图片只能够输入图片路径到文件夹,不用具体到图片名。

参考资料:
https://github.com/sophon-ai-algo/examples/tree/2.7.0/simple/yolox
https://github.com/sophon-ai-algo/examples/tree/main/simple/yolox
https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/model-convert/fp32-bmodel/pt
https://github.com/Megvii-BaseDetection/YOLOX
文中用到的很多文件都在下面链接中,
https://github.com/sophon-ai-algo/examples/tree/main/simple/yolox/data
https://github.com/sophon-ai-algo/examples/tree/2.7.0/simple/yolox/python
https://github.com/sophon-ai-algo/examples/tree/2.7.0/simple/yolox/scirpts

你可能感兴趣的:(学习,docker,容器,运维)