网站菜单

爱芯元智AX650N部署YoloV5s全流程

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模型实录 – 知乎

wuboy19

https://www.cnblogs.com/smallwxw/p/17836977.html

显示评论 (0)

文章评论

相关推荐

爱芯元智AX650N板端验证YoloV5s

笔者的AX650N为AXCL PCIe 算力卡形态;如果你是 SoC 开发板(AXera-Pi/AX650N 等),我在文末也放了 SoC 的做法。 1. 安装运行库 在插卡的主机上(Ubuntu/D…

Docker创建容器后退出解决办法

这是正常现象:容器只要主进程(PID 1)结束就会立刻退出。很可能是用镜像默认的 ENTRYPOINT/CMD 启动,命令跑完就退出了,所以状态是 Exited。 下面给你一套“查原因 → 重新跑起来…