YOLO 转 RKNN 识别率降低调优操作手册(新手篇)
面向第一次接触模型量化的新手工程师。按步骤执行,通常可在 2~3 轮迭代内把 INT8 量化后的 mAP 损失压到 1% 以内。每一步都给出可复制的命令、代码模板和验收检查点。
适用平台 :RK3566 / RK3568 / RK3588 / RK3576
适用模型 :YOLOv5 / YOLOv8 / YOLOv11
工具链 :rknn-toolkit2
更新于:2026-07
目录
- 开始前的准备清单
- 第一步:建立精度基线
- 第二步:逐层精度诊断
- 第三步:预处理对齐修复
- 第四步:混合量化修复
- 第五步:后处理对齐修复
- [第六步:QAT 量化感知训练](#第六步:QAT 量化感知训练)
- 验收标准与回归
- 常见问题速查
- 完整配置模板
整体决策流程
拿到训练好的 YOLO 权重
│
▼
导出 ONNX
│
▼
转 FP16 RKNN(不量化)
│
▼
FP16 掉点是否 ≤ 0.5%?
/ \
否 是
│ │
▼ ▼
问题在预处理/ 转 INT8 RKNN(量化)
后处理/算子 │
进入第三/五步 ▼
accuracy_analysis 逐层诊断
│
▼
INT8 掉点是否 ≤ 1%?
/ \
是 否
│ │
▼ ▼
部署上线 误差分布形态?
/ | \
浅层累积 孤立敏感层 检测头跳变
│ │ │
▼ ▼ ▼
重做校准集 该层保留 检查后处理
+预处理对齐 FP16混合 NMS/解码
│ 量化 │
└────────┼─────────┘
▼
重新转 INT8
│
若仍超阈值 ↓
QAT 量化感知训练
│
▼
部署上线
新手最重要的一条原则
不要一发现掉点就调量化参数。先按"FP16 → INT8"两步走,确认问题到底出在"转换/前后处理"还是"量化本身",再对症下药。90% 的"量化掉点"其实是预处理或后处理没对齐。
00 开始前的准备清单
动手前把环境和素材备齐,后面每一步才不会卡壳。
环境与工具
- 已安装 Python 3.8+ 并配好虚拟环境
- 已安装
rknn-toolkit2(PC 端转换用,版本与板端 librknnrt 匹配) - 已安装
onnxruntime(跑 ONNX 基线对比) - 已安装
ultralytics(YOLOv8/v11 训练与导出) - 板端已部署
librknnrt.so,且版本号与 toolkit2 一致
素材与文件
- 训练好的权重文件
best.pt - 验证集图片(建议 200~500 张,含标注)
- 校准图片 500~1000 张(覆盖昼夜/遮挡/小目标等真实场景)
- 训练时的预处理参数(mean / std / imgsz / 是否 RGB)
- 官方 rknn_model_zoo 对应版本的转换脚本作为参考底子
⚠️ 版本一致性是隐形大坑
toolkit2 与板端 librknnrt 必须版本配套,否则会出现"PC 上正常、板端结果异常"的灵异问题。转换前先用
rknn.query(target)确认平台字符串与板子型号一致。
01 第一步:建立精度基线
确认原始模型本身精度正确,排除"假性掉点"。这是后续所有调优的地基。
1.1 导出 ONNX 并验证
从 PyTorch 权重导出 ONNX,用 ONNXRuntime 跑同一批验证图,确认 mAP 与训练侧一致(差异应 < 0.5%)。这一步排除导出环节的问题。
bash
# YOLOv8 / YOLOv11 导出,opset 12 对 RKNN 兼容性最好
yolo export model=best.pt format=onnx opset=12 simplify=True imgsz=640
# 验证 ONNX 与 PyTorch 输出一致性
yolo val model=best.onnx data=your_data.yaml imgsz=640
1.2 先转 FP16 RKNN 作对照
关键一步:先不量化,只转 FP16。FP16 几乎无损,如果 FP16 就掉点,问题在预处理 / 后处理 / 算子转换,而不是量化------此时去调量化参数是白费力气。
python
# convert_fp16.py
from rknn.api import RKNN
rknn = RKNN()
rknn.config(mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
target_platform='rk3588')
# 关键:do_quantization=False,只转不量化
ret = rknn.load_onnx(model='best.onnx')
ret = rknn.build(do_quantization=False)
ret = rknn.export_rknn('best_fp16.rknn')
rknn.release()
1.3 判定问题归属
用 FP16 模型在板端跑验证集,对比 ONNX 的 mAP,按下表判定:
| FP16 损失 | 问题归属 | 下一步 |
|---|---|---|
| ✅ < 0.5% | 转换与前后处理正常 | 进入第二步,做 INT8 量化 |
| ⚠️ 0.5% ~ 2% | 可能有轻微算子/预处理偏差 | 先排查预处理对齐,再量化 |
| ❌ > 2% | 转换或前后处理有问题 | 跳到第三步、第五步修复,不要急着量化 |
判定法则
FP16 损失 < 0.5% 且 INT8 损失 > 2%,才是真正的"量化精度问题"。其余情况先查前后处理。
02 第二步:逐层精度诊断
用 RKNN 自带的 accuracy_analysis 工具,像"模型 CT 扫描"一样逐层对比量化前后差异,精准定位问题层。
2.1 运行 accuracy_analysis
该工具对比三组数据:Golden (浮点模型 PC 端输出)、Simulator (量化模拟器输出)、Runtime(芯片实测),逐层计算余弦相似度。
python
# accuracy_analysis.py
from rknn.api import RKNN
rknn = RKNN()
rknn.config(mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
target_platform='rk3588',
quantized_algorithm='mmse')
rknn.load_onnx(model='best.onnx')
rknn.build(do_quantization=True, dataset='./dataset.txt')
# 生成逐层精度分析报告(HTML)
rknn.accuracy_analysis(
inputs=['./calib_imgs/0001.jpg'],
output_dir='./accuracy_report',
target='rk3588' # 连板端测 Runtime,不连板可省略
)
rknn.release()
运行结束后打开 ./accuracy_report/accuracy_analysis.html,会看到每一层的余弦相似度表格和特征图热力图。
2.2 解读相似度指标
| 余弦相似度 cos_similarity | 判定 | 处理方向 |
|---|---|---|
| > 0.99 | ✅ 正常 | 无需处理 |
| 0.95 ~ 0.99 | ⚠️ 轻微累积 | 优化校准集代表性 |
| < 0.95 | ❌ 异常层 | 对该层做混合量化,保留 FP16 |
| 浅层就崩 | ❌ 输入分布问题 | 查预处理 / 校准集 |
2.3 识别误差分布形态
看相似度曲线的整体走势,三种典型形态对应不同根因,直接决定你走哪条修复路径:
| 形态 | 特征 | 根因 | 修复路径 |
|---|---|---|---|
| 浅层累积型 | 前几层相似度就低,逐层放大 | 校准集不具代表性,或预处理不对齐 | [第三步](#形态 特征 根因 修复路径 浅层累积型 前几层相似度就低,逐层放大 校准集不具代表性,或预处理不对齐 第三步 孤立敏感层型 中部某层突然跳水,前后层正常 该层对量化敏感(常见 Concat/注意力) 第四步 检测头跳变型 末端检测头/输出层差异大 后处理解码或 NMS 不对齐 第五步) |
| 孤立敏感层型 | 中部某层突然跳水,前后层正常 | 该层对量化敏感(常见 Concat/注意力) | [第四步](#形态 特征 根因 修复路径 浅层累积型 前几层相似度就低,逐层放大 校准集不具代表性,或预处理不对齐 第三步 孤立敏感层型 中部某层突然跳水,前后层正常 该层对量化敏感(常见 Concat/注意力) 第四步 检测头跳变型 末端检测头/输出层差异大 后处理解码或 NMS 不对齐 第五步) |
| 检测头跳变型 | 末端检测头/输出层差异大 | 后处理解码或 NMS 不对齐 | [第五步](#形态 特征 根因 修复路径 浅层累积型 前几层相似度就低,逐层放大 校准集不具代表性,或预处理不对齐 第三步 孤立敏感层型 中部某层突然跳水,前后层正常 该层对量化敏感(常见 Concat/注意力) 第四步 检测头跳变型 末端检测头/输出层差异大 后处理解码或 NMS 不对齐 第五步) |
看报告的诀窍
先扫一遍找"跳水层"(相似度骤降的位置),再往前回溯 2~3 层看是累积还是突变。突变基本就是那一层的问题,累积则要回到输入端查。
03 第三步:预处理对齐修复
这是掉点的头号原因。必须做到 PC 端与板端"逐像素一致"。
❌ 90% 的精度暴跌源于此
很多新手跑通转换,INT8 后 mAP 掉 10% 以上,几乎都是校准集或预处理不对齐导致。按下面四个点逐一核对,基本能把损失控制在 1% 以内。
3.1 核对归一化参数 mean / std
rknn.config 的 mean/std 必须与训练时 transforms.Compose 完全一致。YOLO 系列通常不做 mean 减法,只做 /255,所以 std=255、mean=0。
python
# YOLO 标准预处理:pixel / 255,无 mean 减法
# 对应 rknn.config 写法:
rknn.config(
mean_values=[[0, 0, 0]], # 不减均值
std_values=[[255, 255, 255]], # 除以 255
target_platform='rk3588'
)
⚠️ 易错点
如果训练时用了 ImageNet 的 mean=0.485,0.456,0.406、std=0.229,0.224,0.225,RKNN 里也要按同样数值换算成 0~255 尺度填入,否则通道整体偏移。
3.2 统一颜色空间 RGB / BGR
YOLO 训练默认 RGB ,但 OpenCV 读图默认 BGR 。板端推理前必须做 cv2.cvtColor(img, cv2.COLOR_BGR2RGB),否则 R/B 通道颠倒,精度直接崩。
✅ 推荐做法
全流程统一用 RGB,从训练、导出、转换到板端推理,颜色空间顺序写进配置文件管理,避免靠人记忆。
3.3 对齐 Letterbox 缩放
Letterbox 是 YOLO 保持长宽比的缩放填充,PC 端和板端必须用完全相同 的算法,并记录缩放比例 ratio 和填充边 pad,供后处理坐标还原使用。
python
# letterbox_safe.py
# 危险写法(YOLOv8 习惯,auto 会动态改变输出尺寸)
letterbox = LetterBox(new_shape=640, auto=True)
# 安全写法(YOLO11 / RKNN 部署必须)
letterbox = LetterBox(
new_shape=(640, 640), # 显式固定尺寸
auto=False, # 关闭 auto,保证输入 shape 固定
scale_fill=False,
stride=32 # 必须是 32 的倍数
)
3.4 重做校准数据集
校准集直接决定量化质量。官方建议 500~1000 张,且必须覆盖真实部署场景。
bash
# build_dataset.sh
# 生成 dataset.txt,每行一张图片的绝对路径
find /data/calib_imgs -name "*.jpg" > dataset.txt
wc -l dataset.txt # 确认数量在 500~1000
校准集选取原则:
- 覆盖白天 / 夜间 / 黄昏等不同光照
- 包含遮挡、运动模糊、密集目标等难例
- 包含小目标场景(小目标最易被量化截断)
- 类别分布与实际部署比例一致,不要只挑易识别的
- 来源与验证集不同(避免过拟合校准)
3.5 复测验证
修完预处理后重新转 INT8,跑验证集。若 mAP 损失已 ≤ 1%,直接进入验收;否则回到第二步重新做 accuracy_analysis,看是否还有孤立敏感层。
04 第四步:混合量化修复
对 accuracy_analysis 定位的敏感层单独保留 FP16,主干仍走 INT8,兼顾速度与精度。
4.1 识别敏感层
从第二步的报告里挑出 cos_similarity < 0.95 的层。YOLO 中常见的敏感层包括:
- 检测头最后两层卷积(Conv_198 / Conv_205 这类命名)
- 注意力模块(如 C2f 中的注意力分支)
- Concat 后的层(多分支特征融合处易失真)
- 末端 1x1 卷积(通道数大,量化噪声放大)
4.2 配置混合量化
通过 rknn.config 的 quantized_dtype 和排除参数,让敏感层保留高精度,其余层走 INT8。
python
# hybrid_quant.py
rknn = RKNN()
rknn.config(
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
target_platform='rk3588',
quantized_dtype='w8a8', # 权重激活都 INT8
quantized_method='channel', # 逐通道量化,精度更高
quantized_algorithm='mmse', # 比 kl_divergence 通常更好
optimization_level=3
)
rknn.load_onnx(model='best.onnx')
# 混合量化:指定敏感层不参与 INT8,保留 FP16
rknn.build(
do_quantization=True,
dataset='./dataset.txt',
rknn_batchsize=-1
)
# 敏感层排除的具体写法依赖 toolkit2 版本,
# 新版通过 rknn.config 的 quantized_dtype_attribute 或
# build 的 extra_layer_config 指定,详见官方文档。
✅ 分层策略经验值
"检测头 / 注意力用 FP16,主干用 INT8"是最常用的分层方式,能显著缓解小目标漏检,同时保持整体推理速度。
4.3 切换量化算法
如果混合量化后仍差一点,试试切换量化算法。默认 kl_divergence,换成 mmse(最小均方误差)通常能再回收 0.3~0.8% mAP。
| 算法 | 特点 | 适用 |
|---|---|---|
kl_divergence |
基于 KL 散度,理论严谨 | 分布近似正态的场景 |
mmse |
最小均方误差,直接优化输出误差 | ✅ 推荐优先尝试 |
moving_average |
滑动平均,稳定但精度一般 | 分布波动大的场景 |
05 第五步:后处理对齐修复
NMS、解码逻辑、坐标还原三处不一致,会让"模型本身没掉点"却表现为漏检、错框。
⚠️ 典型症状
accuracy_analysis 每层相似度都 > 0.99,但最终检测框数量明显变少或位置偏移------这种情况 99% 是后处理不对齐。
5.1 对齐 NMS 阈值
端到端模型自带的 NMS 与 Torch 版实现常有差异。手动对齐以下参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Score Threshold | 0.001 |
与训练一致,过滤前保留低分框 |
| IoU Threshold | 0.45 ~ 0.5 |
NMS 去重阈值 |
| Max Output Boxes / Class | 300 |
设合理上限避免截断 |
| Conf Threshold(最终) | 0.25 ~ 0.45 |
推理时最终过滤阈值 |
✅ 阈值临界排查技巧
对比同一张图 Float 与 Int8 的原始 Score。若只差 0.03 却一个有框一个无框,是 conf 阈值过临界,适当下调(如 0.5→0.45)即可恢复。
5.2 对齐解码逻辑
raw-head 输出需自行解码。必须严格按官方 Detect.forward 重写解码器,特别注意 meshgrid 的 NumPy 等价实现和 grid stride。
python
# decode_head.py
import numpy as np
def decode_yolov8_head(output, strides=[8, 16, 32]):
"""YOLOv8 raw head 解码,需与官方 forward 严格对齐"""
# output shape: [1, 4+nc, 8400] (YOLOv8 无 anchor)
boxes, scores = [], []
for i, stride in enumerate(strides):
# 生成 grid 坐标,等价于 torch.meshgrid
gx, gy = np.meshgrid(
np.arange(feature_w), np.arange(feature_h), indexing='xy'
)
# 解码 xywh → xyxy
xywh = output[..., 0:4]
xyxy = xywh2xyxy(xywh, gx, gy, stride)
boxes.append(xyxy)
scores.append(output[..., 4:])
return np.concatenate(boxes), np.concatenate(scores)
5.3 坐标还原回原图
raw-head 输出的框坐标在 letterbox(640×640)空间,画回原图必须反算缩放比和填充,否则框全跑偏。
python
# restore_coords.py
# letterbox 时记录的 ratio 和 pad
# x_orig = (x_lb - pad_x) / ratio
# y_orig = (y_lb - pad_y) / ratio
def scale_boxes_back(boxes_lb, ratio, pad):
"""把 letterbox 空间的框还原到原图空间"""
boxes_orig = boxes_lb.copy()
boxes_orig[:, 0] = (boxes_lb[:, 0] - pad[0]) / ratio # x1
boxes_orig[:, 1] = (boxes_lb[:, 1] - pad[1]) / ratio # y1
boxes_orig[:, 2] = (boxes_lb[:, 2] - pad[0]) / ratio # x2
boxes_orig[:, 3] = (boxes_lb[:, 3] - pad[1]) / ratio # y2
return boxes_orig
✅ 端到端 vs raw-head
端到端模型自带 NMS 会自己做坐标还原;如果用 raw-head(推荐,精度更稳),就必须自己补上这步。漏掉这步是"框全跑偏"的元凶。
5.4 推荐:移除模型内 NMS,用外部后处理
INT8 量化时,模型内 NMS 算子量化损失大且 RKNN 支持不稳定。官方推荐做法是移除模型内 NMS,改用外部后处理(Model Zoo 风格),精度和速度都更稳。
✅ 直接用官方后处理代码
Rockchip SDK 提供 C++ 后处理工具(带 NEON 优化),直接复用比自己重写更省心且更快。在 rknn_model_zoo 对应 YOLO 版本目录下可找到。
06 第六步:QAT 量化感知训练
PTQ 调优后仍超阈值的兜底方案。在训练侧插入伪量化节点,让模型提前适应量化噪声。
6.1 何时启用 QAT
当第三~五步都做完,INT8 损失仍 > 1% 时启用。QAT 典型能比 PTQ 再回收 0.5~1.5% mAP,尤其改善小目标漏检(浅层特征被量化截断为 0 的问题)。
6.2 用 Ultralytics 原生 QAT
Ultralytics v8.3.123 起原生支持 Rockchip INT8 导出,可直接在训练侧插入量化感知,无需手动改网络。
bash
# qat_train.sh
# 1. 升级 ultralytics 到支持 RKNN INT8 的版本
pip install -U ultralytics
# 2. 用 QAT 微调(基于已有 best.pt 继续训练,少量 epoch)
yolo detect train model=best.pt data=your_data.yaml \
epochs=20 imgsz=640 \
int8=True batch=16
# 3. 导出 RKNN INT8 模型
yolo export model=best_qat.pt format=rknn \
name=rk3588 int8=True data=your_data.yaml
⚠️ QAT 注意事项
QAT 需要训练环境与数据,耗时比 PTQ 长得多。务必在 PTQ 调到极限后再考虑。微调 epoch 不用太多(15~30),学习率调低(原训练的 1/10),避免破坏已学特征。
6.3 BN Folding 别忘了开
转换时开启 Batch Normalization Folding,把 BN 折叠进卷积,提升 NPU 兼容性并减少量化误差。
07 验收标准与回归
每一步都要用同一套验证集 + 同一套后处理代码端到端复测,而非只看模型单层输出。
| 阶段 | 验收指标 | 目标值 | 不达标怎么办 |
|---|---|---|---|
| FP16 RKNN | mAP@0.5 vs ONNX | ✅ 损失 < 0.5% | 查预处理/算子 |
| INT8 PTQ(初版) | mAP@0.5 vs ONNX | ⚠️ 损失 ≤ 2% | 进入逐层诊断 |
| INT8 PTQ(调优后) | mAP@0.5 vs ONNX | ✅ 损失 ≤ 1% | 基本可部署 |
| QAT 后 | mAP@0.5 vs ONNX | ✅ 损失 ≤ 1% | 已达极限 |
| 板端实测 | 同图 Score 差异 | ✅ < 0.05 | 查 librknnrt 版本 |
| 推理速度 | 单帧耗时 | 见平台基准 | 查是否落到 NPU |
✅ 回归测试要点
务必保留一套"黄金验证集"和固定版本的后处理代码,每次调优后用同一套跑。否则指标波动分不清是模型变化还是评测变化。
执行顺序速记
整个调优的推荐执行顺序,严格按此走通常 2~3 轮即可收敛:
# 调优黄金顺序
校准集重做 → 预处理对齐 → accuracy_analysis 定位
↓
混合量化(敏感层 FP16) → 后处理对齐 → QAT 兜底
↓
每步复测 mAP,收敛到 ≤ 1% 即可部署
08 常见问题速查
新手最常踩的坑,按现象快速定位。
Q:INT8 量化后 mAP 掉了 10% 以上,商品全认错,从哪查起?
A:90% 是校准集不行或预处理没对齐。第一步先重做校准集(500~1000 张覆盖真实场景),第二步核对 mean/std/BGR-RGB/letterbox 三项。这两步基本能把暴跌压到 1% 以内。
Q:FP16 就掉点了,但 accuracy_analysis 每层相似度都 > 0.99?
A:模型本身没问题,问题在后处理。检查 NMS 阈值、解码逻辑、坐标还原(尤其 letterbox 的 ratio/pad 是否正确传到后处理)。
Q:PC 上仿真精度正常,板端实测却掉点?
A:检查 toolkit2 与板端 librknnrt 版本是否配套,不一致会出现算子回退到 CPU 或结果异常。用 rknn.query 确认平台字符串与板子型号一致。
Q:小目标大量漏检,大目标正常?
A:浅层特征被量化截断为 0。方案:对浅层/检测头做混合量化保留 FP16;或启用 QAT;或增加轻量级注意力模块增强小目标上下文感知。
Q:转换直接报错"算子不支持"?
A:用了 RKNN 不支持的魔改算子(自定义注意力、魔改卷积)。改用官方标准结构,或用 RKNN API 注册自定义算子插件。优先用 rknn_model_zoo 对应版本的转换脚本。
Q:框的位置全偏了,但检测到的类别对?
A:坐标还原没做或做错了。raw-head 输出在 letterbox 空间,必须用 x_orig = (x_lb - pad_x) / ratio 还原回原图。端到端模型自带这步,自己解码必须补上。
Q:Float 和 Int8 的 Score 只差 0.03,但一个有框一个没框?
A:conf 阈值设得过于临界。适当降低推理时的置信度阈值(如 0.5 → 0.45),观察该类别是否重新出现。
Q:kl_divergence 和 mmse 哪个好?
A:没有绝对优劣,但 mmse(最小均方误差)直接优化输出误差,在 YOLO 上通常比 kl_divergence 回收 0.3~0.8% mAP,建议优先尝试 mmse。
09 完整配置模板
一键复制即用的转换脚本模板,整合了本手册所有最佳实践。
python
# convert_rknn_full.py
# -*- coding: utf-8 -*-
"""YOLO → RKNN 完整转换模板(整合最佳实践)
适用:YOLOv5 / YOLOv8 / YOLOv11,RK3566/3568/3588/3576
"""
from rknn.api import RKNN
import os
# ============ 1. 配置区(按你的情况改) ============
ONNX_PATH = './best.onnx'
DATASET_PATH = './dataset.txt' # 500~1000 张校准图路径列表
PLATFORM = 'rk3588' # rk3566 / rk3568 / rk3576 / rk3588
OUTPUT_FP16 = './best_fp16.rknn'
OUTPUT_INT8 = './best_int8.rknn'
# ============ 2. 创建 RKNN ============
rknn = RKNN(verbose=True)
# ============ 3. 预处理配置(必须与训练一致) ============
rknn.config(
mean_values=[[0, 0, 0]], # YOLO 标准:不减均值
std_values=[[255, 255, 255]], # YOLO 标准:除以 255
target_platform=PLATFORM,
quantized_dtype='w8a8', # 权重激活都 INT8
quantized_method='channel', # 逐通道量化
quantized_algorithm='mmse', # 推荐:比 kl_divergence 更好
optimization_level=3 # 最高优化级别
)
# ============ 4. 加载 ONNX ============
ret = rknn.load_onnx(model=ONNX_PATH)
assert ret == 0, f"加载 ONNX 失败: {ret}"
# ============ 5. 先转 FP16 建基线 ============
print("--> 转换 FP16(不量化,建基线)")
ret = rknn.build(do_quantization=False)
assert ret == 0, f"FP16 build 失败: {ret}"
rknn.export_rknn(OUTPUT_FP16)
print(f"--> FP16 模型已保存: {OUTPUT_FP16}")
# ============ 6. 重新配置并转 INT8 ============
rknn.release()
rknn = RKNN(verbose=True)
rknn.config(
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
target_platform=PLATFORM,
quantized_dtype='w8a8',
quantized_method='channel',
quantized_algorithm='mmse',
optimization_level=3
)
rknn.load_onnx(model=ONNX_PATH)
print("--> 转换 INT8(量化)")
ret = rknn.build(
do_quantization=True,
dataset=DATASET_PATH,
rknn_batchsize=-1
)
assert ret == 0, f"INT8 build 失败: {ret}"
rknn.export_rknn(OUTPUT_INT8)
print(f"--> INT8 模型已保存: {OUTPUT_INT8}")
# ============ 7. 逐层精度分析(可选) ============
print("--> 运行 accuracy_analysis")
rknn.accuracy_analysis(
inputs=['./calib_imgs/0001.jpg'],
output_dir='./accuracy_report'
)
rknn.release()
print("全部完成,请检查 accuracy_report/accuracy_analysis.html")
使用方法
把上面的脚本保存为
convert_rknn_full.py,修改顶部配置区的三个路径和平台名,然后python convert_rknn_full.py一键跑完 FP16 基线 + INT8 量化 + 精度分析三件事。
参考资料
- 【RK3588S 嵌入式AI系列⑥】量化精度评估与调试:accuracy_analysis 深度实战
- RK3588 模型精度掉点别慌!手把手教你用 RKNN Toolkit2 的 accuracy_analysis 工具精准定位问题层
- 【无人售货柜・RK+YOLO】篇 5:RK3576 部署第一步!YOLO 模型转 RKNN 全流程,新手必避的量化大坑
- YOLOv8 Implementation and Quantization: From Training to Edge Deployment
- 深入 RKNN 混合量化:当 YOLOv8 在 RV1126 上精度损失过大时,我是如何逐层调优的
- 我在 INT8 量化中遇到的问题,解决过程让我收获颇丰
- YOLOv11 转 RKNN 模型后推理结果异常?
- YOLOv5 转 RKNN 模型后精度下降如何解决?
- YOLO 模型转 RKNN 后总丢框、乱框,到底是哪一环没对齐?
- RK3588 部署 YOLO:ONNX 转换、CPU 算子判断与处理实战
- YOLO 模型转换 RKNN 后推理结果异常,常见原因有哪些?
- YOLOv11 跟踪模型 RKNN 部署后准确率下降?
- YOLO11 目标检测踩坑记:这些错误千万别犯
- Radxa Docs:Convert Custom Trained YOLO Models
- Ultralytics v8.3.123:INT8 RKNN Exports
- rknn_model_zoo --- Quantization
- RDK 量化工具每层预选相似度都是 0.97 以上,但是量化前后置信度分数相差 0.6 左右
- yolov5.rknn 在线转 yolov5.gt 时模型精度下降如何解决?
- How to Deploy YOLOv8 on RK3566
- YOLOv8 量化实战:5 步实现 RK3588 上 INT8 高效推理,精度性能双提升秘籍