我来帮你分析这个问题。从日志看,量化过程中有几个节点的 Cosine Similarity 较低,这可能是导致检测性能下降的关键原因。
先搜索一下社区是否有类似的 YOLO 量化问题:
问题分析
根据你的日志,核心问题是量化后 cls 输出分布异常:
| 阶段 | cls 输出范围 | 问题 |
|---|---|---|
| ONNX | [-229, 82] |
|
| 量化后 | [-14, -0.1] |
量化后 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] |
参考资源
建议
- 先用官方预训练模型跑通全流程,确认环境没问题
- 校准数据用训练集的一部分(200 张),不要用测试集
- 对比输出范围:官方模型量化后 vs 你的模型量化后
- 如果问题仍未解决,请补充:
- 训练时的预处理代码片段
- 完整的量化命令和配置文件
- 量化前后的输出范围对比
社区已有多个类似案例,基本都是输入格式不一致或校准数据问题导致的。