文章目录

  • 基本概念
  • 一、R-CNN
  • 1. 网络结构
  • 2. 训练流程
  • 3. 测试阶段
  • 4. 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): 抑制不是极大值的元素,搜索局部的极大值。
算法步骤:

  1. 在当前类别的候选边界框中寻找得分最高的边界框;
  2. 计算其他边界框与该边界框的IOU值;
  3. 删除所有IOU值大于给定阈值的目边界框;

mAP(mean Average Precision): 给每一类计算AP,然后求平均。

一、R-CNN

1. 网络结构

各级层独立:





Regin proposal-Selective Search

Feature extraction-CNN

Classification-SVM

Bounding box regression




两阶段目标检测算法的过程 双阶段目标检测_卷积_02


算法主要分为4个步骤:

  1. 通过Selective Search方法获取约2000张候选区域;
    Selective Search算法步骤如上所述。
  2. 对每个候选区域使用CNN提取特征;
    通过区域预处理将区域图片的Bounding box向外膨胀16个像素,变换成两阶段目标检测算法的过程 双阶段目标检测_目标检测_03的图片;之后进入预训练好的卷积神经网络得到特征图。
  3. fc7特征送入每一类SVM分类器,判断该区域是否属于该类;
    两阶段目标检测算法的过程 双阶段目标检测_卷积_04维特征与20个SVM分类器组成的两阶段目标检测算法的过程 双阶段目标检测_cnn_05维的权重矩阵相乘,得到两阶段目标检测算法的过程 双阶段目标检测_两阶段目标检测算法的过程_06维矩阵,该矩阵表示表示每个建议框是某类目标的得分。
  4. 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所学习到的特征是用于针对特定任务的特征卷积层所学习到的为共性特征,全连接层所学习到的是特定任务的特征。
  • 两阶段目标检测算法的过程 双阶段目标检测_卷积_07


  • SVM分类:使用微调后的网络中的fc7训练SVM线性分类器。
  • Hinge Loss
  • 每个类别(N类)对应一个分类器
  • IoU阈值定义为0.3,当重叠度大于0.3时定义为正样本,反之。
  • 一旦CNN fc7层特征被提取出来,将每个物体类训练一个svm分类器,通过分类判断是需要的物体还是backgound。
  • Bounding Box回归:使用微调后的网络中的conv5训练Bounding Box回归模型。
  • Square Loss

两阶段目标检测算法的过程 双阶段目标检测_cnn_08

  • 每个类别训练(N类)训练一个回归模型
  • IoU阈值定义为0.3,当重叠度大于0.3时定义为正样本,反之。
  • 由于目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需一个位置精修操作:对每一类目标使用一个线性回归模型进行精修。正则项两阶段目标检测算法的过程 双阶段目标检测_两阶段目标检测算法的过程_09。输入为 conv5的4096维特征,输出为xy方向的缩放和平移。

3. 测试阶段



两阶段目标检测算法的过程 双阶段目标检测_两阶段目标检测算法的过程_10


  1. 使用SS算法提取出2000个区域目标图;
  2. 将每个区域目标图通过预处理归一化到两阶段目标检测算法的过程 双阶段目标检测_目标检测_03
    使用fine-tune过的CNN计算2套特征
  3. fc7 -> SVM -> 类别分值
  • NMS(IoU>=0.5)获取无冗余的区域子集
  1. con5 -> Bounding box -> Box偏差
  • 使用Bbox偏差修正区域子集

4. RNN存在的问题

  1. 测试速度慢,测试一张图片在CPU上需要53S,使用Selective Search算法提取候选框需要2S,一张图像内候选框之间存在大量重叠,提取特征操作存在大量冗余;
  2. 训练速度慢,过程极其繁琐,不仅需要训练图像分类网络,还需要训练SVM分类器、Bounding Box回归器,训练过程都是相互独立的;
  3. 训练所需空间大,对于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)。

  1. 共享卷积计算: 在conv5层输出提取所有区域的特征。
  2. 金字塔池化: 为不同尺寸的区域,在Conv5输出提取特征;映射到尺寸固定的全连接层上。

1. 网络结构





Regin proposal-Selective Search

Feature extraction--CNN+SPP

Classification-SVM

Bounding box regression




两阶段目标检测算法的过程 双阶段目标检测_两阶段目标检测算法的过程_12


算法主要分为5步骤(大部分与RCNN类似):

  1. 通过Selective Search方法获取约2000张候选区域;
  2. 对每个候选区域使用CNN提取特征;
  3. 对CNN提取后的特征图提取SPP特征
  4. fc7特征送入N类SVM分类器,判断该区域是否属于该类;
  5. conv5特征进行N类Bounding box回归精调预测框结构

2. 基础知识

共享卷积计算

直接输入整张图片,进行一次共享卷积计算,将conv5层输出所有区域的特征。

金字塔池化 Spatial Pyramid Pooling



两阶段目标检测算法的过程 双阶段目标检测_深度学习_13


在R-CNN中,需要将每个候选框统一大小后分别作为CNN的输入,低效而费时。SPP提出只对原图进行一次卷积计算,得到整张图的卷积特征,然后找到每个候选框在特征图上的映射,将映射作为候选框的卷积特征输入到SPP层中,变换成相同尺度。
具体操作:
将spp替换conv5中的pooling层,spp的思路是对于任意大小的feature map首先分成3个不同level的切割图,切割尺寸分别为两阶段目标检测算法的过程 双阶段目标检测_卷积_14两阶段目标检测算法的过程 双阶段目标检测_cnn_15两阶段目标检测算法的过程 双阶段目标检测_目标检测_16,每个切割图得到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. 测试流程



两阶段目标检测算法的过程 双阶段目标检测_两阶段目标检测算法的过程_12


基础结构与R-CNN类似,将预处理过程去除,对图片进行共享卷积计算,将得到的conv5层特征图和SS算法提取的区域图进行映射得到原图区域作为SPP层的输入,SPP层将不同尺寸的映射到原图的区域进行金字塔池化将其变成尺寸相同的特征图,再进入全连接层,后续步骤和R- CNN类似。

  • 与R-CNN不同的是SPP在图片级计算不做fine-tunning,只在区域级计算时计算时进行fine-tunning。

5. 存在问题

  1. 继承了RCNN剩余问题: 需要存储大量特征、复杂的多阶段训练、训练时间仍长
  2. 新问题:SPP是取代先前Max pooling层,将特征图转化为224*224的,由于 SPP的特殊性(分为3个尺寸的bin)SPP层之前的所有卷积层参数不能finetune,缺少迁移的可能性。

三、 Fast R-CNN

在SPP的基础上提出3个改进:

  1. 实现end-to-end单阶段训练,通过多任务损失函数实现end-to-end.
  2. 所有层的参数都可以finetune
  3. 不需要离线存储特征文件

Fast R-CNN在SPP Net的基础上提出两个优化点:感兴趣区域池化层(ROI pooling)和多任务损失函数(Multi- task loss)。

1. 网络结构


第二阶段




Classification-SVM

Feature extraction-CNN

Bounding box regression

Regin proposal-Selective Search




两阶段目标检测算法的过程 双阶段目标检测_目标检测_18


算法步骤分为5步:

  1. 通过Selective Search方法获取约2000张候选区域;
  2. 对每个候选区域使用CNN提取特征;
  3. 对CNN提取后的特征图提取ROI特征
  4. fc7特征送入N+1类softmax分类,判断该区域是否属于哪类;
  5. 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)



两阶段目标检测算法的过程 双阶段目标检测_两阶段目标检测算法的过程_19


ROI pooling是SPP pooling的单层特例。ROI pooling是将ROI区域的卷积特征拆分为两阶段目标检测算法的过程 双阶段目标检测_目标检测_20网格,然后对每个Bin内的所有特征进行Max pooling。

多任务损失(Multi-task loss)

损失函数为:两阶段目标检测算法的过程 双阶段目标检测_深度学习_21

该损失函数分为两部分,第一部分分类器的损失:两阶段目标检测算法的过程 双阶段目标检测_目标检测_22,其中p为每个ROI的概率分布,u为Ground truth类别。

第二部分为回归器损失L1 loss:
两阶段目标检测算法的过程 双阶段目标检测_深度学习_23
两阶段目标检测算法的过程 双阶段目标检测_目标检测_24
其中两阶段目标检测算法的过程 双阶段目标检测_cnn_25为偏差目标,两阶段目标检测算法的过程 双阶段目标检测_卷积_26为预测偏差,两阶段目标检测算法的过程 双阶段目标检测_卷积_27为指示函数,当该值为1的时候分类为物体类别,有回归loss;当值为0时,分类为背景类别,没有回归loss.
预测偏差的计算公式:
两阶段目标检测算法的过程 双阶段目标检测_深度学习_28

3.训练&测试流程



两阶段目标检测算法的过程 双阶段目标检测_深度学习_29


训练流程: 将整张图片输入到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_30

Faster RCNN = RPN + Fast RCNN,主要分为以下几个步骤:

  • 将图像输入到CNN网络得到特征图
  • 使用RPN网络结构生成候选框,然后将这些RPN生成的候选框投影到第一步得到相应的特征矩阵
  • 然后将每个特征矩阵通过ROI Pooling层缩放到固定的两阶段目标检测算法的过程 双阶段目标检测_cnn_31大小的特征图,最后将特征图flatten后经过一系列全连接层得到分类和回归的结果。

2. RNP



两阶段目标检测算法的过程 双阶段目标检测_深度学习_32


1.网络结构
RNP网络具体结构如下:

  • 向RNP网络输入图片Conv5两阶段目标检测算法的过程 双阶段目标检测_两阶段目标检测算法的过程_33的特征图,依次经过两阶段目标检测算法的过程 双阶段目标检测_卷积_34的卷积核和两阶段目标检测算法的过程 双阶段目标检测_深度学习_35的卷积核和ReLu激活函数,得到两阶段目标检测算法的过程 双阶段目标检测_卷积_34的特征矩阵。
  • 将得到的特征矩阵并联输入到两个分支中,第一个分支两阶段目标检测算法的过程 双阶段目标检测_cnn_37用2k个两阶段目标检测算法的过程 双阶段目标检测_深度学习_35卷积核进行卷积,输出2k个数,表示某个区域有没有物体的分数。
  • 第二个分支两阶段目标检测算法的过程 双阶段目标检测_卷积_39用4k个两阶段目标检测算法的过程 双阶段目标检测_深度学习_35卷积核进行卷积,最后输出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网络在输入特征图后进行两阶段目标检测算法的过程 双阶段目标检测_卷积_41的卷积,特征图位置和原图像之间有对应关系,这里Anchor box参考框的中心就是卷积核 的中心,在conv5层上每卷积一次就会自动对应9个Anchor box,这样拟合的边界框偏移量就是Anchor box的偏移量。

3.Loss Function
两阶段目标检测算法的过程 双阶段目标检测_cnn_42

  • 两阶段目标检测算法的过程 双阶段目标检测_目标检测_43为第i个anchor预测为真实标签的概率
  • 两阶段目标检测算法的过程 双阶段目标检测_卷积_44为正样本时为1,负样本为零(作用类似于Faster RCNN中艾佛森括号)
  • 两阶段目标检测算法的过程 双阶段目标检测_深度学习_45表示预测第i个Anchor box的边界框回归参数
  • 两阶段目标检测算法的过程 双阶段目标检测_cnn_46表示第i个Anchor box对应的GT Box
  • 两阶段目标检测算法的过程 双阶段目标检测_卷积_47表示一个mini-batch中所有样本的数量
  • 两阶段目标检测算法的过程 双阶段目标检测_目标检测_48表示Anchor box位置个数

第一部分为分类损失,若使用多类别的Softmax交叉熵损失,由于分类类别只有背景和前景,因此对于k个Anchor box就有2k个值。若使用的是二分类的交叉熵损失,对于每个Anchor box只计算一个概率,对于k个Anchor box就有k个值。

第二部分为边界框回归损失,形式和Faster RCNN类似。

4.RPN Loss和Fast RCNN Loss联合训练
具体步骤如下:

  1. 训练RPN网络
    使用Image Net预训练分类模型初始化卷积层参数;
  2. 训练Fast RCNN网络
    使用Image Net预训练分类模型初始化卷积层参数;Region proposals由步骤1的RPN生成
  3. 调优RPN
    使用Fast RCNN卷积层参数对其进行初始化;
    固定卷积层,finetune剩余层
  4. 调优Fast RCNN
    固定卷积层,finetune剩余层;Region proposals由步骤3的RPN生成。

参考文章