Fast R-CNN 论文链接 Fast R-CNN
Faster R-CNN 论文链接 Faster R-CNN
Fast R-CNN
解决R-CNN的问题
R-CNN存在的主要问题:
- 步骤繁琐:分为多步训练,先要微调一个预训练网络,针对每一个类别都需要训练一个SVM分类器,最后需要对Bounding-Box进行回归,而Region-Proposal需要用selective search得到。
- 计算资源消耗大,费时:由于训练分类SVM和回归时需要用到网络的输出特征图作为输入,对缓存以及时间的消耗都很大。
- 前向时间慢:每个Region-Proposal都需要做卷积,重复操作耗时。
基于VGG16的Fast RCNN算法在训练速度上比RCNN快了将近9倍,比SPPnet快大概3倍;测试速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。
算法
Fast R-CNN主干网络使用的是VGG-16。
训练
输入网络的图像大小为 224 × 224 224\times224 224×224,经过5个 C o n v Conv Conv层和两个 D o w n S a m p l e DownSample DownSample层( C o n v + D o w n S a m p l e + C o n v + D o w n S a m p l e + C o n v ∗ 3 Conv + DownSample+Conv+DownSample+Conv*3 Conv+DownSample+Conv+DownSample+Conv∗3)之后将最后一个 C o n v Conv Conv的输入和 R e g i o n P r o p o s a l Region\ Proposal Region Proposal输入至 R O I P o o l i n g ROIPooling ROIPooling层,再经过两个 S i z e = 4096 Size=4096 Size=4096的全连接层,最后并行输入两个全连接层( S i z e 1 = 21 , S i z e 2 = 84 Size_1 =21, Size_2=84 Size1=21,Size2=84),输出每个 R e g i o n P r o p o s a l Region \ Proposal Region Proposal属于21个类别的得分以及每个 R e g i o n Region Region的四个坐标。前者为分类得分,后者为回归输出,分类的损失计算 L a b e l Label Label以及分类层输出的得分,使用的是 S o f t m a x W i t h L o s s Softmax \ With \ Loss Softmax With Loss;回归的损失计算的是回归层的输出和 T a r g e t Target Target坐标及 W e i g h t Weight Weight,使用的是 S m o o t h L 1 L o s s Smooth \ L1 \ Loss Smooth L1 Loss。
测试
将两个Loss层更改为一个 S o f t m a x Softmax Softmax层,输入分类的得分,输出分类的概率,再对各类别采用 N M S ( N o n − M a x i m u m − S u p p r e s s i o n ) NMS(Non-Maximum-Suppression) NMS(Non−Maximum−Suppression)
Fast R-CNN详解
网络输入:
- 图像
- R e g i o n P r o p o s a l Region \ Proposal Region Proposal(由 S e l e c t i v e S e a r c h Selective \ Search Selective Search得到)
对每个类别训练一个回归器,非背景类别的 R e g i o n P r o p o s a l Region \ Proposal Region Proposal才需要进行回归。
ROI Pooling:作用是对不同大小的 R e g i o n P r o p o s a l Region \ Proposal Region Proposal,从网络最后一层卷积输出的 f e a t u r e m a p feature \ map feature map提取固定 s i z e size size的 f e a t u r e m a p feature\ map feature map。全连接层需要输入尺寸一致,所以不能直接将不同大小的 R e g i o n P r o p o s a l Region \ Proposal Region Proposal映射到 f e a t u r e m a p feature\ map feature map作为输出,需要做尺寸变换。在Fast R-CNN中,VGG16使用 H = W = 7 H=W=7 H=W=7,即将一个 h × w h\times w h×w的 R e g i o n P r o p o s a l Region \ Proposal Region Proposal分割成 H × W H\times W H×W大小的网格,然后将这个 R e g i o n P r o p o s a l Region \ Proposal Region Proposal映射到最后一个卷积层输出的 f e a t u r e m a p feature\ map feature map,最后将每个网格里的最大值作为该网格的输出,经过该层网络输出的 f e a t u r e m a p feature\ map feature map大小固定为 H × W H \times W H×W。
Fast R-CNN 三大改进
1. 针对整张图像进行卷积,减少很多重复计算。
2. 用
R
O
I
P
o
o
l
i
n
g
ROI\ Pooling
ROI Pooling进行特征的尺寸变换。
3. 将回归器输入网络一起训练,每个类别对应一个回归器,并用
S
o
f
t
m
a
x
Softmax
Softmax代替原来的SVM分类器。
在实际训练中,每个mini-batch包含2张图像和128个
r
e
g
i
o
n
p
r
o
p
o
s
a
l
region \ proposal
region proposal(或者叫ROI),也就是每张图像有64个ROI。然后从这些ROI中挑选约25%的ROI,这些ROI和ground truth的IOU值都大于0.5。另外只采用随机水平翻转的方式增加数据集。
测试的时候则每张图像大约2000个ROI。
损失函数
分类损失:
L
o
g
Log
Log损失,
k
k
k个类别+1个背景类,回归损失:
S
m
o
o
t
h
L
1
Smooth \ L1
Smooth L1损失。
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)+\lambda [u \ge 1] L_{loc}(t^u, v)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v),
其中,
L
c
l
s
(
p
,
u
)
=
−
l
o
g
p
u
L_{cls}(p,u)=-log\ p_u
Lcls(p,u)=−log pu
表示的是类别
u
u
u的
l
o
g
log
log损失;
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^u_i-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
,
i
f
∣
x
∣
<
1
∣
x
∣
−
0.5
,
o
t
h
e
r
w
i
s
e
smooth_{L1}(x)=\begin{cases} 0.5x^2,\quad if \ |x| < 1 \\ |x|-0.5,\quad otherwise \end{cases}
smoothL1(x)={0.5x2,if ∣x∣<1∣x∣−0.5,otherwise
其中
t
u
t^u
tu表示预测的结果,
u
u
u表示类别,
v
v
v为真值。
ROIPooling和总体结构
采用SVD分解改进全连接层。如果是一个普通的分类网络,那么全连接层的计算应该远不及卷积层的计算,但是针对object detection,Fast RCNN在
R
O
I
p
o
o
l
i
n
g
ROI \ pooling
ROI pooling后每个
r
e
g
i
o
n
p
r
o
p
o
s
a
l
region \ proposal
region proposal都要经过几个全连接层,这使得全连接层的计算占网络的计算将近一半,如下图,所以作者采用SVD来简化全连接层的计算。
实验结果
精度
速度
对比实验
由于本文主要讲RCNN多步骤的网络结构合并在一起,因此需要实验证明这种multi-task训练的方式有效,实验对比结果如下:一共有S,M,L三个组,每个组有4列,分别表示:
- 仅采用分类训练,测试也没有回归;
- 采用论文中的分类加回归训练,但是测试时候没有回归;
- 采用分段训练,测试时候有回归;
- 采用论文中的分类加回归训练,且测试时候有回归。
这种multi-task在最近两年的object detection算法中非常普遍。
然后是多尺度和单尺度的对比:这里多尺度的5表示输入图像采用5中不同的尺寸,比如
[
480
,
576
,
688
,
864
,
1200
]
[480,576,688,864,1200]
[480,576,688,864,1200],在测试的时候发现多尺度虽然能在mAP上取得一点提升,但是时间代价也比较大。作者直接给出原因:深度卷积网络可以学习尺度不变性。
总结
Fast RCNN将RCNN众多步骤整合在一起,不仅大大提高了检测速度,也提高了检测准确率。其中,对整张图像卷积而不是对每个region proposal卷积,ROI Pooling,分类和回归都放在网络一起训练的multi-task loss是算法的三个核心。另外还有SVD分解等是加速的小贡献,数据集的增加时mAP提高的小贡献。
当然Fast RCNN的主要缺点在于region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),这也是后续Faster RCNN的改进方向之一。
Faster R-CNN
Faster R-CNN由以下部分组成:
1. Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用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_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小 P × Q P \times Q P×Q的图像,首先缩放至固定大小 M × N M \times N M×N,然后将 M × N M\times N M×N图像送入网络;而Conv layers中包含了 13 ∗ c o n v + 13 ∗ r e l u + 4 ∗ p o o l i n g 13*conv+13*relu+4*pooling 13∗conv+13∗relu+4∗pooling;RPN网络首先经过 3 × 3 3\times 3 3×3卷积,再分别生成 f o r e g r o u n d a n c h o r s foreground\ anchors foreground anchors与 b o u n d i n g b o x r e g r e s s i o n bounding\ box\ regression bounding box regression偏移量,然后计算出 p r o p o s a l s proposals proposals;而 R O I P o o l i n g ROI \ Pooling ROI Pooling层则利用 p r o p o s a l s proposals proposals从 f e a t u r e m a p s feature\ maps feature maps中提取 p r o p o s a l f e a t u r e proposal\ feature proposal feature送入后续全连接和 s o f t m a x softmax softmax网络作 c l a s s i f i c a t i o n classification classification(即分类 p r o p o s a l proposal proposal到底是什么 o b j e c t object object)。
逐层分析
- Conv layers:
C
o
n
v
l
a
y
e
r
s
Conv\ layers
Conv layers包含了
c
o
n
v
conv
conv,
p
o
o
l
i
n
g
pooling
pooling,
r
e
l
u
relu
relu三种层。以python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构为例,
C
o
n
v
l
a
y
e
r
s
Conv\ layers
Conv layers部分共有13个
c
o
n
v
conv
conv层,13个
r
e
l
u
relu
relu层,4个
p
o
o
l
i
n
g
pooling
pooling层。在
C
o
n
v
l
a
y
e
r
s
Conv\ layers
Conv layers中所有的
c
o
n
v
conv
conv层都是:
k
e
r
n
e
l
_
s
i
z
e
=
3
,
p
a
d
=
1
kernel\_size=3,pad=1
kernel_size=3,pad=1,所有的
p
o
o
l
i
n
g
pooling
pooling层都是:
k
e
r
n
e
l
s
i
z
e
=
2
,
s
t
r
i
d
e
=
2
kernel_size=2,stride=2
kernelsize=2,stride=2。在Faster R-CNN中的
C
o
n
v
l
a
y
e
r
s
Conv\ layers
Conv layers中对所有的卷积都做了扩边处理(
p
a
d
=
1
pad=1
pad=1,即填充一圈0),导致原图变为
(
M
+
2
)
×
(
N
+
2
)
(M+2)\times (N+2)
(M+2)×(N+2)大小,再做
3
×
3
3\times 3
3×3卷积后输出
M
×
N
M\times N
M×N。正是这种设置,导致
C
o
n
v
l
a
y
e
r
s
Conv\ layers
Conv layers中的
c
o
n
v
conv
conv层不改变输入和输出矩阵大小。
C o n v l a y e r s Conv\ layers Conv layers中的 p o o l i n g pooling pooling层 k e r n e l _ s i z e = 2 , s t r i d e = 2 kernel\_size=2,stride=2 kernel_size=2,stride=2。这样每个经过 p o o l i n g pooling pooling层的 M × N M\times N M×N矩阵,都会变为 ( M / 2 ) × ( N / 2 ) (M/2)\times (N/2) (M/2)×(N/2)大小。综上所述,在整个 C o n v l a y e r s Conv\ layers Conv layers中, c o n v conv conv和 r e l u relu relu层不改变输入输出大小,只有 p o o l i n g pooling pooling层使输出长宽都变为输入的 1 2 \frac{1}{2} 21。,一个 M × N M\times N M×N大小的矩阵经过 C o n v l a y e r s Conv\ layers Conv layers固定变为 ( M / 16 ) × ( N / 16 ) (M/16)\times (N/16) (M/16)×(N/16),这样 C o n v l a y e r s Conv\ layers Conv layers生成的 f e a t u u r e m a p featuure\ map featuure map中都可以和原图对应起来。
- Region Proposal Networks(RPN):经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如RCNN使用SS(Selective Search)方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
RPN网络实际分为2条线,上面一条通过 s o f t m a x softmax softmax分类 a n c h o r s anchors anchors获得 f o r e g r o u n d foreground foreground和 b a c k g r o u n d background background(检测目标是 f o r e g r o u n d foreground foreground),下面一条用于计算对于 a n c h o r s anchors anchors的 b o u n d i n g b o x r e g r e s s i o n bounding\ box\ regression bounding box regression偏移量,以获得精确的 p r o p o s a l proposal proposal。而最后的 p r o p o s a l proposal proposal层则负责综合 f o r e g r o u n d a n c h o r s foreground\ anchors foreground anchors和 b o u n d i n g b o x r e g r e s s i o n bounding\ box\ regression bounding box regression偏移量获取 p r o p o s a l s proposals proposals,同时剔除太小和超出边界的 p r o p o s a l s proposals proposals。整个网络到了 p r o p o s a l l a y e r proposal\ layer proposal layer这里,就完成了相当于目标定位的功能。
- 与RPN网络相关的是Anchor,由四个值构成
[
x
1
,
y
1
,
x
2
,
y
2
]
[x_1,y_1,x_2,y_2]
[x1,y1,x2,y2]代表矩形左上和右下角点坐标。
9
9
9个矩形共有
3
3
3种形状,长宽比为大约为:
w
i
d
t
h
:
h
e
i
g
h
t
=
[
1
:
1
,
1
:
2
,
2
:
1
]
width:height = [1:1, 1:2, 2:1]
width:height=[1:1,1:2,2:1]三种,通过anchors就引入了检测中常用到的多尺度方法。
anchors中长宽 1 : 2 1:2 1:2中最大为 352 × 704 352\times 704 352×704,长宽 2 : 1 2:1 2:1中最大 736 × 384 736\times 384 736×384,基本是cover了 800 × 600 800\times 600 800×600的各个尺度和形状。遍历 c o n v l a y e r s conv\ layers conv layers计算获得的 f e a t u r e m a p s feature\ maps feature maps,为每一个点都配备 9 9 9种 a n c h o r s anchors anchors作为初始的检测框。这样做获得检测框很不准确,之后 2 2 2次 b o u n d i n g b o x r e g r e s s i o n bounding\ box\ regression bounding box regression可以修正检测框位置。
上图中在原文中使用的是ZF model中,其 C o n v L a y e r s 中 Conv\ Layers中 Conv Layers中最后的 c o n v 5 conv5 conv5层 n u m _ o u t p u t = 256 num\_output=256 num_output=256,对应生成256张特征图,所以相当于 f e a t u r e m a p feature\ map feature map每个点都是 256 − d 256-d 256−d;在 c o n v 5 conv5 conv5之后,做了 r p n _ c o n v / 3 × 3 rpn\_conv/3\times 3 rpn_conv/3×3卷积且 n u m _ o u t p u t = 256 num\_output=256 num_output=256,相当于每个点又融合了周围 3 × 3 3\times 3 3×3的空间信息,同时 256 − d 256-d 256−d不变;假设在 c o n v 5 conv5 conv5的 f e a t u r e m a p feature\ map feature map中每个点上有 k k k个 a n c h o r anchor anchor(默认 k = 9 k=9 k=9),而每个 a n h c o r anhcor anhcor要分 f o r e g r o u n d foreground foreground和 b a c k g r o u n d background background,所以每个点由 256 d 256d 256d f e a t u r e feature feature转化为 c l s = 2 k s c o r e s cls=2k\ scores cls=2k scores;而每个 a n c h o r anchor anchor都有 [ x , y , w , h ] [x, y, w, h] [x,y,w,h]对应 4 4 4个偏移量,所以 r e g = 4 k c o o r d i n a t e s reg=4k\ coordinates reg=4k coordinates;由于如果所有 a n c h o r s anchors anchors参与训练则太多了,训练程序会选取 256 256 256个合适的 a n c h o r s anchors anchors进行训练。
PS: 文中使用的VGG网络 c o n v 5 conv5 conv5 n u m _ o u t p u t = 512 num\_output=512 num_output=512,所以是 512 d 512d 512d。
RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用CNN去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。作为二分类任务。
A n c h o r Anchor Anchor数量:原图 800 × 600 800\times 600 800×600,VGG下采样 16 16 16倍, f e a t u r e m a p feature\ map feature map每个点设置 9 9 9个 A n c h o r Anchor Anchor:
c e i l ( 800 / 16 ) × c e i l ( 600 / 16 ) × 9 = 50 × 38 × 9 = 17100 ceil(800/16)\times ceil(600/16) \times 9 = 50 \times 38 \times 9=17100 ceil(800/16)×ceil(600/16)×9=50×38×9=17100
- Bounding Box Regression原理
如图所示绿色框为飞机的 G r o u n d T r u t h ( G T ) Ground\ Truth(GT) Ground Truth(GT),红色为提取的 p o s i t i v e a n c h o r s positive\ anchors positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以采用一种方法对红色的框进行微调,使得 p o s i t i v e a n c h o r s positive\ anchors positive anchors和 G T GT GT更加接近。
对于窗口一般使用四维向量 [ x , y , w , h ] [x,y,w,h] [x,y,w,h]表示,分别表示窗口的中心点坐标和宽高。对于下图,红色的框 A A A代表原始的 p o s i t i v e A n c h o r s positive\ Anchors positive Anchors,绿色的框 G G G代表目标的 G T GT GT,目标是寻找一种关系,使得输入原始的 a n c h o r A anchor\ A anchor A经过映射得到一个跟真实窗口 G G G更接近的回归窗口 G ′ G' G′,即:
1、给定 a n c h o r A = ( A x , A y , A w , A h ) anchor\ A = (A_x, A_y, A_w, A_h) anchor A=(Ax,Ay,Aw,Ah)和 G T = [ G x , G y , G w , G h ] GT=[G_x, G_y, G_w, G_h] GT=[Gx,Gy,Gw,Gh]。
2、寻找一种变换 F F F,使得 F ( A x , A y , A w , A h ) = ( G x ′ , G y ′ , G w ′ , G h ′ ) F(A_x, A_y, A_w, A_h)=(G'_x,G'_y, G'_w, G'_h) F(Ax,Ay,Aw,Ah)=(Gx′,Gy′,Gw′,Gh′),其中 ( G x ′ , G y ′ , G w ′ , G h ′ ) ≈ ( G x , G y , G w , G h ) (G'_x,G'_y, G'_w, G'_h)\approx (G_x, G_y, G_w, G_h) (Gx′,Gy′,Gw′,Gh′)≈(Gx,Gy,Gw,Gh)
步骤:
先做平移: G x ′ = A w ⋅ d x ( A ) + A x G'_x=A_w\cdot d_x(A)+A_x Gx′=Aw⋅dx(A)+Ax G y ′ = A h ⋅ d y ( A ) + A y G'_y=A_h\cdot d_y(A)+A_y Gy′=Ah⋅dy(A)+Ay
再做缩放: G w ′ = A w ⋅ e x p ( d w ( A ) ) G'_w=A_w\cdot exp(d_w(A)) Gw′=Aw⋅exp(dw(A)) G h ′ = A h ⋅ e x p ( d h ( A ) ) G'_h=A_h\cdot exp(d_h(A)) Gh′=Ah⋅exp(dh(A))
需要学习四个变换 d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) d_x(A),d_y(A),d_w(A),d_h(A) dx(A),dy(A),dw(A),dh(A),当输入的 a n c h o r A anchor\ A anchor A与 G T GT GT相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调(注意,只有当 a n c h o r s A anchors\ A anchors A和 G T GT GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。
线性回归就是给定输入的特征向量 X X X, 学习一组参数 W W W, 使得经过线性回归后的值跟真实值 Y Y Y非常接近,即 Y = W X Y=WX Y=WX。对于该问题,输入 X X X是 c n n f e a t u r e m a p cnn\ feature\ map cnn feature map,定义为 ϕ \phi ϕ;同时还有训练传入 A A A与 G T GT GT之间的变换量,即 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th)。输出是 ( d x ( A ) , d y ( A ) , d w ( A ) , d x ( A ) ) (d_x(A),d_y(A),d_w(A),d_x(A)) (dx(A),dy(A),dw(A),dx(A))四个变换。目标函数表示为: d ∗ ( A ) = W ∗ T ⋅ ϕ ( A ) d_*(A)=W^T_*\cdot \phi (A) d∗(A)=W∗T⋅ϕ(A)其中 ϕ ( A ) \phi(A) ϕ(A) 是对应 a n c h o r anchor anchor的 f e a t u r e m a p feature\ map feature map组成的特征向量, W ∗ W_* W∗是需要学习的参数, d ∗ ( A ) d_*(A) d∗(A)是得到的预测值( ∗ * ∗表示 x , y , w , h x,y,w,h x,y,w,h,也就是每一个变换对应一个上述目标函数)。为了让预测值 d ∗ ( A ) d_*(A) d∗(A)与真实值 t ∗ t_* t∗差距最小,设计 L 1 L1 L1损失函数: L o s s = ∑ i N ∣ t ∗ i − W ∗ T ⋅ ϕ ( A i ) ∣ Loss=\sum ^N_i|t^i_*-W^T_*\cdot \phi (A^i)| Loss=i∑N∣t∗i−W∗T⋅ϕ(Ai)∣函数优化目标为: W ^ ∗ = a r g m i n W ∗ ∑ i n ∣ t ∗ i − W ∗ T ⋅ ϕ ( A i ) ∣ + λ ∣ ∣ W ∗ ∣ ∣ \hat{W}_*=argmin_{W_*}\sum^n_i|t^i_*-W^T_*\cdot \phi(A^i)|+\lambda ||W_*|| W^∗=argminW∗i∑n∣t∗i−W∗T⋅ϕ(Ai)∣+λ∣∣W∗∣∣为了方便描述,这里以 L 1 L1 L1损失为例介绍,而真实情况中一般使用 s o o m t h − L 1 soomth-L1 soomth−L1损失。
需要说明,只有在 G T GT GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。
对应于Faster RCNN原文, p o s i t i v e a n c h o r positive\ anchor positive anchor与 g r o u n d t r u t h ground\ truth ground truth之间的平移量 ( t x , t y ) (t_x,t_y) (tx,ty)与尺度因子 ( t w , t h ) (t_w,t_h) (tw,th)如下: t x = ( x − x a ) / w a t y = ( y − y a ) / h a t_x=(x-x_a)/w_a \quad t_y=(y-y_a)/h_a tx=(x−xa)/waty=(y−ya)/ha t w = l o g ( w / w a ) t h = l o g ( h / h a ) t_w=log(w/w_a) \quad t_h=log(h/h_a) tw=log(w/wa)th=log(h/ha)对于训练 b o u d i n g b o x r e g r e s s i o n bouding\ box\ regression bouding box regression网络回归分支,输入是 c n n f e a t u r e ϕ cnn\ feature\ \phi cnn feature ϕ,监督信号是 A n c h o Ancho Ancho与 G T GT GT的差距 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th),即训练目标是:输入 ϕ \phi ϕ的情况下使网络输出与监督信号尽可能接近。那么当 b o u d i n g b o x r e g r e s s i o n bouding\ box\ regression bouding box regression工作时,再输入 ϕ \phi ϕ时,回归网络分支的输出就是每个 A n c h o r Anchor Anchor的平移量和变换尺度 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th),显然即可用来修正 A n c h o r Anchor Anchor位置了。 - 对proposals进行bounding box regression
其 n u m _ o u t p u t = 36 num\_output=36 num_output=36,即经过该卷积输出图像为 W × H × 36 W\times H\times 36 W×H×36,在 c a f f e b l o b caffe\ blob caffe blob存储为 [ 1 , 4 × 9 , H , W ] [1, 4\times 9, H, W] [1,4×9,H,W],这里相当于 f e a t u r e m a p s feature\ maps feature maps每个点都有 9 9 9个 a n c h o r s anchors anchors,每个 a n c h o r s anchors anchors又都有 4 4 4个用于回归的 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]变换量。VGG输出 50 × 38 × 512 50\times 38\times 512 50×38×512的特征,对应设置 50 × 38 × k 50\times 38\times k 50×38×k个 a n c h o r s anchors anchors,而 R P N RPN RPN输出:
1、大小为 50 × 38 × 2 k 50\times 38\times 2k 50×38×2k的positive/negative softmax分类特征矩阵;
2、大小为 50 × 38 × 4 k 50\times 38\times 4k 50×38×4k的regression坐标回归特征矩阵;
恰好满足RPN完成 p o s i t i v e / n e g a t i v e positive/negative positive/negative分类 + b o u n d i n g b o x r e g r e s s i o n +bounding\ box\ regression +bounding box regression坐标回归。 - Proposal Layer
P r o p o s a l L a y e r Proposal\ Layer Proposal Layer负责综合所有 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]变换量和 p o s i t i v e a n c h o r s positive\ anchors positive anchors,计算出精准的 p r o p o s a l proposal proposal,送入后续 R o I P o o l i n g L a y e r RoI\ Pooling\ Layer RoI Pooling Layer。
P r o p o s a l L a y e r Proposal\ Layer Proposal Layer有3个输入: p o s i t i v e v s n e g a t i v e a n c h o r s positive\ vs\ negative\ anchors positive vs negative anchors分类器结果 r p n _ c l s _ p r o b _ r e s h a p e rpn\_cls\_prob\_reshape rpn_cls_prob_reshape,对应的 b b o x r e g bbox\ reg bbox reg的 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]变换量 r p n _ b b o x _ p r e d rpn\_bbox\_pred rpn_bbox_pred,以及 i m _ i n f o im\_info im_info。 i m i n f o im_info iminfo是对于一副任意大小 P × Q P\times Q P×Q图像,传入 F a s t e r R − C N N Faster\ R-CNN Faster R−CNN前首先 r e s h a p e reshape reshape到固定 M × N M\times N M×N, i m i n f o = [ M , N , s c a l e _ f a c t o r ] im_info=[M, N, scale\_factor] iminfo=[M,N,scale_factor]则保存了此次缩放的所有信息。然后经过 C o n v L a y e r s Conv\ Layers Conv Layers,经过 4 4 4次 p o o l i n g pooling pooling变为 W × H = ( M / 16 ) × ( N / 16 ) W\times H=(M/16)\times (N/16) W×H=(M/16)×(N/16)大小,其中 f e a t u r e _ s t r i d e = 16 feature\_stride=16 feature_stride=16则保存了该信息,用于计算 a n c h o r anchor anchor偏移量。
P r o p o s a l L a y e r f o r w a r d Proposal\ Layer\ forward Proposal Layer forward按照以下顺序依次处理:
1、生成 a n c h o r s anchors anchors,利用 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_x(A),d_y(A),d_w(A),d_h(A)] [dx(A),dy(A),dw(A),dh(A)]对所有的 a n c h o r s anchors anchors做 b b o x r e g r e s s i o n bbox\ regression bbox regression回归(这里的 a n c h o r s anchors anchors生成和训练时完全一致);
2、按照输入的 p o s i t i v e s o f t m a x s c o r e s positive\ softmax\ scores positive softmax scores由大到小排序 a n c h o r s anchors anchors,提取前 p r e _ n m s _ t o p N ( e . g . 6000 ) pre\_nms\_topN(e.g. 6000) pre_nms_topN(e.g.6000)个 a n c h o r anchor anchor,即提取修正位置后的 p o s i t i v e a n c h o r s positive\ anchors positive anchors;
3、限定超出图像边界的 p o s i t i v e a n c h o r s positive\ anchors positive anchors为图像边界,防止后续 r o i p o o l i n g roi\ pooling roi pooling时 p r o p o s a l proposal proposal超出图像边界;
4、剔除尺寸非常小的 p o s i t i v e a n c h o r s positive\ anchors positive anchors;
5、对剩余的 p o s i t i v e a n c h o r s positive\ anchors positive anchors进行 N M S ( n o n m a x i m u m s u p p r e s s i o n ) NMS(nonmaximum\ suppression) NMS(nonmaximum suppression);
6、KaTeX parse error: Undefined control sequence: \l at position 8: Proposa\̲l̲ ̲Layer有3个输入: p o s i t i v e positive positive和 n e g a t i v e a n c h o r s negative\ anchors negative anchors分类器结果 r p n _ c l s _ p r o b _ r e s h a p e rpn\_cls\_prob\_reshape rpn_cls_prob_reshape,对应的 b b o x r e g ( e . g . 300 ) bbox\ reg(e.g. 300) bbox reg(e.g.300)结果作为 p r o p o s a l proposal proposal输出。
之后输出 p r o p o s a l = [ x 1 , y 1 , x 2 , y 2 ] proposal=[x_1, y_1, x_2, y_2] proposal=[x1,y1,x2,y2],注意,由于在第三步中将 a n c h o r s anchors anchors映射回原图判断是否超出边界,所以这里输出的 p r o p o s a l proposal proposal是对应 M × N M\times N M×N输入图像尺度的,这点在后续网络中有用。严格意义上的检测应该到此就结束了,后续部分应该属于识别了。
RPN总结:
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
RoI Pooling
R o I P o o l i n g RoI\ Pooling RoI Pooling层则负责收集 p r o p o s a l proposal proposal,并计算出 p r o p o s a l f e a t u r e m a p s proposal\ feature\ maps proposal feature maps,送入后续网络。 R o l p o o l i n g Rol\ pooling Rol pooling层有2个输入:
- 原始的 f e a t u r e m a p s feature\ maps feature maps
- R P N RPN RPN输出的 p r o p o s a l b o x e s proposal\ boxes proposal boxes(大小各不相同)
为何需要RoI Pooling
先来看一个问题:对于传统的 C N N CNN CNN(如 A l e x N e t AlexNet AlexNet和 V G G VGG VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的 v e c t o r o r m a t r i x vector\ or\ matrix vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。有 2 2 2种解决办法:
- 从图像中 c r o p crop crop一部分传入网络
- 将图像 w a r p warp warp成需要的大小后传入网络
c
r
o
p
crop
crop后破坏了图像的完整结构,
w
a
r
p
warp
warp破坏了图像原始形状信息。所以需要
R
o
I
P
o
o
l
i
n
g
RoI\ Pooling
RoI Pooling。
RoI Pooling原理
R o I P o o l i n g l a y e r f o r w a r d RoI\ Pooling\ layer\ forward RoI Pooling layer forward过程:
- 由于 p r o p o s a l proposal proposal是对应 M × N M\times N M×N尺度的,所以首先使用 s p a t i a l _ s c a l e spatial\_scale spatial_scale参数将其映射回 ( M / 16 ) × ( N / 16 ) (M/16)\times (N/16) (M/16)×(N/16)大小的 f e a t u r e m a p feature\ map feature map尺度;
- 再将每个 p r o p o s a l proposal proposal对应的 f e a t u r e m a p feature\ map feature map区域水平分为 p o o l e d _ w × p o o l e d _ h pooled\_w\times pooled\_h pooled_w×pooled_h的网格;
- 对网格的每一份都进行 m a x p o o l i n g max\ pooling max pooling处理。
这样处理后,即使大小不同的
p
r
o
p
o
s
a
l
proposal
proposal输出结果都是
p
o
o
l
e
d
_
w
×
p
o
o
l
e
d
_
h
pooled\_w\times pooled\_h
pooled_w×pooled_h固定大小,实现了固定长度输出。
Classification
C
l
a
s
s
i
f
i
c
a
t
i
o
n
Classification
Classification部分利用已经获得的
p
r
o
p
o
s
a
l
f
e
a
t
u
r
e
m
a
p
s
proposal\ feature\ maps
proposal feature maps,通过
f
u
l
l
c
o
n
n
e
c
t
full\ connect
full connect层与
s
o
f
t
m
a
x
softmax
softmax计算每个
p
r
o
p
o
s
a
l
proposal
proposal具体属于那个类别(如人,车,电视等),输出
c
l
s
_
p
r
o
b
cls\_prob
cls_prob概率向量;同时再次利用
b
o
u
n
d
i
n
g
b
o
x
r
e
g
r
e
s
s
i
o
n
bounding\ box\ regression
bounding box regression获得每个
p
r
o
p
o
s
a
l
proposal
proposal的位置偏移量
b
b
o
x
_
p
r
e
d
bbox\_pred
bbox_pred,用于回归更加精确的目标检测框。
C
l
a
s
s
i
f
i
c
a
t
i
o
n
Classification
Classification部分网络结构如图:
从
R
o
I
P
o
o
l
i
n
g
RoI\ Pooling
RoI Pooling获取到
7
×
7
=
49
7\times 7=49
7×7=49大小的
p
r
o
p
o
s
a
l
f
e
a
t
u
r
e
m
a
p
s
proposal\ feature\ maps
proposal feature maps后,送入后续网络,可以看到做了如下
2
2
2件事:
- 通过全连接和 s o f t m a x softmax softmax对 p r o p o s a l s proposals proposals进行分类,这实际上已经是识别的范畴了
- 再次对 p r o p o s a l s proposals proposals进行 b o u n d i n g b o x r e g r e s s i o n bounding\ box\ regression bounding box regression,获取更高精度的 r e c t b o x rect\ box rect box
这里来看看全连接层
I
n
n
e
r
P
r
o
d
u
c
t
l
a
y
e
r
s
InnerProduct\ layers
InnerProduct layers,简单的示意图如图:”
其计算公式如下:
(
x
1
x
2
x
3
)
(
w
11
w
12
w
21
w
22
w
31
w
32
)
+
(
b
1
b
2
)
=
(
y
1
y
2
)
\begin{pmatrix}x_1& x_2&x_3\end{pmatrix}\begin{pmatrix}w_{11}& w_{12}\\w_{21}&w_{22}\\w_{31}&w_{32}\end{pmatrix}+\begin{pmatrix}b_1& b_2\end{pmatrix}=\begin{pmatrix}y_1& y_2\end{pmatrix}
(x1x2x3)⎝⎛w11w21w31w12w22w32⎠⎞+(b1b2)=(y1y2)
其中
W
W
W和
b
i
a
s
B
bias\ B
bias B都是预先训练好的,即大小是固定的,当然输入
X
X
X和输出
Y
Y
Y也就是固定大小。所以,这也就印证了之前
R
o
I
P
o
o
l
i
n
g
RoI\ Pooling
RoI Pooling的必要性。
Faster R-CNN训练
Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:
1. 在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
2. 利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
3. 第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
4. 第二训练RPN网络,对应stage2_rpn_train.pt
5. 再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt 第二次训练Fast
6. RCNN网络,对应stage2_fast_rcnn_train.pt
可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。
训练RPN网络
首先读取RBG提供的预训练好的model(本文使用VGG),开始迭代训练。来看看stage1_rpn_train.pt网络结构,如图:
与检测网络类似的是,依然使用
C
o
n
v
L
a
y
e
r
s
Conv\ Layers
Conv Layers提取
f
e
a
t
u
r
e
m
a
p
s
feature\ maps
feature maps。整个网络使用的
L
o
s
s
Loss
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_ip^*_iL_{reg}(t_i,t^*_i)
L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
上述公式中
i
i
i表示
a
n
c
h
o
r
s
i
n
d
e
x
anchors\ index
anchors index,
p
i
p_i
pi表示
p
o
s
i
t
i
v
e
s
o
f
t
m
a
x
p
r
o
b
a
b
i
l
i
t
y
positive\ softmax\ probability
positive softmax probability,
p
i
∗
p^*_i
pi∗代表对应的
G
T
p
r
e
d
i
c
t
GT\ predict
GT predict概率(即当第
i
i
i个
a
n
c
h
o
r
anchor
anchor与
G
T
GT
GT间
I
o
U
>
0.7
IoU>0.7
IoU>0.7,认为是该
a
n
c
h
o
r
anchor
anchor是
p
o
s
i
t
i
v
e
positive
positive,
p
i
∗
=
1
p^*_i=1
pi∗=1;反之
I
o
U
<
0.3
IoU<0.3
IoU<0.3时,认为是该
a
n
c
h
o
r
anchor
anchor是
n
e
g
a
t
i
v
e
negative
negative,
p
i
∗
=
0
p^*_i=0
pi∗=0;至于那些
0.3
<
I
o
U
<
0.7
0.3<IoU<0.7
0.3<IoU<0.7的
a
n
c
h
o
r
anchor
anchor则不参与训练);
t
t
t代表
p
r
e
d
i
c
t
b
o
u
n
d
i
n
g
b
o
x
predict\ bounding\ box
predict bounding box,
t
∗
t^*
t∗代表对应
p
o
s
i
t
i
v
e
a
n
c
h
o
r
positive\ anchor
positive anchor对应的
G
T
b
o
x
GT\ box
GT box。可以看到,整个
L
o
s
s
Loss
Loss分为
2
2
2部分:
- c l s l o s s cls\ loss cls loss,即 r p n _ c l s _ l o s s rpn\_cls\_loss rpn_cls_loss层计算的 s o f t m a x l o s s softmax\ loss softmax loss,用于分类 a n c h o r s anchors anchors为 p o s i t i v e positive positive与 n e g a t i v e negative negative的网络训练
- r e g l o s s reg\ loss reg loss,即 r p n _ l o s s _ b b o x rpn\_loss\_bbox rpn_loss_bbox层计算的 s o o m t h L 1 l o s s soomth\ L1\ loss soomth L1 loss,用于 b o u n d i n g b o x r e g r e s s i o n bounding\ box\ regression bounding box regression网络训练。注意在该 l o s s loss loss中乘了 p i ∗ p^*_i pi∗,相当于只关心 p o s i t i v e a n c h o r s positive\ anchors positive anchors的回归(其实在回归中也完全没必要去关心 n e g a t i v e negative negative)。
由于在实际过程中, N c l s N_{cls} Ncls和 N r e g N_{reg} Nreg差距过大,用参数 λ \lambda λ平衡二者(如 N c l s = 256 , N r e g = 2400 N_{cls}=256,N_{reg}=2400 Ncls=256,Nreg=2400时设置 λ = N r e g N c l s ≈ 10 \lambda=\frac{N_{reg}}{N_{cls}}\approx10 λ=NclsNreg≈10),使总的网络 L o s s Loss Loss计算过程中能够均匀考虑 2 2 2种 L o s s Loss Loss。这里比较重要是 L r e g L_{reg} Lreg使用的 s o o m t h L 1 l o s s soomth\ L1\ loss soomth L1 loss,计算公式如下: L r e g ( t i , t i ∗ ) = ∑ i ∈ { x , y , w , h } s m o o t h L 1 ( t i − t i ∗ ) s m o o t h L 1 ( x ) = { 0.5 x 2 , i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 , o t h e r w i s e L_{reg}(t_i,t^*_i)=\sum_{i\in \{x,y,w,h\}}smooth_{L1}(t_i-t^*_i) \\ smooth_{L1}(x)=\begin{cases}0.5x^2,\quad if \ |x| < 1 \\|x|-0.5,\quad otherwise \end{cases} Lreg(ti,ti∗)=i∈{x,y,w,h}∑smoothL1(ti−ti∗)smoothL1(x)={0.5x2,if ∣x∣<1∣x∣−0.5,otherwise
- 在RPN训练阶段, r p n − d a t a rpn-data rpn−data( p y t h o n A n c h o r T a r g e t L a y e r python\ AnchorTargetLayer python AnchorTargetLayer)层会按照和 t e s t test test阶段 P r o p o s a l Proposal Proposal层完全一样的方式生成 A n c h o r s Anchors Anchors用于训练
- 对于 r p n _ l o s s _ c l s rpn\_loss\_cls rpn_loss_cls,输入的 r p n _ c l s _ s c o r s _ r e s h a p e rpn\_cls\_scors\_reshape rpn_cls_scors_reshape和 r p n _ l a b e l s rpn\_labels rpn_labels分别对应 p p p与 p ∗ p^* p∗, N c l s N_{cls} Ncls参数隐含在 p p p与 ∗ ^* ∗的 c a f f e b l o b caffe\ blob caffe blob的大小中
- 对于 r p n _ l o s s _ b b o x rpn\_loss\_bbox rpn_loss_bbox,输入的 r p n _ b b o x _ p r e d rpn\_bbox\_pred rpn_bbox_pred和 r p n _ b b o x _ t a r g e t s rpn\_bbox\_targets rpn_bbox_targets分别对应 t t t与 t ∗ t^* t∗, r p n _ b b o x _ i n s i d e _ w e i g t h s rpn\_bbox\_inside\_weigths rpn_bbox_inside_weigths对应 p ∗ p^* p∗, r p n _ b b o x _ o u t s i d e _ w e i g t h s rpn\_bbox\_outside\_weigths rpn_bbox_outside_weigths未用到(从 s o o m t h _ L 1 _ L o s s l a y e r soomth\_L1\_Loss\ layer soomth_L1_Loss layer代码中可以看到),而 N r e g N_{reg} Nreg同样隐含在 c a f f e b l o b caffe\ blob caffe blob大小中
这样,公式与代码就完全对应了。特别需要注意的是,在训练和检测阶段生成和存储 a n c h o r s anchors anchors的顺序完全一样,这样训练结果才能被用于检测!
通过训练好的RPN网络收集proposals
在该步骤中,利用之前的
R
P
N
RPN
RPN网络,获取
p
r
o
p
o
s
a
l
r
o
i
s
proposal\ rois
proposal rois,同时获取
p
o
s
i
t
i
v
e
s
o
f
t
m
a
x
p
r
o
b
a
b
i
l
i
t
y
positive\ softmax\ probability
positive softmax probability,如图,然后将获取的信息保存在
p
y
t
h
o
n
p
i
c
k
l
e
python\ pickle
python pickle文件中。该网络本质上和检测中的
R
P
N
RPN
RPN网络一样,没有什么区别。
训练Faster RCNN网络
读取之前保存的 p i c k l e pickle pickle文件,获取 p r o p o s a l s proposals proposals与 p o s i t i v e p r o b a b i l i t y positive\ probability positive probability。从 d a t a data data层输入网络。然后:
- 将提取的 p r o p o s a l s proposals proposals作为rois传入网络,如下图蓝框
- 计算 b b o x _ i n s i d e _ w e i g h t s + b b o x _ o u t s i d e _ w e i g h t s bbox\_inside\_weights+bbox\_outside\_weights bbox_inside_weights+bbox_outside_weights,作用与 R P N RPN RPN一样,传入 s o o m t h _ L 1 _ l o s s l a y e r soomth\_L1\_loss\ layer soomth_L1_loss layer,如下图绿框
这样就可以训练最后的识别
s
o
f
t
m
a
x
softmax
softmax与最终的
b
o
u
n
d
i
n
g
b
o
x
r
e
g
r
e
s
s
i
o
n
bounding\ box\ regression
bounding box regression了。
之后的stage2训练都是大同小异,不再赘述了。
F
a
s
t
e
r
R
−
C
N
N
Faster\ R-CNN
Faster R−CNN还有一种
e
n
d
−
t
o
−
e
n
d
end-to-end
end−to−end的训练方式,可以一次完成
t
r
a
i
n
train
train:
Faster R-CNN-github
问题
- 为什么Anchor坐标中有负数?
回顾 a n c h o r anchor anchor生成步骤:首先生成 9 9 9个 b a s e a n c h o r base\ anchor base anchor,然后通过坐标偏移在 50 × 38 50\times 38 50×38大小的 1 16 \frac{1}{16} 161下采样 F e a t u r e M a p Feature\ Map Feature Map每个点都放上这 9 9 9个 b a s e a n c h o r base\ anchor base anchor,就形成了 50 × 38 × k 50\times 38\times k 50×38×k个 a n h c o r s anhcors anhcors。至于这 9 9 9个 b a s e a n c h o r base\ anchor base anchor坐标是什么其实并不重要,不同代码实现也许不同。
显然这里面有一部分边缘 a n c h o r s anchors anchors会超出图像边界,而真实中不会有超出图像的目标,所以会有 c l i p a n c h o r clip\ anchor clip anchor步骤。
- Anchor到底与网络输出如何对应?
VGG输出 50 × 38 × 512 50\times 38\times 512 50×38×512的特征,对应设置 50 × 38 × k 50\times 38\times k 50×38×k个 a n c h o r s anchors anchors,而 R P N RPN RPN输出 50 × 38 × 2 k 50\times 38\times 2k 50×38×2k的分类特征矩阵和 50 × 38 × 4 k 50\times 38\times 4k 50×38×4k的坐标回归特征矩阵。
其实在实现过程中,每个点的 2 k 2k 2k个分类特征与 4 k 4k 4k回归特征,与 k k k个 a n c h o r anchor anchor逐个对应即可,这实际是一种“人为设置的逻辑映射”。当然,也可以不这样设置,但是无论如何都需要保证在训练和测试过程中映射方式必须一致。
- 为何有ROI Pooling还要把输入图片resize到固定大小的MxN
由于引入 R O I P o o l i n g ROI\ Pooling ROI Pooling,从原理上说 F a s t e r R − C N N Faster\ R-CNN Faster R−CNN确实能够检测任意大小的图片。但是由于在训练的时候需要使用大 b a t c h batch batch训练网络,而不同大小输入拼 b a t c h batch batch在实现的时候代码较为复杂,而且当时以 C a f f e Caffe Caffe为代表的第一代深度学习框架也不如 T e n s o r f l o w Tensorflow Tensorflow和 P y T o r c h PyTorch PyTorch灵活,所以作者选择了把输入图片 r e s i z e resize resize到固定大小的 800 × 600 800\times 600 800×600。