了解下R-CNN
R-CNN:区域CNN。主要论文:
-
R-CNN: https://arxiv.org/abs/1311.2524
-
Fast R-CNN: https://arxiv.org/abs/1504.08083
-
Faster R-CNN: https://arxiv.org/abs/1506.01497
-
Mask R-CNN: https://arxiv.org/abs/1703.06870
目标检测是一种找到图像中的不同目标并进行分类的任务。通过在PASCAL VOC测试(类似于ImageNet)
理解R-CNN
输入:图像 输出:边界框+图像中每个目标的标注
区域提案,判断目标
R-CNN通过在图像中假设了一些列边界,再利用卷积神经网络和分类器识别是否可以真的对应一个目标。创造这些边界框的方法叫做区域提案(region proposal)。一旦创建了这些提案,R-CNN简单的将该区域卷曲到一个标准的平方尺寸,并将其传递给修改版的AlexNet,在CNN的最后一层,R-CNN添加了一个支持向量机(SVM),可以简单的界定物体是否为目标,什么事目标。
提升边界框
题目意思是找到了目标后,收紧边框适应目标的真实尺寸。这是R-CNN的最后一步。R-CNN在区域提案上运行简单的线性回归,以生成更紧密的边界框坐标从而获得最终结果。(怎么运行线性回归?)
所以概括起来,R-CNN只是以下简单的步骤:
1.为边界框生成一组提案;
2.通过预训练的ALexNet运行的边界框中的图像,最后通过SVM来查看框中图像的目标是什么;
3.通过线性回归模型运行边框,一旦目标完成分类,输出边框的更紧密的坐标
缺点:R-CNN准确度很棒,但是运行很慢,原因如下:
1,需要CNN模型针对每个图像的每个提案区域进行前向传递
2,必须分别训练三个不同的模型–1.CNN生成图像特征,2,分类器3,收紧边界框的回归模型。使得传递难以训练
FAST R-CNN
R-CNN的第一作者解决了R-CNN的主要两个问题,创造了第二个算法–Fast R-CNN.解决方法的主要思想包括:
1.ROI(兴趣区域)池化
对于每个图像的每个提案,都要进行CNN计算,大约2000次。ROI Pool(兴趣区域池化)对每个图像只运行一次CNN,然后在2000个提案中共享计算的方法。
原理:CNN卷积计算能够保留了空间信息。
过程:创建了图像的完整前向传递,并从获得的前向传递中提取每个兴趣区域的转换特征。通过从从 CNN 的特征映射选择相应的区域来获取每个区域的 CNN 特征。然后,每个区域的特征简单地池化(通常使用最大池化(Max Pooling))。所以我们所需要的是原始图像的一次传递,而非大约 2000 次!
2.将所有模型并入一个网络
Faster R-CNN将卷积神经网络,分类器和边界框回归器组合为一个简单的网络。
在上述图像中,你可以看到这些工作是如何完成的。Fast R-CNN 在 CNN 顶部用简单的 softmax 层代替了支持向量机分类器(SVM classfier)以输出分类。它还添加了与 softmax 层平行的线性回归层以输出边界框坐标。这样,所有需要的输出均来自一个单一网络!下面是整个模型的输入和输出:
输入:带有区域提案的图像
输出:带有更紧密边界框的每个区域的目标分类
Faster R-CNN-加速区域提案
降低提案区域生成的成本,几乎降为0;
整体过程:输入:一张图片 输出:一个边框列表,每个边框会被分配一个标签,还有每对标签和边框所对应的概率。
主要内容:
1,卷积层:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2,Region Proposal Networks(区域提案网络)。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
3,Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps(提案区域的特征向量),送入后续全连接层判定目标类别。
4,Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置
python中的VGG16模型中标的Faster R-cnn的网络结构:
首先将任意大小的图像缩放至标准大小MxN,经过卷积层的特征提取,其中包括13个卷积层和4个池化层;RPN网络首先经过3x3的卷积,再分别生成positive anchors 和对应的 bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。
1.基础网络 卷积
在图像分类中ResNet优于VGG
ResNet 在使用残差连接和批归一化的方法后更加易于训练,这些方法在 VGG 发布的时候还没有出现。
**2.RPN **
Faster R-CNN放弃了传统的滑动窗口和选择搜索的方法,用RPN(区域提案网络)生成检测框,极大提升检测框的生成速度。
换成将使用特征提取网络处理后的特征图并建议目标区域。这种方法解决了区域提案长度可变的问题。具体方法如下:
上图展示了RPN网络的具体结构。以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
Anchor box锚点
为了选择合适的锚点,定义一组固定的尺寸:64px或者128px和长宽比例(0.5,1,1.5等)的边框,使得最后的变量所有的可能组合得到候选边框。在论文中作者根据上面的比例生成了下面的9个anchors
注:关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即图2中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。
这9个anchors怎么用?
对原图像经过卷积层的特征图中的每一个点,都配备这9种anchors作为初始检测框。后边再进行回归拟合出更准确地边框位置。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!下面看下论文中图片的过程:
多少个卷积核,多少个特征。1.经过卷积层,共有256个特征图,即一个位置256维度;
2,特征图上每个点有k个anchor(默认k=9),每个anchor判断是不是目标,所以每个点由256维的特征转换为2k的判断值,而每个人anchor都有(x,y,w,h)对应4个偏移量,所以reg=4k coordinates;
3,补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(选择标准?)
因为我们只用到了卷积和池化层,所以特征图的最终维度与原始图片是呈比例的。数学上,如果图片的尺寸是 w×h,那么特征图最终会缩小到尺寸为 w/r 和 h/r,其中 r 是次级采样率。如果我们在特征图上每个空间位置上都定义一个锚点,那么最终图片的锚点会相隔 r 个像素,在 VGG 中,r=16。下图是原始图片的锚点对应的中心
1.softmax判定出positive anchor作为候选区域,完成了区域提案
过程如下:
MxN的图像经过特征提取到RPN网络前变(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,经过卷积输出图像为WxHx18大小(18个卷积核),softmax的前面做reshape是为了方便分类,变为[1,2,9xH,W]大小,之后再reshape回去。
2,回归网络原理
对于窗口一般使用四维向量(x,y,w,h)表示,分别表示窗口的中心坐标和宽高。对于上图,红色的框A表示原始的positive Anchors,绿色的框G 表示目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:
寻找一种变化F,使得F(
A
x
A_{x}
Ax,
A
y
A_{y}
Ay,
A
w
A_{w}
Aw,
A
h
A_{h}
Ah)=(
G
x
,
G_{x}^,
Gx,,
G
y
,
G_{y}^,
Gy,,
G
w
,
G_{w}^,
Gw,,
G
h
,
G_{h}^,
Gh,),其中(
G
x
,
G_{x}^,
Gx,,
G
y
,
G_{y}^,
Gy,,
G
w
,
G_{w}^,
Gw,,
G
h
,
G_{h}^,
Gh,)
≈
\approx
≈(
G
x
G_{x}
Gx,
G
y
G_{y}
Gy,
G
w
G_{w}
Gw,
G
h
G_{h}
Gh)
这种关系主要是存在两步:先平移再缩放,这种变化是一种线性变换,
Y
=
W
X
Y=WX
Y=WX,对于该问题,输入的X是卷积层得到的feature map,定义是
ϕ
\phi
ϕ,同时还有训练传入A与GT之间的变换量,即(
t
x
t_{x}
tx,
t
y
t_{y}
ty,
t
w
t_{w}
tw,
t
h
t_{h}
th)。输出是
d
x
(
A
)
d_{x}(A)
dx(A),
d
y
(
A
)
d_{y}(A)
dy(A),
d
w
(
A
)
d_{w}(A)
dw(A),
d
h
(
A
)
d_{h}(A)
dh(A)四个变换。目标函数可以表示为:
d
∗
(
A
)
=
W
∗
T
⋅
ϕ
(
A
)
d_{*}(A)=W_{*}^T\cdot\phi(A)
d∗(A)=W∗T⋅ϕ(A)
其中
ϕ
(
A
)
\phi(A)
ϕ(A)是对应的锚点anchor的feature map组成的特征向量,
W
∗
W_{*}
W∗是需要学习的参数。
d
∗
(
A
)
d_{*}(A)
d∗(A)是预测值,为了使得预测值更接近真实的目标位置和框,设计L1损失函数:
L
O
S
S
=
∑
i
N
∣
t
∗
i
−
W
∗
T
⋅
ϕ
(
A
i
)
∣
LOSS=\sum_{i}^N\mid t_{*}^i-W_{*}^T\cdot\phi(A^i)\mid
LOSS=∑iN∣t∗i−W∗T⋅ϕ(Ai)∣
函数优化目标为:
W
∗
a
r
g
m
i
n
L
o
s
s
W_{*}argminLoss
W∗argminLoss最小化损失
进一步说明:
需要说明,只有在GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。 说完回归模型的原理,对应到Faster RCNN原文,positive anchor与ground truth 之间的平移量
(
t
x
,
t
y
)
(t_{x},t_{y})
(tx,ty)和缩放尺度调整因子
(
t
x
,
t
h
)
(t_{x},t_{h})
(tx,th)如下:
t
x
=
(
x
−
x
a
)
/
w
a
t_{x}=(x-x_{a})/w_{a}
tx=(x−xa)/wa
t
y
=
(
y
−
y
a
)
/
h
a
t_{y}=(y-y_{a})/h_{a}
ty=(y−ya)/ha
t
w
=
l
o
g
(
w
/
w
a
)
t_{w}=log(w/w_{a})
tw=log(w/wa)
t
x
=
(
h
/
h
a
)
t_{x}=(h/h_{a})
tx=(h/ha)对于训练bouding box regression网络回归分支,输入是cnn feature Φ,监督信号是Anchor与GT的差距
(
t
x
,
t
y
,
t
w
,
t
h
)
(t_{x},t_{y},t_{w},t_{h})
(tx,ty,tw,th),即训练目标是:输入 Φ的情况下使网络输出与监督信号尽可能接近。那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度
(
t
x
,
t
y
,
t
w
,
t
h
)
(t_{x},t_{y},t_{w},t_{h})
(tx,ty,tw,th),显然即可用来修正Anchor位置了。
卷积后性状变为WxH36,36是49,9个anchors的偏移变换量。
Proposal Layer建议层
从网络结构图可知道Proposal有三个输入,anchors是否positivate的分类结果WH2k和 positive anchors偏移量 WH4k和imge info,image info是原始图像信息大小和卷积层的缩放。
Proposal Layer forward按照以下顺序依次处理:
1.生成anchors
2,按照输入的positive scores由大到小排序anchors,提取前6000个anchors,即提取修正位置后的positive anchors
3,限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界
4,剔除尺寸非常小的positive anchors
5,对剩余的positive anchors进行NMS(极大值抑制)算法
输出:proposal=[x1, y1, x2, y2],注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的,这点在后续网络中有用
RPN网络结构就介绍到这里,总结起来就是:
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
3.RoI pooling
输入包含两方面:
1,原始的feature maps;
2,RPN输出的proposal boxes(大小各不相同) propasal boxes存在的本质原因
过程:
1,因为输入的proposal是对应原图的尺寸,使用压缩比,映射回feature map的尺寸。
2,再将每个proposal对应的feature map区域水平分为pooled_wXpooled_h的网格;
3,对网格的每一份都进行max pooling处理
处理后,大小不同的区域,实现了固定长度的输出(论文是7x7),方便分类
4.分类
输入:从ROI Pooling获取到的7x7大小的区域特征
输出:1.通过全连接层和softmax对提案区域进行分类,识别区域内物体类别
2,对区域利用全连接层进行回归,获得更高精度的框的位置
5.训练
Faster RCNN属于two stage 网络,所以训练主要分为两个阶段,是在已经训练好的特征提取网络(VGG ResNet)基础上继续训练。实际的训练过程有6个步骤:
1,在已经训练好的model上,训练RPN网络(利用位置标记信息)
2,利用步骤1训练的RPN网络,收集提案区域(代替了之前R-CNN选择搜索的漫长过程)
3,第一次训练 fast RCNN网络(输入:feature map+proposal)
4,第二次训练RPN网路
5,再次利用步骤4训练好的RPN网路,收集proposals
6,第二次训练Fast RCNN网络
最后训练好两个网络,分别是RPN和 Fast RCNN
1,训练RPN
该过程中 conv layer是训练好的模型,整个网络的损失函数如下:包含了分类损失函数和回归损失函数
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}})=1/N_{cls}\sum_{i}L_{cls}(p_{i},p_{i}^*)+\lambda*1/N_{reg}\sum_{i}p_{i}^*L_{reg}(t_{i},t_{i}^*)
L(pi,ti)=1/Ncls∑iLcls(pi,pi∗)+λ∗1/Nreg∑ipi∗Lreg(ti,ti∗)
公式中字符含义:
i
i
i表示 anchors的索引值,每个锚点都要计算。
p
i
p_{i}
pi表示分类到positivate的概率,
p
i
∗
p_{i}^*
pi∗表示对应的GT预测的概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive,
p
i
∗
=
1
p_{i}^*=1
pi∗=1;反之IoU<0.3时,认为是该anchor是negative,
p
i
∗
=
0
p_{i}^*=0
pi∗=0;至于那些0.3<IoU<0.7的anchor则不参与训练)。
t
t
t代表predict bounding box,
t
∗
t^*
t∗代表对应positive anchor对应的GT box。
由于在实际过程中,
N
c
l
s
N_{cls}
Ncls和
N
r
e
g
N_{reg}
Nreg差距过大,用参数
λ
\lambda
λ平衡,这里比较重要是
L
r
e
g
L_{reg}
Lreg使用的soomth L1 loss.
图中的训练过程:
1,在RPN训练阶段,rpn-data(python AnchorTargetLayer)层会按照和test阶段Proposal层完全一样的方式生成Anchors用于训练;
2,对于rpn_loss_cls,输入的rpn_cls_scors_reshape和rpn_labels分别对应
p
p
p与
p
∗
p^*
p∗ ,
N
c
l
s
N_{cls}
Ncls参数隐含在
p
p
p与
p
∗
p^*
p∗的caffe blob的大小中
对于rpn_loss_bbox,输入的rpn_bbox_pred和rpn_bbox_targets分别对应
t
t
t与
t
∗
t^*
t∗ ,rpn_bbox_inside_weigths对应
p
∗
p*
p∗,rpn_bbox_outside_weigths未用到(从soomth_L1_Loss layer代码中可以看到),而
N
r
e
g
N_{reg}
Nreg 同样隐含在caffe blob大小中
2,训练Fast RCNN
读取之前保存的pickle文件,获取proposals与positive probability。从data层输入网络。然后:
1,将提取的proposals作为rois传入网络,如图21蓝框
2,计算bbox_inside_weights+bbox_outside_weights,作用与RPN一样,传入soomth_L1_loss layer,如图21绿框
这样就可以训练最后的识别softmax与最终的bounding box regression了。
Mask R-CNN-扩展Faster R-CNN用于像素级分割
进一步扩展目标检测技术,定位每个目标的精确像素,这个问题成为图像分割。
Mask R-CNN 通过简单地向 Faster R-CNN 添加一个分支来输出二进制 mask,以说明给定像素是否是目标的一部分。如上所述,分支(在上图中为白色)仅仅是 CNN 特征图上的简单的全卷积网络。
在这里科普下全卷机网络 FCN:
1.传统的基于CNN 的分割方法:
为了对一个像素分类,使用该像素周围的一个图像块作为CNN 的输入用于训练和预测。这种方法有几个缺点:
一.是存储开销很大
对每个像素使用的图像块的大小是 , 然后不断滑动窗口,每次滑动的窗口给CNN 进行判别分类,因此则所需要的存储空间根据滑动窗口次数和大小急剧上升。
二是计算效率低下。
相邻的像素块基本上都是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。
三是像素块大小的限制了感知区域的大小。
通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。
2,为了改进提出了全卷机FCN的概念
可以接收任意尺寸的输入图像,采用反卷积对最后一个feature map进行上采样,使它恢复到输入图像相同尺寸,从而可以对每个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后在上采样的特征图进行逐像素分类。
反卷积层:
我们已经知道卷积层的前向操作可以表示为和矩阵C相乘,那么 我们很容易得到卷积层的反向传播就是和C的转置相乘 。
深层特征谱
深层的图像特征反卷积回去也会丢失很多信息,所以保存中间层信息,对反卷积的结果进行补充,最后完成整个图像的还原。
FCN的缺点
1.得到的结果不够精细,进行8背得的上采样虽然比32效果好了很多,但是上采样结果还是比较模糊和平滑的,对图像中的细节不敏感。
2.对个各个像素进行分类,没有充分考虑像素与像素之间的关系,忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性