Consistent-Point半监督人群计数算法详解

Consistent-Point 论文方法与实验详解

论文:Consistent-Point: Consistent Pseudo-Points for Semi-Supervised Crowd Counting and Localization(arXiv:2503.12441,2025.03)

作者:Yuda Zou、Zelong Liu、Yuliang Gu、Bo Du、Yongchao Xu(武汉大学)
本文首次指出并量化了点定位半监督人群计数中伪点的位置不一致与类别不一致问题(Mean-Teacher baseline 甚至不如只用标注数据),并给出两个极简正交模块------PA 用"被匹配的伪点与其邻近提议点定位相似"的洞察做空间平均,以 1/K 方差收缩稳住位置;IUC 用分类得分做实例级加权,压低决策边界附近模糊伪点的监督强度。两模块零推理开销、只引入一个超参 λ,在 5 数据集 × 3 标注比例的 15 个定位设置上全部 SOTA,并在 CPS 框架上验证泛化性,说明"伪标签一致性"是点定位半监督范式中被低估的关键自由度

https://github.com/KeepTryingTo/Consistent-Point

第一部分:研究背景与问题定义

1.1 任务场景

人群计数与定位(public security、traffic management)有两条技术路线:

  • 密度图回归(density-based) :预测密度图再积分计数------计数准但无法精确定位个体;
  • 点定位(localization-based,本文采用):直接回归每个人的 2D 点坐标(如 P2PNet)------计数的同时给出精确位置,实用潜力更大。

痛点:标注成本极高 。一张人群图可能要标几百上千个头点,而无标注图像可以廉价获取------这催生了半监督人群计数。

1.2 现有半监督范式及其盲区

Mean-Teacher 已成为主流:教师模型(EMA 更新的学生权重)在无标注图上预测伪标签,监督学生训练。密度图方法已注意到伪密度图随训练时间波动 的问题(如 STC-Crowd 用时序集成 + 像素级不确定性缓解),但 point-localization 方法(伪点)的这一致性问题从未被研究。

1.3 论文的核心观察:伪点的两种不一致(Fig.1)

教师模型参数在训练中不断变化,导致伪点存在两类不一致:

不一致类型 来源 表现
位置不一致(Position Inconsistency) 回归分支参数变化 同一个头,伪点在相邻帧训练时刻漂移到脸部不同位置(Fig.1b 上排)
类别不一致(Class Inconsistency) 分类分支参数变化 模糊实例时而被判为"人"(有伪点)、时而判为背景(无伪点),伪点集合本身在变化(Fig.1b 下排)

危害:不稳定监督信号 → 学生训练混乱 → 计数/定位精度下降(Fig.1d:Baseline 对未标注图的计数剧烈波动,Ours 平稳收敛)。

值得注意的是,人工标注点也存在位置不一致(标注者的主观性,BL、NoiseCC 在全监督下专门处理过),而伪点的不一致问题更严重却没人管------这正是本文的切入点。


第二部分:方法详解

2.1 基座模型回顾(Preliminary:P2PNet)

Consistent-Point 以 P2PNet 为教师和学生(沿用 CU、SAL 的设置),P2PNet 三个组件:

  1. 点提议预测:backbone 特征图上并行两个分支------回归分支预测每个提议点的位置偏移 p̂ⱼ=(x̂ⱼ,ŷⱼ),分类分支预测其类别得分 ĉⱼ∈0,1;
  2. 一对一匈牙利匹配:代价矩阵 D 做最优匹配,每个 GT 点配对一个提议点(正样本),其余为负样本;
  3. 损失:正样本欧氏定位损失 + 全部提议点的交叉熵分类损失,L = L_cls + λ₂L_loc(λ₁=0.5,λ₂=2e-4)。

2.2 整体框架(Fig.2)

text 复制代码
┌─────────────────────────────────────────────────────────────────────────────┐
│                           Consistent-Point 完整框架                          │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌─────────────────────────────────────────────────────────────────────┐   │
│  │                         无标注数据流 (Unlabeled Flow)                 │   │
│  │                                                                     │   │
│  │   未标注图 ──弱增强──> 教师 P2PNet                                   │   │
│  │                          │                                          │   │
│  │              ┌───────────┴───────────┐                              │   │
│  │              ↓                       ↓                              │   │
│  │      回归分支输出              分类分支输出                          │   │
│  │      (提议点集合)              (分类得分 ĉ)                          │   │
│  │              │                       │                              │   │
│  │              ↓                       ↓                              │   │
│  │      PA 模块: 聚合邻近           IUC 模块: 按得分加权                 │   │
│  │      辅助点位置                  w_i = (ĉ_i - 0.5) / 0.5            │   │
│  │              │                       │                              │   │
│  │              └───────────┬───────────┘                              │   │
│  │                          ↓                                          │   │
│  │              Consistent Pseudo-points (一致伪点)                     │   │
│  │                          │                                          │   │
│  └──────────────────────────┼──────────────────────────────────────────┘   │
│                             ↓                                               │
│  ┌─────────────────────────────────────────────────────────────────────┐   │
│  │                         有标注数据流 (Labeled Flow)                   │   │
│  │                                                                     │   │
│  │   标注图 ──弱增强──> 学生 P2PNet                                     │   │
│  │                          │                                          │   │
│  │                          ↓                                          │   │
│  │              与 GT Points 计算有标注损失 L^L                         │   │
│  │              L^L = L_cls^L + λ_2 · L_loc^L                         │   │
│  │                                                                     │   │
│  └─────────────────────────────────────────────────────────────────────┘   │
│                             │                                               │
│  ┌─────────────────────────────────────────────────────────────────────┐   │
│  │                         学生模型训练                                  │   │
│  │                                                                     │   │
│  │   未标注图 ──强增强──> 学生 P2PNet                                   │   │
│  │                          │                                          │   │
│  │                          ↓                                          │   │
│  │              与 Consistent Pseudo-points 计算无标注损失 L^U          │   │
│  │              L^U = L_cls^U + λ_2 · L_loc^U                         │   │
│  │                                                                     │   │
│  │   总损失: L = L^L + λ · L^U   (λ = 0.1)                            │   │
│  │                                                                     │   │
│  └─────────────────────────────────────────────────────────────────────┘   │
│                             │                                               │
│                             ↓                                               │
│                    反向传播更新学生参数                                       │
│                             │                                               │
│                             ↓                                               │
│              教师 ← EMA 更新 ← 学生                                        │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
损失 公式 说明
有标注分类损失 L c l s L = − 1 M ( ∑ i = 1 N log ⁡ c ^ ξ ( i ) L_{cls}^L = -\frac{1}{M}\big(\sum_{i=1}^{N}\log \hat{c}{\xi(i)} LclsL=−M1(∑i=1Nlogc^ξ(i) +   λ 1 ∑ i = N + 1 M log ⁡ ( 1 − c ^ ξ ( i ) ) ) +\, \lambda_1 \sum{i=N+1}^{M}\log(1-\hat{c}_{\xi(i)})\big) +λ1∑i=N+1Mlog(1−c^ξ(i))) 正/负提议点的交叉熵
有标注定位损失 L l o c L = 1 N L_{loc}^L = \frac{1}{N} LlocL=N1 ∑ i = 1 N ∣ p i − p ^ ξ ( i ) ∣ 2 2 \sum_{i=1}^{N}|p_i - \hat{p}_{\xi(i)}|_2^2 ∑i=1N∣pi−p^ξ(i)∣22 匹配点的欧氏距离
有标注总损失 L L = L c l s L + λ 2 L l o c L L^L = L_{cls}^L + \lambda_2 L_{loc}^L LL=LclsL+λ2LlocL
PA 位置聚合 c p ^ i t = 1 K ∑ k = 1 K p k a u x \hat{cp}i^t = \frac{1}{K}\sum{k=1}^{K} p_k^{aux} cp^it=K1∑k=1Kpkaux 取邻近 K=4 个辅助点平均
IUC 权重 w i = c ^ i t − 0.5 0.5 w_i = \frac{\hat{c}_i^t - 0.5}{0.5} wi=0.5c^it−0.5 按分类得分校准不确定性
无标注分类损失 L c l s U = − 1 M U ( ∑ i = 1 N U w i log ⁡ c ^ ξ t ( i ) s L_{cls}^U = -\frac{1}{M^U}\big(\sum_{i=1}^{N^U} w_i \log \hat{c}{\xi^t(i)}^s LclsU=−MU1(∑i=1NUwilogc^ξt(i)s +   λ 1 ∑ i = N U + 1 M U log ⁡ ( 1 − c ^ ξ t ( i ) s ) ) +\, \lambda_1 \sum{i=N^U+1}^{M^U}\log(1-\hat{c}_{\xi^t(i)}^s)\big) +λ1∑i=NU+1MUlog(1−c^ξt(i)s)) 加权交叉熵
无标注定位损失 L l o c U = 1 N U L_{loc}^U = \frac{1}{N^U} LlocU=NU1 ∑ i = 1 N U ∣ c p ^ i t − p ^ ξ t ( i ) s ∣ 2 2 \sum_{i=1}^{N^U}|\hat{cp}i^t - \hat{p}{\xi^t(i)}^s|_2^2 ∑i=1NU∣cp^it−p^ξt(i)s∣22 与一致伪点的欧氏距离
无标注总损失 L U = L c l s U + λ 2 L l o c U L^U = L_{cls}^U + \lambda_2 L_{loc}^U LU=LclsU+λ2LlocU
最终总损失 L = L L + λ ⋅ L U L = L^L + \lambda \cdot L^U L=LL+λ⋅LU λ = 0.1 平衡有/无标注

2.3 模块一:Position Aggregation(PA,治位置不一致)

关键洞察 :P2PNet 的一对一匹配机制下,伪点(正提议点)会抑制其邻近提议点 ------它们被分类为负样本;但由于特征高度相似,回归分支对伪点和其邻近点的定位结果是相近的。

理论依据:假设邻近点的定位误差服从高斯分布 p^aux ~ N(0, σ²),则 K 个点取平均后:

c p ^ t = 1 K ∑ K p a u x ∈ N ( 0 , 1 K σ 2 ) \hat{cp}^t = \frac{1}{K}\sum^K p^{aux} \in \mathcal{N}(0, \frac{1}{K}\sigma^2) cp^t=K1∑Kpaux∈N(0,K1σ2)

方差缩小为 1/K------邻近点的位置信息可以用来"平滑"伪点。

操作 :对每个伪点,取邻近的 4 个辅助提议点,直接平均它们的位置,得到位置一致的伪点 ĉp̂ᵢᵗ。聚合后的伪点抖动显著减小(Fig.1c:Baseline 伪点散布大,Ours 紧致)。

替代方案对比(Table 7,为什么不用它们):

  • 时序集成(TE):存多个 epoch 的伪点再平均------需要大量存储,且早期模型质量差会拖后腿;
  • 多回归分支(MB):同一位置多个回归分支取平均------各分支监督信号相同,收敛后输出几乎一样,无增益。

PA 的"空间聚合"既便宜又有效。

2.4 模块二:Instance-wise Uncertainty Calibration(IUC,治类别不一致)

问题:分类分支对模糊实例反复横跳(有时有伪点、有时没有),直接用作监督会毒害学生。

操作 :用伪点自身的分类得分作为不确定性的代理,给无标注图的分类损失加权:

w i = c ^ i t − 0.5 0.5 w_i = \frac{\hat{c}_i^t - 0.5}{0.5} wi=0.5c^it−0.5

  • 得分 ĉᵢᵗ ∈ (0.5, 1](因为是分类为正的提议点);
  • 得分接近 0.5(决策边界附近,类别不确定)→ wᵢ 接近 0,弱监督;
  • 得分接近 1(类别稳定)→ wᵢ 接近 1,全监督。

只给正样本项加权(λ₁ 加权的负样本项不变):

L c l s U = − 1 M U ( ∑ i = 1 N U w i log ⁡ c ^ ξ t ( i ) s + λ 1 ∑ i = N U + 1 M U log ⁡ ( 1 − c ^ ξ t ( i ) s ) ) \mathcal{L}{cls}^{U} = \frac{-1}{M^U}\left(\sum{i=1}^{N^U} w_i \log \hat{c}{\xi^t(i)}^s + \lambda_1 \sum{i=N^U+1}^{M^U} \log(1-\hat{c}_{\xi^t(i)}^s)\right) LclsU=MU−1 i=1∑NUwilogc^ξt(i)s+λ1i=NU+1∑MUlog(1−c^ξt(i)s)

定位损失用聚合后的位置一致伪点 ĉp̂ᵢᵗ 监督学生匹配点 p̂ˢ_{ξᵗ(i)}。思想是经典"用模型自身置信度当权重",但这里以实例为单位(不是密度图方法的像素级),且和 PA 互补。

2.5 总损失

L = L L + λ L U , L U = L c l s U + λ 2 L l o c U \mathcal{L} = \mathcal{L}^L + \lambda \mathcal{L}^U, \quad \mathcal{L}^U = \mathcal{L}{cls}^U + \lambda_2 \mathcal{L}{loc}^U L=LL+λLU,LU=LclsU+λ2LlocU

λ 是唯一需要调的超参,经验取 0.1;教师用 EMA 更新学生权重。两个模块零推理开销(只在训练时作用于伪标签)。


第三部分:实验详解

3.1 实验设置

  • 5 个数据集:ShanghaiTech A/B、UCF-QNRF、JHU-Crowd++、NWPU-Crowd;
  • 3 种标注比例:5% / 10% / 40%(共 15 个设置);
  • 定位指标:Precision / Recall / F1(预测点与 GT 距离 < σ 判 TP,σ_l=8 和 σ_s=4 两档阈值);
  • 计数指标:MAE / MSE;
  • 实现:沿用 CU/SAL 设置------随机缩放 0.7,1.3 → 裁 128×128 patch → 水平翻转 0.5;高分辨率数据集长边缩至 1408/1430/1920;Adam(backbone 1e-5,其余 1e-4),batch size 8,RTX 3090,PyTorch;
  • 效率 :JHU-Crowd++(10% 标注)训练 1000 epoch 约 10 小时,测试 1600 张图仅 28 秒(57.1 FPS);推理零额外开销,训练时间增量 <5%。

3.2 定位性能(Table 1)------15 个设置全部 SOTA

在 5 数据集 × 3 标注比例 × 2 阈值的全部组合上,F1 均优于 OT-M、CU、SAL。典型数字(10% 标注,σ_l=8):

方法 SHA SHB UCF-QNRF JHU-Crowd++ NWPU-Crowd
OT-M 69.7 76.2 70.1 67.8 62.2
CU 68.5 76.3 72.8 67.8 66.2
SAL 71.2 76.9 73.3 68.6 66.6
Ours 73.8 78.6 75.5 69.7 73.8

NWPU-Crowd 上提升尤其明显(66.6→73.8,+7.2 点);严格阈值 σ_s=4 下同样全面领先。

3.3 计数性能(Table 2/3/4)

在 SHA/SHB(Table 2)、UCF-QNRF/JHU-Crowd++(Table 3)、NWPU(Table 4)上与密度图方法(GP、DACount、P³Net、MRC-Crowd 等)和点定位方法(OT-M、CU、SAL)全面比较:

  • 10% 标注 SHA:MAE 从 baseline(Mean-Teacher)81.58 降到 63.55;40% 标注 SHA:57.82,优于 SAL 的 60.7;
  • 多数设置 MAE 第一,个别与最优密度方法互有胜负(如 40% 时 MRC-Crowd 在 JHU 上 MSE 略优);
  • 亮点 :UCF-QNRF 40% 标注下(MAE 78.91)超过了 P2PNet 全监督 100% 标注(MAE 85.32)------作者归因于原始标注本身存在位置误差,伪点反而更"干净"。

3.4 消融实验(SHA,10% 标注)

① 模块有效性(Table 5):

配置 MAE MSE
Baseline(Mean-Teacher + P2PNet) 81.58 139.66
+PA 66.06 112.29(-15.52 MAE)
+PA+IUC 63.55 103.18(再 -2.51)

注意 baseline 甚至差于"只用标注数据"(78.12)------证明伪点不一致确实在拖后腿,而 PA 单独就贡献了绝大部分增益。

② PA 辅助点数量 K(Table 6):K=4(即取邻近 4 个,2×2 网格)最优;扩大到 16(选点范围变大)反而变差------混入特征相似度低的点会破坏聚合。

③ PA 替代方案(Table 7):时序集成(TE)71.45、多回归分支(MB)79.32,均不如 PA 的 66.06。

④ 无标注损失权重 λ(Fig.4) :0.01~0.5 都显著优于 baseline,0.1 最优。

3.5 补充实验

CPS 框架上的泛化性(Table 8) :把 PA/IUC 移植到 Cross Pseudo Supervision 框架,baseline 同样从 85.86 → +PA 70.85 → +PA+IUC 65.74,趋势与 Mean-Teacher 一致,证明模块与半监督范式解耦。

局限 :在极端密集区域,PA 可能把别的头的伪点误取为辅助点,反而增加位置不一致。作者提出未来可按密度动态调整辅助点的范围和数量。


第四部分:一句话总结

本文首次指出并量化了点定位半监督人群计数中伪点的位置不一致与类别不一致 问题(Mean-Teacher baseline 甚至不如只用标注数据),并给出两个极简正交模块------PA 用"被匹配的伪点与其邻近提议点定位相似"的洞察做空间平均,以 1/K 方差收缩稳住位置;IUC 用分类得分做实例级加权,压低决策边界附近模糊伪点的监督强度。两模块零推理开销、只引入一个超参 λ,在 5 数据集 × 3 标注比例的 15 个定位设置上全部 SOTA,并在 CPS 框架上验证泛化性,说明"伪标签一致性"是点定位半监督范式中被低估的关键自由度。

相关推荐
老纪的技术唠嗑局1 小时前
PowerContext 1.4.0 发布:开发做到一半,换个 Agent 怎么继续?
人工智能
在所不辞兄1 小时前
【零基础学智能仿真-69】综合项目——材料参数驱动的仿真研究
人工智能·深度学习·神经网络·算法·机器学习·1024程序员节
天天代码码天天1 小时前
喊一声“小芽小芽”,让电脑陪孩子聊聊天:我的 C# 儿童语音伙伴升级了
人工智能
老纪的技术唠嗑局1 小时前
我们想和你一起,让 Agent 的优化有据可循
人工智能
桑年1 小时前
四、Pandas数据处理
人工智能·python·线性代数·pandas·数据可视化·数据处理
大雾的小屋1 小时前
卷积神经网络原理解析:从1989年手写邮编识别到现代计算机视觉
人工智能·计算机视觉·cnn
Luchang-Li2 小时前
DeepSeek v4.1 Flash SGLang引擎KV cache存储逻辑
人工智能
这是谁的博客?2 小时前
CUDA 内存一致性模型与同步原语深度解析:从弱内存序、作用域可见性到异步代理栅栏的 GPU 并发正确性底层原理
人工智能
u1301302 小时前
GitHub 热榜项目:周榜(2026-11-01)
人工智能·github