深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

定位 + 分类

 

定义+分类问题是分类到目标检测的一个过度问题,从单纯的图片分类到分类后给出目标所处的位置,再到多目标的类别和位置。定位问题需要模型返回目标所在的外界矩形框,即目标的(x,y,w,h)四元组。接下来介绍一种比较容易想到的实现思路,将定位当作回归问题,具体步骤如下。

  1. 训练(或下载) 一个分类模型,例如,AlexNet、VGGNet或ResNet
  2. 在分类网络最后一个卷积层的特征层(feature map) 上添加“regression head",如下图所示深度学习与图像识别:原理与实践 笔记Day_18(目标检测)
  3. 同时训练”classification head“和”regression head“,为了同时训练分类和定位(定位是回归问题)两个问题,最终损失函数是分类和定位两个”head“产生的损失的加权和。
  4. 在预测时同时使用分类和回归”head“得到分类+定位的结果。这里需要强调一下的是,分类预测出的结果就是C个类别,回归预测的结果可能有两种:一种是类别无关,输出4个值;一种是类别相关,输出4*C个值。

目标检测

selective search方法:从图片中选出潜在物体候选框(Regions of Interest, ROI)。

R-CNN

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

(1)选出潜在目标候选框(ROI)

objectness、selective search、category-independent object proposals等很多论文都讲述了候选框提取的方法,R-CNN使用selective search的方法选出了2000个潜在物体候选框。

(2)训练一个好的特征提取器

R-CNN的提出者使用卷积神经网络AlexNet提取4096维的特征向量,实际上使用VGGNet、GoogLeNet或ResNet也可以。 AlexNet等网络要求输入的图片尺寸是固定的,而(1)中ROI尺寸大小不定,这需要将每个ROI调整到指定尺寸,如下所示。

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

 接下来,为了获得一个好的特征提取器,一般会在ImageNet预训练好的模型基础上做调整,唯一的改动就是将ImageNet中1000个类别的输出改为(C+1)个输出,其中C是真是需要预测的类别个数,1是背景类。新特征的训练方法是使用随机梯度下降(SGD)

         这里先抛出一个用于衡量两个矩阵交叠情况的指标IOU(Intesection Over Union),IOU就是两个矩形面积的交际除以并集。,当IOU>=0.5时,则认为是正样本,其余为负样本。 

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

(3)训练最终的分类器

下面为每个类别单独训练一个SVM分类器。SVM的训练也需要选择正负样本,R-CNN的提出者做了一个实验来选择最优IOU阈值,最终仅仅选择真实值的矩形框作为正样本。

(4)训练回归模型

为每个类训练一个回归模型,用来微调ROI与真实矩形框位置和大小的偏差。

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

 以下是所有检测问题都会用到的一段代码(IOU计算):

def bboxIOU(bboxA, bboxB):
    A_xmin = bboxA[0]
    A_ymin = bboxA[1]
    A_xmax = bboxA[2]
    A_ymax = bboxA[3]
    A_width = A_xmax - A_xmin
    A_height = A_ymax - A_ymin

    B_xmin = bboxB[0]
    B_ymin = bboxB[1]
    B_xmax = bboxB[2]
    B_ymax = bboxB[3]
    B_width = B_xmax - B_xmin
    B_height = B_ymax - B_ymin

    xmin = min(A_xmin, B_xmin)
    ymin = min(A_ymin, B_ymin)
    xmax = max(A_xmax, B_xmax)
    ymax = max(A_ymax, B_ymax)

    A_width_and = (A_width + B_width) - (xmax - xmin)  # 宽的交集
    A_height_and = (A_height + B_height) - (ymax - ymin)  # 高的交集

    if (A_width_and <= 0.0001 or A_height_and <= 0.0001):
        return 0

    area_and = (A_width_and * A_height_and)
    area_or = (A_width * A_height) + (B_height * B_width)
    IOU = area_and / (area_or - area_and)

    return IOU

预测阶段可以分为如下几个步骤:

  1. 使用selective search 方法先选出2000个ROI
  2. 所有ROI调整为特征提取网络所需的输入大小并进行特征提取,得到与2000个ROI对应的2000个4096维的特征向量
  3. 将2000个特征向量分别输入到SVM中,得到每个ROI预测的类别。
  4. 通过回归网络微调ROI的位置
  5. 最终使用非极大值抑制(Non-MaximumSuppression,MNS)方法对同一个类别的ROI进行合并得到最终检测结果。NMS的原理是得到每个矩形框的分数(置信度),如果两个矩形框的IOU超过指定阈值,则仅仅保留分数大的那个矩形框。

以上就是R-CNN的全部过程,我们可以看出,R-CNN存在如下问题:

  • 不论是训练还是预测,都需要对selective search出来的2000个ROI全部通过CNN的Forward过程来获取特征,这个过程花费的时间会非常长。
  • 卷积神经网络的特征提取器和用来预测分类的SVM是分开的,也就是特征提取的过程不会因SVM和回归的调整而更新。
  • R-CNN具有非常复杂的操作流程,而且每一步都是分裂的,如特征提取器通过Softmax分类获得,最终的分类结果由SVM获得,矩形框的位置则是通过回归方式获得。

Fast R-CNN

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

具体的步骤如下:

  1. 将整张图片和ROI直接输入到全卷积的CNN中,得到特征层和对应在特征层上的ROI(特征层的ROI信息可用其几何位置加卷积坐标公式推导得出)。
  2. 与R-CNN类似,为了使用不同尺寸的ROI可以统一进行训练,Fast R-CNN将每块候选区域通过池化的方法调整到指定的M*N,此时特征层上将调整后的ROI作为分类器的训练数据。与R-CNN不同的是,将分类和回归任务合并到一起进行训练,这样就将整个流程串联起来。Fast R-CNN的池化示意图如下所示,即先将整张图通过卷积神经网络进行处理,然后在特征层上找到ROI对应的位置并取出,对取出的ROI进行池化(此处的池化方式有很多)。池化后,全部2000个M*N个训练数据通过全连接层并分别经过2个head:softmax分类以及L2回归,最终的损失函数是分类和回归的损失函数的加权和。利用这种方式即可实现端到端的训练。
  3. 深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

Fast R-CNN 极大地提升了目标检测训练和预测的速度。 

Faster R-CNN

 Faster R-CNN就是在Fast R-CNN的基础上构建一个小的网络,直接产生Region Proposal来代替其他方法(如selective search)得到ROI。这个小型的网络被称为区域预测网络(Region Proposal Network,RPN)。Faster R-CNN的训练过程如下所示:

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

 RPN的核心思想是构建一个小的全卷积网络,对于任意大小的图片,输出ROI的具体位置以及ROI是否为物体。RPN网络在卷积神经网络的最后一个特征层上滑动。

下面我们对照下图来进一步解释RPN.(a)中最下面灰色的网格表示卷积神经网络的特征层,红框表示RPN的输入,其大小为3*3,而后链接到256维的一个低维向量上。 这个3*3的窗口滑动经过整个特征层,并且每次计算都将经过这256维的向量并最终输出2个结果:该3*3滑动窗口位置中是否有物体,以及该滑动窗口对应物体的矩形框位置。右图是将RPN网络旋转90度的图,input维度9即33的滑动窗口大小。

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

为了适应多种形状的物体,RPN定义了k种不同尺度的滑窗(因为有的目标是长的,有的是扁的,有的是大的,有的是小的,统一用3*3的滑窗难以很好的拟合多种情况),它有一个专业的名词——anchor,每个anchor都是以特征层(feature map)上的像素点为中心并且根据其尺度大小进行后续计算。在Faster-RCNN论文中,滑窗在特征层的每个位置上使用3种大小和3种比例,共3*3=9种 anchor。在上图中,n=9.

根据上面的介绍,我们指定RPN包含两类输出:

  1. 二分类网络输出是否为物体
  2. 回归网络返回矩形框位置对应的4个值

针对分类任务,对于滑窗产生的每一个anchor都计算该anchor与真实标记矩形框的IOU。当IOU大于0.7时,便认为该anchor中含有物体;当IOU小于0.3时,便认为该anchor中不包含物体;当IOU介于0.3~0.7时,则不参与网络训练的迭代过程。

针对回归任务,这里定义为anchor中心点的横、纵坐标以及anchor的宽、高,学习目标为anchor与真实bbox在这四个值上的便宜。可以使用随机梯度下降(SGD)的方式端到端地进行训练。

注意点⚠:

训练的过程中能与真实物体矩形框相交的IOU大于0.7的anchor并不多,它们绝大多数都是负样本,因此会导致正负样本比例严重失衡,从而影响识别效果。因此,在RPN训练的过程,对每个batch进行随机采样(每个batch中有256个样本)并保证正负样本的比例为1:1,而当正样本数量小于128时,取全部的正样本,其余的则随机使用负样本进行补全。

使用RPN产生ROI的好处是可以与检测网络共享卷积层,使用随机梯度下降的方式端到端地进行训练。Faster R-CNN的训练过程如下:

  1. 使用ImageNet预训练好的模型训练一个RPN
  2. 使用ImageNet预训练好的模型,以及第一步里产生的建议区域训练Fast R-CNN,得到物体的实际类别以及微调的矩形框位置
  3. 使用第二部中的网络初始化RPN,固定前面的卷积层,只调整RPN层的参数
  4. 固定前面的卷积层,只训练并调整Fast R-CNN的FC层

有了RPN的帮助,Faster R-CNN的速度得到了极大提升:

深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

R-CNN、Fast R-CNN、Faster R-CNN这几个模型的比较如下图所示:

深度学习与图像识别:原理与实践 笔记Day_18(目标检测) 

 YOLO


由于在R-CNN的系列算法中需要先获取大量的proposal,但是proposal之间又有很大的重叠,会带来很多重复的工作。YOLO改变基于proposal预测的思路,将输入图片划分成S ∗ S个小格子,在每个小格子中做预测,最终将结果合并。如下图所示
深度学习与图像识别:原理与实践 笔记Day_18(目标检测)

  1. YOLO对于网络输入图片的尺寸有要求,首先需要将图片缩放到指定尺寸(448*448),再将图片划分成S ∗ S的小格。
  2. 在每个小格里进行这样几个预测:该小格是否包含物体?包含物体对应的矩形框位置以及该小格对应C个类别的分数是多少?,因此,每个小格需要预测的维度为B*(1+4)+C,其中,B代表每个小格最多可能交叠物体的个数,1为该小格是否包含物体的置信度,4用来预测矩形框,C表示任务中所有可能的类别个数(不包括背景)。因此YOLO网络最终特征层的大小为S*S*(B*5+C),上图中特征层的大小即为7*7*(2*5+20)=7*7*30,(PASCAL VOC2012目标检测数据集共有20种类别)

YOLO直接将输入图片划分为S ∗ S个小格,不需要产生proposal,所以速度比FasterR-CNN快很多,但是因为其粒度较粗,所以精度相比Faster R-CNN略逊一筹。YOLO的主要贡献是诶目标检测提供了另外一种思路,并使实时目标检测成为可能。
 

上一篇:关于Java反射中创建对象


下一篇:算法第二章上机实践报告