ICCV2019年的文章,arxiv地址,出发点在于解决自然场景下区域人数范围无上限,与training set中场景人数有限的问题。
自然场景下,人数的变化范围是
[
0
,
+
∞
)
[0,+\infty)
[0,+∞),但是训练集中的图片场景有限,我们很难用有限的场景和有限的人数得到足够好的模型,来应对真实场景中
[
0
,
+
∞
)
[0,+\infty)
[0,+∞)范围的人数变化。Figure 1描述了SHA数据集中的长尾效应,选取了很多
64
×
64
64\times64
64×64的patch,可以看到多数patch包含的人数少,误差低,少数包含人数多,误差大,那么对于回归器来说,是否有必要把所有的情况都统一放在同一个范围处理呢?举例,训练集和测试集中图片包含1000-2000人占5%,1000以下占95%,specifically 200以下80%,200到1000占15%,那么回归器如果对于所有的图片都在0到2000范围来回归,给人的感觉就是没有抓住重点,为了少数图片而极大的增加了搜索区域或优化区域。既然0-200的占80%,不如把主要关注点放在0-200上来,那剩下的200-1000和1000-2000怎么解决呢?counting有个独特的属性,空间可分割性(spatially decomposable),也就是1个区域分割为几个小区域再汇总起来,是典型的divide and conquer分治递归思想。比如我的回归器只关注于0-20人的区域,或者说在包含0-20人的场景/图片中效果好,精度高,那么对于人数多于20的(这个20应该是指初步估计结果),就把图像划分成4块,如果1/4的图像还是多于20人,继续划分。
那么问题来了,如何划分呢?
naive的方法是上采样,再根据密度分割,会导致图像模糊和指数级的复杂度。
Inspired by RoI
把open set转变为closed set问题
SDC
From quantity to interval
把要预测的数字范围从 [ 0 , + ∞ ) [0,+\infty) [0,+∞)划分为 { 0 } , ( 0 , C 1 ] , ( C 1 , C 2 ] , . . . [ C m , + ∞ ) \{0\},(0,C_{1}],(C_{1},C_{2}],...[C_{m},+\infty) {0},(0,C1],(C1,C2],...[Cm,+∞),这些子区间对应m+1个类,比如 C 1 < k < C 2 C_{1}<k<C_{2} C1<k<C2对应class=1,如果一个图片被分到 ( C i , C i + 1 ] (C_{i},C_{i+1}] (Ci,Ci+1],那么估计的人数是中位数 C i + C i + 1 2 \frac{C_{i}+C_{i+1}}{2} 2Ci+Ci+1,最后一个 [ C m , + ∞ ) [C_{m},+\infty) [Cm,+∞)使用 C m C_{m} Cm代替。
Single-Stage Spatial Divide-and-Conquer
Figure2所示,主干网络结构完全采用VGG,结合UNet,除去了最后的全连接,输入都是
64
×
64
64\times64
64×64的patch,由于有5个池化,所以得到
2
×
2
2\times2
2×2的feature maps,输入分类器中得到分类结果
C
0
C_{0}
C0,作为整张图的密度估计结果。是为first stage
上采样加与上阶段的feature maps concat,conv得到
4
×
4
4\times4
4×4的feature maps,分为4个
2
×
2
2\times2
2×2区域,输入分类网络得到
2
×
2
2\times2
2×2的
C
1
C_{1}
C1,每个元素对应原图4个
32
×
32
32\times32
32×32的sub-region。
如何决定分割哪个区域呢?
使用division decider
division decider会生成一个soft mask
W
1
W_{1}
W1,值在区间
[
0
,
1
]
[0,1]
[0,1],越接近0意味着越不需要分割。并以此计算划分结果division result:
D
I
V
1
=
(
I
−
W
1
)
⋅
a
v
g
(
C
0
)
+
W
1
⋅
C
1
DIV_{1}=(\mathbb{I}-W_{1})\cdot avg(C_{0})+W_{1}\cdot C_{1}
DIV1=(I−W1)⋅avg(C0)+W1⋅C1
与此类似,
D
I
V
i
=
(
1
−
W
i
)
⋅
a
v
g
(
C
i
−
1
)
+
W
i
⋅
C
i
DIV_{i}=(1-W_{i})\cdot avg(C_{i-1})+W_{i}\cdot C_{i}
DIVi=(1−Wi)⋅avg(Ci−1)+Wi⋅Ci,
D
I
V
N
DIV_{N}
DIVN积分得到最后的结果,作者说two stage已经足够好了,也就是
N
=
2
N=2
N=2。
loss函数:cross-entropy对应于分类结果,
ℓ
1
\ell_{1}
ℓ1 loss对应于
D
I
V
N
DIV_{N}
DIVN,总loss是加和(不需要设置权重吗),
L
=
∑
i
=
1
N
L
C
i
+
L
R
N
\mathcal L = \sum_{i=1}^{N}L_{C}^{i}+L_{R}^{N}
L=∑i=1NLCi+LRN
Open set or closed set
这一段是想证明,在closed set上训练的模型,很难在open set上的实际场景有好的泛化能力。在cell counting数据集上选了若干个 [ 0 , 10 ] [0,10] [0,10]的patch做训练集,若干 [ 0 , 20 ] [0,20] [0,20]的patch做测试集,发现测试集中 [ 0 , 10 ] [0,10] [0,10]区间的patch精度很高, [ 10 , 20 ] [10,20] [10,20]区间的误差很大。