图像定位的深度学习解决方法

计算机视觉(Computer Vision) 有许多不同的应用,比如下图中四个相关但不同的图像处理任务。

1)分类。给定一幅图像,我们用计算机模型预测图片中有什么对象。

2)分类+定位。不仅需要我们知道图片中的对象是什么,还要在对象的附近画一个边框,确定该对象所处的位置。

3)目标检测。找到图片中出现的所有物体,在每一个物体周围画一个边框。目标检测与定位的主要区别在于定位的任务中,图片中只涉及一个对象,而目标检测的图片中可以有多个对象。

4)实例分割。我们不仅要识别出对象,找出对象的位置,我们还要在每一个物体周边画一个更精确的轮廓。之前确定对象位置的方形边框之中包含了大量的背景噪声数据,而实例分割就是尽量去除那些噪声数据,得到一个更精确的轮廓。

对于单纯的分类问题,有很多深度学习方法可以用,比如基于卷积神经网络(CNN) 的Alex Net, 基于Inception 的GoogleNet, 以及 ResNet,这里暂时略过,而把主要精力放在第二三四项图像处理的任务。另外分类也比较容易理解,给定一幅图片,我们输出一个标签类别,而定位有点复杂,需要输出四个数字(x,y,w,h),图像中某一个点的坐标(x,y),以及图像的宽度和高度,有了这四个数字,我们可以很容易地找到物体的边框。

接下来主要提到的算法包括,R-CNN(Region Convolutional Neural Network),Fast R-CNN,这两个算法有助于理解定位是什么以及基本的处理方法是什么。在下一个章节中,我们会研究 Faster R-CNN, Mask R-CNN, YOLO这些算法。

1. R-CNN(Region Convolutional Neural Network)

R-CNN是之后一系列算法的基础,之后的算法都是基于这一算法的改进。因此,我们先从这个算法开始,了解它工作的步骤:

上图就是这个算法的步骤,我们再具体看看算法的流程。

1)我们预先训训练一个CNN的分类模型,这个CNN模型可以区分不同的类别的图像。

2)我们用一种算法在图像中提取一组区域作为可能包含我们感兴趣对象的候选区域。一种简单的算法是滑动窗口,用一个滑动的窗口输出图像上所有位置的任意大小的区域,但这样输出的区域太多,后续的计算复杂度高。一种改进方法是一种叫做选择性搜索(Selective Search) 的算法,该算法输出1000或2000个图像区域,这1000或2000个图像区域中,有很多并不包含任何我们感兴趣的对象,但也有些区域会包含感兴趣的图像。

备注:Selective Search的基本思路如下:

- 使用一种过分割手段,将图像分割成小区域。

- 查看现有的小区域,合并可能性最高的两个区域。重复这个过程直到整张图像合并成一个区域位置。

- 输出所有曾经存在过的区域,作为候选区域

3)正则化图像的候选区域。我们在上一步得到的候选区域往往大小不一致,为了能输入到我们的CNN网络训练,我们把每个区域转化为定为固定大小的区域。这些区域输入第一步训练好的CNN网络,就可以获得每个区域的特征表示。在输出分类结果之前最后一层的表示就是这些候选区域的特征表示,我们并不用CNN来分类这些特征,因为实践中用其他的分类器有更好的效果。

4)微调CNN的结果。也就是在第三步的基础上,再训练一个CNN网络,如果我们有K个不同的类别,那我们按K+ 1个类来训练,额外的一类是指背景(其中没有感兴趣的对象)。

5)在微调好之后,再输入每个图像区域,前向传播的结果就是我们要的特征向量。我们再用这个特征向量和图像区域的标签(Label)训练一个支持向量机(SVM)。这个SVM分类器也是最终用于分类的模型。

6)训练回归模型来校正候选区域。那些训练时用的图像的候选区域可能会有误差,为了得到一个更精准的边框,我们要再训练一个模型来用模型得到一个校正的图像区域。

那么如何来选择训练样本?

在进行训练时,重要的步骤之一是构造训练数据,包括正样本和负样本。我们使用IOU(Intersection of Union)的概念,它衡量了实际对象的区域和候选对象区域之间的重叠度。如下图:

正样本为IOU(交叉相交)重叠度>0.7的区域,负样本就是重叠度小于这个阈值的区域。

至此,用R-CNN 来实现分类和边框计算就介绍完了。R-CNN的缺点是速度非常慢。Selective Search 要花费很多时间。此外,还有三种不同的计算模型:1)CNN微调来得到候选区域最终的特征表示。2)支持向量机模型进行预测。3)另一个用于边框计算的的CNN模型。

所以,提出了更加快速的 Fast CNN。

2 Fast R-CNN:

Fast R-CNN 训练过程与R-CNN非常相似,但对网络结构进行了一些修改,把三个独立的模型统一为一个框架,并且通过CNN之间权重共享来减少计算量,如下图所示,输出对象类别的分类器和输出边框的回归器使用同样的CNN,共享CNN的权重。

具体步骤如下:

1)我们仍然需要一个预先训练好的CNN图像分类器。

2)我们仍然需要一个算法来提取对象的候选区域。

3)把整幅图片都输入预选训练好的CNN分类器,得到整幅图片的特征表示。和之前R-CNN的一个区别是,之前需要把CNN 用在所有的候选区域上,这里只需要输入整幅图片,这样就减少了很多的重复计算。那如何在整幅图片的特征表示中仍然能够找到我们感兴趣区域?我们需要一个ROI映射(ROI Projection),把第二步得到的这些候选区域映射到图像的特征表示上,得到相应的区域。

4) 同时训练分类器和回归器。在第三步得到的特征的区域,仍然是大小不一的区域。我们需要把这些区域归一化成统一大小的区域,这个过程是 ROI Pooling。

5) 经过全连接层,然后形成两个输出的分支:一个输出使用 softmax进行预测,另一个使用回归器来计算边框。同时优化两个任务,两个 Loss 函数叫多任务学习。

备注: ROI Pooling

ROI Pooling 把大小为w*h的图像分割成W*H个块。每块的大小为w/W*h/H。对于每个块,提取最大值,就得到了大小为W*H的结果。

通过比较这个计算步骤,也可以看出来 Fast R-CNN 在计算上比 R-CNN提高了很多。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180618G14BOQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券