目录
[目标检测(Object Detection)](#目标检测(Object Detection))
[Fast R-CNN](#Fast R-CNN)
[YOLO v1](#YOLO v1)
[YOLO v2](#YOLO v2)
[YOLO v3](#YOLO v3)
目标检测(Object Detection)
任务是计算机视觉中非常重要的基础问题,也是解决图像分割、目标跟踪、图像描述等问题的基础。目标检测是检测输入图像是否存在给定类别的物体,如果存在,输出物体在图像中的位置信息(矩形框的坐标值表示,Xmin、Ymin、Xmax、Ymax)。
早期,传统目标检测算法还没有使用深度学习,一般分为三个阶段:区域选取、特征提取、特征分类。
-
区域选取:采用滑动窗口(Sliding Windows)算法,选取图像中可能出现物体的位置,这种算法会存在大量冗余框,并且计算复杂度高。
-
特征提取:通过手工设计的特征提取器(如SIFT和HOG等)进行特征提取。
-
特征分类:使用分类器(如SVM)对上一步提取的特征进行分类。
传统算法HOG+SVM的作用如下:
2014年的R-CNN(Regions with CNN features)使用深度学习实现目标检测,从此拉开了深度学习做目标检测的序幕。目标检测大致可以分为一阶段(One Stage)模型和二阶段(Two Stage)模型。目标检测的一阶段模型是指没有独立地提取候选区域(Region Proposal),直接输入图像得到图中存在的物体类别和相应的位置信息。典型的一阶段模型有SSD(Single Shot multibox-Detector)、YOLO(You Only Look Once)系列模型等。二阶段模型是有独立地候选区域选取,要先对输入图像筛选出可能存在物体的候选区域,然后判断候选区域中是否存在目标,如果存在输出目标类别和位置信息。经典的二阶段模型有R-CNN、SPPNet、Fast R-CNN、Faster R-CNN
下图总结了目标检测中一些经典模型的发展历程:
一般来说,一阶段模型在计算效率上有优势,两阶段在检测精度上有优势。对于一阶段和二阶段模型在速度上和精度上的差异,一般有以下原因:
-
多数一阶段模型是利用预设的锚框(Anchor Box)来捕捉图像可能存在物体的区域,图像中包含物体的框远少于总共的锚框,因而在训练分类器时正负样本数目极不平衡,这会导致分类器训练的效果不好。
-
二阶段模型在会修正候选框的位置,带来更高的定位精度,同时也增加了模型复杂度。
接下来,简单介绍二阶段模型的发展过程。
R-CNN
首先使用无监督的选择性搜索(Selective Search, SS)方法将输入图像中颜色、纹理相近的区域合并,产生2000个候选区域;
然后截取这些候选区域相应的图像,裁剪缩放至固定的尺寸,依次送入CNN特征提取网络提取特征;
特征送入每一类的SVM分类器,判断是否属于此类;
使用线性分类器修正框位置和大小,最后对检测结果进行非极大值抑制(Non-Maximum Suppression,NMS)。
SPPNet
在RCNN中,要对候选区域裁剪缩放至固定的尺寸,会破坏截取图像的长宽比,损失一些信息。针对以上问题,SPPNet 提出了空间金字塔池化(Spatial Pyramid Pooling)层,该层置于 CNN的末端,输入不需要缩放至指定的大小。下图第一行是 R-CNN,第二行是 SPPNet,对比可以发现它们的区别。
SPPNet 的思路是对于任意大小的 feature map 首先分成 16、4、1 个块,然后在每个块上最大池化,池化后的特征拼接得到一个固定维度的输出。
Fast R-CNN
Fast R-CNN 的思路与 SPPNet 一致,区别在于 Fast R-CNN 使用感兴趣区域池化( Region-of-Interest Pooling )而非空间金字塔池化。Fast R-CNN 相比 R-CNN 使用全连接网络代替之前的 SVM 分类器和线性回归器进行物体分类和检测框的修正。Fast R-CNN 有两个输出,一个是通过 softmax 层进行类别预测,另一个输出物体的检测框。
Faster R-CNN
Faster R-CNN 在 Fast R-CNN 的基础上,将其最耗时的候选区域提取用一个区域候选网络(Region Proposal Network,RPN)进行替代。在 faster R-CNN 中,一幅输入图像先由 RPN 提取候选区域,再取出各个候选区域对应的特征图,送入 Fast R-CNN (独立于 RPN 的后半部分)进行物体分类和位置回归。
**Region-CNN (区域卷积神经网络)**系列将目标检测问题归结为分类问题,即先寻找目标可能存在的区域(Bounding box),然后对这些Box分类,从而确定目标。YoLo 则将目标检测问题转换为一个回归问题(Regreesion problem),直接预测出 boudning box 和相关的类别信息。YoLo 是一个可以端到端训练的单个网络(single network),它不需要单独的搜索 Region Proposals,也不需要单独的 Classifier,因此其检测速度特别快,YoLo 可以达到 45 FPS,而 Fast YoLo 可以达到 155FPS。YoLo 对背景的识别效果较好,且有一定的迁移性,但是 YoLo 最大的问题是对小目标的检测不准确。
YOLO v1
- 将输入图像(
)划分为
个网格,如果一个物体的中心落在某个网格,则这个网格负责这个物体的检测。
- 每个网格预测 B 个 Bounding Box 的位置,这个 Box 的置信度得分,以及 Box 中是否存物体的概率。
-
Bounding Box 包含五个参数(中心 x 坐标,中心 y 坐标,宽度,高度,置信度)
-
置信度得分表示该网格包含一个对象的可能性:Pr(containing an object) x IoU(pred, truth); 其中Pr=概率。
-
如果网格包含一个对象,则它将预测该对象属于每个类别的概率
- 将输入图像划分为
个网格,每个网格预测B 个Bounding Box以及置信度,则最终的预测编码为
YOLO v2
YOLO v2 在 YOLO v1 的基础上做出了改进,大体可以分为网络结构的改善、先验框的设计及训练技巧。
- 网络结构的改善,提出了一个全新的网络结构,称之为 DarkNet。
-
BN层:在卷积层后面添加了批**归一化(BN)**层。
-
用连续 3×3 卷积替代了 v1 版本中的 7×7 卷积,这样既减少了计算量,又增加了网络深度。此外,DarkNet 去掉了全连接层与 Dropout 层。
-
Passthrough 层:DarkNet 还进行了深浅层特征的融合。
-
先验框的设计,YOLO v2 首先使用了聚类的算法来确定先验框的尺度。
-
训练技巧,YOLO v2 采取了多种尺度的图片作为训练的输入。模型在训练过程中,每隔 10 个批次就改变输入图片的大小。
YOLO v3
YOLO v3 在 YOLO v2 的基础上做出了一些改动。
-
YOLO v3 是使用了Logistic 函数代 Softmax函数。原因在于,Softmax函数输出的多个类别预测之间会相互抑制,只能预测出一个类别,而Logistic分类器相互独立,可以实现多类别的预测。
-
YOLO v3 采用了更深的网络作为特征提取器(DarkNet-53),包含53个卷积层。为了避免深层网络带来的梯度消失问题,DarkNet-53借鉴了ResNet的残差思想,在基础网络中大量使用了残差连接。