编辑
2025-07-04
嵌入式
00
请注意,本文编写于 63 天前,最后修改于 1 天前,其中某些信息可能已经过时。

像RDK,RK这种带BPU,NPU的INT算力处理单元的开发板,一般要部署模型都要先进行从float32量化成int8或者int16。本文整理一遍其他教程方便记录。

参考的文章:

github官方文档:YOLOv11 Detect

CSDN博客:rdkx5部署yolov11

RDK论坛帖子:RDKx5板载yolov11我也是成功了!

RDK论坛帖子:YOLOv11,地瓜RDK X5开发板,TROS端到端140FPS!

这里主要记录差异点: 这一部分其实可以直接修改pip下载的ultralytics包的源码而不用卸载ultralytics整个包并且拉取ultralytics的git仓库源码: 假设你的Python虚拟环境路径为~/yolov11-env/ 那么在 ~/yolov11-env/lib/python3.11/site-packages/ultralytics/nn/modules 路径下就能找到head.py,注意不同版本的ultralytics 里面的Detect类的forward方法所在的位置不一样。

image.png

注意原来的head.py文件先备份成head.py-convert,新建一个head.py文件再修改。而后写一个switch_head.sh脚本,可以快速切换训练转模型。

#!/bin/bash # Ultralytics head.py 切换脚本 # 用于在训练与模型转换之间切换 head.py 文件 # 文件路径 DIR="~/pyenv/lib/python3.12/site-packages/ultralytics/nn/modules" DIR=$(eval echo $DIR) # 展开 ~ cd "$DIR" || { echo "❌ 目录不存在: $DIR"; exit 1; } # 打印帮助信息 print_help() { echo "用法: $0 [选项]" echo "" echo "选项:" echo " -t, --train 切换到训练模式(使用 head.py-train)" echo " -c, --convert 切换到模型转换模式(使用 head.py-convert)" echo " -h, --help 显示此帮助信息" echo "" echo "说明:" echo " 训练模式: head.py -> head.py-convert" echo " head.py-train -> head.py" echo " 转换模式: head.py -> head.py-train" echo " head.py-convert -> head.py" } # 检查文件存在性 check_exists() { if [ ! -f "$1" ]; then echo "❌ 缺少文件: $1" exit 1 fi } # 执行模式切换 case "$1" in -t|--train) echo "🔁 切换到训练模式..." check_exists "head.py" check_exists "head.py-train" mv -v head.py head.py-convert mv -v head.py-train head.py ;; -c|--convert) echo "🔁 切换到模型转换模式..." check_exists "head.py" check_exists "head.py-convert" mv -v head.py head.py-train mv -v head.py-convert head.py ;; -h|--help|"") print_help ;; *) echo "❌ 无效选项: $1" print_help exit 1 ;; esac

其他的内容就按照参考文章来 对于 github官方文档:YOLOv11 DetectRDK论坛帖子:RDKx5板载yolov11我也是成功了! 里面提及的移除bbox信息3个输出头的反量化节点,怎么区别是bbox还是class,可以根据hb_model_modifier.log

通道数 64:通常是 YOLO 的 bbox head(3 anchor * (x,y,w,h) = 12 per anchor → e.g., 34class) 通道数 xx:是你的分类数量(如 COCO 数据集 80 类) cv2 分支:通常为 bbox(box regression) cv3 分支:通常为 class(class confidence)

比如我的模型分类数是4,有这样的hb_model_modifier.log文件,找到中间的地方,看到value_info附近:

2025-07-05 08:47:30,819 file: hb_model_modifier.py func: hb_model_modifier line No: 404 --------value_info---------- 2025-07-05 08:47:30,819 file: hb_model_modifier.py func: hb_model_modifier line No: 406 name: "/model.23/cv2.1/cv2.1.2/Conv_output_0_quantized" type { elem_type: INT32 dim: 1 dim: 40 dim: 40 dim: 64 } 2025-07-05 08:47:30,819 file: hb_model_modifier.py func: hb_model_modifier line No: 406 name: "/model.23/cv3.1/cv3.1.2/Conv_output_0_quantized" type { elem_type: INT32 dim: 1 dim: 40 dim: 40 dim: 4 } 2025-07-05 08:47:30,819 file: hb_model_modifier.py func: hb_model_modifier line No: 406 name: "/model.23/cv2.2/cv2.2.2/Conv_output_0_quantized" type { elem_type: INT32 dim: 1 dim: 20 dim: 20 dim: 64 } 2025-07-05 08:47:30,820 file: hb_model_modifier.py func: hb_model_modifier line No: 406 name: "/model.23/cv3.0/cv3.0.2/Conv_output_0_quantized" type { elem_type: INT32 dim: 1 dim: 80 dim: 80 dim: 4 } 2025-07-05 08:47:30,820 file: hb_model_modifier.py func: hb_model_modifier line No: 406 name: "/model.23/cv2.0/cv2.0.2/Conv_output_0_quantized" type { elem_type: INT32 dim: 1 dim: 80 dim: 80 dim: 64 } 2025-07-05 08:47:30,820 file: hb_model_modifier.py func: hb_model_modifier line No: 406 name: "/model.23/cv3.2/cv3.2.2/Conv_output_0_quantized" type { elem_type: INT32 dim: 1 dim: 20 dim: 20 dim: 4 }

那么除了dim: 4以外的三个,都要移除,但是呢后缀不是Conv_output_0_quantized,要继续往下看,找到--------node----------开始处,注意看后缀而是Conv_output_0_HzDequantize

移除模型节点,注意看你output_model_file_prefix配置项目定义的模型名,这里假设是your

$ hb_model_modifier your.bin \ -r /model.23/cv2.0/cv2.0.2/Conv_output_0_HzDequantize \ -r /model.23/cv2.1/cv2.1.2/Conv_output_0_HzDequantize \ -r /model.23/cv2.2/cv2.2.2/Conv_output_0_HzDequantize

注意看日志输出,最终的模型是xxxxxxx_modified.bin

2025-08-04 15:06:37,611 INFO modified model saved as xxxxxxx_modified.bin

最终的模型最好用 hb_perf 来检验一下这个bin文件 hb_perf 你自定义的文件名.bin

本文作者:phae

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!