本篇博客仅作为个人学习的论文笔记使用,如有侵权,请联系删除
To Choose or to Fuse? Scale Selection for Crowd Counting
一、主要针对问题及解决手段
- 论文主要针对的问题:人头尺寸在图片中变化大的问题(人体在图片中远小近大问题);
- 解决方法:充分利用基于multi-level结构的网络中的多尺度(multi-scale)特征表示。具体地,由于每一层的特征图都有一个最擅长预测的特定的尺度范围,则可以通过一个选择策略来选择合适的特征层,从而使得单个patch内的计数误差尽可能地小,同时作者还利用加权平均来将其它的特征层也考虑了进来,用于平滑离散的特征图和连续的尺度变化之间的差异;
- 上述尺度和特征层之间的内部对应关系,可以使用SASNet来自主地学习。
二、其它问题or创新点
- 由于图像中局部范围内的头部尺寸大致相同,故可以逐patch地选择特征层;
- 由于传统的像素级别损失函数忽略了patch内部不同像素的不同学习难度,故论文给出了一种金字塔区域感知损失函数(PRA Loss);具体地,它会在一个patch中迭代地选择最困难(即最大高估/最小低估)的子区域,直到到达像素级别,此时将该像素视为最困难像素,做进一步优化;
- 此外,传统的损失函数强调的是精确的像素级别损失,而常见的评估准则(如MAE/MSE)只关注最终的计数误差。PRA Loss考虑了像素和区域之间的包含关系,有助于平滑训练目标和评估指标之间的不连续性。
三、网络结构
- 使用 VGG16的前 13 个卷积层作为编码器网络,共有五个特征层级,下采样步长分别为1、2、4、8、16,对应的特征图记为 V 1 V_1 V1 ~ V 5 V_5 V5;
- P 1 P_1 P1 ~ P 5 P_5 P5为解码阶段的多尺度特征图表示,每个 P i P_i Pi由 V i V_i Vi和 P i + 1 P_{i+1} Pi+1生成;为使 P i + 1 P_{i+1} Pi+1和 V i V_i Vi尺寸匹配,需要对 P i + 1 P_{i+1} Pi+1进行上采样,上采样方式为近邻插值法;正如上文所说,由于感受野固定,因此只在某些特定尺寸下表现良好;
- 抛开置信图预测分支Confidence Head不谈,直接将 P 1 P_1 P1 ~ P 5 P_5 P5分别输入密度分支Density Head来得到五张密度图 D 1 D_1 D1 ~ D 5 D_5 D5,再在通道维度上对此五张密度图进行拼接,得到Density Maps;
- 抛开密度预测分支Density Head不谈,直接将 P 1 P_1 P1 ~ P 5 P_5 P5分别输入置信分支Confidence Head来得到五张置信图 C 1 C_1 C1 ~ C 5 C_5 C5,(特别地,对于输入的 P i P_i Pi首先进行下采样,使其尺寸变为原始输入图片尺寸的 1 k \frac{1}{k} k1,这样 C i C_i Ci中的每个像素值实际代表着 P i P_i Pi中对应位置的一个 k × k k \times k k×k大小的patch的置信度),再在通道维度上对此五张置信图进行拼接,得到Confidence Maps;
- 对Confidence Maps在通道维度上进行Softmax操作,使得五张二维的置信图在每个对应位置像素上的值之和都为1(为下一步的加权平均做铺垫);
- 对Confidence Maps和Density Maps对应位置逐像素地相乘后,再在通道维度上求和(由此完成加权平均操作,当然,此步操作的前提是两者尺寸匹配,故需要使用近邻插值法将
C
i
C_i
Ci插值到与
D
i
D_i
Di相同大小),得到最终的密度图预测
D
j
,
k
e
s
t
D_{j,k}^{est}
Dj,kest,定义如公式(1)所示:
D
j
,
k
e
s
t
=
∑
i
5
(
C
i
,
j
,
k
′
⋅
D
i
,
j
,
k
)
(1)
D_{j,k}^{est}=\sum_i^5 ({C_{i,j,k}}' \cdotp D_{i,j,k}) \tag{1}
Dj,kest=i∑5(Ci,j,k′⋅Di,j,k)(1)
式中 D j , k e s t D_{j,k}^{est} Dj,kest表示最终的密度预测图 D e s t D^{est} Dest的 ( j , k ) (j,k) (j,k)位置处的密度估计值 - 最合适的特征层被认为是计数误差最小的特征层。在推理过程中,拥有最大置信度分数的为最合适的特征层,即对于 ( m , n ) (m,n) (m,n)处的patch,选择置信度分数最大的特征层 j = arg min i ∈ [ 1 , 5 ] C i , m , n j=\text{arg min}_{i\in [1,5]}C_{i,m,n} j=arg mini∈[1,5]Ci,m,n作为最合适的特征层。
四、损失函数
- 五个Density Heads均由同一张GT图监督,即输入图片的原始GT图
D
g
t
D^{gt}
Dgt,损失函数定义为Euclidean Distence损失函数,如公式(2)所示:
L d e n = ∑ i 5 ∥ D i − D g t ∥ 2 2 (2) \mathcal{L_{den}}=\sum_i^5\Vert D_i - D^{gt}\Vert_2^2 \tag{2} Lden=i∑5∥Di−Dgt∥22(2) - 为了监督Confidence Heads,论文利用
D
i
D_i
Di和
D
g
t
D^{gt}
Dgt之间的比较,构建出了
C
i
C_i
Ci的GT图
C
i
g
t
C^{gt}_i
Cigt,构建示意图如下图所示:
上图选取了五张Density maps中的三张作为示例,首先作者将 D i D_i Di划分成一系列互不重叠的大小为 k × k k \times k k×k的patches,然后便可以得到一张计数图 M i M_i Mi,图中每个像素值等于 D i D_i Di中相应位置patch的内部密度和;类似地,也可利用 D g t D^{gt} Dgt构建每张 M i M_i Mi的GT图 M g t M^{gt} Mgt;最后通过公式(3)给出 C i g t C^{gt}_i Cigt:
C i , m , n g t = { 1 , if arg min l ∈ [ 1 , 5 ] ∣ M l , m , n − M m , n g t ∣ = i 0 , if arg max l ∈ [ 1 , 5 ] ∣ M l , m , n − M m , n g t ∣ = i − 1 , otherwise (3) C^{gt}_{i,m,n} =\begin{cases} 1,& \text{if $\mathop{\arg\min}\limits_{l \in [1,5]} | M_{l,m,n} - M_{m,n}^{gt} |$ = $i$} \\ 0,& \text{if $\mathop{\arg\max}\limits_{l \in [1,5]} | M_{l,m,n} - M_{m,n}^{gt} |$ = $i$} \\ -1,& \text{otherwise} \end{cases} \tag{3} Ci,m,ngt=⎩ ⎨ ⎧1,0,−1,if l∈[1,5]argmin∣Ml,m,n−Mm,ngt∣ = iif l∈[1,5]argmax∣Ml,m,n−Mm,ngt∣ = iotherwise(3)
上式中, C i , m , n g t C^{gt}_{i,m,n} Ci,m,ngt表示第 i i i 个特征层中位于 ( m , n ) (m,n) (m,n) 处的patch的真实标签, M l , m , n M_{l,m,n} Ml,m,n表示第 l l l 个特征层中位于 ( m , n ) (m,n) (m,n) 处的patch的内部密度和, M m , n g t M^{gt}_{m,n} Mm,ngt表示 D g t D^{gt} Dgt中位于 ( m , n ) (m,n) (m,n) 处的patch的内部密度和。对公式(2)的直观解释就是,离 M m , n g t M^{gt}_{m,n} Mm,ngt最远的对应patch的值设置为1,离 M m , n g t M^{gt}_{m,n} Mm,ngt最接近的对应patch的值设置为0,其它情况设置为-1,在训练阶段,值为-1的patch被忽略;
由此导出损失函数 L c e \mathcal{L_{ce}} Lce和 L c o n f \mathcal{L_{conf}} Lconf,两者定义为公式(4)和公式(5):
L c e ( C i , m , n , C i , m , n g t ) = C i , m , n g t ⋅ log ( C i , m , n ) + ( 1 − C i , m , n g t ) ⋅ ( 1 − log ( C i , m , n ) ) (4) \mathcal{L_{ce}}(C_{i,m,n}, C^{gt}_{i,m,n}) = C^{gt}_{i,m,n} \cdotp \text{log}(C_{i,m,n}) + (1- C^{gt}_{i,m,n})\cdotp (1-\text{log}(C_{i,m,n})) \tag{4} Lce(Ci,m,n,Ci,m,ngt)=Ci,m,ngt⋅log(Ci,m,n)+(1−Ci,m,ngt)⋅(1−log(Ci,m,n))(4)
L c o n f = ∑ i = 1 5 ∑ ( m , n ) ∈ K i L c e ( C i , m , n , C i , m , n g t ) ∑ i = 1 5 ∣ K i ∣ (5) \mathcal{L_{conf}} = \frac {\sum_{i=1}^5 \sum_{(m,n)\in \mathcal{K_i}}\mathcal{L_{ce}}(C_{i,m,n}, C^{gt}_{i,m,n})} {\sum_{i=1}^5 |\mathcal{K}_i|} \tag{5} Lconf=∑i=15∣Ki∣∑i=15∑(m,n)∈KiLce(Ci,m,n,Ci,m,ngt)(5)
上式中, K i \mathcal{K_i} Ki在第 i i i层特征图中置信标签为0或者1的patches集合,而 ∣ K i ∣ |\mathcal{K_i}| ∣Ki∣则代表该集合中patch的数量; L c e ( C i , m , n , C i , m , n g t ) \mathcal{L_{ce}}(C_{i,m,n}, C^{gt}_{i,m,n}) Lce(Ci,m,n,Ci,m,ngt)表示 C i , m , n C_{i,m,n} Ci,m,n和 C i , m , n g t C^{gt}_{i,m,n} Ci,m,ngt之间的交叉熵损失; L c o n f \mathcal{L_{conf}} Lconf表示Confidence Branch上总损失; - 上文提到,patch 内的像素具有不同的学习难度,并产生不同的计数误差。论文定义“困难的像素”为高估patch中的最高估子区域,以及低估patch中的最低估子区域。以高估区域为例,将一个高估patch均分为四个相同大小的、互不重叠的子区域,那么这四个子区域中至少有一个是高估区域,取其中最高估的子区域为下一步的迭代区域(而高估patch中的低估子区域有助于缓解父区域的高估问题,因此在PRA Loss中被忽略,仅由其它Loss函数进行常规优化),直到到达像素水平。最终选择的像素被认为是整个图像中最难的像素,这些像素通过 PRA Loss 进一步优化;搜索过程的可视化如下图所示:
上述搜索过程最开始的输入为 D e s t D^{est} Dest,首先将其划分成四个相同大小的、互不重叠的patch,每一个patch要么高估要么低估,然后即可按照上述流程进行迭代搜索(高估patch中寻找高估子区域,低估patch中寻找低估子区域;而patch中的其它子区域则被忽略)。在找到最困难的像素之后,PRA Loss损失函数定义如公式(6)所示:
L p r a = ∥ D p ∈ G e s t − D p ∈ G g t ∥ 2 2 + γ ∥ D p ∈ H e s t − D p ∈ H g t ∥ 2 2 (6) \mathcal{L}_{pra}=\Vert D^{est}_{p\in \mathcal{G}}-D^{gt}_{p\in \mathcal{G}} \Vert_2^2 + \gamma \Vert D^{est}_{p\in \mathcal{H}}-D^{gt}_{p\in \mathcal{H}} \Vert_2^2 \tag{6} Lpra=∥Dp∈Gest−Dp∈Ggt∥22+γ∥Dp∈Hest−Dp∈Hgt∥22(6)
式中 p p p表示最终预测图 D e s t D^{est} Dest中的像素, G \mathcal{G} G表示 D e s t D^{est} Dest中的所有像素集合,而 H \mathcal{H} H则表示在 D e s t D^{est} Dest中搜索到的所有困难像素集合, γ \gamma γ表示权重因子。 - 最终的损失函数定义如公式(7)所示:
L f i n a l = L d e n + λ L c o n f + L p r a (7) \mathcal{L}_{final}=\mathcal{L}_{den}+\lambda \mathcal{L}_{conf}+\mathcal{L}_{pra} \tag{7} Lfinal=Lden+λLconf+Lpra(7)
本篇博客仅作为个人学习的论文笔记使用,如有侵权,请联系删除