深度学习图像处理主要分为图像分类、目标检测和语义分割,以下介绍一下广泛用于目标检测系统的RCNN系列神经网络算法。
RCNN
RCNN的检测流程:(Region proposal+CNN)
生成候选区域——CNN提取特征——SVM进行分类
其中d表示对该proposal的Pool5层提取的特征进行线性变换:
损失函数如下,使用梯度下降或最小二乘求最优的w:
如果proposal全部在Ground Truth内部,且很小,则IOU<0.5,依然看做检测错误。如果我们能对proposal进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确。确实,Bounding-box regression 就是用来微调这个窗口的。
上面的 f 即为线性回归函数。
只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)
输入:输入就是这四个数值吗?其实真正的输入是这个窗口对应的CNN特征,也就是R-CNN中的Pool5 feature(特征向量)。(注:训练阶段输入还包括 Ground Truth,也就是下边提到的)
输出:需要进行的平移变换和尺度缩放,或者说是。我们的最终输出不应该是Ground Truth吗?是的,但是有了这四个变换我们就可以直接得到Ground Truth,这里还有个问题,根据上面4个公式我们可以知道,P经过,得到的并不是真实值G,而是预测值。
===============================================================================
Fast RCNN
将分类和边框回归进行合并(又一个开创性的思路),通过多任务Loss层进一步整合深度网络,统一了训练过程,从而提高了算法准确度。其实就是softmaxLoss后面加了一个SmoothL1Loss函数,梯度求导就是softmaxLoss和SmoothL1Loss的分阶段的梯度求导!
缺点:region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),无法满足实时应用
1、ROI池化(ROI即为预测检测框)
Fast R-CNN使用全连接层,我们需要使用池化层将不同大小的ROI转换为固定大小的ROI。
假如我们有如下特征图,我们想要转换成预定义的2*2大小的ROI:
首先将ROI (蓝色框) 与特征图重叠:
然后将ROI拆分成目标维度的ROI,因为我们要求生成2*2的ROI,所以我们考虑将上图拆分为4个大小相等或近似的部分。
然后使用max-pooling的方式找到每个区域的最大值,生成2*2的特征模块,分布馈送到分类器和边框回归器中。
2、多任务Loss层如下图所示:
smooth L1损失函数为:
smooth L1损失函数曲线如下图9所示,作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。
=================================================================================
Faster RCNN
RPN的核心思想是使用卷积神经网络直接产生region proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,因为anchor机制和边框回归可以得到多尺度多长宽比的region proposal。
权值共享后的RPN和Fast R-CNN用于目标检测精度会提高一些。
RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高),提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归,与FastRCNN类似。目标分类只需要区分候选框内特征为前景或者背景。
生成的9个检测框如下:
基本网络结构如下:
图片输入 – 卷积网络提取特征(conv5) – RPN网络生成检测框(二分类过滤+位置回归) – 检测框具体分类
我们先整体的介绍下上图中各层主要的功能
1)、Conv layers提取特征图:
作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取input image的feature maps,该feature maps会用于后续的RPN层和全连接层
2)、RPN(Region Proposal Networks):
RPN网络主要用于生成region proposals,前面产生的特征复制两份,分别用于两个分支(分类+回归)(检测框二分类+检测框位置回归):第一个分支首先生成一堆Anchor box,对其进行裁剪过滤后通过softmax判断anchors属于前景(foreground)或者后景(background),即是物体or不是物体,所以这是一个二分类,过滤掉没目标的检测框;同时,另一分支bounding box regression修正anchor box,形成较精确的proposal(注:这里的较精确是相对于后面全连接层的再一次box regression而言)
3)、Roi Pooling:
该层利用RPN生成的proposals和VGG16最后一层得到的feature map,进行ROI pooling,进入到后面可利用全连接操作来进行目标识别和定位。关于残差网络的意义:卷积一下会损失一些东西或导致错误出现,加上残差会补足和增强。
4)、Classifier:
会将Roi Pooling层形成固定大小的feature map进行全连接操作,利用Softmax进行具体类别的分类,同时,利用L1 Loss完成bounding box regression回归操作获得物体的精确位置。
更详细结构如下图:
一、RPN网络部分:
3*3卷积 -- 复制两份 (这里如果换成5*5的卷积实际上会更精准,因为检测框会变多)
一份通过1*1*18卷积,卷成18通道,因为是1*1,所以相当于复制18份,reshape成2*9 (2分类-区域是否有目标,每个像素点生成9个检测框-可覆盖大部分不同位置大小的目标,宽高比rations=[0.5,1,2],放缩比scales=[8,16,32]) softmax得到每个检测区域有目标和无目标的概率(所以有个维度是2,把有目标看做一个类别,无目标也看做一个类别),取大的那个概率(求有无目标),(这里换成逻辑回归实际上也可以,维度就变成了1*9)。然后reshape回18通道。
一份通过1*1*36卷积,卷成36通道(9个检测框,每个检测框都有坐标4个,中心点坐标+宽高,4*9为36) 然后进行回归(bounding box regression)
然后Im_info是把原图坐标(有人工标注的目标框)转换成特征图坐标,坐标体系一致,用于和预测检测框比较,进行分类标记(二分类)和分类过滤+计算检测框偏移量(bounding box回归)和检测框过滤。
过滤和标记规则:越界(超过原图边界)剔除 + anchor box与ground truth的IOU(交并比)大于0.7标记为正样本,小于0.3标记为负样本,其他过滤。正负样本相当于一正一负两个类别,后面就可以对两个类别算损失,RPN网络是二分类。
除了对anchor box进行标记外,另一件事情就是计算anchor box与ground truth之间的偏移量,根据偏移量构建检测框损失,来训练RPN网络:
注意,上述ground truth的坐标和宽高指的是原图坐标和宽高,anchor box的坐标宽高指的是特征图上的坐标宽高,所以这里用了除法和log(特征图坐标映射到原图是乘法和指数运算,这里是反运算)。
偏移量过滤规则:越界剔除+nms非极大值抑制(取top1(按softmax置信度排行)个目标框+交并比高值(重复检测框)过滤。每次都在剩下的里面取top1重复循环执行。) 源码中,会重新生成60*40*9个anchor box,然后累加上训练好的△x, △y, △w, △h,从而得到了相较于之前更加准确的预测框region proposal,进一步对预测框进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框,再取前N个box(比如300个)这样,进入到下一层ROI Pooling时region proposal大约只有300个
这里并不是用来训练最后的网络的。这是典型的多任务训练,两个网络一起训练。此时输出的proposal既有目标也有位置。仅仅是检测框。
在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1。如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然。
非极大值抑制:
· 按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7
· 取最大0.95的框为一个物体框
· 剩余5个框中,去掉与0.95框重叠率IoU大于0.6(可以另行设置),则保留0.9, 0.8, 0.7三个框
· 重复上面的步骤,直到没有框了,0.9为一个框
· 选出来的为: 0.95, 0.9
所以,整个过程,可以用下图形象的表示出来
二、ROIpooling的部分:
将proposal (有目标的检测框)与VGG16最后一层产生的特征图重叠,然后将proposal拆分成目标维度的proposal,例如根据参数pooled_w:7,pooled_h:7,考虑将ROI拆分为7*7=49个大小相等或近似的部分。然后对49个部分max-pooling从中选取最大的像素点作为输出,这样,就形成了一个7*7的feature map。以此,参照上述方法,300个region proposal遍历完后,会产生很多个7*7大小的feature map,故而输出的数组是:[300,512,7,7],作为下一层的全连接的输入。
三、最终分类和回归
RoIpolling后会得到新的特征图,全连接-激活-全连接-激活-全连接(全连接为了得到分类函数需要的形状,全连接只有卷积没有激活,用1*1的卷积核,将n*m的特征图拉平成n*1)后,复制两份
一份用回归+smoothL1 loss求目标坐标,回归前的输入是[bach_size,81*4],81是81个检测框,4是每个检测框的4个坐标。
一份softmax分类+softmax loss求损失,求目标具体类别。分类前的输入是[bach_size,81],81是81个检测框,对应81各个类别数。
假设特征图是10*10,每一点+连续n点都生成目标 检测框
这里的回归是对检测框进行微调。回归映射完成后就可以用映射的检测框和人工标注的检测框对比求损失。
这里是分别进行分类(检测框类别)和回归(检测框位置)
注:smooth L1公式如下:
作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点(指的是距离中心较远的点)、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。