R-CNN(Region with CNN feature)
1 主要介绍
论文:Rich feature hierarchies for accurate object detection and semantic segmentation 用于目标检测与语义分割的丰富特征层次结构
R-CNN是利用深度学习进行目标检测的开山之作,作者Ross Girshick,将目标检测的准确率提高30%左右。RCNN文章是two-stage算法的开篇之作,奠定了一个基础。在RCNN之前,很多效果好的算法主要是采用融合多个低层次的图像特征与高层次的上下文信息的复杂ensamble(集成)的系统。
其实它的名字就是一个很好的解释。用CNN提取出Region Proposals(候选区域)
中的featues
,然后进行SVM分类与bbox的回归。
RCNN算法流程可分为4个步骤
- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 对每个候选区域,使用深度网络提取特征
- 特征送入每一类的SVM分类器,判断是否属于该类
- 使用回归器精细修正候选框的位置
1.1 候选区的生成
利用Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就可能包含需要的物体
Selective Search算法:训练过程中用于从输入图像中搜索出2000个Regional Proposal。步骤如下:
- 使用一种过分割手段,将图像分割成小区域(1k-2k)
- 计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等
- 将相似度比较高得到区域合并到一起
- 计算合并区域和临近区域的相似度
- 重复3、4过程,直到整个图片变成一个区域
输入:图片image
输出:物体可能的位置集合L
-------------------------------------
使用图像分割算法获取初始候选区域R={r1,r2,...,rn}(# 如图一)
定义相似度集合S={}
for earch 相邻区域(ri,rj) in R:
计算相似度s(ri,rj)
S = S ∪ s(ri,rj)
end for
while S ≠ Ø:(# 如图二)
获取S中的最大相似度,s_max(ri,rj) = max(S)
合并该这两个区域 rt = ri ∪ rj
删除所有与ri和rj有关的相似度 s(ri,r*),s(rj,r*)
计算所有与rt相邻区域的相似度,并添加到集合S,S = S ∪ s(rt,r*)
将新生成的区域rt添加到候选区域R, R = R ∪ rt
end while
从候选区域R获取所有可能的Bounding Boxes集合L
return L
-------------------------------------
在每次迭代中,形成更大的区域并将其添加到候选区域列表中,这种自下而上的方式可以创建从小到大不同scale的Region proposal.
1.2 特征提取
对每个候选区域,使用深度网络提取特征。将2000候选区缩放到227*227pixel(变形之前,我们先在候选框周围加上16的padding,再进行各向异性缩放。 这种形变使得mAp提高了3到5个百分点。)接着将候选区域输入到事先训练后的AlexNet,获取4096维的特征,得到2000*4096维矩阵。
假设我们采用结构比较简单的AlexNet,但是考虑到训练数据少,如果随机初始化参数从头开始训练,由于数据不够,最终的检测效果会比较差。所以我们使用已经训练好了的AlexNet进行迁移学习,进行fine-tuning训练,只需将最后一层替换掉即可,替换为N+1个输出的神经元(假设需要检测的物体有N类,还有一类表示背景,这一层参数使用随机初始化),然后我们就能对其进行训练了。
训练过程中我们需要一些正样本和一些负样本,人工标注的数据中标注了正确的bounding box,我们前面使用selective search算法挑选出了2000个左右的候选框,然后我我们将候选框中与人工标注的矩形框的重叠区域IoU大于0.5的标记为正样本,否则就标记为负样本。然后使用这些样本对CNN网络进行训练即可。
另外,由于对于一张图片的多有候选区域来说,负样本是远远大于正样本数,所以需要将正样本进行上采样来保证样本分布均衡。在每次迭代的过程中,选择层次采样,每个mini-batch中采样两张图像,从中随机选取32个正样本和96个负样本组成一个mini-batch(128,正负比:1:3)。我们使用0.001的学习率和SGD来进行训练。
1.3 类别判定
特征送入每一类的SVM分类器,判定类别。将2000*4096维特征与20个SVM组成的权值矩阵4096*20相乘,或获得2000*20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000*20维矩阵中每一列即每一类进行非极大值抑制剔除重叠候选框,得到该列即类中得分最高的一些候选框。
非极大值抑制 Non-maximum suppression:
- 寻找得分最高的目标
- 计算其他目标与该目标的IoU值
- 删除所有IoU值大于给定阈值的目标
设置删除大于阈值,是因为若两个目标的IoU很大,说明这两个目标包含的东西差不多,所以只需要保留概率值大的,删除小的就行。遍历完所有的目标,只需要保留最完整的边界框即可。
1.4 精细修正
使用回归器精细修正候选框的位置。对NMS处理后剩余的候选框进行进一步的筛选。接着分别用20个回归其对上述20个类别中剩余的候选框进行回归操作,最总得到每个类比的的修正后的得分最高的bounding box。
Bounding box regression
在目标检测中,窗口一般用四维向量(x, y, w, h)来表示,分别表示窗口的中心点坐标和宽高。在下图中,粉色的窗口P为region proposal,蓝色窗口G为Ground Truth,那么bounding box regression的目标就是:找到一种映射关系,使得P经过映射后会得到一个和G比较接近的G’。
即:给定 ( P x , P y , P w , P h ) (P_x,P_y,P_w,P_h) (Px,Py,Pw,Ph),寻找一种映射关系 f f f,使得 f ( P x , P y , P w , P h ) = ( G x ′ , G y ′ , G w ′ , G h ′ ) f(P_x,P_y,P_w,P_h)=(G_x',G_y',G_w',G_h') f(Px,Py,Pw,Ph)=(Gx′,Gy′,Gw′,Gh′),且$(G_x’,G_y’,G_w’,G_h’) \approx(G_x,G_y,G_w,G_h) $
要从P变到G’,无非就是平移+缩放
-
平移 ( Δ x , Δ y ) (\Delta x, \Delta y) (Δx,Δy),在R-CNN中对应着如下平移操作:
G x ′ = P w d x ( P ) + P x G_x'=P_wd_x(P)+P_x Gx′=Pwdx(P)+PxG y ′ = P h d y ( P ) + P y G_y'=P_hd_y(P)+P_y Gy′=Phdy(P)+Py
其中 Δ x = P w d x ( P ) , Δ y = P h d y ( P ) \Delta x =P_wd_x(P), \quad \Delta y = P_hd_y(P) Δx=Pwdx(P),Δy=Phdy(P)
-
缩放 ( S w , S h ) (S_w, S_h) (Sw,Sh), 在R-CNN中对应着如下的操作:
G w ′ = P w e d w ( p ) G_w'=P_we^{d_w(p)} Gw′=Pwedw(p)G h ′ = P h e d h ( P ) G_h'=P_he^{d_h(P)} Gh′=Phedh(P)
其中 S w = e d w ( P ) , S h = e d h ( P ) S_w = e^{d_w(P)}, \quad S_h=e^{d_h(P)} Sw=edw(P),Sh=edh(P)
综上所述,我们需要计算出 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P), d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P)这四个平移缩放量,这就需要我们学习到四种映射关系,
设计回归:
回归是在大一堆数据中找到一种映射关系,所以现在需要定义一堆数据(x, y):
x:region proposal P x , P y , P w , P h P_x, P_y,P_w,P_h Px,Py,Pw,Ph ,但是输入的并不是这四个数值,而是region proposal所对应的pool 5层的特征。
y:输出就是平移和缩放的尺度,即 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P), d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P)。根据这些平移缩放尺度,我们就能根据上面的公式(1)(2)(3)(4)计算得到微调后的窗口 G′ 。回归的目的就是,训练一组参数 W W W,使得 y = W x y=Wx y=Wx。
在训练时,输入x就是每个region proposal的pool5层的特征,用 ϕ5§ 表示,那么y则是由ground truth G 和当前的region P 计算得到平移缩放量,就代表真正需要的平移和缩放量,这里用 t 来表示:
t
x
=
(
G
x
−
P
x
)
/
P
w
t
y
=
(
G
y
−
P
y
)
/
P
h
t
w
=
log
(
G
w
/
P
w
)
t
h
=
log
(
G
h
/
P
h
)
t_x = (G_x - P_x)/P_w\\ t_y = (G_y - P_y)/P_h \\ t_w = \log(G_w/P_w)\\ t_h = \log(G_h/P_h)
tx=(Gx−Px)/Pwty=(Gy−Py)/Phtw=log(Gw/Pw)th=log(Gh/Ph)
所以我们训练W,使得WΦ§ ≈t ,因此可以将损失函数定义为:
l
o
s
s
=
∑
i
=
1
N
(
t
i
−
w
T
Φ
5
(
P
)
)
2
+
λ
∥
w
∥
2
loss = \sum_{i=1}^{N}(t^i-w^T\Phi_5(P))^2+\lambda \left \| w\right \|^2
loss=i=1∑N(ti−wTΦ5(P))2+λ∥w∥2
后面加入正则项。
1.5 R-CNN存在的问题
-
测试速度慢:
- 测试一张图片越53s(CPU)。用Selective Search算法提取候选框用时约2s,一张图片内候选框之间存在大量重叠,提取特征操作冗余。
-
训练速度慢:
- 过程极其繁琐
-
训练所需空间大:
- 对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如Vgg16,从VOC07训练集上的5k图像上提取特征需要数百GB的存储空间。
-
多阶段训练:
- 文章中提出的模型包括多个模块,每个模块都是相互独立的,训练也是分开的。这会导致精度不高,因为整体没有一个训练联动性,都是不共享分割训练的,自然最重要的CNN特征提取也不会做的太好。
Fast R-CNN
论文名称:Fast R-CNN 是作者Ross Girshick继R-CNN后的又一力作。同样使用VGG16作为网络的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从62%提升至66%(Pascal VOC数据集)。
Fast R-CNN算法流程可分为3个步骤:
- 一张图片生成1~2k个候选区域(使用Selective Search算法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获取到相应的特征矩阵
- 将每个特征矩阵通过RoI pooling层缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果(RoI Region of Interest) RoI是在feature map上,而region proposal在原图上。
2.1 图像特征
一次性计算整张图像特征
R-CNN一次将候选区域输入卷积神经网络得到特征
Fast-RCNN 将整张图像输入网络,紧接着从图像特征上提取相应的候选区域。这些候选区域的特征不需要再重复计算。而且不限制输入图像的尺寸。
2.1.1 SPPnet
论文:Spatial Pyamid Pooling in Deep Convolutional Networks for Visual Recognition
SPPnet是何凯明的作品。其两大亮点:1.它解决了深度卷积神经网络(CNNs)的输入必须要求固定图像尺寸(例如224*224)的限制。2.在目标检测领域它提高了提取特征的效率,速度相比R-CNN提升24-102倍。
1)空间金字塔池化
我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。对此SPPnet提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。
空间金字塔池化并非作者原创,它是一种词袋(Bag of Words,BoW)模型的拓展,该模型在计算机视觉领域已经是非常成功的方法了,它将图像切分成粗糙到精细各种级别,然后整合其中的局部特征。
输入一副任意尺度的待测图像,用CNN可以提取得到卷积层特征(例如VGG16最后的卷积层为Conv5_3,得到512幅特征图)。然后将不同大小候选区域的坐标投影到特征图上得到对应的窗口(window),将每个window均匀划分为4*4, 2*2, 1*1的块,然后对每个块使用Max-Pooling下采样,这样无论window大小如何,经过SPP层之后都得到了一个固定长度为(4*4+2*2+1)*512维的特征向量,将这个特征向量作为全连接层的输入进行后续操作。这样就能保证只对图像提取一次卷积层特征,同时全连接层的输入维度固定。
SPP-net的目标检测整体流程:
(1)输入待检测图像;
(2)利用SS算法提取约2000个最有可能包含目标的候选框;
(3)候选区长宽中较短边长度进行统一,即min(w, h)=s, s∈{480,576,688,864,1200},s取值标准是使得统一后的候选区域尺寸与224*224最接近;
(4)利用SPP-net网络结构提取特征
(5)分类与回归:根据所提取特征,利用SVM进行分类,用边框回归器微调候选框的位置。
问题的关键在于特征图(feature maps)的大小是根据图片的大小与卷积层的卷积核大小(kernel size)与步长(stride)决定的,如何在特征图上找到原图上对应的候选区域,即两者之间的映射关系是怎么样的。
假设(x’, y’)表示特征图上的坐标点,坐标点(x, y)表示输入图片上的点,那么他们之间有如下转换关系,这种映射关系和网络结构有关: ( x , y ) = ( S x ′ , S y ′ ) (x, y)=(S_x', S_y') (x,y)=(Sx′,Sy′)
反过来,我们希望通过(x, y)坐标求解(x’, y’),那么计算公式如下:
l
e
f
t
、
t
o
p
:
x
′
=
⌊
x
/
S
⌋
+
1
r
i
g
h
t
、
b
o
t
t
o
m
:
x
′
=
⌈
x
/
S
⌉
−
1
left、top:\quad x'=\left \lfloor x / S\right \rfloor+1 \\ right、bottom: \quad x' = \left \lceil x / S \right \rceil - 1
left、top:x′=⌊x/S⌋+1right、bottom:x′=⌈x/S⌉−1
S就是CNN中所有的strides的乘积,包含了池化,卷积的strid
2.1.2 RoI Pooling Layer
Fast R-CNN在特征提取上可以说很大程度借鉴了SPPnet,首先将图片用选择搜索算法(selective search)得到2000个候选区域(region proposals)的坐标信息。另一方面,直接将图片归一化到CNN需要的格式,整张图片送入CNN(本文选择的网络是VGG),将第五层的普通池化层替换为RoI池化层,图片然后经过5层卷积操作后,得到一张特征图(feature maps),开始得到的坐标信息通过一定的映射关系转换为对应特征图的坐标,截取对应的候选区域,经过RoI层后提取到固定长度的特征向量,送入全连接层。 例如VGG16的conv5_3有512个特征图,通过RoI池化产生一个7*7*512维的特征向量作为全连接层的输入,即RoI Pooling Layer只采用单一尺度进行池化
而对于RoI pooling层则采用一种尺度的池化层进行下采样,将每个RoI区域的卷积特征分成4*4个bin,然后对每个bin内采用max pooling,这样就得到一共16维的特征向量。SPP层和RoI pooling层使得网络对输入图像的尺寸不再有限制,同时RoI pooling解决了SPP无法进行权值更新的问题。RoI pooling层有两个主要作用:第一个:将图像中的RoI区域定位到卷积特征中的对应位置;第二个:将这个对应后的卷积特征区域通过池化操作固定到特定长度的特征,然后将该特征送入全连接层。
假如最终我们要生成 H x W 的 feature map,那么我们就 将此 feature map 的区域划分为平均的 H x W 大小的网格。分别求出每个网格中的最大值,我们就会得到 H x W 大小的结果。这就是 RoI pooling 的过程。
2.1.3 分类器
Fast R-CNN则是将候选框目标分类与bbox regression并列放入全连接层,形成一个multi-task模型。cls_ score层用于分类,输出K+1维数组p,表示属于K类和背景的概率(是经过softmax层的概率,所以和为1)。 bbox_predict层用于调整候选区域位置,输出4*K维数组t,表示分别属于K类时,应该平移缩放的参数 ( d x , d y , d w , d h ) (d_x,d_y,d_w,d_h) (dx,dy,dw,dh)。根据缩放参数如何得到微调后的框,计算公式见上面的R-CNN。
2.1.4 Multi-task 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)=Lcls(p,u)+\lambda[u\ge1]L_{loc}(t^u,v) L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
前半部分是分类损失,后半部分是边界框回归损失。
[
u
≥
1
]
[u\ge1]
[u≥1]是艾佛森括号(当u大等于1是,值为1,当u小于1时,值 为0)即,当
u
u
u为背景时,是不需要加上
L
l
o
c
L_{loc}
Lloc损失的,其中
p
p
p是分类器预测的softmax概率分布
p
=
(
p
0
,
.
.
.
,
p
k
)
p=(p_0,...,p_k)
p=(p0,...,pk),
p
0
p_0
p0是背景的概率。
u
u
u对应目标真实标签,
t
u
t^u
tu对应边界框回归器预测的对应类别
u
u
u的回归参数
(
t
x
u
,
t
y
u
,
t
w
u
,
t
h
u
)
(t^u_x,t^u_y,t^u_w,t^u_h)
(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)
L
c
l
s
=
−
log
(
p
u
)
L
l
o
c
=
∑
i
∈
{
x
,
y
,
w
,
h
}
s
m
o
o
t
h
L
1
(
t
i
u
−
v
i
)
L_{cls}=-\log(p_u)\\ L_{loc}=\sum_{i\in \{ x,y,w,h\}}smooth_{L_1}(t_i^u-v_i)\\
Lcls=−log(pu)Lloc=i∈{x,y,w,h}∑smoothL1(tiu−vi)
s
m
o
o
t
h
L
1
smooth_{L_1}
smoothL1误差,相比于L2损失,对outlier离群点不敏感:
KaTeX parse error: Undefined control sequence: \abs at position 46: ….5x^2 \quad if \̲a̲b̲s̲{x} < 1 \\ \ab…
图像如下:
2.1.5 SVD全连接层加速网络
图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多【约2k】,几乎有一半的前向计算时间被花费于全连接层,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次【每个建议框都要计算】,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算,具体实现如下:
① 物体分类和窗口回归都是通过全连接层实现的,假设全连接层输入数据为x,输出数据为y,全连接层参数为W,尺寸为u×v,那么该层全连接计算为:
y=Wx(计算复杂度为u×v)
② 若将W进行SVD分解,并用前t个特征值近似代替,即:
W=U∑VT≈U(u,1:t)⋅∑(1:t,1:t)⋅V(v,1:t)T
那么原来的前向传播分解成两步:
y=Wx=U⋅(∑⋅VT)⋅x=U⋅z
计算复杂度为u×t+v×t,若t<min(u,v),则这种分解会大大减少计算量;
在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置;实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作。
Faster R-CNN
Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。同样使用VGG16作为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。
论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Faster R-CNN算法流程可分为3个步骤 RPN + Fast R-CNN
- 将图像输入网络得到相应的特征图
- 使用RPN(Region Proposal Networks)结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
- 将每个特征矩阵通过RoI pooling层缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
3.1 RPN结构
3.1.1 anchor机制
在Faster R-CNN中,抛弃了以往的SS算法作为候选区域的选取方法,而是利用anchor机制来寻找region proposal;并且这些anchor是基于feature map的。作者选取了9个不同尺寸的anchor,其中3中面积尺寸(scale),分别为 [ 12 8 2 , 25 6 2 , 51 2 2 ] [128^2, \quad 256^2, \quad 512^2] [1282,2562,5122], 3中长宽比例(aspect ratio),分别是 [ 1 : 1 , 1 : 2 , 2 : 1 ] [1:1, \quad 1:2,\quad 2:1] [1:1,1:2,2:1]。这样就会有3*3=9个anchor。以feature map的每个点为中心锚点,计算出该点在原图上的位置,以该位置在原图上生成上面的9个anchor,组成一个anchor集。
- one stage中的目标检测
是直接在最后提取的Feature map上使用预定义的Anchor生成一系列的边框,最后再对这些边框进行回归。 - two stage中的目标检测
提取的Feature map上使用预定义的Anchor生成一系列的边框,这些边框经过RPN网络,生成一些的ROI区域。将提取到的ROI输入到后续网络中进行边框回归,这就比one stage的方法多了一步,所以精度和耗时上都有所增加。
流程:
- 创建铺满特征层的anchor,使得每个像素点都有9(或者n)个anchor,将anchor和gt框都映射到当前特征层上,并找出IoU最大的anchor作为正样本标记为1
- 通过IoU(giou)判断每个像素点的9个anchor哪些能更好的匹配gt框,标记最好的anchor为1,让其来回归学习
- 将网络的预测最好的值标记为0,使其不参与loss,让网络不去动这些值
anchor存在的问题
- 超参数难调
- 正负样本不均衡
- 与GT匹配的过程耗时严重
- 对小目标不友好
3.2.2 RPN结构
解释一下上面右边张图的数字。
- 在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions
- 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息(,同时256-d不变,如图中的红框
- 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2•k scores(背景概率+前景概率,二分类);而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4•k coordinates
- 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练
注意,在本文讲解中使用的VGG conv5 num_output=512,所以是512d,其他类似。
上图中黄色框为2k个scores,红色框为4k个coordinates。
对于一张1000*600*3的图像,大约有60*40*9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框
对于2k scores,和4k coordinates分别用1*1的卷积处理。
正负样本的标记:
- 正样本:anchor与gt框的IoU大于0.7,或anchor与任意一个gt框的IoU大于0.7
- 负样本: anchor与任何gt框的IoU都小于0.3
正负样本之外的anchor全部丢弃
3.2.3 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^*)+\lambda \frac{1}{N_{reg}}\sum_i p_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个anchor预测为真实标签的概率
p
i
∗
p_i^*
pi∗当为正样本时为1,当为负样本时为0
t
i
t_i
ti表示预测第i个anchor的边界框回归参数
t
i
∗
t_i^*
ti∗表示第i个anchor对应的GT Box
N
c
l
s
N_{cls}
Ncls表示一个mini-batch中的所有样本数量256
N
r
e
g
N_{reg}
Nreg表示anchor位置的个数=4*anchor个数(不是anchor个数)约2400
前部分为分类损失,交叉熵损失。后半部分为,边界框回归损失,和fast R-CNN的边界框回归损失一样。
二值交叉熵:对于两个类别,只需预测出一个概率。比如是背景,概率就趋近于0,是前景就趋近于1。若使用二值交叉熵,则只需预测出k个scores。
3.2.4 Faster R-CNN训练
现在直接使用RPN Loss + Fast R-CNN Loss的联合训练方法。论文中是使用分布训练。
Mask R-CNN
Mask R-CNN用于实例分割(Instance Segmentation),也可用于目标检测。Mask R-CNN 在Faster R-CNN的网络原有的cls, bbox regressor分支中,加入一个mask分支
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDCcuxiN-1662017783943)(http://bbs.sciencenet.cn/home.php?mod=attachment&filename=image.png&id=702099)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9k1tdSpI-1662017783944)(http://bbs.sciencenet.cn/home.php?mod=attachment&filename=image.png&id=702090)]
左上是原图,右上是目标检测的结果;左下是语义分割的结果(每个像素都判定为一个类别),右下是实列分割的结果。
参考文献 | 思路 | 方法 | 描述/缺点 |
---|---|---|---|
[13, 15, 16, 9]; [42, 2] | segment-proposal-based | 使用bottom-up segment | |
DeepMask[33]; [34, 8] | segment-proposal-based | 先segment proposal,然后使用Fast R-CNN分类 | slow & less accurate |
[10] | segment-proposal-based | 先进行BBox proposal,然后进行segment proposal,然后再classification | |
FCIS[26] | segment proposal与object detection并行 | 将[8]中的segment proposal与[11]中的object detection结合起来 | 1.[8, 11, 26]的共同思路是全卷积,同时处理object的box、class、和mask, 因此速度快;2.识别overlapping instance的能力较差,会出现spurious edge |
[23, 4, 3, 29] | segmentation-first | 先行继续semantic segmentation,再进行instance segmentation | 基于semantic segmentation得到的per-pixel classification结果,尝试将class相同的pixel区分为不同的instance |
Mask R -CNN | classification分支和mask分支并行+instance-first | 略 |
相对于其他方法的思路,可以看出Mask R-CNN思路创新为:classification分支和mask分支并行+instance-first
4.1 方法/研究内容
-
Mask RCNN:基于Faster RCNN,添加1个对每个RoI预测binary mask的分支,该分支并行与已有的classification分支和BBox regression分支,因此可以同时进行object detection和instance segmentation(输出BBox和mask)
-
RoIAlign
-
- 问题:Faster RCNN并非为pixel-to-pixel的input和output设计的。RoIPool是识别instance的核心操作,但其仅通过coarse spatial quantization来提取特征
- 改进:本文提出RoIAlign,其保留了exact spatial locations
- 性能:虽然改动很小,但将mask accuracy相对提高了10%-50%
4.2 创新点/优点★
-
创新点
-
- Mask RCNN在instance segmentation思路上的创新:classification分支和mask分支并行 + instance-first,
- RoIAlign:RoIPool通过coarse spatial quantization来提取特征,这并不适用于精细的pixel-pixel的instance segmentation任务,因此提出可以保留exact spatial location的RoIAlign。虽然改动很小,但将mask accuracy相对提高了10%-50%
- 将segmentation和classification解耦:FCN通常执行per-pixel multi-class categorization(即对每个像素进行多分类),将classification和segmentation耦合起来,而本文通过实验发现两者耦合时在instance segmentation任务中的效果并不好;而本文使用classification分支进行分类,mask分支独立为每个class预测1个binary mask,并且classification分支和mask分支是并行的
-
优点
-
- 易于训练,mask分支仅增加了很小的计算开销
- generality:Mask RCNN的框架易于generalize到其它任务(比如Human Pose Estimation)中
- 准确度:在多个任务(instance segmentation、object detection、person keypoint detection)中达到SOTA
4.3 整体结构
在Faster R-CNN上添加mask分支:讲过backbone+RPN+RoIAlign之后,将得到的每个RoI分别传入classification分析,regression分支和mask分支
4.3.1 Mask分支
-
输出:对于每个RoI,Mask的分支输出为m*m*k维,这对应着k个m*m维的binary mask(上图中k=80,也即有80个类别, m=28),推理时,对classification分支选择第k个m*m维的mask进行resize,然后再进行二值化(阈值0.5)
-
Mask Branch for ResNet
- Backbone(ResNet C4) + RPN + RoIAlign:输出7×7×1024的feature map,表示1个RoI
- res5:ResNet第5个stage,输出7×7×2048
- ave:应该是对7×7×2048的每个channel取平均值,得到2048维的vector,然后传入classification分支和regression分支
- deconv & conv:将7×7×2048变成14×14×256,再变成14×14×80(80个channel分别表示80个class的mask)
-
Mask Branch for ResNet-FPN
- ResNet + FPN + RPN + RoIAlign:输出7×7×256和14×14×256的feature map,表示1个RoI,分别传入OD的2个分支和mask分支
- classification分支和regression分支:应该是通过FC层得到2个1024维的vector,再传入2个分支
- mask分支:通过一系列卷积和反卷积,得到28×28×80(80个channel分别表示80个class的mask)
mask representation:卷积层要比FC层更能表达spatial structure([33, 34, 10])、参数更少、更准确。
- dedication/解耦:
- classification分支预测RoI属于某个类别的概率,也就是该RoI的属于哪个类。选择mask分支输出的k个mask中的某一个,这样实现mask predication和class predication的解耦
- 因为 L m a s k L_{mask} Lmask仅定义再第k个mask上即其他class对应的mask不参与loss计算),所以mask分支再生成mask时与class之间不存在competition,即mask分支是个dedicated mask generator
4.3.2 损失函数
- Multi-task Loss:对每个sampled RoI,计算其损失 L = L c l s + L r e g + L m a s k L=L_{cls}+L_{reg}+L_{mask} L=Lcls+Lreg+Lmask其中,前两项和和Faster R-CNN中定义一样
- L m a s k L_{mask} Lmask:mask分支中会使用一个per-pixel sigmoid, L m a s k L_{mask} Lmask为average BCELoss。如果RoI被分配的GT class为k,则 L m a s k L_{mask} Lmask仅定义在第k个mask上(即其他class对应的mask不参与loss计算)
4.3.3 RoIAlign
- motivation:Faster RCNN并非为pixel-to-pixel的input和output设计的,不同于另外2个分支输出class和BBox,mask分支需要提取更精细的对象空间布局。RoIPool是识别instance的核心操作,但其仅通过coarse spatial quantization来提取特征。因此本文提出RoIAlign,它可以保留exact spatial location以实现pixel-to-pixel alignment
- RoI Pool的问题:RoI Pool使用了2次quantization(“浮点数变整数”):将原图上的RoI映射到特征图时、对特征图进行池化以得到期望size的输出时(详见**图解 RoIPooling、RoIAlign 和 RoIWarp - 知乎**一文)。quantization使得RoI和RoI Pool输出的feature之间存在misalignment。这种misalignment可能不会影响classification,但它对预测pixel-accurate mask有很大的负面影响
- 方法:RoIAlign并不使用quantization。首先将原图上的RoI映射到特征图(不使用quantization),然后将特征图上的RoI均分成2×2个bin(RoIPool/RoIAlign输出C×N×N的feature map,则bin的数量就是N×N,这里仅以2×2 bins为例);在每个bin中平均采样得到4个point的位置,通过线性插值计算这4个point对应的value,然后对这4个point的value进行aggregation(max/avg pooling)得到该bin的value
com/p/273587749)**一文)。quantization使得RoI和RoI Pool输出的feature之间存在misalignment。这种misalignment可能不会影响classification,但它对预测pixel-accurate mask有很大的负面影响
- 方法:RoIAlign并不使用quantization。首先将原图上的RoI映射到特征图(不使用quantization),然后将特征图上的RoI均分成2×2个bin(RoIPool/RoIAlign输出C×N×N的feature map,则bin的数量就是N×N,这里仅以2×2 bins为例);在每个bin中平均采样得到4个point的位置,通过线性插值计算这4个point对应的value,然后对这4个point的value进行aggregation(max/avg pooling)得到该bin的value