首页 > 代码库 > CS231n第八课:目标检测定位学习记录

CS231n第八课:目标检测定位学习记录

结合视频第八集和笔记:http://chuansong.me/n/353443351445

本节课程从分类(Classification),定位(Localization)和检测(Detection)三个方面入手。

技术分享
从上图可以直观的看到:
1.对于分类而言,就是对于给定的图片把其划分到给定的几种类别中某一种。很显然,图像中只能存在一种给定类别中的对象。
2.而定位就是找到对应的对象的位置区域,把它框选出来(即Bounding Box),这个选框除了位置信息(x,y)外还要包含其大小信息(w,h)。同样的,这里的图像只包含单个对象。
3.检测就可以看作是定位的拓展,即给定一张图像或者视频帧,找出其中所有目标的位置,并给出每个目标的具体类别。与定位的不同就是图像中包含的对象数不确定。
4.实例分割(Instance Segmentation),就是在检测的基础上,把每个对象的轮廓勾勒出来,随之而来的就是语义分割(Semantic segmentation)

定位

一个简单的定位网络的训练过程:

1.先训练一个分类的模型,主要是其用于提取特征的卷积网络部分
技术分享

2.在上面训练好的卷积网络后接上用于选框的全连接的回归网络(fully-connected “regression head”)
技术分享

3.然后训练接上的回归网络部分,就像训练分类神经网络一样。
技术分享

4.最后使用的时候,把卷积网络后接上两个全连接的头,用于选框定位和分类
技术分享

那么这里就有一个问题了,是对于每一种分类进行一个选框呢还是对于整张图片进行一层分类呢,只能说两者现在都有。
方式如下:
一、分类部分:C 个类别
二、选框部分:
1.类型不明确:4 数字(1个选框)
2.类型明确的:C x 4 数字(每个类1个选框)

还有另外一种常用选框方式就是Sliding Window。
这里还要补充一下关于对象选框的问题,object proposal(后面简写做OP)方法分成了两类,一类叫grouping method,即先将图片打碎,然后再聚合的一种方法,比如selective search;另一类叫window scoring method。是生成大量window并打分,然后过滤掉低分的一种方法,比如objectness。这里的Sliding Window也是这类方法。(见下图)
http://blog.csdn.net/zxdxyz/article/details/46119369

技术分享
每个滑动窗口作为CNN的输入,会预测一个选框,并给予一个评分,最后结合评分然后把几个选框进行融合。
技术分享
Sliding Window需要对图像的所有位置进行评分,然后输出Box regression outputs, 最终定位图像。

技术分享
技术分享
技术分享
Boxes因为有(x,y,w,h),所以乘上4。

这篇文章要采用多尺度的方式。这里要补充一下多尺度(multi-scale)的问题,传统的检测/定位算法是固定输入图像不变,采用不同大小的滑窗来支持不同尺度的物体。对于CNN来说,滑窗的大小就是训练时输入图像的大小,是不可以改变的。那么,CNN支持多尺度的办法就是,固定滑窗的大小,改变输入图像的大小。具体来说,对于一幅给定的待处理的图像,将图像分别resize到对应的尺度上,然后,在每一个尺度上执行上述的密集采样的算法,最后,将所有尺度上的结果结合起来,得到最终的结果。
给定一张框定的图片,已知这张图片有某种可分类物体,但是由于框给的不是很合适,或者和训练的时候有差异,所以取不同scale图片进行检测,得到结果。对于CNN,使用不同scale需要放缩图片,由于最后的FC层的输入大小是固定的(比如5x5),所以不同scale输入经过pool5之后的 ‘feature map’ 大小不一,此时取所有可能5x5作为输入得到特征向量.

例如训练阶在(1414)下,训练网络;测试阶段在多个较大的图片上测试,由于每个1414的view区域产生一个分类预测分布,(1616)的图片上测试,有4个不同的1414的view,所以最后产生一个4个分类预测分布;组成一个具有C个特征图的22分类结果图,然后按照11卷积方式计算全连接部分;这样整个系统类似可以看做一个完整的卷积系统。
后面又在这个分类(识别)的基础上,做了定位。
在训练的CNN后面接两个全连接层,组成regressor network 。训练时,只需要训练后面的两个全连接层。这个 regressor network 的输出就是一个 bounding box,这个 regressor network 的最后一层是class specific的,也就是说,对于每一个class,都需要训练单独最后一层。这样,假设类别数有1000,则这个 regressor network 输出1000个 bounding box,每一个bounding box 对应一类。
对于定位问题,测试时,在每一个尺度上同时运行 classification network 和 regressor network 。这样,对于每一个尺度来说, classification network 给出了图像块的类别的概率分布,regressor network 进一步为每一类给出了一个 bounding box,这样,对于每一个 bounding box,就有一个置信度与之对应。最后,综合这些信息,进行框选的融合,最终给出定位结果。

检测

不能简单对每一个不同尺度不同位置窗口进行分类,因为数据量实在太多,所以要尽量选取可能正确区域。这也正式现在的普遍做法,比较出名就是Region Proposals: Selective Search。

Selective Search只是Region Proposals(后面简称RP)中的一种方法,此外还有edge Boxes等方法。为什么要使用region proposal呢?因为其利用了图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口(几千个甚至几百个)的情况下保持较高的召回率(这个名词将在后面再次提到时与其他概念放在一起进行说明)。这大大降低了后续操作的时间复杂度,并且获取的候选窗口要比滑动窗口的质量更高(滑动窗口固定长宽比)

Selective Search:
简单的讲就是:首先将图片打散,然后按照超像素的原理(superpixel),根据人为定义的距离进行聚合。
技术分享

然后就进入最著名三大检测算法,R-CNN,fast R-CNN,faster R-CNN:

R-CNN:
(1) 输入测试图像
(2) 利用selective search算法在图像中提取2000个左右的region proposal。
(3) 将每个region proposal缩放(warp)成227x227的大小并输入到CNN,将CNN的fc7层的输出作为特征。
(4) 将每个region proposal提取到的CNN特征输入到SVM进行分类。
(5) 对于SVM分好类的region proposal做边框回归(bounding-box regression),边框回归是对region proposal进行纠正的线性回归算法。
技术分享
针对上面的框架给出几点解释:

  • 上面的框架图是测试的流程图,要进行测试我们首先要训练好提取特征的CNN模型,以及用于分类的SVM:使用在ImageNet上预训练的模型(AlexNet/VGG16)进行微调得到用于特征提取的CNN模型,然后利用CNN模型对训练集提特征训练SVM。
  • 对每个region proposal缩放到同一尺度是因为CNN全连接层输入需要保证维度固定。
  • 上图少画了一个过程——对于SVM分好类的region proposal做边框回归(bounding-box regression),边框回归是对region proposal进行纠正的线性回归算法,为了让region proposal提取到的窗口跟目标真实窗口更吻合。因为region proposal提取到的窗口不可能跟人手工标记那么准,如果region proposal跟目标位置偏移较大,即便是分类正确了,但是由于IoU(region proposal与Ground Truth的窗口的交集比并集的比值)低于0.5,那么相当于目标还是没有检测到。

Fast R-CNN
为了解决R-CNN的问题:
1.运行速度慢
2.训练分为多个阶段,步骤繁琐
3.支持向量机和回归是事后训练的:CNN特征没有根据支持向量机和回归来更新
在进入Fast R-CNN之前,必须提到另一个网络,就是SPPNet:针对不同尺寸输入图片,在CNN之后的Feature Map上分割成同样大小的特征图并Pooling,转化成相同尺度的向量。

这2000个region proposal不都是图像的一部分吗,那么我们完全可以对图像提一次卷积层特征,然后只需要将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个region proposal的卷积层特征输入到全连接层做后续操作。(对于CNN来说,大部分运算都耗在卷积操作上,这样做可以节省大量时间)。现在的问题是每个region proposal的尺度不一样,直接这样输入全连接层肯定是不行的,因为全连接层输入必须是固定的长度。SPP-NET恰好可以解决这个问题:
技术分享
技术分享
上图对应的就是SPP-NET的网络结构图,任意给一张图像输入到CNN,经过卷积操作我们可以得到卷积特征(比如VGG16最后的卷积层为conv5_3,共产生512张特征图)。图中的window是就是原图一个region proposal对应到特征图的区域,只需要将这些不同大小window的特征映射到同样的维度,将其作为全连接的输入,就能保证只对图像提取一次卷积层特征。SPP-NET使用了空间金字塔采样(spatial pyramid pooling):将每个window划分为4*4, 2*2, 1*1的块,然后每个块使用max-pooling下采样,这样对于每个window经过SPP层之后都得到了一个长度为(4*4+2*2+1)*512维度的特征向量,将这个作为全连接层的输入进行后续操作。

Fast R-CNN的框架图:
技术分享

(1) ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7*7*512维度的特征向量作为全连接层的输入。
(2) R-CNN训练过程分为了三个阶段,而Fast R-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去region proposal提取阶段)。
(3) Fast R-CNN在网络微调的过程中,将部分卷积层也进行了微调,取得了更好的检测效果。

Faster R-CNN
在Region Proposal + CNN分类的这种目标检测框架中,Region Proposal质量好坏直接影响到目标检测任务的精度。如果找到一种方法只提取几百个或者更少的高质量的假选窗口,而且召回率很高,这不但能加快目标检测速度,还能提高目标检测的性能(假阳例少)。RPN(Region Proposal Networks)网络应运而生。

RPN的核心思想是使用卷积神经网络直接产生region proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,因为anchor机制和边框回归可以得到多尺度多长宽比的region proposal。
技术分享
我们直接看上边的RPN网络结构图(使用了ZF< Zeiler and Fergus model>模型),给定输入图像(假设分辨率为600*1000),经过卷积操作得到最后一层的卷积特征图(大小约为40*60)。在这个特征图上使用3*3的卷积核(滑动窗口)与特征图进行卷积,最后一层卷积层共有256个feature map,那么这个3*3的区域卷积后可以获得一个256维的特征向量,后边接cls layer(box-classification layer)和reg layer(box-regression layer)分别用于分类和边框回归(跟Fast R-CNN类似,只不过这里的类别只有目标和背景两个类别)。3*3滑窗对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:1,1:2,2:1)的region proposal,这种映射的机制称为anchor。所以对于这个40*60的feature map,总共有约20000(40*60*9)个anchor,也就是预测20000个region proposal。
这样设计的好处是什么呢?虽然现在也是用的滑动窗口策略,但是:滑动窗口操作是在卷积层特征图上进行的,维度较原始图像降低了16*16倍(中间经过了4次2*2的pooling操作);多尺度采用了9种anchor,对应了三种尺度和三种长宽比,加上后边接了边框回归,所以即便是这9种anchor外的窗口也能得到一个跟目标比较接近的region proposal。

Faster R-CNN架构
技术分享

基于回归方法的深度学习目标检测算法

Faster R-CNN的方法目前是主流的目标检测方法,但是速度上并不能满足实时的要求。YOLO一类的方法慢慢显现出其重要性,这类方法使用了回归的思想,既给定输入图像,直接在图像的多个位置上回归出这个位置的目标边框以及目标类别。
YOLO (CVPR2016, oral)
技术分享
我们直接看上面YOLO的目标检测的流程图:
(1) 给个一个输入图像,首先将图像划分成7*7的网格
(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3) 根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可。
可以看到整个过程非常简单,不需要中间的region proposal在找目标,直接回归便完成了位置和类别的判定。
技术分享
那么如何才能做到直接在不同位置的网格上回归出目标的位置和类别信息呢?上面是YOLO的网络结构图,前边的网络结构跟GoogLeNet的模型比较类似,主要的是最后两层的结构,卷积层之后接了一个4096维的全连接层,然后后边又全连接到一个7*7*30维的张量上。实际上这7*7就是划分的网格数,现在要在每个网格上预测目标两个可能的位置以及这个位置的目标置信度和类别,也就是每个网格预测两个目标,每个目标的信息有4维坐标信息(中心点坐标+长宽),1个是目标的置信度,还有类别数20(VOC上20个类别),总共就是(4+1)*2+20 = 30维的向量。这样可以利用前边4096维的全图特征直接在每个网格上回归出目标检测需要的信息(边框信息加类别)。

小结:YOLO将目标检测任务转换成一个回归问题,大大加快了检测的速度,使得YOLO可以每秒处理45张图像。而且由于每个网络预测目标窗口时使用的是全图信息,使得false positive比例大幅降低(充分的上下文信息)。但是YOLO也存在问题:没有了region proposal机制,只使用7*7的网格回归会使得目标不能非常精准的定位,这也导致了YOLO的检测精度并不是很高。

SSD: Single Shot MultiBox Detector
上面分析了YOLO存在的问题,使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。那是不是可以结合region proposal的思想实现精准一些的定位?SSD结合YOLO的回归思想以及Faster R-CNN的anchor机制做到了这点。
技术分享
上图是SSD的一个框架图,首先SSD获取目标位置和类别的方法跟YOLO一样,都是使用回归,但是YOLO预测某个位置使用的是全图的特征,SSD预测某个位置使用的是这个位置周围的特征(感觉更合理一些)。那么如何建立某个位置和其特征的对应关系呢?可能你已经想到了,使用Faster R-CNN的anchor机制。如SSD的框架图所示,假如某一层特征图(图b)大小是8*8,那么就使用3*3的滑窗提取每个位置的特征,然后这个特征回归得到目标的坐标信息和类别信息(图c)。
不同于Faster R-CNN,这个anchor是在多个feature map上,这样可以利用多层的特征并且自然的达到多尺度(不同层的feature map 3*3滑窗感受野不同)。
**小结:**SSD结合了YOLO中的回归思想和Faster R-CNN中的anchor机制,使用全图各个位置的多尺度区域特征进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster R-CNN一样比较精准。SSD在VOC2007上mAP可以达到72.1%,速度在GPU上达到58帧每秒。
**总结:**YOLO的提出给目标检测一个新的思路,SSD的性能则让我们看到了目标检测在实际应用中真正的可能性。

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    CS231n第八课:目标检测定位学习记录