〇、前言
本文将向你展示,如何通过 yolov5 官方的代码工具,导出 onnx 模型,并通过 onnx 自带的工具,获得子图,以适应 爱芯元智的 GitHub 开源项目 ax_samples 中 yolov5s的代码 运行,同时提升在AX620芯片中的运行效率
欢迎加入 爱芯元智 QQ技术交流群,群号 139953715,群里很多大佬,如果你有什么关于 AX620 开发的疑问,都可以在里面提问!
一、获得onnx模型
1、克隆 yolov5的代码,并安装 yolov5 所需的 python包 以及 onnx,这个就不多赘述了,命令如下
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
pip install onnx
2、进入你期望的目录,下载 yolov5 的 pt模型,本文使用 yolov5s 模型进行演示,我的方式是在 yolov5 的目录创建了一个 weights 文件夹,命令如下(请确保pt文件下载完成)
mkdir weights
cd weights
wget https://github.com/ultralytics/yolov5/releases/download/v6.2/yolov5s.pt
3、通过 yolov5 自带的工具,获得 onnx 模型,执行以下命令,会在 weights 目录会生成一个名为 yolov5s.onnx 的 onnx 模型文件,命令如下
python export.py --weights weights/yolov5s.pt --include onnx
二、获取onnx子图
1、访问 netron.app 网页,打开前面生成的 yolov5s.onnx 模型,并记录输入节点的名称,如下图所示,输入节点的名称为"images"
!
2、往下拉,分别点击下图所示的三个分支的最后一个 Conv op,并记录每一个 Conv op 对应的 output name,如下图所示,三个 Conv op 的 output name 分别为 "onnx::Reshape_329" "onnx::Reshape_367" "onnx::Reshape_405"
3、使用 onnx 自带的工具,提取 yolov5s.onnx 的子图 yolov5s_sub.onnx ,代码如下
import onnx
input_path = "weights/yolov5s.onnx"
output_path = "weights/yolov5s_sub.onnx"
input_names = ["images"]
output_names = ["onnx::Reshape_329","onnx::Reshape_367","onnx::Reshape_405"]
onnx.utils.extract_model(input_path, output_path, input_names, output_names)
4、使用 netron.app 再次打开 yolov5s_sub.onnx,可以看到输出如下图所示,其中黄色框的数字应该等于你的 (模型训练的类别+5)x3,如果上文下载的模型,则是yolov5官方基于coco 80个类的目标检测数据集训练的模型,255=(80+5)x3
5、请确保上图红框中的三个输出节点的后面两个维度,从上到下是以“从大到小”的顺序排序的,例如图中从上到下的排序为 [80,40,20]
三、onnx->joint 模型转换
1、资源准备
① 下载 quick_start_example.zip 并解压到你所期望的目录,并将上文得到的 yolov5s_sub.onnx 模型,复制到 model 目录
② 从爱新元智 的 GitHub 开源项目的 Readme 中的 百度网盘 的 "AXERA>ModelZoo>config" 目录获取到 yolov5s.prototxt,并复制到 config 目录
③ 下载coco数据集,并从中随机挑选一千张图片,打包成tar格式的压缩包 "coco_1000.tar",并移入dataset目录
④ 联系 爱芯元智 获取 axera_neuwizard 工具链,并根据文档,安装到 docker 中,下文会假设你的 axera_neuwizard 工具链已经准备就绪
⑤ 联系 爱芯元智 获取 AX620A 的开发板以及SDK,并根据文档进行开发环境配置,下文会假设你的 开发环境 已经准备就绪
⑥ 第 ④、⑤ 点可参考 爱芯元智 的 GitHub 的开源文档,进行配置,链接如下
pulsar-docs
⑦,请根据上述文档,进行 ax_samples 的编译工作,并确定编译成功,且已经将 编译目录/examples 目录中的 ax_yolov5s 的可执行程序,通过你懂的方式,拷贝到了 AX620A 的开发板中,这里我拷贝到了开发板中的 /opt/test 目录(如果你使用的是开发板,建议在 /opt 目录下创建你的测试目录)
⑧ 将你希望测试的图片,通过你懂的方式,拷贝到第 ⑦ 点所述的 /opt/test 目录下,我挑选的测试的图片如下
2、模型转换
① 在 quick_start_example.zip 解压的目录中,运行以下命令进入 docker,其中,我的版本号"0.6.1.16",请根据你所获取的工具链版本号进行修改
docker run -it --net host --rm --shm-size 32g -v $PWD:/data axera/neuwizard:0.6.1.16
② 参考以下命令,将 onnx 模型转换成 joint 模型
pulsar build --input models/yolov5s_sub.onnx --output models/yolov5s_sub.joint --config config/yolov5s.prototxt --output_config config/output_config.prototxt
③ 转换完成后,将 models 目录下生成的 yolov5s_sub.joint 文件,通过 scp 命令,拷贝到开发板上的 /opt/test 目录,在这里我的板子ip为 10.126.33.208 ,你可以用任何你懂的方式,将该文件拷贝到开发板的目标目录
scp models/yolov5s_sub.joint root@10.126.33.208:/opt/test
四、板端测试
① 确认可执行程序、joint模型文件、测试图片准备就绪
② 运行 ax_yolov5s,程序会生成测试结果图片 yolov5s_out.jpg
③ 通过你懂的方式,下载 yolov5s_out.jpg 到你的电脑,并通过图片浏览工具查看结果
五、推理时间及内存消耗(AX620A)
模型 | 分辨率 | NPU模式 | 推理时间 | 内存消耗(OS/CMM) |
---|---|---|---|---|
YOLOv5s | 640x640 | AX620_VIRTUAL_NPU_MODE_0 | 12.6 ms | - |
YOLOv5s | 640x640 | AX620_VIRTUAL_NPU_MODE_111 | 25.7 ms | 3.84 Mib/15.32 Mib |
YOLOv5m | 640x640 | AX620_VIRTUAL_NPU_MODE_0 | 37.2 ms | - |
YOLOv5m | 640x640 | AX620_VIRTUAL_NPU_MODE_111 | 81.1 ms | 9.49 Mib/33.90 Mib |
YOLOv5m | 640x640 | AX620_VIRTUAL_NPU_MODE_0 | 20.1 ms | - |
YOLOv5m | 640x640 | AX620_VIRTUAL_NPU_MODE_111 | 39.5 ms | 6.06 Mib/29.13 Mib |