简介
传统目标检测流程:
- 区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)
- 特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)
- 分类器分类(主要有SVM、Adaboost等)
深度学习的方法,分解为两类问题:
- 图像识别
- 目标定位
区域提名
区域提名,或候选区域选择,方法总结如下[1]。
基于区域提名的方法
Model | Goal | Resources |
---|---|---|
R-CNN | Object recognition | [paper][code] |
Fast R-CNN | Object recognition | [paper][code] |
Faster R-CNN | Object recognition | [paper][code] |
Mask R-CNN | Image segmentation | [paper][code] |
R-CNN, Fast R-CNN, Faster R-CNN和Mask R-CNN的模型结构如下图所示[2]。
R-CNN
算法
- 输入图像,生成候选区域。利用选择性搜索(selective search)对图像生成1K~2K的候选区域(region proposal)。运行图像分割算法选出候选区域,速度快运算量少。
- 提取特征:将候选区域调整为统一大小,送入CNN,对每个候选区域提取特征。
- 对区域进行分类:SVM分类。
- 修正候选区域位置:对候选区域提取特征做回归。
R-CNN中提出的回归的方法,被广泛应用。这部分文章后面有单独的介绍。
缺点
- 对每个候选区域都进行特征计算,冗余计算多(候选区域高度重叠)。
- 不是端到端的训练。
- 需要储存多个SVM分类器和bounding box 回归器,占用内存大。
- 对输入图片的大小有要求。
Fast R-CNN
针对R-CNN第一个缺点。可以对图像提一次卷积层特征,然后只需要将候选区域在原图的位置映射到卷积层特征图上。这样一张图像只需要提一次卷积层特征,然后将每个候选区域的卷积层特征输入到全连接层做后续操作,实现共享。
每个候选区域的尺度不一样,而全连接层输入必须是固定的长度,需要对输入数据进行crop或warp。但这样图片失真。
ROI Pooling(Region of Interest)解决了这个问题,这是SPP-net[3]的一个精简版(spatial pyramid pooling)。ROI pooling保证多尺度输入下固定的输出。
另外一个改进是,损失函数使用了多任务损失函数(multi-task loss),将边框回归Bounding Box Regression (bbox)直接加入到CNN网络中训练。实际实验证明:把边框回归放进了神经网络内部,与分类和并成为了一个multi-task模型,这两个任务能够共享卷积特征,并相互促进。使用softmax代替了R-CNN里面的多个SVM分类器。
Fast R-CNN把分类和回归组合到一个网络里,实现了端到端的训练。其提出的Loss函数形式(loss=分类loss+定位loss)被广泛使用。
算法
- 将任意大小的图片输入CNN,得到特征图。
- 对原始图片使用选择性搜索算法得到约2k候选区域。在特征图中找到每一个候选区域对应的特征框。在ROI池化层中将每个特征框池化到统一大小。
- 统一大小的特征框经过全连接层得到固定大小的特征向量,分别进行softmax分类和bbox回归。
Faster R-CNN
对前面选择性搜索的方法进行改进:加入一个提取边缘的神经网络,把候选框的工作也交给神经网络来做。即引入候选区域提名网络(Region Proposal Network (RPN))替代选择性搜索。
算法
- 提取特征:输入固定大小的图片,进过卷积层提取特征图(feature maps)
- 生成候选区域: 通过经过RPN生成候选区域,该层通过softmax判断anchors属于foreground或者background,再利用候选框回归修正anchors获得精确的候选区域。
- ROI Pooling: 该层的输入是特征图和候选区域,综合这些信息后提取候选特征图(proposal feature maps)。
- 分类: 将ROI pooling生成的提取候选特征图分别传入softmax分类和候选框回归,获得检测物体类别和检测框最终的精确位置
四个损失函数;
- RPN calssification (anchor good/bad)
- RPN regression (anchor->propoasal)
- Fast R-CNN classification (over classes)
- Fast R-CNN regression (proposal ->box)
R-FCN
R-FCN[4]解决了“分类网络的位置不敏感性(translation-invariance in image classification)”与“检测网络的位置敏感性(translation-variance in object detection)”之间的矛盾,在提升精度的同时利用“位置敏感得分图(position-sensitive score maps)”提升了检测速度。
Faster R-CNN网络跟经典的用于分类的卷积神经网络类似,用于分类的卷积神经网络前面一部分是用于特征提取的主干网络,后面是用于分类的全连接层,从卷积层到全连接层中间通过一个ROI池化层连接。ROI之后的分类和回归是针对每一个提名区域的,这样是为了获得“位置敏感性”。由于各个ROI后面的全连接层不能共享,造成计算量增大。简单的想法是把池化层放在全连接层后面,这样可以全连接层的计算所有ROI可以共享。实验表明此效果很差,因为深层卷积网络具有平移不变性----这也正是分类网络所需要的。对于图片分类效果比较好的一些网络(比如GoogLeNet,ResNet)都是属于全卷积网络的,一堆卷积层得到一个特征图经过一个全局平均值池化,然后为接入输出与物体类别数相等的全连接层,最后加上softmax层输出概率。
Head of Faster R-CNN -ResNet 101. | Faster R-CNN, FCs are for each proposed ROI. |
---|---|
这也就是为什么基于ResNet101(见下图)中的 ROI 池化层不是放在 Conv5 输出的feature map后面,而是放在了Conv4和Conv5两组卷积层之间。Conv5和后面的全连接层构成了head部分,一来可以避免位置信息进一步损失,二来可以使用后面的Conv5卷积层学习位置信息。但是缺点就是每一个ROI都要再经过Conv5这一组卷积,head部分的计算不能实现共享。
R-FCN解决了head部分使用FCN共享计算的问题。网络使用了ResNet-101,ResNet-101包含100个卷积层,一个全局平均值池化层,和一个1000维的全连接层。论文[4]去掉了最后的全局平均值池化层和全连接层,最后加上了一个1024个 1×1 卷积核的卷积层用以降维(将Conv5输出的2048维降为1024维)。不一样的地方在于改变了 ROI Pooling的使用方法,称为位置敏感的ROI池化(Position-Sensitive ROI Pooling, PS ROI Pooling),增加了平移可变性 。
得到feature map后,再经过最后一个卷积层Conv5(调整Conv5的卷积核数量使用个卷积核)为每一个类别产生个position-sensitive score maps。对于类的目标再加上一个背景类,输出层的通道数为。每个类别对应个score map,与个空间子网格(bin)相对应,描述了相对空间位置。例如,则对应个位置(左上,左中,…右下)。然后是位置敏感的ROI池化层(position-sensitive RoI pooling layer)。这一层聚合上一个卷积层的输出。通过池化每个score map、每个类别得到一个score。对个score maps,每个类别得到个数相加就得到该类别的score。一共得到个scores。对每一个ROI生成的个scores,进行vote操作判断当前ROI类别。
后面每个ROI经过的都是池化层,而池化层与卷积层和全连接层相比计算量大大减少,这就实现了ROI运算共享。
要注意的是:“目标左上角的概率”的概念并不局限于图中画的绿色框范围,而是根据整张图上的每一个点,得到目标在左上角的概率。其余的bin同理。
FPN
FPN(Feature Pyramid Network)结构中包括自下而上,自上而下和横向连接三个部分。这种结构可以将各个层级的特征进行融合,使其同时具有强语义信息和强空间信息。
Single Shot Detector (SSD)就是利用了特征金字塔结构,见上图(c)。
Mask R-CNN
双线性插值
RetinaNet
RetinaNet = Resnet + FPN + 2 * FCN
通用技术
Bounding Box Regression Coefficients
和分别代表“目标”和“原始”参数,分别代表x,y坐标和宽、高。可以看出系数具有仿射(affine transformation)不变性。这一点很重要,因为在计算classification loss的时候,系数是根据原始参数中计算的,期望输出的系数是针对ROI pooling后的。
Intersection over Union (IoU) Overlap
Non-Maximum Suppression
有多个候选框,用非极大值抑制NMS,来抑制那些冗余的框: 抑制的过程是一个迭代-遍历-消除的过程。
- 将所有框的得分排序,选中最高分及其对应的框;
- 遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除;
- 从未处理的框中继续选一个得分最高的,重复上述过程,直至边界框列表为空。