Selective Search: 主要思想是先按照像素将图像分割成小区域,再查看现有小区域,按照合并规则合并可能性最高的两个相邻区域,重复直到整张图像合并成一个区域位置。
IoU(重叠度Intersection of Uint): 定义两个bounding box的定位精度——两个矩形框的重叠面积占两个矩形框并集的面积比例。
非极大值抑制(NMS): 抑制不是极大值的元素,搜索局部的极大值。
算法步骤:
mAP(mean Average Precision): 给每一类计算AP,然后求平均。
各级层独立:
算法主要分为4个步骤:
fc7
特征送入每一类SVM分类器,判断该区域是否属于该类;conv5
特征进行Bounding box回归精调预测框结构 预训练:使用ImageNet
数据集对CNN模型进行预训练初始化网络参数。
fine- tuning:使用SS算法生成的所有区域对预训练出的网络进行微调。
卷积层所学习到的为共性特征,全连接层所学习到的是特定任务的特征。
SVM分类:使用微调后的网络中的fc7
训练SVM线性分类器。
Bounding Box回归:使用微调后的网络中的conv5
训练Bounding Box回归模型。
fc7
-> SVM -> 类别分值
con5
-> Bounding box -> Box偏差
Q: 为什么使用SVM分类不直接使用softmax多分类器?
A: svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。训练过程中对于训练数据的标注很宽泛(bounding box只包含一部分)标记为正样本,容易过拟合;svm对于训练样本数据的iou要求严格(bounding box包含整个物体)。
在R-CNN的基础上提出两个创新点:共享卷积计算和金字塔池化(spatial pyramid pooling)。
算法主要分为5步骤(大部分与RCNN类似):
fc7
特征送入N
类SVM分类器,判断该区域是否属于该类;conv5
特征进行N
类Bounding box回归精调预测框结构直接输入整张图片,进行一次共享卷积计算,将conv5
层输出所有区域的特征。
在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个块,然后在每个块上最大池化,池化后的特征拼接得到一个固定维度的输出。以满足全连接层的需要。
fc7
特征对每一类进行svm分类。基础结构与R-CNN类似,将预处理过程去除,对图片进行共享卷积计算,将得到的conv5层特征图和SS算法提取的区域图进行映射得到原图区域作为SPP层的输入,SPP层将不同尺寸的映射到原图的区域进行金字塔池化将其变成尺寸相同的特征图,再进入全连接层,后续步骤和R- CNN类似。
在SPP的基础上提出3个改进:
Fast R-CNN在SPP Net的基础上提出两个优化点:感兴趣区域池化层(ROI pooling)和多任务损失函数(Multi- task loss)。
算法步骤分为5步:
fc7
特征送入N+1
类softmax分类,判断该区域是否属于哪类;conv5
特征进行N
类Bounding box回归精调预测框结构与SPP网络结构异同点:
ROI pooling是SPP pooling的单层特例。ROI pooling是将ROI区域的卷积特征拆分为 H × W H \times W H×W网格,然后对每个Bin内的所有特征进行Max pooling。
损失函数为: 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)
训练流程: 将整张图片输入到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算法即可。
为解决Fast RCNN算法中SS选择耗时时间长的问题,Faster RCNN提出一个RPN(Region Proposal Network)网络,即其他部分与Fast RCNN相同,即Faster RCNN = RPN + Fast RCNN,RPN取代了离线Selective Search模块,解决了性能瓶颈。同时Faster RCNN进一步共享卷积层计算,并基于Attention机制,待改
1.网络结构
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的特征矩阵。2.Anchor
Anchor box为图像中的参考框,对应网络结构中的k,一般来说k=9,分别包括了3个尺度和3个长宽的ratio的组合。
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联合训练
具体步骤如下:
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)