Fork me on GitHub

目标检测算法

​ 深度学习在目标检测(Object Detection)中的应用,总结一些常见网络和方法。

​ 本文主要总结介绍R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD。

目标检测常见算法

​ 在目标检测领域的深度学习主要分为两种,one stage 和 two stage。在之前还有以R-CNN为代表的multi-stage,但是由于检测精度和速度问题,已经被淘汰。这里用表格总结两类算法特点如下:

one-stage two-stage
主要算法 YOLOv1、SSD、YOLOv2、RetinaNet、YOLOv3 Fast R-CNN、Faster R-CNN
检测精度 较低 较高
检测速度 较快 较慢
鼻祖 YOLOv1 Fast R-CNN
特点 不用产生候选框,直接将目标边框定位的问题转化为回归问题处理 先由算法生成一系列作为样本的候选框,再通过卷积神经网络进行样本分类

滑窗法

​ 滑窗(Sliding Window)的思路很简单:

  • 首先需要一个已经训练好的分类器,然后把图像按照一定间隔和大小分为一个个窗口,在这些窗口上执行分类器,如果得到较高的分类分数,就认为是检测到了物体。
  • 把每个窗口都用分类器执行一遍之后,再对得到的分数做一些后处理,比如非极大值抑制 NMS等,最后就得到了物体类别和对应区域。

PASCAL VOC、mAP和IOU

PASCAL VOC = Pattern Analysis Statistical Modelling and Computational Learning, Visual Object Class

  • 是一套用于评估图像分类、检测、分割和人体姿势动作的数据集,被用到最多的是物体检测。一共包括4大类,20个细分类。

mAP = mean Average Precision

  • 平均精度均值,mAP是把每个类别的AP都单独拿出来,然后计算所有类别AP的平均值,代表检测到目标平均精度的一个综合评价。

关于mAP详细的解释请参考本文

IOU

  • 在目标检测的评价体系中,有一个参数叫做 IoU ,简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。

  • 具体我们可以简单的理解为:即检测结果DetectionResult与真实值Ground Truth的交集比上它们的并集,即为检测的准确率 IoU。

Selective Search 和 R-CNN

Selective Search:

  • 采用超像素合并的思路。
  • 首先用分割算法在图像上产生很多小区域,这些区域是最基础的子区域,或者可以看作超像素。然后根据这些区域之间的相似性进行合并,成为大一点的区域。衡量相似性的标准可以是颜色、纹理和大小等。不断迭加这些小区域合并成大区域的过程,最后整张图会合并成一个区域。这个过程中,给每个区域做一个外切的矩形,就得到了许许多多可能是物体的区域方框。
  • 和滑窗法相比的第一个优点就是高效,不再是漫无目的的穷举式的寻找。

R-CNN:

​ 根据Selective Search 寻找到可能物体的边框后,只要接一个CNN就可以分类检测了。但是Selective Search找到的框未必精确,所以还加入一些改进,如和物体标注框位置的回归来修正Selective Search提出的原始物体框。

SPP、ROI 和 Fast-RCNN

SPP和ROI Pooling

SPP = Spatial Pyramid Pooling 空间金字塔池化:

  • 物体通过卷积网络之后,会在语意层的响应图上的对应位置有特别的响应。
  • 对整张图片进行一次卷积神经网络的前向计算,到了最后一层的 feature map 的时候,通过某种方式将目标区域所在区域部分的feature map拿出来做为特征给分类器。这样对画面哪所有可能物体的检测就可以共享一次卷积神经网络的前向计算,大大节省时间。

例子:

  • 假设输入图片中👨、🐎和🐶的三个框框是 Selective Search 选出来的框,那么经过了(没有全连接层)的卷积神经网络之后,到最后一层输出的n个channel的feature map时,原图上的两个框也会对应两个区域。这样的区域成为 Region Of Interest。
  • 如果有一种方式可以ROI的信息转换为固定维度的向量,每个ROI都给分类器去计算获得结果,并且在进入分类器之前,只需要运行一次卷积神经网络的前向计算,所有ROI共享feature map。
  • SPP分层将指定区域划分为不同层次。越底层划分的数目越多。SPP通过像金字塔一样的结构来获得感兴趣区域不同尺度的信息。
  • 借助SPP,不仅实现了对ROI的分类,而且对整张图片也只需要进行一次卷积神经网络的前向计算。

Fast R-CNN

改进:

  • ROI提取特征之后,把物体框回归和分类两个任务的loss一起训练,相当于 端到端的多任务训练,训练效率也更高。
  • 把SPP换成了ROI Pooling,这就是Fast R-CNN。在计算预测的框和标注框的loss的时候,并没有采用常见的 L2 方式,而是采用了一种叫做 Smooth L1的计算方法,其实也就是把L1 和L2拼在一起。

RPN 和 Faster-RCNN

​ 在Faster R-CNN 中,将RPN提出来代替 Selective Search。这样做的一个重要意义是将算法的所有步骤都被包含到一个完整的框架中去了,实现了端到端的训练。

​ 也就是说,加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。

​ RPN的一些特点:

  • 在feature map上滑动窗口

  • 建一个神经网络用于物体分类+框位置的回归

  • 滑动窗口的位置提供了物体的大体位置信息

  • 框的回归提供了框更精确的位置

    ​ 在Faster R-CNN中,一共有四个损失函数,两个用来RPN的分类和回归训练,两个用来对Fast R-CNN的分类和回归训练。

    ​ Faster R-CNN的主要贡献就是设计了提取候选区域的网络RPN,代替了费时的选择性搜索Selective Search,使得检测速度大幅提高。

YOLO和SSD简介

YOLO = You Only Look Once

​ 实名推荐这位大佬写的关于YOLO的相关文章,很清楚的讲述了YOLOv1,YOLOv2,YOLOv3的特点和主要思想。

链接在此。以下是我自己总结的简单的YOLO的一些特点。

​ YOLO的所属的one-stage,这类方法使用了回归的思想,利用整张图作为网络的输入,直接在图像的多个位置上回归出这个位置的目标边框,以及目标所属的类别。

​ YOLO检测的流程:

  1. 给个一个输入图像,首先将图像划分成7*7的网格
  2. 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
  3. 根据上一步可以预测出772个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可

​ 但是因为没有了RP机制,所以不能非常精准的定位,这是YOLO的一个缺点。

SSD = Single Shot multibox Detector

​ 由于在YOLO中,使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。所以SSD结合RP的思想来解决这个问题。

​ 首先SSD获取目标位置和类别的方法跟YOLO一样,都是使用回归,但是YOLO预测某个位置使用的是全图的特征,SSD预测某个位置使用的是这个位置周围的特征。

​ 使用Faster R-CNN的anchor机制。如SSD的框架图所示,假如某一层特征图(图b)大小是88,那么就使用33的滑窗提取每个位置的特征,然后这个特征回归得到目标的坐标信息和类别信息(图c)。

​ 不同于Faster R-CNN,这个anchor是在多个feature map上,这样可以利用多层的特征并且自然的达到多尺度(不同层的feature map 3*3滑窗感受野不同)。

​ 本文写到这里,主要是希望能够让自己更加深入的了解这些算法的思想,由于目前没有时间去阅读相关论文,希望以后能够阅读这些算法的论文。