目录
一、 深度学习目标检测算法介绍
二、 基于Two-stage的目标检测算法
三、Two-stage基本流程
四、Two-stage常见算法
五、Two-stage核心组件
1、Two-stage的两个核心组件
2、主干CNN网络设计原则
3、RPN网络
3.1 Faster R-CNN 网络结构
3.2 RPN(Region Proposal Networks)网络结构
3.2.1 整体理解:
3.2.2 详细介绍 :
A、利用区域推荐生成anchor
B、分类和边框回归
C、生成Proposal
D、ROI Pooling(可以理解为抠图+resize的操作)
一、 深度学习目标检测算法介绍
在目标检测-传统检测方法中,我们介绍了目标检测中传统的算法和目标检测的方式,在目标检测-传统方法与深度学习算法对比中,我们对传统的目标检测算法和深度学习目标检测算法简单做了比较,此篇记录了深度学习目标检测算法内容,深入讲述一下深度学习算法在目标检测的原理和效果。而目标检测深度学习算法分为类两个阶段:
- One-stage(YOLO和SSD系列):直接回归目标位置。
- Two-stage(Faster RCNN系列):利用RPN网络对候选区域进行推荐,即通过一个完整的卷积神经网完成检测过程。
我们首先对Two-stage进行介绍。
二、 基于Two-stage的目标检测算法
Two-stage的目标检测算法主要是通过一个完整的卷积神经网络
来完成目标检测的过程,进行目标检测时用到的特征就是CNN的特征,也就是通过一个CNN卷积神经网来提取对候选区域目标的特征的描述。
对于Two-stage的目标检测算法最典型的代表就是2014年提出的提出R-CNN到faster RCNN的一系列算法。
在训练过程中需要两个步骤:训练RPN网络、目标区域的网络训练。相对于传统的目标检测算法,不需要再进行训练分类器,不需要再做特征表示这个过程。整个过程都是从A到B的一个完整的卷积神经网络完成,同时精度得到提升。不过相比于one-stage慢些。
上述描述可以总结为以下几点:
- CNN卷积特征
- R. Girshick et al., 2014提出R-CNN到faster RCNN
- 端到端的目标检测(RPN网络)
- 准确度高、速度相对one-stage慢
三、Two-stage基本流程
输入图片------对图片进行深度特征的提取(主干神经网络)------RPN网络完成滑动窗口所完成的任务,也就是产生候选区域,完成候选区域分类(背景和目标)对目标的位置进行初步定位-------为了不重复的计算CNN特征,通过roi_pooling完成抠图操作-----fc全连接层对候选区域进行表示----分类和回归对候选目标的类别判定和位置精修(得到物体的真实类别)
详细流程:
首先输入一张图片,然后图片进行深度特征提取,也就是一幅图作为输入经过一个卷积神经网络,通常将其称为主干网络,典型的主干网络包括VGG、ResNet等一些经典的卷积神经网络,再然后通过一个RPN网络来完成传统目标检测算法中滑动窗口所完成的任务,也就是产生候选区域。在进行候选框区域提取的同时对候选框区域分类(分类过程中将候选框区域分类为背景和目标两种不同类别)。在RPN网络产生候选区域的时候也会对目标的位置进行初步的预测,意味着RPN网络同时完成区域分类和位置精修两个环节。在得到候选区域之后,通过roi_pooling层对候选区域进一步精确进行位置回归和修正,可以将roi_pooling理解为抠图,接下来得到候选目标对应到feature map上的特征后,会通过一个fc层,来进一步对候选区域的特征进行表示,接下来通过分类和回归来分别完成对候选目标的类别的判定以及候选目标位置的精修,这里的类别不同于RPN网络的类别,这里通常会得到物体真实的类别,回归主要得到当前目标具体的坐标位置,通常表示为一个矩形框,即四个值(x,y,w,h)。
四、Two-stage常见算法
- RCNN
- Fast RCNN
- Faster RCNN
- Faster RCNN变种
五、Two-stage核心组件
1、Two-stage的两个核心组件
Two-stage有两个重要的核心组件是:
- CNN网络(主干网络)
- RPN网络
2、主干CNN网络设计原则
- 从简单到复杂,再从复杂到简单的卷积神经网络
简单的网络结构:比较经典的就是LeNet(具有一个输入层,两个卷积层,两个池化层,3个全连接层,但LeNet在大规模的任务中网络表达能力和抽象能力就相对弱一些)
复杂的网络结构:经过LeNet又出现了LSNet、Resnet、Vgg等复杂的网络结构,这些网路结构往往是用来增加网络的深度,因为网络越深,非线性表达能力越强,得到物体更加抽象的表达,对于图像的变化敏感度越不敏感,鲁棒性越强,解决非线性任务能力越强,同时也会导致梯度消失或梯度弥散。其中最典型的是Resnet可是达到100多层的深度,再经典的就是GoogleNet。
- 多尺度特征融合的网络
- 更轻量级的CNN网络
在设计时候考虑性能和模型大小,此时就需要用到轻量级的CNN网络,如经典的ShuffleNet、MobileNet等。
3、RPN网络
在了解RPN网络前我们先了解一些相关概念区域推荐(Anchor机制)。
在了解了上述的Anchor机制后,我们详解讲解一下RPN网络。
SPPnet、Fast R-CNN等目标检测算法已经大幅降低了目标检测网络的运行时间。可是尽管如此,仍然不能在工程上做到实时检测,这主要是因为region proposal computation耗时在整个网络用时中的占比较高。比如,Fast R-CNN如果忽略提取region proposals所花费的时间,就几乎可以做到实时性。为此,本文介绍了Region Proposal Network(RPN)用以解决该问题。经实验证实,应用该算法的系统在GPU上的处理速度可以达到5fps的帧率。
3.1 Faster R-CNN 网络结构
上图展示了网络的大致结构。可以发现,Fast R-CNN网络分为两部分,一部分是Region Proposal Network(RPN),另一部分是Fast R-CNN。其中RPN包括图中proposals和conv layers,而detection network包括conv layers、ROI pooling及后面全连接层等部分。另外,conv layers被RPN和Fast R-CNN object detection network两部分共享。
3.2 RPN(Region Proposal Networks)网络结构
RPN,从字面上理解区域候选网络,是用来生成候选区域的网络。
3.2.1 整体理解:
- 区域推荐(Anchor机制)
- 分类和回归
- ROI Pooling
图中原始图像(600*1000)经过主干网络(如ResNet、VGG16:它有13层可共享的卷积层、ZF:Zeiler and Fergus model 它有5层可共享的卷积层)共享卷积层后生成通道数为256的40x60的feature maps(也称共享Feature Maps)。这些feature maps被RPN网络和Fast R-CNN detector共享。
RPN网络的输入是对主干网络输出的通道数为256的40x60的feature maps,在这个特征参数的基础上,使用一个size为nxn(二维,一般是3x3)的空间滑动窗口与feature maps(40x60x256)进行非标准的卷积运算(strides=1,padding=(n-1)/2,单通道卷积核,运算和标准池化类似,运算前后通道数不变),计算结果仍然是40x60x256,即仍然是256个40x60的特征图。可以发现,每个位置通过卷积求得的特征是256-d(256维度),这就将每个滑动窗口都映射到一个256-d的低维特征。
假如通过一个3×3的滑动窗口,在40x60的区域上进行滑动,可以产生40×60个3×3个可能含有目标的建议区域窗口,每个3×3的窗口的中心点都对应原始图片中一个目标区域的中心点,即滑动窗口的中心在image上对应一片区域(相当于中心位置的神经元在image上的感受野),计算出该区域的中心位置后以该位置为中心,以Faster R-CNN为例,设置了三种尺寸为(128x128,256x256,512x512)面积的box,每一个面积取三种不同的长宽比例(1:1,1:2,2:1),也就是每一个点会有9个anchor box。此时每个滑动窗口的中心点都对应9个anchor box,所以 40x60个3x3的滑动窗口的中心点对应的 anchor box 有 40x60x9 个anchor box。
然后对每个特征向量做两次全连接操作,一个分支得到2个分数(前景和背景的置信度),
另一个分支得到4个坐标(目标的坐标框信息),4个坐标是指针对原图坐标的偏移。由于要对每个向量做同样的全连接操作,等同于对整个特征图做两次1 × 1的卷积,得到一个2 × 40 × 60和一个4 × 40 × 60大小的特征图。最终再结合预先定义的Anchors,完成后处理操作,得到候选框。
3.2.2 详细介绍 :
RPN网络可以分为这么几部分:
- 利用区域推荐生成anchor
- 对anchor进行二分类
- 边框回归
- 生成最终的Proposal
- ROI pooling
A、利用区域推荐生成anchor
anchor可以翻译为锚,这个anchor指的是输入图像上的点,是生成候选框的基础,有了anchor后就可以为每个anchor即每个锚点生成不同大小和长宽比的box,这些box就是anchor box,用这些box来覆盖输入图片中要检测的物体(当然,会生成很多很多的box, 在图片上密密麻麻的,需要后续的操作进行筛选)。筛选过后剩下的就是最终的Proposal。Proposal会给ROIPooling然后进行分类和回归(后面介绍)
生成anchor box分为两步:
- 第一先从Feature map的点对应回输入图像感受野的中心点;
- 第二以该点为中心点创建不同面积和长宽比的box,这个也是输入图像上的box。
从Feature map到图像中的anchor:FPN会用一个大小为3x3,padding=2,stride=1的卷积核遍历特征图(只取一个维度为例),这样就会将backbone输出的特征图中每一个点(也就是每一个值)都作为3x3的中心点遍历了一遍。
遍历过程中会找到3x3窗口的中心点对应到输入图片的感受野的中心点,该点就是anchor。
为什么可以对应会输入图片中的点呢?因为backbone中都是卷积和池化的操作。所以是可以将特征图中的点对应到原图的,也就是该点的感受野,感受野的计算这里就不再描述了。
有了anchor点后就可以为每个点生成anchor box了,Faster R-CNN中设置了三种尺寸为(128^2,256^2,51^2)面积的box,每一个面积取三种不同的长宽比例(1:1,1:2,2:1),也就是每一个点会有9个anchor box。
B、分类和边框回归
在第一步生成了很多很多的anchor box,后面就是要对这些anchor box进行分类和边框回归的操作。
分类操作就是上图中上面的那个分支,首先通过一个1x1的卷积,将维度降为18(因为是9个框,每个框进行二分类),通过softmax进行二分类(框中有没有目标,也就是前景和背景),来生成后面的正负样本。
边框回归的目的是使anchor box更接近ground truth。首先也会通过一个1x1的卷积,维度降为36(和之前的类似每个框四个值来确定)。
C、生成Proposal
有了前面生成的anchor box后,下一步就是利用各种方法剔除我们不需要的那些box,主要分一下几步:
- 第一步:先将anchor box利用feat_stride和im_info(这个里面保存了原始图像的大小,注意这个不是网络输入的图像,是原始图像)将box映射会原始图像,将严重超出边界的box剔除;
- 第二步:按照上面说的二分类的分支得到的score得分进行排序,提取前2000个;
- 第三步:对得到的2000个box执行NMS(非极大值抑制);
-
第四步:将得到的结果再进行排序,取前300个作为最终的Proposal,给后面进行分类和回归。
D、ROI Pooling(可以理解为抠图+resize的操作)
- 根据输入image,将 ROI 映射到 feature map 对应位置;
- 将映射后的区域划分为相同大小的 sections(sections数量与输出的维度相同);
- 对每个 sections 进行 max pooling 操作;
ROI Pooling是RPN网络中的一个层,对于这个层它的输入包括:特征图、rois(1×5×1×1)区域的坐标 以及 ROI参数(尺度标识,比如当前图像下采样了8倍,需要设置为1/8表示为原始的1/8,计算时就会按照这个比例从原始的feature map中进行抠图),rois这个坐标区域为什么是5个值呢?正常表示一个矩形四个值就够了(x,y,w,h)。第5个值放在第一个位置,表示当前的roi的信息所对应到的当前的batchsize中的哪一个图片,实际它是一个索引,这个索引表示了当前这个roi所对应到的特征图这个一整个的batchsize数据的第几个图片。因为对网络训练时通常会处理n张图,对于这样一个batchsize的数据,每一个roi需要知道对应的特征图是哪一张。 在经过了ROIPooling后会输出一个固定尺寸的feature map,这个固定尺寸具体是多大也由ROI参数来决定,比如将ROI参数设置为8*8,最终输出的feature map就为 m*c*8*8. 为什么要固定到同样的大小呢?因为如果后面要使用fc的话,如果特征图的大小是不一致的,在使用fc时会出错,因为fc的参数量是定的。
上一篇:03目标检测-传统方法与深度学习算法对比
下一篇:06目标检测-One-stage的目标检测算法