1. 定义
图像分类采用图像并预测图像中的对象。例如,当我们构建一个cat-dog分类器时,我们给猫或狗拍照并预测它们的类别,但是当一张图片有多个分类对象时,我们就需要进行分类并且定位。(classification and localization)
预测位置和类别就叫目标检测(object Detection),一般对于图片中每个物体实例,需要确定以下变量
class_name,
bounding_box_top_left_x_coordinate,
bounding_box_top_left_y_coordinate,
bounding_box_width,
bounding_box_height
下面这张图很好地展示了目标检测的分类以及发展:
2. 传统方法
2.1 滑动窗口
固定窗口尺寸进行滑动,Object detection就变成了分类问题。
但是有两个问题,第一,如何知道窗口尺寸。
我们可以在多个尺寸上调整图像大小,一般是64层图像金字塔。
第二,纵横比(aspect ratio)如何让选择,对于一个人,有时候他是躺着的,就有不同的aspect ratio,
2.2 HOG Det.
Histogram of Oriented Gradients(HOG) features
方向梯度直方图特征
- 不需要大量计算
- 在金字塔上运行滑动窗口,计算Hog特征,并将其反馈给支持向量机(SVM)来创建分类器。
3. two-stage方法
r-cnn
Region-based Convolutional Neural Networks(R-CNN)
由于cnn的计算复杂,对每块滑动窗口生成的patch进行计算是不可能的。R-CNN使用目标建议算法叫做”Selective Search”,使输入分类器的边界框的数量。选择性搜索使用局部线索,如纹理、强度、颜色和/或内在度等来生成物体的所有可能位置。
R-CNN有三个重要步骤
- 运行选择性搜索以生成可能的patch。
- 将这些patch反馈给CNN,然后使用SVM来预测每个patch的类别。
- 分别通过训练边界盒回归对patch进行优化。
SPPNet
Spatial Pyramid Pooling(空间金字塔池化)
使用SPP-net,我们只计算一次整个图像的CNN表示,并且可以使用它来计算选择性搜索生成的每个patch的CNN表示。这可以通过对最后一个卷积层的特征映射的对应区域执行池化操作来实现。卷积层对应区域的矩形截面可以通过将区域投影到卷积层上来计算,同时考虑到中间层发生的下采样(在VGG中简单的将坐标除以16)。
挑战
需要固定尺寸的输入,到CNN的全连接层。它在最后一个卷积层之后使用spatial-pooling,而不是传统上使用的max-pooling。SPP层将任意大小的区域划分为一定数量的容器,并对每个容器执行最大池。由于箱子的数量保持不变,因此产生了一个恒定大小的向量,如下图所示。
然而,SPP net有一个很大的缺点,通过空间池化层执行back-propagation不是一件小事。因此,网络只微调了网络的完全连接部分。SPP-Net为更受欢迎的faster-RCNN铺平了道路。
faster r-cnn
- fast r-cnn
使端到端训练成为可能;
在神经网络中加入bounding box regression
Faster RCNN replaces selective search with a very small convolutional network called Region Proposal Network to generate regions of Interests.
- anchor box
为了解决纵横比和物体范围的问题,引入anchor box。在每个位置,使用3种锚盒,尺寸分别为128x128、256 256和512 512。类似地,对于长宽比,它使用了三个长宽比1:1、2:1和1:2。因此,在每个位置上,我们总共有9个箱子,RPN在这些箱子上预测它成为背景或前景的概率。我们应用边界盒回归来改进每个位置的锚盒。因此,RPN给出了不同大小的边界框,以及每个类对应的概率。不同大小的边界框可以通过应用空间池化进一步传递,就像快速rcnn一样。剩下的网络类似于Fast-RCNN。Fast-RCNN比Fast-RCNN快10倍,与vocs -2007等数据集的精确度相当。这就是为什么fast - rcnn是最精确的目标检测算法之一。下面是各种RCNN版本的快速比较。
2. one-stage方法
Regression-based object detectors:
基于回归的目标检测方法:把目标检测当作回归问题。
2.1 yolo
(You only Look Once)
作者在YOLO算法中把物体检测(object detection)问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率。
算法首先把输入图像划分成S*S的格子,然后对每个格子都预测B个bounding boxes,每个bounding box都包含5个预测值:x,y,w,h和confidence。x,y就是bounding box的中心坐标,与grid cell对齐(即相对于当前grid cell的偏移值),使得范围变成0到1;w和h进行归一化(分别除以图像的w和h,这样最后的w和h就在0到1范围)。
另外每个格子都预测C个假定类别的概率。在本文中作者取S=7,B=2,C=20(因为PASCAL VOC有20个类别),所以最后有7730个tensor。如Fig2,比较好理解。
YOLO算法的缺点:
- 位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。
- YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。
参考:
- http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf
- https://blog.csdn.net/u014380165/article/details/72616238
2.2 ssd
Single Shot Detector:原文
SSD在输入图像上运行一次卷积网络计算特征图,SSD还使用类似于fast - rcnn的各种纵横比的anchor boxes,并且学习偏移而不是学习box。为了处理规模,SSD预测多个卷积层后的 bounding boxes。由于每个卷积层在不同的尺度上运行,它能够检测不同尺度的对象。
4. 比较
这些方法在速度和准确度上直观的理解:
看看这个比较SSD、YOLO和fast - rcnn在各种大小对象上的性能的图表。在大数据下,SSD的表现与fast - rcnn相似。但是,看看精度,当数据集很小的时候,差距就变大了。