Efficient Small Object Detection on High-Resolution Images (ESOD)
- 论文: arXiv:2407.16424 (IEEE TIP 2024)
- 代码: https://github.com/alibaba/esod
- 作者: Kai Liu et al. (Alibaba)
- 日期: 2024-07-23
摘要
核心问题: 简单放大图像提升小目标检测效果,但计算和显存开销太大
关键洞察: 小目标通常稀疏分布且局部聚集,背景区域浪费大量计算
方法: 复用 detector 的 backbone 做特征级目标寻找 + patch 切片,结合稀疏检测头
结果: 在 VisDrone、UAVDT、TinyPerson 上比 SOTA 提升 8% AP
1. Introduction
背景问题
- 放大图像可提升小目标检测效果,但计算和显存开销大
- 小目标稀疏分布,统计显示 70%+ 的 patch 不含目标,背景区域计算浪费严重
之前工作的局限
- 用额外网络(CPNet/DMNet 等)挑选目标区域
- 在降采样图上做目标查找 → 小目标被过滤掉
- 两段网络导致冗余特征提取
ESOD 核心思路
- 复用 backbone,在特征层面做目标寻找(ObjSeeker)+ patch 切片(AdaSlicer)
- 避免图像层面的冗余特征提取
- 稀疏检测头处理剩余 patches
- 动机来源:借鉴 Grounded-SAM 的 "divide and conquer" 思路——先用 SAM 分割显著目标,再赋语义标签
- Grounded-SAM = SAM(分割) + Grounding-DINO(分类)
- ESOD 借鉴:ObjSeeker(class-agnostic,只判断"这块有没有东西")→ Neck + SparseHead(判断"是什么、在哪里")
- 核心:"先粗找目标,再细分类"的两阶段思路
- 训练监督:Hybrid pseudo-label(Gaussian + SAM 预测)补充形状先验
架构流程
Input → Stem → ObjSeeker → AdaSlicer (切片+丢弃背景) → Neck → SparseHead → Output
| 组件 | 作用 |
|---|---|
| ObjSeeker | 在特征层面寻找可能含目标的区域 |
| AdaSlicer | 自适应切片特征图,丢弃背景 patch |
| SparseHead | 用稀疏卷积做检测,进一步节省计算 |
实验结果
- 比 SOTA 提升 8% AP(VisDrone/UAVDT/TinyPerson)
- 可处理 1080P 或更高分辨率图像
2. Related Work
A. Small Object Detection
- 图像放大、特征融合、FPN/PAN 等方法
B. Filter-Then-Detect Paradigm
| 方法 | 核心思路 |
|---|---|
| ClusDet | 额外 CPNet 找聚集目标,丢弃空区域 |
| DMNet | 密度图估计 + 滑动窗 + 连通域生成 cluster proposals |
| CDMNet | 形态学闭运算 + 连通域 |
| UFPMP-Det | 粗检测器生成子区域,合并后多 proxy 检测 |
| Focus&Detect | GMM 估计焦点区域 |
问题:都用额外网络,两段特征提取冗余,且在降采样图上做目标查找 → 小目标被过滤
C. Sparse Convolution
| 方法 | 核心思路 |
|---|---|
| Perforated-CNN | 确定性采样生成 mask |
| DynamicConv | 小 gating 网络预测 pixel mask |
| SSNet | 随机采样 + 插值 |
| QueryDet | 级联稀疏 query 结构加速 tiny object 检测 |
| CEASC | 自适应调整 mask ratio |
问题:都用 Gumble-Softmax 或 focal loss 训练稀疏 mask,引入额外计算
ESOD 改进:提出 cost-free 的稀疏 mask 生成方法
3. Method
3A. Revisiting Object Detector
- 常规检测器:Input I → Backbone F → Feature Pyramid P → Detection Head H
3B. ObjSeeker(目标寻找模块)
- 位置:插入在 Stem 之后
- 结构:DWConv (13x3, 扩展感受野) + 1x1 Conv → Sigmoid → objectness mask
- 计算量:仅 1.2 GFLOPs(可忽略)
- 为什么不直接用 RPN/密度图:
- bbox 回归不适合浅层特征找小目标(特征容量有限)
- 密度图是计数的,要的是完整的前景,不是计数
- 输出:class-agnostic objectness mask M̂
- 监督策略:Hybrid pseudo-label(Gaussian + SAM 预测)
SAM 相关论述
为什么用 SAM:
- Gaussian mask 无法捕获目标的精确形状
- 用 SAM 生成高精度 pseudo-masks
M_S = SAM(I)来补充形状先验
SAM 的局限:
"despite the extraordinary ability of salient object segmentation, SAM still suffers from recognizing small objects"
Hybrid 策略:
M = M_S ⊙ M_G (if M_G 太小) else M_G用 focal loss + dice loss 训练,loss ratio = 20:1
消融实验结论(Table V):
| 策略 | BPRbox | BPRctr | APs |
|---|---|---|---|
| Gaussian | 99.1% | 98.3% | 28.2 |
| SAM | 98.9% | 97.7% | 27.9 ❌ |
| Hybrid | 99.3% | 98.3% | 28.3 |
- SAM 单独用反而更差,因为 SAM 分割小目标有困难
- Hybrid 最好,带来 +0.3 AP 增益
3C. AdaSlicer(自适应切片)
- 问题:vanilla 固定网格切 → 目标切断、背景残留
- 贪心算法(Algorithm 1):找局部最大值 → 以它为中心初始化 patch → 调整覆盖最多目标 → 迭代直到覆盖全部
- 并行简化版(Algorithm 2):一次并行切片所有候选 patch
- 流程:
patches → Neck(特征聚合)→ SparseHead - ViT 适配:ViT 本身以 patch/token 为单位,直接丢弃未激活 tokens,避免 self-attention 浪费计算
3D. SparseHead(稀疏检测头)
- 直接在 ObjSeeker 输出的 object centers C 上做稀疏卷积
- 关键:不引入额外参数,cost-free(复用 ObjSeeker 的 objectness mask)
- 本质是两级过滤:AdaSlicer 粗筛 → Neck 聚合 → SparseHead 精筛
训练细节
- Warm-up 阶段:用 GT mask 做切片保证训练稳定
- 后续:用 ObjSeeker 预测的 mask
4. Experiments
4A. Datasets
- VisDrone: 6,471 训练 + 548 验证,10 类,图像 960×540 ~ 2000×1500,默认输入 1536×1536
- UAVDT: 城市航拍数据,默认输入 1280×1280
- TinyPerson: 极小目标数据集
4B. 主要结果
| 数据集 | 方法 | AP | AP50 | GFLOPs | FPS |
|---|---|---|---|---|---|
| VisDrone | ESOD | 36.0 | 59.7 | 119.5 | 36.4 |
| VisDrone | †ESOD (1.25x) | 37.9 | 62.3 | 180.6 | 28.6 |
| VisDrone | UFPMP-Det (SOTA) | 36.6 | 62.4 | 658.7 | 8.5 |
| UAVDT | ESOD | 22.5 | 40.7 | 43.7 | 41.1 |
| TinyPerson | ESOD | 61.3 (APt) | - | 148.3 | 32.8 |
| TinyPerson | †ESOD | 64.0 | - | 234.5 | 24.3 |
符号说明:
- ESOD (默认):ESOD + 默认输入分辨率
- †ESOD (1.25x):输入分辨率宽高同时放大 1.25 倍(1536→1920,1280→1600)
- 论文原话:"simply 1.25× enlarging the input sizes (both of width and height)"
分析:
- ESOD 计算量远低于 SOTA(119.5 vs 658.7 GFLOPs),速度更快(36.4 vs 8.5 FPS)
- 精度略低于 UFPMP-Det(36.0 vs 36.6),但速度快 4 倍
- 1.25x 分辨率后 ESOD 达到 37.9 AP,超越 UFPMP-Det
4C. 适配不同检测器
- CNN: RetinaNet, YOLOv5, RTMDet, YOLOv8 都有效
- ViT: Vanilla, GPViT 也适用
- 结论:通用框架,不挑 backbone
4D. 消融实验
| 配置 | AP | GFLOPs |
|---|---|---|
| Baseline (YOLOv5) | 36.2 | 264.9 |
| +HR (高分辨率 1.25x) | 38.1 | 412.2 |
| +Uni (均匀切片) | 34.9 | 243.3 |
| +Ada (自适应切片) | 38.1 | 232.9 |
| +SparseHead | 37.9 | 180.6 |
关键发现:
- 自适应切片 > 均匀切片
- SparseHead 额外节省 22% 计算
- Patch size = 1/8 是 VisDrone 的最优选择
4E. Pseudo-label 策略
- Hybrid > Gaussian > SAM(Table V)
- Hybrid 带来 +0.3 AP 增益
5. Conclusion
- 小目标在图像中稀疏分布,统计显示 70%+ patch 无目标
- 之前方法:用额外网络做 filter-then-detect,在降采样图上找目标导致小目标丢失
- ESOD 核心:复用 backbone,在特征层面做 ObjSeeker + AdaSlicer + SparseHead
- 优点:
- 通用框架,CNN/ViT 都适用
- cost-free(不引入额外 learnable 参数)
- 在 VisDrone/UAVDT/TinyPerson 比 SOTA 提升 8% AP,同时大幅降低计算
- 适配不同 backbone 大小(s/m/l/xl)
参考
- GitHub: https://github.com/alibaba/esod
