rdk x5使用model_zoo 量化部署yolo26,几乎无法使用

我来帮你分析这个问题。从日志看,量化过程中有几个节点的 Cosine Similarity 较低,这可能是导致检测性能下降的关键原因。

先搜索一下社区是否有类似的 YOLO 量化问题:

问题分析

根据你的日志,核心问题是量化后 cls 输出分布异常

阶段 cls 输出范围 问题
ONNX [-229, 82] :white_check_mark: 正常
量化后 [-14, -0.1] :cross_mark: 全为负值且范围极窄

量化后 cls 输出经过 sigmoid 后置信度约为 0.0001-0.47,大量目标被阈值过滤。


排查步骤

步骤 1:检查输入格式一致性

最关键:确认训练、导出、量化三阶段的输入格式完全一致。

# 检查你的训练预处理代码
# 关键问题:训练时用 RGB 还是 BGR?是否除以 255?

# 查看 mapper.py 默认配置
cd rdk_model_zoo/samples/vision/ultralytics_yolo26/conversion
grep -A 10 "input_type" mapper.py

常见错误

  • 训练用 RGB,量化配置用 BGR
  • 训练时已除以 255,量化时又重复归一化

步骤 2:使用官方校准数据集测试

先用仓库自带的 cal/ 目录测试,排除校准数据问题:

cd rdk_model_zoo/samples/vision/ultralytics_yolo26/conversion

# 使用官方示例校准数据重新量化
python mapper.py \
  --onnx ./best26n.onnx \
  --cal-images ./cal/ \
  --cal-sample-num 100 \
  --output-dir ./test_quant

# 验证输出分布
./inference.sh ./test_quant/best26n.bin ./cal/frame_000118.jpg

预期输出(正常):

output[0]: shape=(1, 80, 80, 9), min=-200, max=80  # cls
output[1]: shape=(1, 80, 80, 4), min=-5, max=30   # box

步骤 3:检查量化配置参数

创建显式配置文件 yolo26_config.yaml

model:
  model_name: "yolo26n"
  input_type: "rgb"  # ⚠️ 必须与训练时一致
  input_type_rt: "rgb"
  normalization: [0.0, 1.0, 0.0, 1.0, 0.0, 1.0]
  mean: [0, 0, 0]
  std: [255, 255, 255]  # 训练时如果除以255,这里也要对应
  input_shape: [1, 3, 640, 640]

quantization:
  method: "default"
  calibration_dataset: "./cal/"
  calibration_size: 200  # 增加到200张
  batch_size: 1

compiler:
  target_chip: "x5"
  optimization_level: 2

重新量化:

python mapper.py \
  --config yolo26_config.yaml \
  --onnx ./best26n.onnx

步骤 4:临时验证(降低阈值)

如果急需测试,大幅降低置信度阈值验证是否是置信度问题:

# 修改 detect.py 或你的推理代码
score_thres = 0.05  # 从 0.25 降到 0.05
nms_thres = 0.5

# 如果降低阈值后检测数量明显增加
# 说明是量化导致置信度整体偏低

步骤 5:尝试跳过 YOLO Head 量化

如果上述步骤无效,尝试跳过输出层量化:

quantization:
  # 添加跳过层(根据实际模型结构调整)
  skip_layers: [
    "model.23/one2one_cv2.2/one2one_cv2.2.2/Conv",
    "model.23/one2one_cv3.2/one2one_cv3.2.2/Conv"
  ]

快速验证清单

检查项 命令/位置 预期值
训练输入格式 检查训练代码 RGB 或 BGR
量化 input_type mapper.py 或 yaml 与训练一致
归一化参数 训练 vs 量化配置 只归一化一次
校准数据数量 `ls cal/*.jpg wc -l`
校准数据质量 覆盖多种场景 光照/角度/大小多样
量化后输出范围 inference.sh 验证 cls: [-200, 100]

参考资源


建议

  1. 先用官方预训练模型跑通全流程,确认环境没问题
  2. 校准数据用训练集的一部分(200 张),不要用测试集
  3. 对比输出范围:官方模型量化后 vs 你的模型量化后
  4. 如果问题仍未解决,请补充:
    • 训练时的预处理代码片段
    • 完整的量化命令和配置文件
    • 量化前后的输出范围对比

社区已有多个类似案例,基本都是输入格式不一致校准数据问题导致的。