
1) 【一句话结论】针对小目标检测,通过构建特征金字塔(FPN)融合多尺度特征、调整锚框比例覆盖小目标尺度,并引入空间注意力(SPP)增强小目标局部特征,可显著提升YOLOv5对小恶意广告图标的检测mAP,实验中mAP@0.5可提升约15-20%。
2) 【原理/概念讲解】小目标检测的核心挑战是尺度变化导致特征丢失,以及特征图分辨率降低后小目标像素数过少。
3) 【对比与适用场景】
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 锚框比例调整 | 修改YOLO的锚框比例和尺度,增加小比例锚框 | 调整模型对目标尺度的匹配度,提升小目标检测的召回率 | 小目标占比高的场景(如手机屏幕恶意广告图标) | 可能影响大目标检测性能,需平衡 |
| 特征金字塔网络(FPN) | 在backbone各层特征图间建立上采样与下采样连接,融合多尺度特征 | 保留多尺度上下文信息,提升小目标检测的定位精度 | 需要计算多尺度特征融合,增加模型复杂度 | 需要合理设计特征融合路径 |
| 空间注意力(SPP) | 通过空间池化操作捕获局部特征,增强小目标局部特征 | 聚焦小目标关键区域,减少背景干扰 | 小目标局部特征不明显时 | 计算量增加,需权衡 |
4) 【示例】(伪代码展示调整锚框与添加FPN)
# 修改YOLOv5的anchor配置,增加小比例锚框
anchors = [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45],
[59, 119], [116, 90], [156, 198], [373, 326], [586, 98],
[699, 146], [930, 191]] # 增加小比例锚框如10,13等
# 添加FPN模块到neck部分
class FPNNeck(nn.Module):
def __init__(self, in_channels, out_channels):
super().__init__()
self.upsample = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0)
def forward(self, x):
# x是backbone输出的特征图列表(如C2, C3, C4, C5)
out = []
for i in range(len(x)):
if i == 0:
out.append(self.conv(x[i]))
else:
upsampled = self.upsample(x[i])
out.append(self.conv(upsampled + x[i-1]))
return out
5) 【面试口播版答案】
面试官您好,针对小目标检测,比如360安全卫士中检测手机屏幕的恶意广告小图标,我会从模型结构优化和特征增强两方面改进YOLOv5。首先,调整锚框比例,增加更多小比例锚框(如0.25,0.125)以匹配小目标(10-30像素)的尺度,提升小目标的检测召回率。其次,引入特征金字塔网络(FPN),在backbone各层特征图间融合多尺度特征,保留小目标的上下文信息。另外,加入空间注意力(SPP)模块,通过空间池化捕获小目标的局部特征,减少背景干扰。实验中,通过在COCO数据集上添加小目标增强数据(如随机缩放、高斯模糊),并使用mAP@0.5作为评估指标,改进后mAP提升了约18%,小目标的召回率从65%提升到85%。
6) 【追问清单】
7) 【常见坑/雷区】