RDK x5量化st-gcn后效果失真,应该怎么修改

根据你提供的信息,量化流程在 HB_ONNXRuntime 测试阶段正常,但板端 .bin 模型效果严重失真(top5 类别和 logits 都完全不同)。这是典型的量化部署一致性问题

核心结论

问题大概率出在以下三个环节之一:

  1. 校准数据格式/预处理不一致(最可能)
  2. 板端推理代码数据处理错误
  3. 模型编译参数或版本不匹配

排查步骤(按优先级)

步骤 1:使用 hb_verifier 工具验证一致性

这是最关键的一步,可以直接定位是量化问题还是部署问题。

# 在 x86 环境(量化所在的 Docker)执行
hb_verifier -m stgcn_x5_quantized.onnx,stgcn_x5.bin \
  -b <板子IP地址> \
  -s True \
  -i <你的校准数据路径> \
  -c 5 \
  -r True

参数说明:

  • -s True: 同时在 x86 模拟器上运行 bin 模型
  • -r True: 输出所有节点的对比结果(定位具体哪一层开始失真)
  • -c 5: 比较小数点后 5 位
  • -i: 必须使用和量化时相同的校准数据

预期结果:

  • 如果显示 Strict check PASSED:说明模型本身没问题,问题在板端推理代码
  • 如果显示 Check FAILED:说明量化/编译环节有问题,查看 -r True 输出的节点对比日志

步骤 2:检查校准数据格式

你的 YAML 配置中:

calibration_parameters:
  cal_data_dir: '/data/save-1'
  cal_data_type: 'float32'
  input_type_rt: 'featuremap'
  input_type_train: 'featuremap'

关键检查点:

  1. 校准数据是否真的是 float32 的 featuremap 格式?

    import numpy as np
    data = np.fromfile('/data/save-1/xxx.bin', dtype=np.float32)
    print(data.shape)  # 应该是 (1, 3, 32, 18) 或 (3, 32, 18)
    
  2. 校准数据是否和训练/测试数据分布一致?

    • ST-GCN 是骨骼点模型,校准数据应该是归一化后的骨骼点坐标
    • 如果校准数据是原始像素坐标或未归一化,会导致量化参数计算错误
  3. 校准数据数量是否足够?

    • 建议至少 100 帧以上,覆盖各种动作场景

步骤 3:检查板端推理代码

从你的日志看,板端输入输出信息:

input shape : (1, 3, 32, 18)
input dtype : float32
output shape : (1, 400, 1, 1)
output dtype : float32

常见错误:

  1. 输入数据未正确归一化

    // 错误示例:直接使用原始骨骼点坐标
    float* input_data = skeleton_points;  // 可能是像素坐标
    
    // 正确做法:应该和训练时一致的归一化
    for(int i=0; i<32*18; i++) {
        input_data[i] = (skeleton_points[i] - mean[i]) / std[i];
    }
    
  2. 数据 Layout 错误

    // 确认是 NCHW 格式
    // 如果板端代码按 NHWC 填充数据,会导致结果完全错误
    
  3. 未使用正确的推理接口

    // featuremap 模型应该用 hbDNNInferFeatureMap 或设置正确的 input_type
    // 不要用处理图像的接口
    

步骤 4:使用 hrt_model_exec 验证板端推理

在板子上直接用地平线官方工具推理,排除自己代码的问题:

# 在板子上执行
hrt_model_exec infer \
  --model_file=stgcn_x5.bin \
  --input_file=<你的测试数据.bin> \
  --enable_dump 1 \
  --dump_format txt \
  --dump_precision 9

然后对比输出和 HB_ONNXRuntime 的结果。


步骤 5:检查工具链版本

从日志看:

BPU Platform Version(1.3.6)
Runtime version = 3.15.55.0
DNN Runtime version = 1.24.5
Model builder version = 1.24.3

确认:

  • 量化用的 OE 包版本和板子上的 Runtime 版本是否匹配?
  • 建议升级到最新 OE 包重新量化(社区有多个案例显示版本不匹配会导致精度问题)

快速诊断流程图

quantized.onnx 正常 → bin 模型异常
         ↓
   运行 hb_verifier
         ↓
    ┌────┴────┐
    ↓         ↓
  PASSED    FAILED
    ↓         ↓
板端代码问题  量化/编译问题
    ↓         ↓
检查:     检查:
- 输入归一化  - 校准数据格式
- 数据 Layout  - 校准数据分布
- 推理接口    - YAML 配置
- 后处理     - 工具链版本

建议的下一步行动

  1. 立即执行 hb_verifier -r True,查看具体哪一层节点开始失真
  2. 提供 verifier 的输出日志(特别是节点对比结果)
  3. 检查校准数据:用 Python 加载几个样本,确认数值范围和分布
  4. 如果 verifier 通过:提供板端推理代码的关键部分(输入数据处理部分)

相关社区资源

请先运行 hb_verifier 并贴出结果,这样可以更精准定位问题。