目录
在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。
一.模型框架
如图:
1.conv layers:用于提取特征,通过conv+relu+pooling层来提取图像的feature maps (特征图)
2.RPN(Region Proposal Network)区域候选网络:替换了之前哪些的Selective Searvh,用于生成候选框。它里面做了一个二分类任务,一类是判断anchor是属于positive(识别的东西),另一类是判断是否是negative(不是目标的背景);还有一个bounding box regression:修正anchors得到较为准确的proposals,简单来说就是让候选框准确点。RPN是判断这张图片里面有没有目标,具体目标是什么这里还没判断,以及修正anchor的边框
3.Rol Pooling(兴趣域池化):简单来是就是收集RPN中选出来的候选框的坐标,一般收集左上角和右下角。并且将这些坐标对于1中提取的特征图中的特征,生成proposals feature maps送人全连接层
4.Classification and Regression:利用3中送入的数据计算出整个图片中的类别,同时再做一次bounding box regression获得检测框最终的精准位置
二:步骤详细
1.conv layers
如上图所示,共有13个conv层,13个relu层,4个pooling层
conv:kernel_size=3,padding=1,stride=1。核卷积操作类似,使用3*3的卷积核,一层零,步长为1
pooling:kernel_size=2,padding=0,stride=2。池化操作
经过conv层时数据变化为:
height=(h-k+2*p)/s+1=h-3+3,数据大小没变
width=(w-k+2*p)/s+1,数据大小没变
经过pooling时,因为步长为2,所以数据的宽高变为了之前的一办,有四个pooling,所以数据变为之前的1/16
2.RPN
图中所示,分为两个操作
1.softmax分类anchors获得positive和negative分类
2.计算对于每个anchors的bounding box regression(边框)偏移量,以获取比较精确的proposal
两步操作后在proposal结合,proposal层复杂将positive anchors和对应的bounding box regression偏移量获取修正后的proposals。同时剔除没有框住物体的和超出图片边界的proposals。
3.anchors
经过conv leyer处理后的feature map(特征图)的大小为原来的1/16,同时在这些feature map中,经过conv操作后因为设置的是kernel_size=3的映射,所以对于每一个像素点,设置了9个预测anchor。这9个anchor的大小按照三种长宽比ratio[1:1,1:2,2:1]设置,具体大小根据输入图像的原始目标大小灵活设置。
设置anchor是为了覆盖图像上各个位置各种大小的目标,那么原图上anchor的数量就是(M/16) x (N/16) x 9。这么多anchor,第一肯定不准确,第二肯定不能要这么多,所以后续还会淘汰一大批以及修正anchor位置
4.cls layer分类
在拿到conv layers的feature map后,先经过一个3x3卷积(卷积核个数为256)红色框是一个anchor,所以通过这个卷积层后feature map的通道数也是256,k是anchor个数(文中默认是9)
(M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x2k的输出,因为这里是二分类判断positive和negative,所以该feature map上每个点的每个anchor对应2个值,表示目标和背景的概率(为什么有2个,是因为这里是用的softmax,这两个值加起来等于1;也可以用sigmoid,就只需要1个值了)
Reshape层是技术细节问题,对feature map进行维度变换,使得有一个单独的维度为2,方便在该维度上进行softmax操作,之后再Reshape恢复原状。
5.reg layer回归
(M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x4k的输出,因为这里是生成每个anchor的坐标偏移量(用于修正anchor),[tx,ty,tw,th]共4个所以是4k。注意,这里输出的是坐标偏移量,不是坐标本身,要得到修正后的anchor还要用原坐标和这个偏移量运算一下才行。
偏移量计算公式
其中[xa,ya,wa,ha]是anchor的中心点坐标和宽高,[tx.ty,tw,th]是这个回归层预测的偏移量,通过这个公式计算出修正后的anchor坐标[x,y,w,h]。计算如下:
[px,py,pw,ph]表示原始anchor的坐标
[dx,dy,dw,dh]表示RPN网络预测的坐标偏移
[gx,gy,gw,gh]表示修正后的anchor坐标。
6.Proprosal
分类和偏移量计算完后,将数据输入到Proposal,输入的有三个
cls层生成的数据
reg层生成的数据
im_info=[宽,高,scale_factor]
接收数据后会进行:
1.利用reg层的偏移量对所有原始的anchor进行修改
2.利用cls层的scores,按positive socres排序,取前面分数大的
3.将太大的positive anchor收拢到边框处,将太小的剔除
4.对剩余的positive anchors进行非极大抑制(NMS)
5.输出每个positive anchors的左上角和右下角坐标
7.Rol pooling
RoI Pooling层则负责收集proposal(上一个操作输出的坐标数据),并计算出proposal feature maps(从conv layers后的feature map中扣出对应位置),输入有两个:
1.conv layers 剔除的原始特征图feature map
2.RPN网络生成的Proposals
因为全连接层的每次输入数据大小都需要是固定的,所有需要一个操作来讲这些数据的大小统一一下,,而Rol Pooling就是讲图片固定大小的
8.Classification
具体分类,这里的分类是讲前面准备好的positive anchors识别具体分类,这里就可以分辨出是背景还是具体物体了。
1.通过全连接层的softmax对所有的proposals进行具体分类
2.再次对proposals进行bounding box regression处理,获得更好的边框
三.训练
Faster RCNN由于是two-stage检测器,训练要分为两个部分进行,一个是训练RPN网络,一个是训练后面的分类网络。
1.先使用ImageNet的预训练权重初始化RPN网络的共享conv层(RPN特有层可随机初始化),然后训练RPN网络。训练完后,共享conv层和RPN特有层的权重都更新了。
2.根据训练好的RPN网络拿到proposals(和测试过程一样)
3.再次使用ImageNet的预训练权重初始化Faster RCNN网络的贡献conv层(Faster RCNN特有层随机初始化),然后训练Faster RCNN网络。训练完后,共享conv层和Faster RCNN特有层的权重都更新了
4.使用第三步训练好的共享conv层和第一步训练好的RPN特有层来初始化RPN网络,第二次训练RPN网络。但这次要把共享conv层的权重固定,训练过程中保持不变,只训练RPN特有层的权重
5.根据训练好的RPN网络拿到proposals(和测试过程一样)
6.依然使用第三步训练好的共享conv层和第三步训练好的Faster RCNN特有层来初始化Faster RCNN网络,第二次训练Faster RCNN网络。同样,固定conv层,只fine tune特有部分
1.训练RPN网络
因为使用的是softmax,所以使用交叉熵损失来训练anchors是物体还是背景
对于边框部分训练,使用smooth L1 loss训练
smooth L1 loss:
2.全连接层部分训练:
和RPN一样,都是使用softmax分类和训练边框
都看到这里了,点个赞把!!!!!