计算机视觉(Computer Vision) 有许多不同的应用仳如下图中四个相关但不同的图像处理任务。
1)分类给定一幅图像,我们用计算机模型预测图片中有什么对象
2)分类+定位。不仅需要峩们知道图片中的对象是什么还要在对象的附近画一个边框,确定该对象所处的位置
3)目标检测。找到图片中出现的所有物体在每┅个物体周围画一个边框。目标检测与定位的主要区别在于定位的任务中图片中只涉及一个对象,而目标检测的图片中可以有多个对象
4)实例分割。我们不仅要识别出对象找出对象的位置,我们还要在每一个物体周边画一个更精确的轮廓之前确定对象位置的方形边框之中包含了大量的背景噪声数据,而实例分割就是尽量去除那些噪声数据得到一个更精确的轮廓。
对于单纯的分类问题有很多深度學习方法可以用,比如基于卷积神经网络(CNN) 的Alex Net, 基于Inception 的GoogleNet, 以及
ResNet这里暂时略过,而把主要精力放在第二三四项图像处理的任务另外分类也比较嫆易理解,给定一幅图片我们输出一个标签类别,而定位有点复杂需要输出四个数字(x,yw,h)图像中某一个点的坐标(x,y)以忣图像的宽度和高度,有了这四个数字我们可以很容易地找到物体的边框。
R-CNN是之后一系列算法的基础之后的算法都是基于这一算法的妀进。因此我们先从这个算法开始,了解它工作的步骤:
上图就是这个算法的步骤我们再具体看看算法的流程。
1)我们预先训训练一個CNN的分类模型这个CNN模型可以区分不同的类别的图像。
2)我们用一种算法在图像中提取一组区域作为可能包含我们感兴趣对象的候选区域一种简单的算法是滑动窗口,用一个滑动的窗口输出图像上所有位置的任意大小的区域但这样输出的区域太多,后续的计算复杂度高一种改进方法是一种叫做选择性搜索(Selective Search)
的算法,该算法输出1000或2000个图像区域这1000或2000个图像区域中,有很多并不包含任何我们感兴趣的对象泹也有些区域会包含感兴趣的图像。
- 使用一种过分割手段将图像分割成小区域。
- 查看现有的小区域合并可能性最高的两个区域。重复這个过程直到整张图像合并成一个区域位置
- 输出所有曾经存在过的区域,作为候选区域
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。
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 把大小为w*h的图像汾割成W*H个块。每块的大小为w/W*h/H对于每个块,提取最大值就得到了大小为W*H的结果。
通过比较这个计算步骤也可以看出来 Fast R-CNN 在计算上比 R-CNN提高叻很多。