ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO26小目标AP上不去?三个核心死穴精准打击,工业场景实测涨3.7%

YOLO26小目标AP上不去?三个核心死穴精准打击,工业场景实测涨3.7% 最近在做PCB板缺陷检测的项目拿YOLO26-s训了一版大目标的焊盘、插件检测AP都能到95%以上偏偏针脚虚焊、微孔划痕这类20×20以下的小目标AP卡在27%死活上不去。调过anchor比例加过CBAM注意力把FPN层砍了又加折腾了两周最多涨了0.8个点一部署到Jetson Orin上还掉速严重。后来沉下心扒了YOLO26的训练源码和检测头逻辑才发现很多人改小目标的思路从一开始就错了——总想着在backbone和FPN上堆模块却忽略了YOLO26架构里三个针对小目标的天生短板。这三个问题不解决加再多注意力都是杯水车薪。今天就把我们团队踩了一个月坑总结出的优化方案分享出来从标签分配、特征融合到回归头全链路调整在我们的PCB缺陷数据集上小目标AP从27.1%涨到30.8%VisDrone小目标子集涨了3.7个点推理速度只掉了4%完全不影响端侧部署。死穴一标签分配的马太效应小目标抢不到正样本问题根源YOLO26主推的STAL标签分配对外号称是“小目标感知”但本质逻辑依然是按匹配度排序分配。对每个gt框计算所有anchor的分类得分定位得分按分数从高到低排取前k个当正样本。这套逻辑对大目标非常友好大目标特征强分类得分稳和anchor的IOU天然高永远排在队伍前面能分到足够的正样本。但小目标就惨了本身像素少、特征弱分类置信度低边界稍微模糊一点IOU就上不去得分天然比大目标低一截。更坑的是当大小目标在同一个grid附近重叠时有限的正样本配额全被大目标抢走小目标直接变成负样本。久而久之就形成了马太效应大目标正样本越来越多越训越准小目标连正样本都抢不到梯度信号不足越训越漏。精准打击方案我们没有推翻STAL的整体框架而是加了三个小改动专门给小目标“开小灶”小目标预分配优先权在标签分配的最前面先遍历所有gt框把宽高都小于32像素的目标挑出来优先给它们分配正样本每个小目标保底分配2个正样本。剩下的配额再按原有的STAL逻辑分配给中大型目标。核心逻辑就是先保小目标有汤喝再让大目标吃肉。邻域正样本扩充对小目标除了中心所在的grid额外把上下左右四个相邻grid也设为正样本同时适当降低IOU阈值从0.5降到0.3。小目标本身的梯度信号就弱多几个正样本训练收敛会稳很多也不容易出现漏检。动态面积加权损失在分类损失和回归损失前乘一个和目标面积负相关的权重系数目标越小权重越高最高放大3倍。强制模型把梯度重心往小目标偏移避免被大目标的损失主导。area(gt_w*gt_h).clamp(min1.0)weight(target_area/area).sqrt().clamp(max3.0)loss_cls*weight loss_reg*weight这三点改完不用动任何网络架构小目标的召回率直接涨了2个点是整个优化流程里投入产出比最高的一步。死穴二FPN特征融合的信息稀释小目标细节被淹没问题根源很多人以为FPN是用来增强小目标的但其实YOLO26的FPN对小目标非常不友好。YOLO26为了提升速度FPN只做了三次下采样和两次上采样融合小目标对应的P2层特征要经过两次上采样和P3、P4的深层特征融合后才送到检测头。深层特征的通道数多、语义强但分辨率低没有小目标的细节浅层特征细节足但通道少语义弱。两者直接相加融合的时候深层特征的数值幅度更大会直接把浅层的细节信息“盖过去”。说白了就是融合了一圈小目标的细节信息被稀释得差不多了到检测头的时候已经分不清哪是小目标哪是背景噪声。精准打击方案我们没有加额外的FPN层数而是做了两个轻量化的优化专门保留小目标的细节浅层特征旁路分支从backbone的P2层直接引出一条旁路经过两个3×3卷积做特征增强不经过FPN的上采样融合直接送到对应的小目标检测头。这条旁路只负责检测32×32以下的目标通道数设为原来的一半参数量增加很少但能完整保留浅层的细节信息小目标的边缘清晰度提升非常明显。动态加权融合把原来FPN里的直接相加改成通道级的动态加权融合对每个融合位置通过一层1×1卷积Sigmoid计算浅层特征和深层特征的权重自动调整融合比例。在小目标密集的区域浅层特征的权重会自动升高保留细节在大目标区域深层特征权重升高保证语义。整个模块的计算量可以忽略不计不会影响推理速度。改完之后可视化特征图能明显看到小目标的特征响应变强了之前很多模糊不清的微小缺陷现在都能被模型捕捉到。死穴三无DFL回归的精度断层小目标定位失准问题根源YOLO26最大的架构改动之一就是彻底拿掉了DFL分布焦点损失改用直接坐标回归。这个改动对部署非常友好少了很多复杂算子TensorRT加速后速度涨了不少但对小目标来说直接就是精度灾难。为什么大目标几十上百个像素预测框偏移1-2个像素IOU变化不大但小目标本身就10-20个像素边界偏移1个像素IOU可能直接从0.8掉到0.5以下直接从正样本变成负样本。DFL的优势就是通过分布建模让边界回归更精细哪怕偏移零点几个像素也能拟合到。拿掉DFL之后小目标的定位误差被放大很多时候不是模型没检测到是框不准导致IOU不够被算成了误检。精准打击方案我们没有简单地把DFL加回去——那样YOLO26的部署优势就没了。而是设计了一个轻量级分支分布回归头LDR-Head只给小目标用分布回归大目标保持原生的直接回归兼顾精度和速度。具体做法双分支回归头检测头的回归部分分成两个分支大目标分支和原生YOLO26一致直接回归四个坐标值速度快小目标分支用简化版的DFL把原来的16个分布bin缩减到4个只对小范围的偏移做分布建模计算量只有原版DFL的1/4。动态路由切换推理的时候根据预测框的大小自动选择分支小于32×32的框用小目标分支的结果大于的用大目标分支。整个切换逻辑只有几个判断操作完全不影响推理速度。中心度约束在小目标回归分支加入中心度损失惩罚预测框中心偏离目标中心的情况进一步降低小目标的定位漂移提升高IOU阈值下的AP。这套方案下来小目标的定位精度提升非常明显IOU0.5的AP涨幅最大同时整体计算量只增加了不到5%导出ONNX、TensorRT完全没有兼容性问题端侧部署不受影响。实测效果工业数据集涨点3.7%速度损失可忽略我们在两个典型的小目标场景数据集上做了完整验证PCB缺陷数据集12000张图片80%以上是小于32×32的缺陷目标VisDrone2024验证集聚焦其中小于32×32的小目标子集。测试基底为YOLO26-s输入尺寸640×640测试环境RTX 3090 TensorRT 8.6。模型版本PCB小目标APVisDrone小目标AP参数量FPS原生YOLO26-s27.1%28.5%9.4M112改进版YOLO26-s30.8%32.2%9.7M107从数据能很直观地看到小目标AP分别涨了3.7和3.7个点提升幅度非常显著参数量只增加了0.3M涨幅不到3.2%推理速度从112降到107下降不到4.5%完全在工业部署的可接受范围内。最重要的是所有改进都用的是标准卷积和常规算子没有任何自定义的复杂算子导出ONNX、转TensorRT、部署到Jetson边缘设备上都一帆风顺不用做额外的算子适配和改写。最后说几句做了这么多YOLO的小目标优化最深的感受就是不要上来就堆模块。很多人一遇到小目标效果差第一反应就是加注意力、换更大的backbone、加深FPN结果涨点有限速度掉得厉害还没法部署。其实对于YOLO26这种已经高度优化的架构小目标的核心问题根本不在backbone的特征提取能力而是在标签分配够不够、特征融合保不保留细节、回归头精不精准这三个环节。把这三个死穴打通用最少的改动换最大的涨点同时保住YOLO26部署友好的核心优势这才是工业落地最需要的优化思路。如果你的项目也被小目标检测卡着不妨先从这三个方向改起成本低见效快。
返回列表