1. 训练模型
克隆 yolov5的代码,并安装 yolov5 所需的 python包 以及 onnx,这个就不多赘述了。
与瑞芯微需要特定分支的yolov5(或者修改网络结构)不同,直接使用官方的版本即可。
模型训练部分详情可以参考:https://www.zknie.com/knowledge_base/rknn%e5%b5%8c%e5%85%a5%e5%bc%8f%e5%bc%80%e5%8f%91/2024/08/23/
这里贴上几个关键的bash:
训练
python train.py --data data.yaml --cfg models/yolov5s.yaml --data data.yaml --weights pretrained/yolov5s.pt --epoch 300 --batch-size 16 --device 0
#分割模型(segment目录下)
python train.py --data dataSeg.yaml --cfg ..\models\segment\yolov5s-seg.yaml --weights ..\pretrained\yolov5s.pt --epoch 300 --batch-size 32 --device 0
检测
python detect.py --weights best.pt --data data.yaml --source data/mis/
2. 转onnx模型,获取简化版onnx模型,获取模型子图
PT转ONNX:
python3 export.py --weights best.pt --include onnx
ONNX获取简化版ONNX:
pip install onnx-simplifier
onnxsim best.onnx bestsim.onnx

ONNX简化版获取ONNX子图:
模型查看通过网址输入netron.app查看三个输出:

如下图所示,三个 Conv op 的 output name 分别为 “/model.24/m.0/Conv_output_0″,”/model.24/m.1/Conv_output_0″,”/model.24/m.2/Conv_output_0”
使用 onnx 自带的工具,提取 bestsim.onnx 的子图 bestsimsub.onnx ,代码如下
import onnx
input_path = "bestsim.onnx"
output_path = "bestsimsub.onnx"
input_names = ["images"]
output_names = ["/model.24/m.0/Conv_output_0","/model.24/m.1/Conv_output_0","/model.24/m.2/Conv_output_0"]
onnx.utils.extract_model(input_path, output_path, input_names, output_names)
使用 netron.app 再次打开 bestsimsub.onnx,可以看到输出如下图所示,其中黄色框的数字应该等于你的(模型训练的类别+5)*3,如果上文下载的模型,则是yolov5官方基于coco 80个类的目标检测数据集训练的模型,255=(80+5)*3。笔者的有5个类别,因此是30。

请确保上图红箭头的三个输出节点的后面两个维度,从上到下是以“从大到小”的顺序排序的,例如图中从上到下的排序为 [80,40,20]
3 .axmodel模型转化
首先你需要有AXCL的docker,具体的安装可以参考上一篇文章https://www.zknie.com/knowledge_base/docker%e5%88%9b%e5%bb%ba%e5%ae%b9%e5%99%a8%e5%90%8e%e9%80%80%e5%87%ba%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/2025/08/11/
docker内有quick_start_example文件夹。
3.1配置Yolov5.json
在quick_start_example/config文件夹内配置yolov5.json。需要根据模型的输出节点进行修改,比如,以下配置文件中,需要将 output_processors 中三个tensor_name,修改为您根据文章内容得到的yolov5的模型的输出节点的名称。比如我将其填充为”/model.24/m.0/Conv_output_0″,”/model.24/m.1/Conv_output_0″,”/model.24/m.2/Conv_output_0″

编号2的位置存放用于量化模型的样图,注意文件为.tar结尾的压缩包。
3.2模型转化
模型转换,在docker中运行以下命令
pulsar2 build --input model/bestsimsub.onnx --output_dir output --config co
nfig/yolov5s_config.json
量化后的模型存放在output文件夹内。默认为compiled.axmodel
4.本地仿真测试
在本地测试模型转化是否正确,可以减少试错成本,及时悬崖勒马。AX650N比RK系列好在可以离线仿真测试而不需要连板调试。但是相对的过程会稍显复杂。
quick_start_example文件夹内的pulsar2-run-helper文件夹提供了仿真测试的小工具包,帮你把图片做预处理→喂给 pulsar2 run→再做后处理。
4.1 axmodel放到对应目录
# 进到你的工作目录(/data 挂载点)
cd /data
# 复制编译好的 axmodel 到 helper 的 models 下并命名为 yolov5s.axmodel
cp output/compiled.axmodel pulsar2-run-helper/models/bestsimsub.axmodel
4.2 预处理一张测试图片(生成仿真输入)
cd pulsar2-run-helper
# 任选一张测试图(可用自带 sim_images/dog.jpg,也可以用你自己的)
# --letterbox_size 要与训练/导出一致,常见是 640
python3 cli_detection.py \
--pre_processing \
--image_path sim_images/1.bmp \
--axmodel_path models/bestsimsub.axmodel \
--intermediate_path sim_inputs/0 \
--letterbox_size 640
成功后会在 sim_inputs/0/ 下生成形如 images.bin 的输入文件名(按模型输入张量名命名)。这一步就是把 JPG/PNG 变成仿真所需的 .bin 原始张量。
注意:输入/输出 bin 的命名规则由张量名经过转义得到,比如输入名是 images
就写成 images.bin
。这在官方“Attention”块里写得很清楚。
4.3 用 pulsar2 run 在 x86 上跑仿真
准备好 list 文件(通常 helper 目录自带):
# 回到 helper 目录根(如果你还没在这里)
cd /data/pulsar2-run-helper
# 看一眼 list.txt,里面一般就一行 "0"
cat list.txt
跑仿真:
pulsar2 run \
--model models/bestsimsub.axmodel \
--input_dir sim_inputs \
--output_dir sim_outputs \
--list list.txt
这会把 0 号样本跑一遍,并在 sim_outputs/0/ 下产出三路 YOLO head 的 .bin 输出(名称是你的三路输出名,比如很多例子里叫 326.bin / 370.bin / 414.bin)。这是官方推荐流程。

4.4 修改anchors
后处理阶段仍在用默认 COCO 的 YOLOv5 anchors(和/或默认 80 类)去解码你“抽 detect 前的三路输出”,所以类别与框都飘了。
解决思路很明确:把你训练用的 anchors 和类别数同步到仿真后处理里。
修改anchors的位置在quick_start_example/pulsar2-run-helper/pulsar2_run_helper/pipeline/object_detection.py
将anchors修改为第一步训练模型时的anchors即可。

4.5 后处理得到可视化框
# num_classes 改成你的类别数;阈值可按需调
python3 cli_detection.py \
--post_processing \
--image_path sim_images/1.bmp\
--axmodel_path models/bestsimsub.axmodel \
--intermediate_path sim_outputs/0 \
--letterbox_size 640 \
--num_classes 5 \
--score_thresh 0.25 \
--nms_thresh 0.45 \
--output_path sim_outputs/0/vis.jpg
运行后,控制台会打印检测结果(类别 id、置信度、坐标),并在 sim_outputs/0/vis.jpg 生成可视化图。(不知道为什么我的并没有生成,但是看输出的类别和坐标显示是正确的)

4.6 (可选)批量图片怎么跑?
把 sim_inputs/ 下多建几个编号子目录:sim_inputs/0/、sim_inputs/1/ ……
逐张执行一次 预处理(把各自图片转成各自目录下的 images.bin)。
把这些编号写进 list.txt(一行一个编号,例如 0、1……)。
再跑一次 pulsar2 run … –list list.txt,就会批量产出 sim_outputs/{编号}/ 的结果。
(这套批量机制是 –list 设计的本意。)
参考:
爱芯元智AX620A/AX650N部署yolov5/yolov5-seg 6.0模型实录 – 知乎
https://www.cnblogs.com/smallwxw/p/17836977.html
文章评论