参考链接:霹雳吧啦b站
主要参考了b站霹雳吧啦的视频《深度学习目标检测篇》。
前言
R-CNN采用VGG-16作为backbone,突破了传统方法的性能瓶颈。Fast R-CNN大大提升了推理速度,并且性能提升了4%。Faster R-CNN将RPN模块与Fast R-CNN相结合进一步提升了推理速度。
R-CNN
根据上图,R-CNN一共可以分为4个步骤:
- 一张图像生成1k~2k个候选区域(Selective Search,SS).
- 对于每个候选区域的图像,均resize至227×227,然后(
每个resize后的候选区域图像
)送入CNN网络,输出时将特征进行展平(2000×4096)。 - 将特征送入每一类的SVM(4096×20)分类器,生成2000×20的特征矩阵。接着对矩阵中的每一列即每一类进行NMS,剔除重叠框。
- 然后剔除预测框与GT框IOU小于阈值的框。最后使用20个回归器对剩余预测框进行回归。
缺点
:
- 使用SS算法耗时,且一张图像内候选框之间存在大量重叠,提取特征冗余。
- 训练过程繁琐,训练速度慢。
- SVM和bbox回归训练需要将提取的候选框写入磁盘,需要的存储空间很大。
Fast R-CNN
根据上图,Fast R-CNN一共可以分为3步:
- 一张图像生成1K~2K个候选区域(SS生成)。
- 将整张原图输入到CNN网络当中(
而R-CNN将所有候选区域输入到网络中
),将SS算法生成的候选框投影到特征图上获得相应的特征矩阵。 - 将每个特征矩阵通过ROI Pooling层缩放至7*7,接着将特征图展平通过一系列全连接层得到预测结果。
- 在训练过程中,并不是直接使用SS生成的全部候选区域。一般户使用64个候选区域,并且其中包含正样本(与目标GT的IOU大于0.5)和负样本。
输出:
- 分类器(softmax)输出N+1个类别概率(N为检测目标的种类,1为背景概率),共N+1个节点。
- 边界框回归输出N+1个类别的候选边界框回归参数( d x , d y , d w , d h d_x,d_y,d_w,d_h dx,dy,dw,dh),共(N+1)×4个节点。
Loss:
总损失为分类损失加边界框回归损失。
L
(
p
,
u
,
t
u
,
v
)
=
L
c
l
s
(
p
,
u
)
+
λ
[
u
≥
1
]
L
l
o
c
(
t
u
,
v
)
L(p,u,t^u,v)=L_{cls}(p,u)+λ[u≥1]L_{loc}(t^u,v)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
其中 p p p为分类器预测的 softmax \text{softmax} softmax概率分布 p = ( p 0 , ⋅ ⋅ ⋅ , p k ) p=(p_0,···,p_k) p=(p0,⋅⋅⋅,pk), u u u为目标真实类别标签 u = ( 0 , ⋅ ⋅ ⋅ , 1 , 0 ) u=(0,···,1,0) u=(0,⋅⋅⋅,1,0), t u t^u tu为边界框回归预测的对应类别 u u u的回归参数 ( t x u , t y u , t w u , t h u ) (t_x^u,t_y^u,t_w^u,t_h^u) (txu,tyu,twu,thu), v v v为真实目标的边界框回归参数 ( v x , v y , v w , v h ) (v_x,v_y,v_w,v_h) (vx,vy,vw,vh)。而 [ u ≥ 1 ] [u≥1] [u≥1]是一个艾弗森括号,当 u ≥ 1 u≥1 u≥1时,括号表达式的值为1,否则为0。即当有目标存在时, one-hot \text{one-hot} one-hot标签为1,此时才计算回归损失,否则当类别为背景时,不计算回归损失。
对于分类损失
(多分类
softmax
\text{softmax}
softmax,所有输出概率和为1;二分类
sigmoid
\text{sigmoid}
sigmoid,各个输出节点概率输出互不相干):
L
c
l
s
(
p
,
u
)
=
−
log
p
u
L_{cls}(p,u)=-\text{log} \ p_u
Lcls(p,u)=−log pu
对于回归损失
:
L
l
o
c
(
t
u
,
v
)
=
∑
i
∈
{
x
,
y
,
w
,
h
}
s
m
o
o
t
h
L
1
(
t
i
u
−
v
i
)
L_{loc}(t^u,v)=\sum_{i \in \{x,y,w,h\}}smooth_{L1}(t_i^u-v_i)
Lloc(tu,v)=i∈{x,y,w,h}∑smoothL1(tiu−vi)
s
m
o
o
t
h
L
1
(
x
)
=
{
0.5
x
2
,
if
∣
x
∣
<
1
∣
x
∣
−
0.5
,
otherwise
smooth_{L1}(x) = \begin{cases} 0.5x^2, & \text{if} \ |x| < 1 \\ |x|-0.5, & \text{otherwise} \end{cases}
smoothL1(x)={0.5x2,∣x∣−0.5,if ∣x∣<1otherwise
Faster R-CNN
根据上图,可以将Faster R-CNN算法分为3个步骤:
- 将整张图像输入网络得到对应的特征图。
- 利用RPN结构生成候选框,然后将候选框投影至特征图上获得对应的特征矩阵。
- 将每个
候选框特征矩阵
通过ROI Pooling层缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。
RPN
- 对于一张1000×600×3的图像,大约有60×40×9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。使用RPN生成的候选框之间同样存在大量重叠,此时基于候选框的 c l s cls cls得分,采用NMS,IOU设为0.7,这样每张图片只剩2k个候选框。
- 训练RPN模块需要使用anchor,上一步说明剩余6k个anchor,此时需要从这些anchor中选取256个anchor,这些anchor中包含正负样本,当正样本不足128个时,使用负样本填充满足样本总量256个。
- 正样本:(1) anchor与GT的IOU大于0.7。(2) 若没有满足条件(1)的,则选择与GT的IOU最大的anchor当做正样本;负样本:anchor与GT的IOU小于0.3。
Anchor Size
三种尺度(面积
):{
12
8
2
,
25
6
2
,
51
2
2
128^2,256^2,512^2
1282,2562,5122},三种比例{
1
:
1
,
1
:
2
,
2
:
1
1:1,1:2,2:1
1:1,1:2,2:1},则可生成9种anchor size:
128×128(16384) | 256×256(65536) | 512×512(262144) | |
---|---|---|---|
1:1 | 128×128 | 256×256 | 512×512 |
1:2 | 90×181 | 181×362 | 362×724 |
2:1 | 181×90 | 362×181 | 724×362 |
LOSS
RPN Multi-task loss:
L
(
{
p
i
}
,
{
t
i
}
)
=
1
N
c
l
s
∑
i
L
c
l
s
(
p
i
,
p
i
∗
)
+
λ
1
N
r
e
g
∑
i
p
i
∗
L
r
e
g
(
t
i
,
t
i
∗
)
L(\{p_i\},\{t_i\})=\frac{1}{N_{cls}}\sum_iL_{cls}(p_i,p_i^*)+λ\frac{1}{N_{reg}}\sum_ip_i^*L_{reg}(t_i,t_i^*)
L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
其中
p
i
p_i
pi表示模型预测的第
i
i
i个
anchor
\text{anchor}
anchor中有前景的概率,
p
i
∗
p_i^*
pi∗表示真实情况第
i
i
i个
anchor
\text{anchor}
anchor是否含有目标,若有其值为1,否则其值为0。
t
i
t_i
ti表示预测的目标框相对于第
i
i
i个
anchor
\text{anchor}
anchor的偏移量,
t
i
∗
t_i^*
ti∗表示
G
T
GT
GT框相对于第
i
i
i个
anchor
\text{anchor}
anchor的偏移量(利用两个相较于anchor的偏移量计算loss
)。
N
c
l
s
N_{cls}
Ncls表示一个
mini-batch
\text{mini-batch}
mini-batch中的所有样本数量(256),
N
r
e
g
N_{reg}
Nreg表示特征图像素个数(不包含channel,约2400)。
L
c
l
s
(
softmax
)
L_{cls}(\text{softmax})
Lcls(softmax):
L
c
l
s
=
−
log
(
p
i
)
L_{cls}=-\text{log}(p_i)
Lcls=−log(pi)
L
r
e
g
L_{reg}
Lreg:
L
r
e
g
(
t
i
,
t
i
∗
)
=
∑
i
s
m
o
o
t
h
L
1
(
t
i
−
t
i
∗
)
L_{reg}(t_i,t_i^*)=\sum_{i}smooth_{L1}(t_i-t_i^*)
Lreg(ti,ti∗)=i∑smoothL1(ti−ti∗)
s
m
o
o
t
h
L
1
(
x
)
=
{
0.5
x
2
,
if
∣
x
∣
<
1
∣
x
∣
−
0.5
,
otherwise
smooth_{L1}(x) = \begin{cases} 0.5x^2, & \text{if} \ |x| < 1 \\ |x|-0.5, & \text{otherwise} \end{cases}
smoothL1(x)={0.5x2,∣x∣−0.5,if ∣x∣<1otherwise
回归损失的示意图如图所示:
其中,偏移量
t
i
=
[
t
x
,
t
y
,
t
w
,
t
h
]
t_i=[t_x,t_y,t_w,t_h]
ti=[tx,ty,tw,th]与偏移量
t
i
∗
=
[
t
x
∗
,
t
y
∗
,
t
w
∗
,
t
h
∗
]
t_i^*=[t_x^*,t_y^*,t_w^*,t_h^*]
ti∗=[tx∗,ty∗,tw∗,th∗]的计算如上图所示。
FPN
特征金字塔结构,通过融合不同层的特征增强表征能力。最后输出的浅层P2由于保留了更多的细节信息用于预测小目标,深层P5/P6用于预测大的目标。
RetinaNet
正负样本匹配
- 使用 anchor \text{anchor} anchor与 G T GT GT做 IOU \text{IOU} IOU计算,当 IOU ≥ 0.5 \text{IOU}≥0.5 IOU≥0.5时,当前 anchor \text{anchor} anchor被当做正样本;而当 IOU < 0.4 \text{IOU}<0.4 IOU<0.4时时,当前 anchor \text{anchor} anchor被当做负样本,其余的则被舍弃。
- RetinaNet使用 FCOS Loss \text{FCOS Loss} FCOS Loss。