我们在准备今年的FPGA大赛,用的安路FPGA做实时车牌识别,模型是YOLOv5n。训练时精度有92%,但INT8量化后直接掉到68%,车牌小目标基本检测不到了。试过PTQ默认的MinMax校准,效果很差。想请教各位,除了QAT量化感知训练,还有哪些低成本的校准方法能快速把精度拉回85%以上?比如改进校准集的选择策略、用KL散度或者百分位截断之类的,具体流程和代码思路是什么?
2026年FPGA大赛,用安路FPGA做实时车牌识别,INT8量化后精度掉到68%,除了QAT还有哪些低成本校准方法能快速提升?
5 个回答

先别急着上复杂的统计方法,把校准集换掉往往是最便宜的提速。你现在的校准集如果是从训练集里随机抽的,大概率小目标样本太少,MinMax 被大目标的极端值带偏。建议从验证集里按类别和尺寸分层抽 200~500 张,保证每张图里至少有一个车牌宽高小于 32 像素的实例。然后跑一遍 PTQ,只看小目标那一类的 mAP 变化。如果还不行,再试百分位截断,比如把激活值分布按 99.9% 截断,代码上就是 torch.quantile(act, 0.999) 代替 max。这个改动小,半天就能验证。你们现在校准集是怎么选的?

其实你这个问题核心是激活值分布的长尾效应,车牌这类小目标的特征图响应值普遍偏低,MinMax 会把量化步长拉大,小目标的激活值就被压成 0 了。除了换校准集,我建议你试试逐层看分布,别全局一刀切。具体做法是:导出每层激活值的直方图,找那些分布拖尾特别长的层,单独用 99.9% 百分位截断,其他层保持 MinMax。安路的工具链一般来说支持 per-channel 量化,你可以先把卷积层的权重用 per-channel,激活用 per-tensor。还有个更省事的招:把前几层(比如 stem 和第一个 C3 模块)保留 FP16,后面的层才量化,因为浅层对边缘纹理敏感,量化损失最大。这个混合精度在安路的工程里常见做法是改量化配置文件,不用重训。风险是最终部署时 FPGA 上要同时支持两种精度,资源会多耗一点,但大赛应该够用。你们现在跑的是安路的哪个开发环境?

顺着你提到的 KL 散度往下说,我觉得这是性价比最高的方向,但很多人用错地方。PTQ 里的 KL 散度校准,本质是找一个阈值,让量化前后的信息损失最小,但它对分布尾部特别敏感。车牌检测这种任务,激活值分布往往是双峰的:背景像素贡献一大坨接近 0 的值,车牌区域则是一小撮高值。MinMax 把那一小撮高值拉得很宽,KL 散度又会为了照顾背景那坨而把阈值定得太低,把小目标的信息也砍了。所以我的建议是,别直接用默认的 2048 个 bin 的直方图,先做一步预处理:把激活值按绝对值排序,取前 5% 的值的均值作为参考,手动调 KL 的搜索范围,比如只搜 50% 到 99.99% 的百分位区间。这样能强制阈值往高值方向靠。另外,你说训练精度 92%,量化后 68%,这个掉点幅度有点大,我怀疑不只是校准方法的问题,可能 BN 层的折叠也影响了分布。你可以在量化前先做一次 BN 统计修正,就是把 BN 的 running_mean 和 running_var 重新在训练集上跑一遍,再冻结。安路的工具链一般支持这个选项,叫 calibrate_bn 或者类似的名字。如果这些做完还是到不了 85%,那确实得考虑对最后两层检测头单独做混合精度。我去年做过类似的车牌识别,最后是校准集里加了 30% 的夜间和雨雾样本,加上 99% 百分位截断,从 71% 拉到了 88%。你们现在用的是什么量化位宽,8bit 还是混合 8/16?这会影响我上面说的截断策略。

先别把 QAT 当唯一出路,你八成是栽在校准集太干净了。随机抽 200 张训练图,里面车牌大多是正对、光照均匀的,MinMax 就被那些极端高亮或模糊样本带偏。从验证集里按距离和角度分层抽,保证每张图里至少有一个车牌宽度小于 32 像素,再用百分位 99.9% 截断激活值,半天就能看出变化。你现在的校准集是从哪抽的?

个人感觉你这掉点不是量化方法单一的问题,而是小目标激活值在 INT8 下直接被抹平了。YOLOv5n 的检测头输出层对低响应值特别敏感,MinMax 把步长拉大后,那些只有几十的激活值全变 0。我建议你分两步走:第一步,把校准集改成混合场景,专门加一些逆光、夜间和远距离车牌,让分布尾部更真实;第二步,别全局用同一种校准,导出每层激活直方图,找出拖尾特别长的层(一般是浅层和检测头),对它们单独用 99.9% 百分位,其余层保持 MinMax。安路工具链支持 per-layer 配置,改个 yaml 就行,不用重训。如果这样还掉到 80 以下,就把第一层卷积和最后一个检测头保留 FP16,混合精度部署在 FPGA 上多占一点 DSP,但换来 5 个点以上的精度,大赛完全值得。你先跑一版分层校准看看,检测头那几层是不是最惨的?
发表回答
登录后可在本页底部提交回答