一、小目标检测概述:到底什么是小目标?
做目标检测这些年,我遇到过不少让人头疼的场景。比如无人机拍到的行人、卫星图里的小汽车、工厂质检面板上的微小划痕。这些目标在整张图里就占那么一丁点像素,人眼都得凑近了看,更别说让模型去认了。
说白了,小目标检测就是要在图像里找到那些「小得可怜」的物体。但问题来了——多小才算「小」?
1.1 小目标的定义
学术界和工业界对小目标有几种常见的定义方式。我个人习惯用下面这张表来跟团队对齐口径:
| 定义标准 | 具体指标 | 典型场景 |
|---|---|---|
| 相对尺寸 | 目标面积占原图比例 < 0.1% | 遥感图像、航拍 |
| 像素 | 目标尺寸 < 32×32 像素 | COCO 数据集定义 |
| 特征尺度 | 目标在特征图上的响应 < 1 个网格 | YOLO 系列检测 |
| 工程经验 | 目标 < 原图宽高的 5% | 工业质检、安防 |
嗯,这里要注意——不同任务对「小」的容忍度差别很大。我在做智慧交通项目时,32×32 像素的行人已经算「大」了,但在医学影像里,一个细胞可能只有 8×8 像素。
核心观点:小目标没有统一的尺寸标准,但有一个共识——目标在特征图上可用的信息太少,导致模型难以提取有效特征。
1.2 小目标检测的难点与挑战
你想想看,一个 16×16 像素的目标,经过 YOLO 的几次下采样后,在特征图上就剩 1×1 甚至更小了。这能提取到什么特征?说白了,就是信息量不够。
我总结了四个核心难点,每个都是我在实际项目中踩过的坑:
- 特征信息严重不足——小目标本身像素少,经过卷积和池化后,有效特征几乎被稀释殆尽。我曾经在无人机巡检项目里试过原版 YOLOv5,小目标召回率不到 20%。
- 锚框匹配困难——YOLO 的锚框是基于数据集聚类得到的。小目标的锚框尺寸小,跟背景噪声的尺度接近,导致正负样本失衡。我记得有一次调参,锚框怎么调都调不好,最后发现是数据里小目标标注框的宽高比太极端。
- 定位精度差——小目标的边界框偏移几个像素,IoU 就掉得厉害。YOLO 的回归头对微小偏移不够敏感,这是结构上的硬伤。
- 背景干扰严重——小目标往往淹没在复杂的背景纹理中。比如森林里的无人机、人群中的小物件,模型很容易把背景纹理误判为目标。
避坑指南:我曾经在工业缺陷检测项目里,直接用 COCO 预训练权重做迁移学习,结果小目标一个都没检测出来。后来才发现,COCO 的小目标定义跟工业场景差太远——工业缺陷可能只有 4×4 像素,而 COCO 的「小目标」是 32×32。所以,一定要根据你的实际数据重新定义小目标,别盲目套用公开数据集的标准。
1.3 YOLO 系列在小目标上的瓶颈
YOLO 系列从 v1 到 v8,大目标检测已经做得相当好了。但小目标检测一直是它的软肋。为什么会这样?我画了一张图来说明:
具体来说,YOLO 的瓶颈主要体现在以下几个方面:
1.3.1 下采样导致的信息丢失
YOLOv5 的 backbone 最大下采样倍数是 32 倍。一个 32×32 的小目标,经过 5 次下采样后,在特征图上只剩 1×1 像素。你想想看,一个像素点能提供什么信息?说白了,就是几乎丢失了全部空间结构信息。
我的经验:在做小目标检测时,我通常会限制 backbone 的最大下采样倍数不超过 16 倍,或者保留浅层特征图(如 P2 层)参与检测。这个改动虽然会增加计算量,但小目标的召回率能提升 10-15%。
1.3.2 锚框设计不合理
YOLO 的锚框是通过 K-means 聚类得到的。但聚类结果严重依赖训练数据。如果数据里小目标占比少,聚类出来的锚框就会偏向中大目标。我曾经在一个人脸检测项目里,数据里 80% 的人脸都小于 20×20 像素,但聚类出来的锚框最小是 30×30——这显然不合理。
1.3.3 感受野与目标尺度不匹配
YOLO 的深层特征图感受野很大,适合检测大目标。但小目标需要的是小感受野,否则会引入大量背景噪声。这个问题在 FPN 出现后有所缓解,但依然存在——FPN 的顶层特征图感受野还是偏大。
1.3.4 NMS 对小框不友好
标准 NMS 算法在计算 IoU 时,小框之间的 IoU 对像素偏移非常敏感。两个相邻的小目标,只要框稍微偏移一点,IoU 就可能从 0.7 掉到 0.3。这导致 NMS 要么误杀,要么漏检。我遇到过最极端的情况——NMS 把同一目标的多个小框全杀了,一个都没留下。
小结:YOLO 在小目标检测上的瓶颈,本质上是「结构设计偏向大目标」和「小目标信息量不足」之间的矛盾。后面的章节,我会逐一给出针对性的优化方案,包括多尺度特征融合、改进锚框策略、注意力机制增强、损失函数优化等。这些方法我在多个项目中验证过,效果确实不错。