我们团队在2026年FPGA大赛上用安路FPGA做实时车牌识别,YOLOv8n模型INT8量化后mAP从92%掉到了75%,主要是小字符和模糊车牌识别不准。请教一下,用QAT(量化感知训练)加知识蒸馏,具体学习率怎么设置?蒸馏温度取多少合适?校准集需要多少张图片才能稳定?求大佬分享实际调参经验。
2026年FPGA大赛用安路FPGA做实时车牌识别,YOLOv8n模型量化后精度掉到75%,怎么用QAT和知识蒸馏恢复到85%以上?求具体调参步骤
6 个回答

先说你最关心的几个数字:初始学习率1e-4,蒸馏温度建议从4开始试,校准集至少500张不同场景的车牌图片,而且一定要包含模糊和倾斜样本。但只给参数不说原因等于白给。关键坑在于:你直接对全模型做QAT大概率还是救不回小字符,因为INT8量化对卷积层的激活分布敏感,而车牌字符这种高频细节恰好集中在浅层特征图。我建议你分两步走——先用蒸馏把教师模型(比如YOLOv8m或者大一点的版本)的知识通过KL散度迁移到学生模型(你的YOLOv8n),蒸馏温度设在5左右,蒸馏损失权重给0.4,等学生模型在FP32精度恢复到89%以上再冻结BN层做QAT。QAT阶段不要把学习率开太大,1e-4是安全的,但要注意用余弦退火衰减到1e-6,同时在校准集里混入10%的纯字符裁剪图,让量化感知到字符边缘的分布。还有一个容易忽视的地方:安路FPGA的NPU对量化粒度有约束,一般要求每通道量化或per-tensor量化,你把QAT训练好的模型导出时一定要确认量化参数是否被正确冻结,否则推理时会被重新校准导致精度回退。最后说句实在的,75%到85%这个跨度不轻松,如果时间紧优先保模糊车牌的召回率,小字符可以用后处理加字符级置信度阈值来补。你们目前是用的安路哪一款芯片?有些型号的NPU对8bit对称量化支持更友好,调参方向会不一样。

核心矛盾是:你量化后精度掉在小字符和模糊车牌上,说明量化感知训练没有充分覆盖这些难例的激活分布。常规做法是先用蒸馏把教师模型的软标签拉高学生模型对边缘特征的敏感度,蒸馏温度取4到6之间,用网格搜索跑几个epoch就能确定最佳值。校准集光有500张还不行,得确保里面有三分之一的样本是字符被遮挡或光照不均的车牌,否则量化校准只会优化常见样本的分布。QAT阶段的学习率从1e-4开始,每10个epoch衰减到1e-6,同时把蒸馏损失和QAT损失按0.3对0.7加权合并训练。另外注意安路FPGA的量化工具链在导出时可能会重新统计激活值,建议在QAT训练完成后手动固定所有量化节点的scale和zero_point,避免工具链自作主张。你们现在推理时用的是安路自己的量化工具还是第三方框架?这个会影响你后续调参的迭代速度。

你们现在遇到的问题,本质上不是QAT参数没调对,而是量化感知训练和蒸馏两个环节没有针对安路FPGA的INT8推理特性做协同优化。YOLOv8n在92%的mAP下,小字符和模糊车牌的特征图激活值分布一定是非常尖锐的——也就是说,大部分激活值集中在很小的数值范围,但偶尔几个大激活值会拉大量化步长,导致精度崩溃。
我的建议是:先别急着调学习率或蒸馏温度,第一步先把校准集的组成改一改。安路工具链在校准阶段默认使用KL散度来统计激活分布,如果你的500张图片里正常光照、大字符车牌占了多数,那KL散度会优先拟合那些常见分布的尾巴,而小字符和模糊车牌那些本就很窄的分布根本不会被优化。你至少需要把校准集扩大到800到1000张,并且保证其中30%是字符被遮挡、倾斜超过15度或者夜间低光照的车牌。这些难例的激活分布和常见样本差异很大,光靠QAT训练时去纠正,收敛速度太慢。
第二步才是蒸馏和QAT的分阶段训练。蒸馏阶段的目标不是让学生模型精度直接上去,而是让它的浅层特征图分布和教师模型对齐。这里有个容易被忽略的细节:YOLOv8n的浅层卷积通道数少,蒸馏损失如果只加在输出层,浅层的细节信息根本传不过去。你应该在第一个C2f模块和检测头之前各加一个蒸馏损失,权重大概按0.2和0.8分配。蒸馏温度取5左右,但不要固定,用一个线性递增策略——前20个epoch从3升到6,这样前期强制拉近分布,后期允许学生模型保留一些自己的特性。
第三步才是QAT参数。初始学习率1e-4没问题,但余弦退火衰减到1e-6之后,建议再跑5个epoch的循环学习率,范围在1e-7到1e-5之间,让量化节点对难例的scale值有重新调整的机会。另外,安路工具链在导出时会重新统计激活值,你必须手动冻结所有量化节点的scale和zero_point,否则你训练的QAT权重等于白费。你们现在推理时用的是安路官方的模型转换工具,还是自己用Pytorch量化接口导出后再手动转?这会影响你后续能不能做循环学习率的控制。

安路FPGA的INT8推理对浅层激活分布特别敏感,光调QAT学习率没用,你得先保证校准集里小字符和模糊车牌占了至少三分之一,不然蒸馏和QAT都救不回来。

分阶段训练的关键顺序很多人搞反了。正确的做法是先做蒸馏,等学生模型在FP32下mAP稳定在88%以上之后,再冻结BN层去做QAT。蒸馏温度从4开始试,如果发现学生模型输出太软(和教师模型完全一致),就升到6;如果学生模型学不动,降到3或者4。校准集数量建议至少800张,而且必须包含不同倾斜角度、不同光照条件的车牌,否则量化时那些难例的激活分布根本不会被覆盖到。学习率用1e-4起步,每10个epoch衰减到1e-6,但要注意在QAT阶段不要对全模型做同样的学习率——把检测头部分的学习率设成其他层的1/10,因为检测头对量化误差更敏感,学习率太大反而会让它过拟合校准集。另外,安路工具链在导出时可能会重新统计激活值,建议在QAT训练完成后手动固定所有量化节点的scale,避免工具链自作主张改成全局最优分布而丢掉难例特征。你们现在有没有试过在蒸馏阶段加一个中心损失来约束字符类别的类内方差?这个对模糊车牌恢复精度挺有帮助的。

说实话,看到你们从92%掉到75%,我第一反应不是QAT参数没调对,而是觉得你们可能跳过了「先确认FP32精度能稳住」这个步骤。2026年大赛用安路FPGA,工具链对YOLOv8n的支持到什么程度了?安路这边量化工具在导出时有个老毛病:它会根据校准集重新统计每层的激活值min/max,如果你用了BN融合或者自定义OP,可能导致某些层的量化范围被工具链强行拉宽,小字符那种窄分布的细节就会被压扁。我的建议是,先别急着上蒸馏,第一步先做纯QAT基线——把校准集扩大到1000张,其中至少混入200张纯字符裁剪图(就是只取车牌文字区域,不要背景),学习率用1e-4,只跑10个epoch看能不能把75%拉到80%左右。如果连这个都做不到,说明问题不在蒸馏温度或权重比例,而在于你模型里某些层(比如浅层卷积)的激活值分布本身就太尖锐,INT8量化时那个大激活值把整个量化步长拉大了。这时候你要做的是在训练时加一个激活值裁剪约束,比如用torch的observer手动限制输出范围。另外,你们推理时用的是安路自己的量化工具链还是第三方框架?如果是安路原厂工具,建议查一下他们有没有对YOLOv8的Focus层或者C2f模块做特殊处理,这些模块在量化时经常被当作普通卷积处理,但实际对量化误差的放大效应不一样。追问一句:你们目前的校准集里,倾斜角度超过15度或者夜间低光照的车牌占多少比例?这个比例直接决定你后续调蒸溜温度是往4还是6靠。
发表回答
登录后可在本页底部提交回答