YOLO 转 RKNN 识别率降低调优操作手册(新手篇)

YOLO 转 RKNN 识别率降低调优操作手册(新手篇)

面向第一次接触模型量化的新手工程师。按步骤执行,通常可在 2~3 轮迭代内把 INT8 量化后的 mAP 损失压到 1% 以内。每一步都给出可复制的命令、代码模板和验收检查点。

适用平台 :RK3566 / RK3568 / RK3588 / RK3576

适用模型 :YOLOv5 / YOLOv8 / YOLOv11

工具链 :rknn-toolkit2

更新于:2026-07


目录

  1. 开始前的准备清单
  2. 第一步:建立精度基线
  3. 第二步:逐层精度诊断
  4. 第三步:预处理对齐修复
  5. 第四步:混合量化修复
  6. 第五步:后处理对齐修复
  7. [第六步:QAT 量化感知训练](#第六步:QAT 量化感知训练)
  8. 验收标准与回归
  9. 常见问题速查
  10. 完整配置模板

整体决策流程

复制代码
拿到训练好的 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.configquantized_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 量化 + 精度分析三件事。


参考资料

  1. 【RK3588S 嵌入式AI系列⑥】量化精度评估与调试:accuracy_analysis 深度实战
  2. RK3588 模型精度掉点别慌!手把手教你用 RKNN Toolkit2 的 accuracy_analysis 工具精准定位问题层
  3. 【无人售货柜・RK+YOLO】篇 5:RK3576 部署第一步!YOLO 模型转 RKNN 全流程,新手必避的量化大坑
  4. YOLOv8 Implementation and Quantization: From Training to Edge Deployment
  5. 深入 RKNN 混合量化:当 YOLOv8 在 RV1126 上精度损失过大时,我是如何逐层调优的
  6. 我在 INT8 量化中遇到的问题,解决过程让我收获颇丰
  7. YOLOv11 转 RKNN 模型后推理结果异常?
  8. YOLOv5 转 RKNN 模型后精度下降如何解决?
  9. YOLO 模型转 RKNN 后总丢框、乱框,到底是哪一环没对齐?
  10. RK3588 部署 YOLO:ONNX 转换、CPU 算子判断与处理实战
  11. YOLO 模型转换 RKNN 后推理结果异常,常见原因有哪些?
  12. YOLOv11 跟踪模型 RKNN 部署后准确率下降?
  13. YOLO11 目标检测踩坑记:这些错误千万别犯
  14. Radxa Docs:Convert Custom Trained YOLO Models
  15. Ultralytics v8.3.123:INT8 RKNN Exports
  16. rknn_model_zoo --- Quantization
  17. RDK 量化工具每层预选相似度都是 0.97 以上,但是量化前后置信度分数相差 0.6 左右
  18. yolov5.rknn 在线转 yolov5.gt 时模型精度下降如何解决?
  19. How to Deploy YOLOv8 on RK3566
  20. YOLOv8 量化实战:5 步实现 RK3588 上 INT8 高效推理,精度性能双提升秘籍
相关推荐
木易 士心7 小时前
深度解析 Android 音频焦点处理与实战开发
android·音视频
祉猷并茂,雯华若锦8 小时前
Appium 3.x安卓APP企业级安装实战
android·appium
微露清风8 小时前
浅析 MySQL 索引
android·数据库·mysql
91刘仁德9 小时前
MySQL 数据类型详解
android·笔记·mysql·adb
编程圈子10 小时前
操作系统学习14 IDT + PIC + 键盘中断
android·学习·计算机外设
齊家治國平天下17 小时前
Android 14 Vehicle HAL (VHAL) 设计与实现深度解析
android·aaos·carservice·车载开发·android 14·vhal·vehicle hal
guo_xiao_xiao_18 小时前
YOLOv11道路桥梁裂缝与坑洼目标检测数据集
人工智能·yolo·目标检测
帅次19 小时前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable
AFinalStone1 天前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络