作  者:XJTU_Ironboy

本文结构:

  1. 摘要
  2. 介绍
    2.1 大致框架
    2.2 测试评价指标
    2.3 相关比赛介绍
    2.4 相关数据集介绍
  3. 基于图像处理和机器学习算法
    3.1 滑动窗口
    3.2 提取特征
     3.1.1 Harr特征
     3.1.2 SIFT(尺度不变特征变换匹配算法)
     3.1.3 HOG(方向梯度直方图特征)
     3.1.4 SURF(加速稳健特征)
    3.3 分类器
    3.2 经典的检测算法
     3.2.1 Haar特征+Adaboost算法
     3.2.2 Hog特征+Svm算法
     3.2.3 DPM算法
  4. 基于深度学习算法
    4.1 基于region proposal的目标检测与识别算法
     4.1.1 R-CNN
     4.1.2 SPP-Net
     4.1.3 Fast R-CNN
     4.1.4 Faster R-CNN
    4.2 基于regression的目标检测与识别算法
     4.2.1 YOLO
     4.2.2 SSD
     4.2.3 RFCN
     4.2.4 Mask-RCNN
    4.3 基于search的目标检测与识别算法
     4.3.1 基于视觉注意的AttentionNet
     4,3.2 基于强化学习的算法
  5. 总结
  6. 致未来

4. 基于深度学习算法

4.1 基于region proposal的目标检测与识别算法

4.1.1 R-CNN

算法结构:
获得候选区域:每次在图片上产生2000个类别无关的region proposal。这些推荐定义了一个候选检测区域的集合;
提取特征:运用一个大型卷积神经网络(AlexNet),将上面得到的候选区域通过五个卷积层和两个全连接层进行前向传播, 最终得到一个4096-D的向量,用于表示从每个区域抽取特定大小的特征向量;
特征分类:在训练时,不同类别分别训练指定类别的线性SVM;
重定位(Bounding Box Regression):为了进一步提高定位的准确度,在对各个region proposal打分后,利用回归的方法重新预测了一个新的矩形框。输入:打完分确定包含物体的候选框窗口对应的CNN特征,也就是R-CNN中的Pool5 feature(特征向量),输出:原候选框需要进行的x方向和y方向平移变换的大小和w和h的尺度缩放的比例目标识别深度学习 目标识别常用算法_目标识别深度学习

算法特点

  1. 不考虑region的大小,在候选框周围加上16的padding,再对每个不同形状的region proposal进行各向异性缩放来产生一个固定大小的图片作为输入(也就是把不同大小的proposal放到同一个大小);
  2. 在辅助数据集(ILSVRC)上进行有监督预训练,再在小数据集上针对特定问题进行调优。这是在训练数据稀少的情况下一个非常有效的训练大型卷积神经网络的方法;
  3. 可视化地分析了卷积神经网络各层输出的特征;
  4. 框架精简:AlexNet 有 7 层,那么那些层是关键指标呢?哪些层可有可无呢?fc6 与 pool5 构成全连接,为了计算 feature 它会乘以一个 4096x9216 的权重矩阵,然后在与一组 bias 相加,所以它有 3700 多万的参数。fc7 是最后一层,它的权重矩阵是 4096x409,它的参数有 1678 万多的参数。作者发现同时移除 fc6 和 fc7 并没有多大的损失,甚至结果还要好一点点。
  5. 目标检测错误分析:即上面讲的重定位(Bounding Box Regression),受 DPM 的启发,作者训练了一个线性的回归模型,这个模型能够针对候选区域的 pool5 数据预测一个新的 box 位置。

4.1.2 SPP-Net

  SPP-Net是2015年出来的一篇论文,主要工作是对R-CNN进行了一些改进。之前的神经网络有个明显特别的地方就是每次训练或是测试之前,网络结构都是完全确定的,并且同时规定输入图片大小确定,比如MNIST要求输入图片大小为32x32,CIFAR要求输入图片大小为32x32x3,ImageNet的很多经典网络要求输入为227x227x3或224x224x3,这样严格要求的输入使得最后在进入全连接层前的输出的特征向量大小固定,从而能确定全连接层计算需要的权重,并在之后进行误差的反向传播计算时更新权重。这篇文章的主要工作就是即使输入不是固定大小,但是我能得到一个固定的输出。

目标识别深度学习 目标识别常用算法_池化_02


如何做到任意输入固定输出:

  文章中提到了一个金字塔池化层,即由一个4x4、2x2和1x1的块来组成,每层分别有16、4和1块,就可以得到16+4+1=21种不同的块(Spatial bins),我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。

目标识别深度学习 目标识别常用算法_目标识别深度学习_03


SPP-Net的目标检测过程:

  1. 候选框位置获取:通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样;
  2. 特征提取:这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps;
  3. 特征映射:在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。;
  4. 分类:采用SVM算法进行特征向量分类识别。

  注意: 上图中的金字塔空间池化层每个块最终能提取出一个256维的向量,而每个块其实又是大小不同的,根据输入图片大小等距离划分出来的,如输入是(w,h),那么每个块的大小是(w/4,h/4)、(w/2,h/2)和(w,h),那么这个256维是怎么得到的呢?按照上面的图注显示,这个256是第五个卷积层中滤波器的数量,即金字塔卷积层的输入是(w,h,256),输出是(21,256),每个块其实是个最大池化,可以得到了一个值,这是种特殊的池化过程,步长和滤波器的大小相同。但是我们也会思考对于那么大的图片,划分成16个、4和1个的区域,然后进行最大池化,将结果组合起来算作特征向量是不是会显得太粗糙了!对于其中的细节我还没有时间去仔细深究,如果有同学搞懂了能在下方评论一下,将万分感激!

与R-CNN不同之处
a. 对候选框的使用方式:R-CNN直接使用了第一步得到的原始候选框,并对该候选框进行特征提取,而SPP-Net是用的整张图片进行特征提取,然后在输出的feature map上进行候选框的空间映射,再把相应的候选框所在位置裁剪出来进行SVM分类;
b. 特征提取:这一步用的是深度卷积神经网络,R-CNN输入的是第一步中的候选框经过各项异性缩放后得到的固定大小的图片,然后将该固定大小的图片输入CNN,第五层输入即为特征;而SPP-Net输入的是整张原始图片,然后在第五层卷积之后的feature maps中找到各个候选框的区域(根据第一步得到的候选框的位置进行映射),再对各个候选框采用金字塔空间池化,经过全连接层的计算,提取出固定长度的特征向量。
c. 运行速度:由于使用的神经网络作为特征提取器,主要运算量即在网络这一块,R-CNN输入的是每个候选框,然后在进入CNN,每张图片有2000个候选框,即需要进行2000次前向运算,而SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。

4.1.3 Fast R-CNN

  基于区域的卷积网络方法(RCNN)通过使用深度卷积网络来分类目标候选框,获得了很高的目标检测精度。然而,R-CNN具有显着的缺点:

1. 训练过程是多级流水线: R-CNN首先使用目标候选框对卷积神经网络使用log损失进行微调。然后,它将卷积神经网络得到的特征送入SVM。 这些SVM作为目标检测器,替代通过微调学习的softmax分类器。 在第三个训练阶段,学习检测框回归。

2. 训练在时间和空间上是的开销很大: 对于SVM和检测框回归训练,从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,这个过程在单个GPU上需要2.5天(VOC07 trainval上的5k个图像)。这些特征需要数百GB的存储空间。

3. 目标检测速度很慢: 在测试时,从每个测试图像中的每个目标候选框提取特征。用VGG16网络检测目标每个图像需要47秒(在GPU上)。

  SPP网络也有显著的缺点。像R-CNN一样,训练过程是一个多级流水线,涉及提取特征,使用log损失对网络进行微调,训练SVM分类器,最后拟合检测框回归。特征也写入磁盘。

  总的意思就是说,R-CNN和SPP-Net为什么都要用SVM来进行分类呢,直接设计个完整的卷积神经网络输入图片,输入分类结果和目标的位置不好吗?

  于是作者提出了这样的一个结构——Fast R-CNN:将整个图像和一组候选框作为输入。网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生卷积特征图。然后,对于每个候选框,RoI池化层从特征图中提取固定长度的特征向量。每个特征向量被送入一系列全连接(fc)层中,其最终分支成两个同级输出层 :一个输出KK个类别加上1个背景类别的Softmax概率估计,另一个为KK个类别的每一个类别输出四个实数值。每组4个值表示KK个类别的一个类别的检测框位置的修正。

目标识别深度学习 目标识别常用算法_池化_04


本文贡献

  1. 成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度;
  2. Fast R-CNN借助多任务损失函数,将物体识别和位置修正合成到一个网络中,不再对网络进行分步训练,不需要大量内存来存储训练过程中特征的数据;
  3. 用RoI层代替SPP层,可以使用BP算法更高效的训练更新整个网络
  4. 提出了一个更加有效的训练方法:SGD+mini_batch分层采样方法

4.1.4 Faster R-CNN

4.2.1 YOLO

4.2.2 SSD

4.2.3 RFCN

4.2.4 Mask-RCNN

4.3 基于search的目标检测与识别算法

4.3.1 基于视觉注意的AttentionNet

4,3.2 基于强化学习的算法

5. 总结

6. 致未来