AFreeCA: Annotation-Free Counting for All¶
会议: ECCV 2024
arXiv: 2403.04943
代码: https://github.com/adrian-dalessandro/AFreeCA (有)
领域: 目标检测 / 计数
关键词: Object Counting, Unsupervised, Diffusion Model, Synthetic Data, Density Estimation
一句话总结¶
利用 Stable Diffusion 生成合成排序/计数数据,通过先学排序再学计数的两阶段策略 + 密度引导的图像分块,实现了首个适用于任意类别物体的无标注计数方法,在人群计数上超越已有无监督方法。
研究背景与动机¶
-
领域现状:物体计数(尤其人群计数)传统依赖密度图监督,标注极其昂贵(ShanghaiTech 数据集 5109 张图需 3000 小时标注)。无监督方法试图消除标注负担,但目前仅限于人群计数(CSS-CCNN、CrowdCLIP),无法泛化到其他类别。
-
现有痛点:
- 全监督方法需要逐点标注,成本高且类别固定
- 现有无监督方法(CSS-CCNN)需要先验知识(最大人数、幂律分布参数)
- CrowdCLIP 虽用 CLIP 做零标注,但仍受限于 CLIP 文本编码器对数量理解能力不足的问题
-
没有通用的、可用于任意类别的无标注计数方法
-
核心矛盾:LDM(如 Stable Diffusion)可以生成高质量合成图像,但文本编码器对具体数量的理解不准确——提示"20 people"生成的图片里可能有 15 或 25 个人。这种 label noise 随数量增大而加剧,无法直接用合成数据做监督。
-
本文要解决什么? 如何绕过 LDM 数量理解不精确的问题,利用其强大的图像生成能力来构建无标注物体计数系统?
-
切入角度:虽然 LDM 生成的绝对计数不准,但它在加/减物体时提供的相对排序信号是可靠的(99% 准确率)。先用这个可靠信号学排序特征,再用有噪声的计数数据做轻量锚定。
-
核心 idea 一句话:将计数问题分解为"先学排序(可靠信号)→ 再锚定计数(有噪声但够用)→ 密度引导分块处理高密度区域",全程使用 LDM 合成数据,零人工标注。
方法详解¶
整体框架¶
三阶段 pipeline:(1) 用 Stable Diffusion 的 image-to-image 和 outpainting 生成排序三元组数据,预训练 sorting network 学习物体数量相关特征;(2) 用 SD text-to-image 生成带噪声计数标签的合成图像,仅微调线性层将排序特征锚定到具体计数;(3) 训练密度分类器,推理时对高密度区域做分块处理提升精度。
关键设计¶
- 合成排序数据生成 + Sorting Network 预训练:
- 做什么:从参考图像出发,用 SD 做 image-to-image 减少物体 + outpainting 增加物体,生成排序三元组 \((x^{syn-}, x^{ref}, x^{syn+})\)
- 核心思路:每张参考图生成 4 个增量版本和 4 个减量版本,得到 16 个有序三元组。用 RankSim 风格的排序损失训练 ResNet-50 backbone,同时在特征空间 \(\ell_{sort}^z\) 和预测空间 \(\ell_{sort}^y\) 对齐排序关系
- 设计动机:SD 的排序信号(加/减物体后的相对大小关系)比绝对计数准确得多(99% 可靠)。先用这个可靠信号学质量特征,避免直接用有噪声的计数标签从头训练
-
关键验证:特征图可视化显示 sorting network 能准确聚焦在目标物体区域
-
合成计数数据 + 计数锚定:
- 做什么:用 SD 生成带计数提示的合成图像(如 "20 people"),仅微调一个线性层将排序特征映射为具体计数值
- 核心思路:生成 1-1000 范围内各种计数的合成图像(每类 150 张 + 800 张零物体图)。冻结 backbone 只训练线性层 \(g_\Phi\),用 MSE 损失 \(\mathcal{L}_{count}\) 训练
- 噪声过滤:用 CleanNet 思路计算各计数类别的特征原型向量,过滤掉与自身类别原型不一致的样本
-
设计动机:只微调线性层是刻意的——保护预训练排序特征不被有噪声的合成计数数据破坏。消融显示全网络微调效果反而差很多(MAE 43.9 vs 35.0 on SHB)
-
Density Classifier Guided Partitioning (DCGP):
- 做什么:推理时将密集图像分块,对每个子块单独计数再汇总
- 核心思路:(a) 用 SD 生成无/稀疏/密集三类密度的合成图像训练密度分类头 \(h_\phi\);(b) 推理时生成 count map 和 density map,sparse 区域直接用 count map 求和,dense 区域从原始高分辨率图像中裁切 patch 送入计数网络重新计数
- 设计动机:计数网络在低计数时更准确(SD 的 label noise 随数量增大而加剧),分块确保每个 patch 的物体数落在可靠范围内。用原始高分辨率 patch 还避免了 resize 导致的特征丢失
- DCGP vs 简单分块:简单的 3×3 分块比不分块好(MAE 42.1→47.1 on SHB 反而更差,因为稀疏区域的边界噪声),而 DCGP 选择性地只对 dense 区域分块(35.0),显著更优
损失函数 / 训练策略¶
- 预训练阶段:\(\mathcal{L}_{sort} = \ell_{sort}^y + 5.0 \cdot \ell_{sort}^z\),联合排序损失
- 计数锚定阶段:\(\mathcal{L}_{count}\) MSE 损失,仅训练线性层
- 密度分类阶段:\(\mathcal{L}_{dense}\) 交叉熵损失,仅训练分类头
- 三阶段顺序训练,backbone 在后两个阶段冻结
实验关键数据¶
主实验(人群计数)¶
| 数据集 | 指标 | AFreeCA | CrowdCLIP | CSS-CCNN++ | 提升 |
|---|---|---|---|---|---|
| ShanghaiTech B | MAE | 35.0 | 69.3 | - | -49.5% |
| JHU-Crowd++ | MAE | 173.8 | 213.7 | 197.9 | -12.2% |
| ShanghaiTech A | MAE | 152.7 | 146.1 | 195.6 | 略高于CrowdCLIP |
| UCF-QNRF | MAE | 283.1 | 283.3 | 414.0 | 持平/大幅超越 |
物体计数(CARPK 车辆计数)¶
| 方法 | 类型 | MAE | MSE |
|---|---|---|---|
| BMNet+ | Few-shot | 10.44 | 13.77 |
| CLIP-Count | Zero-shot | 11.96 | 16.61 |
| AFreeCA | Unsupervised | 9.35 | 12.29 |
消融实验¶
| 配置 | SHB MAE | SHB MSE | 说明 |
|---|---|---|---|
| ImageNet pretrain | 68.1 | 104.7 | 无排序预训练 |
| Intra-Image Rank | 52.8 | 76.3 | 只用图内裁剪排序 |
| \(\ell_{sort}^y\) only | 38.2 | 58.0 | 只用预测空间排序损失 |
| \(\ell_{sort}^y + \ell_{sort}^z\) (Ours) | 35.0 | 50.7 | 联合特征+预测排序 |
| Full network finetune | 43.9 | 74.6 | 全网微调反而差 |
| Last layer finetune | 35.0 | 50.7 | 只训线性层更好 |
关键发现¶
- 排序预训练至关重要:从 ImageNet→Sorting 预训练,SHB MAE 从 68.1 降到 35.0,减半
- 只微调线性层远优于全网微调:35.0 vs 43.9,证明保护排序特征不被噪声数据破坏的策略有效
- DCGP 显著优于固定分块:固定 3×3 在某些数据集反而比不分块差,但 DCGP 能选择性处理,全面提升
- 在 CARPK 车辆计数上超越 few-shot 方法:MAE 9.35 < BMNet+ 10.44,证明方法的类别无关性
- ShanghaiTech A 是唯一不占优的数据集:可能因为 SHA 的超高密度场景超出了 DCGP 的分块能力
亮点与洞察¶
- 将 LDM 的"缺点"转化为优势:SD 数量理解不准确是公认问题,但本文巧妙地发现其加/减物体的排序信号是可靠的。这种"退一步"的思路——不追求准确计数标签,而是利用可靠的排序关系——非常优雅
- 冻结 backbone 只训线性层的策略:看似简单但极其有效,是应对合成数据 domain gap 和 label noise 的通用策略。这个 insight 对其他使用合成数据训练的任务也有参考价值
- DCGP 自适应分块:不是均匀分块,而是只对密集区域分块。这避免了稀疏区域过度分割带来的边界噪声,是一个实用的工程设计
局限性 / 可改进方向¶
- 密度分类器只有三类:no/sparse/dense 的粒度可能不够,多级密度分类或回归可能更好
- SHA(超高密度)效果不如 CrowdCLIP:极端高密度场景下 3×3 分块可能仍不够细,需要更细粒度的递归分块策略
- 合成数据只用了简单提示:没有利用更复杂的 prompt engineering 或 ControlNet 来提升合成数据质量
- backbone 完全冻结可能偏保守:有选择地微调部分层(如 adapter 或 LoRA)可能在保护特征和适应任务间取得更好平衡
- 没有利用 LDM 的密度图信息:SD/SDXL 的注意力图可能包含物体位置信息,可以作为弱监督的空间信号
相关工作与启发¶
- vs CrowdCLIP: CrowdCLIP 用 CLIP 特征做排序+文本匹配,本文用 SD 生成的排序三元组做预训练——后者学到的特征更聚焦于目标物体(不依赖 CLIP 的语义特征)
- vs CSS-CCNN++: CSS-CCNN 需要先验知识(最大人数、幂律参数),本文完全无先验
- vs CLIP-Count (Zero-shot): CLIP-Count 在 SHB 上 MAE 45.7,本文 35.0;在 CARPK 上本文也更优。无监督方法超越了零样本方法
评分¶
- 新颖性: ⭐⭐⭐⭐ 利用 LDM 排序信号做计数预训练的思路新颖,首个任意类别无标注计数方法
- 实验充分度: ⭐⭐⭐⭐ 多个数据集+详细消融,但缺少更多非人群类别的定量评估
- 写作质量: ⭐⭐⭐⭐ 逻辑清晰,三阶段 pipeline 层层递进,图表设计好
- 价值: ⭐⭐⭐⭐ 打开了用生成模型做无标注计数的新方向,实际应用潜力大