多尺度检测
降低下采样率与空洞卷积
- 对于小物体检测而言,降低网络的下采样率也许是最为简单的提升方式,通常的做法是直接去掉 Pooling 层,但这样虽然减小了下采样率,却会导致后续层的感受野与原有模型不同,如果使用预训练模型进行微调,则模型不能很好地收敛,因此可以使用空洞卷积,在保证不改变网络分辨率的前提下增加网络的感受野。需要注意的是,采用空洞卷积也不能保证修改后与修改前的感受野完全相同,但能够最大限度地使感受野在可接受的误差内
Anchor 设计
- Anchor 通常是多个不同大小与宽高的边框,这个大小与宽高是一组超参数,需要我们手动配置。在不同的数据集与任务中,由于物体的尺度、大小会有差距,例如行人检测的数据集中,行人标签宽高比通常为 0.41,与通用物体的标签会有所区别,这时就需要相应地调整 Anchor 的大小与宽高。另外,Anchor 的大小对于小物体的检测也尤为重要,如果 Anchor 过大,即使小物体全部在 Anchor 内,也会因为其自身面积小导致 IoU 低,从而造成漏检。因此,如果 Anchor 设计的不合理,与数据集中的物体分布存在差距,则会给模型收敛带来较大的困难,影响模型的精度,甚至不会收敛
- 通常来讲,可以从以下两个角度考虑如何设计一组好的 Anchor:
- (1) 统计实验: 利用训练集的标签与设计的 Anchor 进行匹配试验,试验的指标是所有训练标签的召回率,以及正样本的平均 IoU 值。当然,也可以增加每个标签的正样本数、标签的最大 IoU 等作为辅助指标。为了方便地匹配,在此不考虑 Anchor 与标签的位置偏移,而是把两者的中心点放在一起,仅仅利用其宽高信息进行匹配。这种统计实验实际是通过手工设计的方式,寻找与标签宽高分布最为一致的一组 Anchor
- (2) 边框聚类: 在训练集的标签上直接聚类出一组合适的 Anchor (YOLO v2 就是使用了 K-means 算法进行边框聚类)。由于一组 Anchor 会出现在特征图的每一个位置上,因此没有位置区别,可以只关注标签里的物体宽高,而没必要关心物体出现的位置
多尺度训练 (Multi Scale Training,MST)
- 关于多尺度,我们首先可以联想到数字图像处理中的图像金字塔,即将输入图片缩放到多个尺度下,每一个尺度单独地计算特征图,并进行后续的检测。这种方式虽然一定程度上可以提升检测精度,但由于多个尺度完全并行,耗时巨大
- 当前的多尺度训练通常是指设置几种不同的图片输入尺度,训练时从多个尺度中随机选取一种尺度,将输入图片缩放到该尺度并送入网络中,是一种简单又有效的提升多尺度物体检测的方法。虽然一次迭代时都是单一尺度的,但每次都各不相同,增加了网络的鲁棒性,又不至于增加过多的计算量。而在测试时,为了得到更为精准的检测结果,也可以将测试图片的尺度放大,例如放大 4 倍,这样可以避免过多的小物体
- 多尺度训练是一种十分有效的 trick,放大了小物体的尺度,同时增加了多尺度物体的多样性,在多个检测算法中都可以直接嵌入,在不要求速度的场合或者各大物体检测竞赛中尤为常见
特征融合
尺度归一化: SNIP (Scale Normalization for Image Pyramids)
Image Classification at Multiple Scales
- SOTA 的目标检测方法一般是在
800
×
1200
800\times 1200
800×1200 的分辨率下训练,但推理却是在图像金字塔上进行的,其中检测小物体时使用的分辨率达到了
1400
×
2000
1400\times2000
1400×2000,因此这样的训练和推理方式带来了 domain shift. 作者下面就分析了 domain shift 带来的影响
- Naive Multi-Scale Inference (CNN-B;高分辨率训练,低分辨率测试): 首先将 ImageNet 中的图像下采样为
48
×
48
48\times48
48×48,
64
×
64
64\times64
64×64,
80
×
80
80\times80
80×80,
96
×
96
96\times96
96×96 和
128
×
128
128\times128
128×128 的低分辨率图像,然后将它们上采样为
224
×
224
224\times224
224×224 后输入 CNN-B,其中 CNN-B 是在
224
×
224
224\times224
224×224 的分辨率上训练的。实验结果表明,训练和推理时的图像分辨率差距越大,模型性能越差
- Resolution Specific Classifiers (CNN-S;低分辨率训练,低分辨率测试): 基于上述观察,一种简单的提高模型小物体检测性能的方法就是让模型在低分辨率图像上训练,这就需要在网络架构中使用更小的 stride。实验表明,
48
×
48
48\times48
48×48 和
96
×
96
96\times96
96×96 分辨率下分别训练的两个 CNN-S 性能都超过了 CNN-B,因此对于低分辨率图像的检测,专门预训练一个针对低分辨率图像的 backbone 网络可能会提升模型性能
- Fine-tuning High-Resolution Classifiers (CNN-B-FT;高分辨率训练,低分辨率微调,低分辨率测试): 另一种简单的提升小物体检测性能的方法就是在上采样后的低分辨率图像上对 CNN-B 做微调,实验表明这种方法的性能最好,因此可以不改变模型架构,而是采取这种在高分辨率上训练,低分辨率上微调的方式来提升模型小物体检测性能
Data Variation or Correct Scale?
以下实验均基于 Deformable-RFCN (D-RFCN),因此可以输入不同尺寸的图片进行目标检测。Deformable-RFCN 基于 R-FCN,它在 conv5 层添加了可变形卷积来动态调整网络感受野以适应物体的不同大小,同时将位置敏感 RoI 池化替换为了可变形位置敏感 RoI 池化
- 下面的对比试验都在
1400
×
2000
1400\times2000
1400×2000 分辨率的图像上测试检测小物体的性能
- Training at different resolutions (Fig 5.1): 分别在
800
×
1400
800\times1400
800×1400 和
1400
×
2000
1400\times2000
1400×2000 分辨率下使用所有训练样本进行训练 (i.e.
80
0
a
l
l
800_{all}
800all?,
140
0
a
l
l
1400_{all}
1400all?)。和前面的结论一致,
140
0
a
l
l
1400_{all}
1400all? 的性能超过了
80
0
a
l
l
800_{all}
800all?,但提升并不明显。对此,作者认为在更高分辨率下训练虽然能提升小物体检测性能,但也让大物体尺寸过大而难以检测,模型需要同时检测尺度差距很大的物体,加重了模型负担,进而限制了模型性能
- Scale specific detectors (Fig 5.2): 有了上述观察,作者进一步在
1400
×
2000
1400\times2000
1400×2000 分辨率下仅使用小于 80 像素点的训练样本进行训练 (i.e.
140
0
<
80
p
x
1400_{<80px}
1400<80px?),但却发现模型性能反而降低了。对此,作者认为丢弃大物体样本降低了样本的多样性,这会对模型性能产生更大的损伤
- Multi-Scale Training (MST) (Fig 5.3): 多尺度训练将样本随机缩放到不同分辨率下进行训练,这保证了模型能在多个分辨率下观察物体。然而,MST 的性能却只与
80
0
a
l
l
800_{all}
800all? 接近,对此,作者认为应该使用适当缩放的物体样本进行训练,同时也要保证足够的样本多样性 (Fig 5.4)
Object Detection on an Image Pyramid
- Scale Normalization for Image Pyramids: SNIP 是 MST 的改进版本,当图像被缩放到不同分辨率时,只有与预训练数据集分辨率尺寸 (typically
224
×
224
224\times224
224×224) 接近的物体才被用于训练。这样既保证了数据的多样性,又不会因为过大/过小物体难以检出而导致模型性能下降
- 具体而言,在训练分类器时,先用所有 GT 框给 proposals 分配标签,然后丢弃那些尺寸过大或过小的 proposals 和 GT 框。同样地,在训练 RPN 时,也是先用所有 GT 框给所有锚框分配标签,然后将过大或过小 GT 框设为无效 GT 框,丢弃与无效 GT 框 IoU 超过 0.3 的锚框;推理时,则在不同分辨率下分别输出预测框,然后丢弃过大或过小的预测框 (注意,是丢弃预测框而非 proposals),最后使用 soft NMS 输出最终的预测框
三叉戟: TridentNet
- TridentNet 的作者首先分析了不同大小的感受野对于检测结果的影响。实验分别采用了 ResNet-50 及 ResNet-101 作为 Backbone,仅仅改变最后一个阶段的每个
3
×
3
3×3
3×3 卷积的空洞数,这也得益于空洞卷积可以在相同的结构、参数量与下采样率时,改变网络的感受野。实验结果如下表所示:
其中,
A
P
s
AP_s
APs?、
A
P
m
AP_m
APm? 与
A
P
l
AP_l
APl? 分别代表小、中、大 3 个不同尺度的评测子集。从结果可以很直观地看出,不同尺度的检测性能与感受野呈正相关,即大的感受野对于大物体更友好,小的感受野对于小物体更友好。基于此结论,进一步联想,能否将这 3 种不同的检测性能结合,实现优势互补呢? - 基于此,作者将这 3 种不同的感受野网络并行化,提出了如下图所示的检测框架。采用 ResNet 作为 Backbone,前三个 stage 沿用原始的结构,在第四个 stage 使用了三个感受野不同的并行网络 (Trident Block):
其中,由于 3 个分支要检测的内容是相同的、要学习的特征也是相同的,只不过是形成了不同的感受野来检测不同尺度的物体,因此,3 个分支共享权重,这样既充分利用了样本信息,学习到更本质的物体检测信息,也减少了参数量与过拟合的风险 (RPN 和 RCNN 网络也是共享的) - Scale-Aware Training: TridentNet 还借鉴了 SNIP 的思想,在每一个分支内只训练一定尺寸范围内的样本,避免了过大与过小的样本对于网络性能产生影响
- Fast Inference Approximation: 在测试时,由于没有先验的标签来选择不同的分支并且中间分支对较小和较大物体的检测性能都比较好,因此只保留了一个中间一个分支进行前向计算。这种前向方法只有少量的精度损失,同时还增加了模型推理速度
拥挤与遮挡
- 与通用的物体检测相比,遮挡问题在行人的检测中更为普遍,该问题也是行人检测中最为棘手的问题之一。本节将会从行人检测的角度,介绍遮挡问题的背景,以及如何解决行人检测中的遮挡问题
行人检测问题
Faster RCNN 由于其两阶的设计,在行人检测领域比 SSD 等一阶网络更有优势,通常作为行人检测的基础结构
行人检测的数据集
- (1) Caltech: 一个规模较大的行人检测数据集,其包含了大约 25 万张图片,2300 个行人标签,是一个十分常用的行人检测数据集
- (2) CityPersons: 在 Cityscape 城市数据集的基础上,标注了更为全面的行人标签,从行人的数量、小物体、遮挡的丰富性来讲,都胜过以往的数据集,现已成为行人检测领域的首选性能评测数据集
多尺度检测
- 在行人检测中,多尺度检测的问题同样严重,因此使用上采样、降低下采样率、SNIP、特征融合等,也可以有效提升行人检测的性能
- 尤其需要指出的是,由于行人具有特殊的形状,其高宽比集中在 2.41 左右,因此设计针对性更强的 Anchor,也可以有效提升检测的精度
行人遮挡情景
- (1) 行人之间的自遮挡: 行人之间的自遮挡会严重影响检测的性能,主要体现在 (i) 定位不准确:在提取行人的特征时,遮挡会带来特征的缺失,并且距离很近的行人特征会相互影响,带来干扰,这都会降低行人定位的准确性;(ii) 对 NMS 的阈值更为敏感
- (2) 行人被其他物体遮挡: 这种遮挡会导致大面积的信息缺失,即使肉眼也不容易判断行人的边框具体位置,进而带来较高的行人漏检
解决行人遮挡问题
- (1) 改进 NMS:Soft NMS、IoU-Net…
- (2) 增加语义信息:遮挡会造成行人部分信息的缺失,因此可以尝试引入额外的特征,如分割信息、梯度和边缘信息等,详细方法可见 CVPR 2017 中的 HyperLearner
- (3) 划分多个 part 处理:由于行人之间的形状较为相似,因此可以利用这个先验信息,将行人按照不同部位,如头部、上身、手臂等划分为多个 part 进行单独处理,然后再综合考虑,可以在一定程度上缓解遮挡带来的整体信息缺失
排斥损失: Repulsion Loss
- 当物体靠得太近时,周围物体会对真实物体的回归造成干扰。基于此,作者提出 Repulsion Loss 来缓解物体之间的相互影响。Repulsion Loss 的回归损失如下式所示:
- Attraction Term
L
a
t
t
r
L_{attr}
Lattr? 代表当前样本预测框与真值的吸引回归损失,沿用了 Faster RCNN 的
s
m
o
o
t
h
L
1
smooth_{L_1}
smoothL1?? 函数
其中,
P
∈
P
+
P\in \mathcal P_+
P∈P+? 为 positive proposal,
G
A
t
t
r
P
=
arg?max
?
G
∈
G
I
o
U
(
G
,
P
)
G_{Attr}^P=\argmax_{G\in\mathcal G}IoU(G,P)
GAttrP?=G∈Gargmax?IoU(G,P),
B
P
B^P
BP 为由 proposal
P
P
P 回归得到的预测框 - Repulsion Term (RepGT)
L
R
e
p
G
T
L_{RepGT}
LRepGT? 表示当前预测框与周围真实物体的排斥损失,目的是让当前预测框尽可能远离周围的标签物体
G
R
e
p
P
G_{Rep}^P
GRepP?,也就是除了预测框本身要回归的物体之外,与该预测框有最大 IoU 的物体标签
受 IoU Loss 的启发,这里衡量预测框与周围物体标签的距离使用了 IoG (Intersection over GroundTruth) 函数 可以看出,
I
o
G
(
B
,
G
)
∈
[
0
,
1
]
IoG(B,G)\in[0,1]
IoG(B,G)∈[0,1],且 IoG 的分母是常量,减小 IoG 只能通过减小
B
B
B 与
G
G
G 的重叠面积。如果这里采用 IoU 作为距离函数来优化的话,由于分母不是常量,简单地增大预测框的面积也可以达到减小 IoU 的目的,这与我们的期望并不一致,会带来模型优化不稳定的问题。最终,RepGT 被定义为 其中,
σ
∈
[
0
,
1
)
\sigma\in[0,1)
σ∈[0,1) 为平滑超参,
S
m
o
o
t
h
l
n
Smooth_{ln}
Smoothln? 在
(
0
,
1
)
(0,1)
(0,1) 上连续可微 - Repulsion Term (RepBox)
L
R
e
p
B
o
x
L_{RepBox}
LRepBox? 表示当前预测框与周围其他预测框之间的排斥损失,目的是避免本属于两个物体的预测框,其中一个被 NMS 抑制掉。根据图像中的物体标签,我们可以将最后的预测框划分为多个组,同组之间的预测框回归的是同一个物体标签,不同组之间的预测框对应的是不同的物体标签。假设有
g
g
g 个物体,则划分形式如下式所示:
然后,对于不同组之间的预测框
P
i
∈
P
i
P_i\in\mathcal P_i
Pi?∈Pi? 与
P
j
∈
P
j
P_j\in\mathcal P_j
Pj?∈Pj?,我们希望
B
P
i
B^{P_i}
BPi? 与
B
P
j
B^{P_j}
BPj? 之间的重叠区域越小越好: - 上述 3 部分损失使用了
α
α
α 与
β
β
β 来调节损失权重,实验表明,当
α
α
α 与
β
β
β 都为 0.5 时,检测性能最佳
OR-CNN (Occlusion-aware R-CNN)
聚集损失:Aggregation Loss
- OR-CNN 基于 Faster RCNN。它在 RPN 和 RCNN 阶段都加入了聚集损失来使得多个匹配到同一个物体标签的 Anchor 尽量地靠近 (locate closely and compactly to the ground-truth object),以免误检到周围临近的行人。聚集损失
L
a
g
g
\mathcal L_{agg}
Lagg? 为
其中,
i
i
i 为 mini-batch 中 proposal 的索引,
p
i
p_i
pi? 和
t
i
t_i
ti? 为预测的分类得分和坐标,
p
i
?
p^*_i
pi?? 和
t
i
?
t^*_i
ti?? 为真值,
β
\beta
β 为平衡两个损失项的超参 - 回归损失
L
r
e
g
\mathcal L_{reg}
Lreg? 使得 proposals 与 GT 框尽量接近,沿用了 Faster RCNN 的
s
m
o
o
t
h
L
1
smooth_{L_1}
smoothL1?? 损失函数
其中,
N
r
e
g
N_{reg}
Nreg? 为总的 proposal 数,
Δ
(
t
i
?
t
i
?
)
\Delta(t_i-t_i^*)
Δ(ti??ti??) 为
s
m
o
o
t
h
L
1
smooth_{L_1}
smoothL1?? 损失 - 紧密损失 (Compactness Loss)
L
c
o
m
\mathcal L_{com}
Lcom? 使得要回归到同一个物体标签的所有 Anchor 尽可能靠的更近
其中,
ρ
=
N
c
o
m
\rho=N_{com}
ρ=Ncom? 为有多个 Anchors 对应的 GT 框数量。假设 GT 框
i
i
i 有多个 Anchors 与之对应,则
t
~
i
?
\tilde t_i^*
t~i?? 为这些 Anchors 对应的坐标真值,
Φ
i
\Phi_i
Φi? 为这些 Anchors 的索引集,
1
∣
Φ
i
∣
∑
j
∈
Φ
i
t
j
\frac{1}{|\Phi_i|}\sum_{j\in\Phi_i}t_j
∣Φi?∣1?∑j∈Φi??tj? 为这些 Anchors 的位置均值,
Δ
(
?
)
\Delta(\cdot)
Δ(?) 为
s
m
o
o
t
h
L
1
smooth_{L_1}
smoothL1?? 损失函数
行人部位拆解的池化:PORoI Pooling (Part Occlusion-aware RoI Pooling)
- 将行人分多个部位拆解,分别提取不同部位的特征,再融合检测,这是较为常见的处理遮挡问题的解决办法。OR-CNN 借鉴了该思想,并将这种思想融合到了 RoI Pooling 的过程中,提出了 PORoI Pooling
- 首先,PORoI Pooling 利用行人的先验知识,将行人 (i.e. proposal
Q
Q
Q) 分成了 5 个部位
(
P
1
,
.
.
.
,
P
5
)
(P_1,...,P_5)
(P1?,...,P5?),5 个部位的大小与行人的宽、高为固定的比例关系。接着用 RoI Pooling 得到特征
(
F
1
,
.
.
.
,
F
5
)
(F_1,...,F_5)
(F1?,...,F5?) 然后输入遮挡处理单元得到可见度得分 (visibility score)
(
o
1
,
.
.
.
,
o
5
)
(o_1,...,o_5)
(o1?,...,o5?)。除此之外,还直接对 proposal
Q
Q
Q 使用 RoI Pooling 得到整体特征
F
\mathcal F
F。最后通过逐元素加来获得最终的特征为
F
⊕
(
o
1
?
F
1
)
⊕
(
o
2
?
F
2
)
⊕
(
o
3
?
F
3
)
⊕
(
o
4
?
F
4
)
⊕
(
o
5
?
F
5
)
\mathcal{F} \oplus\left(o_{1} \cdot F_{1}\right) \oplus\left(o_{2} \cdot F_{2}\right) \oplus(o_{3}\cdot F_3)\oplus(o_{4}\cdot F_4)\oplus(o_{5}\cdot F_5)
F⊕(o1??F1?)⊕(o2??F2?)⊕(o3??F3?)⊕(o4??F4?)⊕(o5??F5?)
其中,遮挡处理单元需要输入每个部分的可见度得分真值
o
?
o^*
o? 作为训练时的标签然后使用交叉熵损失 (i.e.
L
o
c
c
\mathcal L_{occ}
Locc?) 进行训练。如果该部分的一半是可见的,则
o
?
=
1
o^*=1
o?=1,反之为 0,这就要求事先对哪些像素是可见的,哪些是不可见的进行标注
综上所述,OR-CNN 的 RPN 部分损失为: RCNN 部分损失为:
参考文献
|