文章目录
- 基本概念
- 一、R-CNN
- 1. 网络结构
- 2. 训练流程
- 3. 测试阶段
- 5.RNN存在的问题
- 二、SPP-Net
- 1. 网络结构
- 2. 基础知识
- 共享卷积计算
- 金字塔池化 Spatial Pyramid Pooling
- 3. 训练流程
- 4. 测试流程
- 5. 存在问题
- 三、 Fast R-CNN
- 1. 网络结构
- 2. 基础知识
- 感兴趣区域池化层 (ROI pooling)
- 多任务损失(Multi-task loss)
- 3.训练&测试流程
- 四、Faster R-CNN
- 1. 网络结构
- 2. RNP
- 参考文章
基本概念
Selective Search: 主要思想是先按照像素将图像分割成小区域,再查看现有小区域,按照合并规则合并可能性最高的两个相邻区域,重复直到整张图像合并成一个区域位置。
IoU(重叠度Intersection of Uint): 定义两个bounding box的定位精度——两个矩形框的重叠面积占两个矩形框并集的面积比例。
非极大值抑制(NMS): 抑制不是极大值的元素,搜索局部的极大值。
算法步骤:
- 在当前类别的候选边界框中寻找得分最高的边界框;
- 计算其他边界框与该边界框的IOU值;
- 删除所有IOU值大于给定阈值的目边界框;
mAP(mean Average Precision): 给每一类计算AP,然后求平均。
一、R-CNN
1. 网络结构
各级层独立:
算法主要分为4个步骤:
- 通过Selective Search方法获取约2000张候选区域;
Selective Search算法步骤如上所述。 - 对每个候选区域使用CNN提取特征;
通过区域预处理将区域图片的Bounding box向外膨胀16个像素,变换成 227 × 227 227\times 227 227×227的图片;之后进入预训练好的卷积神经网络得到特征图。 - 将
fc7
特征送入每一类SVM分类器,判断该区域是否属于该类;
将 2000 × 4096 2000\times 4096 2000×4096维特征与20个SVM分类器组成的 4096 × 20 4096\times 20 4096×20维的权重矩阵相乘,得到 2000 × 20 2000\times 20 2000×20维矩阵,该矩阵表示表示每个建议框是某类目标的得分。 - 将
conv5
特征进行Bounding box回归精调预测框结构
通过非极大值抑制(NMS)处理后的剩余边界框进行进一步筛选,接着使用20个回归器对20个类别的回归框进行回归操作,并且对候选框进行修正得到最终的边界框。
2. 训练流程
-
预训练:使用
ImageNet
数据集对CNN模型进行预训练初始化网络参数。- 由于目标检测的训练数据较少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的,所以采用有监督的预训练——直接使用Alexnet,VGG的网络参数。
-
fine- tuning:使用SS算法生成的所有区域对预训练出的网络进行微调。
- Log loss
- 微调是将卷积层最后一层替换掉,替换为N+1个神经元的softmax层(N类+1类背景),然后这一层采用参数随机初始化的方法,其他网络层的参数不变,接着以SGD训练:开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个正样本、96个负样本。
- 用SS算法挑选出的候选框与人工标注矩形框的重叠区域IoU>0.5,分为正样本,反之分为负样本(背景类别)
- 如果不针对特定的任务进行fine-tuning,而是仅仅把CNN当作特征提取器,卷积层学到的就是基础的共享特征提取层,可以用于提取各种图片的特征,而f6,f7所学习到的特征是用于针对特定任务的特征。
卷积层所学习到的为共性特征,全连接层所学习到的是特定任务的特征。
-
SVM分类:使用微调后的网络中的
fc7
训练SVM线性分类器。- Hinge Loss
- 每个类别(N类)对应一个分类器
- IoU阈值定义为0.3,当重叠度大于0.3时定义为正样本,反之。
- 一旦CNN fc7层特征被提取出来,将每个物体类训练一个svm分类器,通过分类判断是需要的物体还是backgound。
-
Bounding Box回归:使用微调后的网络中的
conv5
训练Bounding Box回归模型。-
Square Loss
-
-
每个类别训练(N类)训练一个回归模型
-
IoU阈值定义为0.3,当重叠度大于0.3时定义为正样本,反之。
-
由于目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需一个位置精修操作:对每一类目标使用一个线性回归模型进行精修。正则项 λ = 1000 \lambda=1000 λ=1000。输入为
conv5
的4096维特征,输出为xy方向的缩放和平移。
-
3. 测试阶段
- 使用SS算法提取出2000个区域目标图;
- 将每个区域目标图通过预处理归一化到
227
×
227
227\times 227
227×227;
使用fine-tune过的CNN计算2套特征 fc7
-> SVM -> 类别分值- NMS(IoU>=0.5)获取无冗余的区域子集
con5
-> Bounding box -> Box偏差- 使用Bbox偏差修正区域子集
5.RNN存在的问题
- 测试速度慢,测试一张图片在CPU上需要53S,使用Selective Search算法提取候选框需要2S,一张图像内候选框之间存在大量重叠,提取特征操作存在大量冗余;
- 训练速度慢,过程极其繁琐,不仅需要训练图像分类网络,还需要训练SVM分类器、Bounding Box回归器,训练过程都是相互独立的;
- 训练所需空间大,对于SVM和Bounding Box回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘,对于非常深的网络,训练集上5K图像上提取的特征需要数百GB的存储空间。
Q: 为什么使用SVM分类不直接使用softmax多分类器?
A: svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。训练过程中对于训练数据的标注很宽泛(bounding box只包含一部分)标记为正样本,容易过拟合;svm对于训练样本数据的iou要求严格(bounding box包含整个物体)。
二、SPP-Net
在R-CNN的基础上提出两个创新点:共享卷积计算和金字塔池化(spatial pyramid pooling)。
- 共享卷积计算: 在conv5层输出提取所有区域的特征。
- 金字塔池化: 为不同尺寸的区域,在Conv5输出提取特征;映射到尺寸固定的全连接层上。
1. 网络结构
算法主要分为5步骤(大部分与RCNN类似):
- 通过Selective Search方法获取约2000张候选区域;
- 对每个候选区域使用CNN提取特征;
- 对CNN提取后的特征图提取SPP特征
- 将
fc7
特征送入N
类SVM分类器,判断该区域是否属于该类; - 将
conv5
特征进行N
类Bounding box回归精调预测框结构
2. 基础知识
共享卷积计算
直接输入整张图片,进行一次共享卷积计算,将conv5
层输出所有区域的特征。
金字塔池化 Spatial Pyramid Pooling
在R-CNN中,需要将每个候选框统一大小后分别作为CNN的输入,低效而费时。SPP提出只对原图进行一次卷积计算,得到整张图的卷积特征,然后找到每个候选框在特征图上的映射,将映射作为候选框的卷积特征输入到SPP层中,变换成相同尺度。
具体操作:
将spp替换conv5中的pooling层,spp的思路是对于任意大小的feature map首先分成3个不同level的切割图,切割尺寸分别为
1
×
1
1\times 1
1×1、
2
×
2
2\times 2
2×2、
4
×
4
4\times 4
4×4,每个切割图得到1,4,16个块,然后在每个块上最大池化,池化后的特征拼接得到一个固定维度的输出。以满足全连接层的需要。
3. 训练流程
- 预训练:使用ImageNet数据集对CNN模型进行预训练初始化网络参数。
- SPP特征:计算所有SS区域的SPP特征。
- fine-tuning:使用SPP特征对全连接层进行微调。
- SVM分类:使用微调过后的
fc7
特征对每一类进行svm分类。 - bounding box回归:使用spp特征进行bounding box回归。
- R-CNN是使用conv5进行bounding box回归
- 只对全连接层进行fine-tuning
4. 测试流程
基础结构与R-CNN类似,将预处理过程去除,对图片进行共享卷积计算,将得到的conv5层特征图和SS算法提取的区域图进行映射得到原图区域作为SPP层的输入,SPP层将不同尺寸的映射到原图的区域进行金字塔池化将其变成尺寸相同的特征图,再进入全连接层,后续步骤和R- CNN类似。
- 与R-CNN不同的是SPP在图片级计算不做fine-tunning,只在区域级计算时计算时进行fine-tunning。
5. 存在问题
- 继承了RCNN剩余问题: 需要存储大量特征、复杂的多阶段训练、训练时间仍长
- 新问题:SPP层之前的所有卷积层参数不能finetune
三、 Fast R-CNN
在SPP的基础上提出3个改进:
- 实现end-to-end单阶段训练,通过多任务损失函数实现end-to-end.
- 所有层的参数都可以finetune
- 不需要离线存储特征文件
Fast R-CNN在SPP Net的基础上提出两个优化点:感兴趣区域池化层(ROI pooling)和多任务损失函数(Multi- task loss)。
1. 网络结构
算法步骤分为5步:
- 通过Selective Search方法获取约2000张候选区域;
- 对每个候选区域使用CNN提取特征;
- 对CNN提取后的特征图提取ROI特征
- 将
fc7
特征送入N+1
类softmax分类,判断该区域是否属于哪类; - 将
conv5
特征进行N
类Bounding box回归精调预测框结构
与SPP网络结构异同点:
- 提取特征的backbone由AlexNet改换为VGG,提取特征能力更强
- SPP Pooling替换为ROI Pooling
- SVM分类和回归任务使用多任务损失函数替代,目标检测任务就不需要分阶段训练
- 提取到ROI特征向量后并联连接这两个分支。使用softmax替代SVM分类器(C+1类,包含background)。FC全连接边界框回归器替代了LR回归模型,新的边界框回归器输出对应(C + 1)个类别的候选框边界回归参数(dx, dy, dw, dh),共输出(C + 1) * 4个节点,如下图每4个一组,这里回归参数的含义与RCNN保持一致。
2. 基础知识
感兴趣区域池化层 (ROI pooling)
ROI pooling是SPP pooling的单层特例。ROI pooling是将ROI区域的卷积特征拆分为 H × W H \times W H×W网格,然后对每个Bin内的所有特征进行Max pooling。
多任务损失(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)=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)=-logp_u Lcls(p,u)=−logpu,其中p为每个ROI的概率分布,u为Ground truth类别。
第二部分为回归器损失L1 loss:
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=\{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
,
∣
x
∣
<
1
∣
x
∣
−
0.5
,
o
t
h
e
r
w
i
s
e
smooth_{L1}(x)=\left\{\begin{matrix} 0.5x^2 & ,\left | x \right |< 1 \\ \left | x \right |-0.5 &,otherwise \end{matrix}\right.
smoothL1(x)={0.5x2∣x∣−0.5,∣x∣<1,otherwise
其中
v
=
{
v
x
,
v
y
,
y
w
,
v
h
}
v=\{v_x,v_y,y_w,v_h\}
v={vx,vy,yw,vh}为偏差目标,
t
u
=
{
t
x
u
,
t
y
u
,
t
w
u
,
t
h
u
}
t^u=\{t_x^u,t_y^u,t_w^u,t_h^u\}
tu={txu,tyu,twu,thu}为预测偏差,
[
u
≥
1
]
[u\ge1]
[u≥1]为指示函数,当该值为1的时候分类为物体类别,有回归loss;当值为0时,分类为背景类别,没有回归loss.
预测偏差的计算公式:
t
x
=
(
G
x
−
P
x
)
/
P
w
t
y
=
(
G
y
−
P
y
)
/
P
h
t
w
=
l
o
g
(
G
w
/
P
w
)
t
h
=
l
o
g
(
G
h
/
P
h
)
\begin{matrix} 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) \end{matrix}
tx=(Gx−Px)/Pwty=(Gy−Py)/Phtw=log(Gw/Pw)th=log(Gh/Ph)
3.训练&测试流程
训练流程: 将整张图片输入到CNN网络中,同时进行ss算法提取候选框,在Conv5特征图中映射到候选框的特征矩阵,做ROI Pooling,规整到固定大小,然后经过全连接层,分别将全连接层后的特征输入到SoftMax分类器和Bounding box回归器中(根据输出维度需要再接一层FC),使用多任务组合损失函数进行计算和梯度回传,实现端到端的网络训练。
在pre-trained模型上做finetune。在Fast R-CNN训练时,随机梯度下降(SGD)的小批量(mini-batches)采用分层抽样,首先采样N个图像,然后对于每一张图像采样R/N个RoI区域。
- batch_size=128
- Batch尺寸(128)=每个batch的图片数量(2)*每个图片ROI数量(64)
- 一个batch来自两张图片,每张图片各自取64个候选区域,正负样本比为1:3,正样本判定条件为IOU值大于0.5,负例的判定条件是IOU要在0.1-0.5之间,是一种难例挖掘的策略。
测试流程: 与训练过程相同,为每一类加上后处理NMS算法即可。
四、Faster R-CNN
为解决Fast RCNN算法中SS选择耗时时间长的问题,Faster RCNN提出一个RPN(Region Proposal Network)网络,即其他部分与Fast RCNN相同,即Faster RCNN = RPN + Fast RCNN,RPN取代了离线Selective Search模块,解决了性能瓶颈。同时Faster RCNN进一步共享卷积层计算,并基于Attention机制,待改
1. 网络结构
- 将图像输入到CNN网络得到特征图
- 使用RPN网络结构生成候选框,然后将这些RPN生成的候选框投影到第一步得到相应的特征矩阵
- 然后将每个特征矩阵通过ROI Pooling层缩放到固定的 7 × 7 7\times7 7×7大小的特征图,最后将特征图flatten后经过一系列全连接层得到分类和回归的结果。
2. RNP
1.网络结构
RNP网络具体结构如下:
- 向RNP网络输入图片
Conv5
的 13 × 13 × 256 13\times13\times256 13×13×256的特征图,依次经过 3 × 3 × 256 3\times3\times256 3×3×256的卷积核和 1 × 1 × 256 1\times 1\times256 1×1×256的卷积核和ReLu激活函数,得到 3 × 3 × 256 3\times3\times256 3×3×256的特征矩阵。 - 将得到的特征矩阵并联输入到两个分支中,第一个分支 c l s l a y e r cls \ layer cls layer用2k个 1 × 1 × 256 1\times 1\times256 1×1×256卷积核进行卷积,输出2k个数,表示某个区域有没有物体的分数。
- 第二个分支 r e g l a y e r reg \ layer reg layer用4k个 1 × 1 × 256 1\times 1\times256 1×1×256卷积核进行卷积,最后输出4k个数,表示x,y,w,h的偏移量。
2.Anchor
Anchor box为图像中的参考框,对应网络结构中的k,一般来说k=9,分别包括了3个尺度和3个长宽的ratio的组合。
- 3个尺度:[128,256,512]
- 3个ratio:1:1,1:2,2:1
- RPN网络在输入特征图后进行
3
×
3
3 \times 3
3×3的卷积,特征图位置和原图像之间有对应关系,这里Anchor box参考框的中心就是卷积核 的中心,在
conv5
层上每卷积一次就会自动对应9个Anchor box,这样拟合的边界框偏移量就是Anchor box的偏移量。
3.Loss Function
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_{i}L_{cls}(p_i,p_i^*) }+\lambda \frac{1}{N_{reg}\sum_{i}p_i^*L_{reg}(t_i,t_i^*) }
L({pi},{ti})=Ncls∑iLcls(pi,pi∗)1+λNreg∑ipi∗Lreg(ti,ti∗)1
- p i p_i pi为第i个anchor预测为真实标签的概率
- p i ∗ p_i^* pi∗为正样本时为1,负样本为零(作用类似于Faster RCNN中艾佛森括号)
- t i t_i ti表示预测第i个Anchor box的边界框回归参数
- t i ∗ t_i^* ti∗表示第i个Anchor box对应的GT Box
- N c l s N_{cls} Ncls表示一个mini-batch中所有样本的数量
- N r e g N_{reg} Nreg表示Anchor box位置个数
第一部分为分类损失,若使用多类别的Softmax交叉熵损失,由于分类类别只有背景和前景,因此对于k个Anchor box就有2k个值。若使用的是二分类的交叉熵损失,对于每个Anchor box只计算一个概率,对于k个Anchor box就有k个值。
第二部分为边界框回归损失,形式和Faster RCNN类似。
4.RPN Loss和Fast RCNN Loss联合训练
具体步骤如下:
- 训练RPN网络
使用Image Net预训练分类模型初始化卷积层参数; - 训练Fast RCNN网络
使用Image Net预训练分类模型初始化卷积层参数;Region proposals由步骤1的RPN生成 - 调优RPN
使用Fast RCNN卷积层参数对其进行初始化;
固定卷积层,finetune剩余层 - 调优Fast RCNN
固定卷积层,finetune剩余层;Region proposals由步骤3的RPN生成。
参考文章
RCNN- 将CNN引入目标检测的开山之作
在Rcnn中为什么使用IoU非极大值抑制?
目标检测(3)-SPPNet
fast rcnn 论文解读(附代码链接)
Fast R-CNN
RCNN系列(R-CNN、Fast-RCNN、Faster-RCNN、Mask-RCNN)
RCNN、Fast-RCNN、Faster-RCNN的算法步骤以及其中的难点
一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
快速的区域卷积网络方法(Fast R-CNN)