首先通过前面对计算机视觉领域中的卷积神经网络进行了解和学习,我们知道,可以通过卷积神经网络对图像进行分类。
如果还想继续深入,会涉及到目标定位(object location)的问题。在图像分类的基础上(Image classification)的基础上,除了判断图像中的物体类别是什么,还需要给出其在图像中的位置,我们成为分类和定位的问题(Classification and localization)。但是相信你对目标检测问题也有一定了解,对于目标检测,它和前面两个问题就不是一个level了,目标检测需要识别图像中所有待识别的物体,给出其类别和位置。最大的不同点在于,目标分类和定位问题在于图像中仅仅只有一个物体,而目标检测并不是。
但是图像分类和目标定位的知识也会对目标检测问题有帮助。所以接下来我们再看一下分类问题和定位问题,它们也是学习目标检测的基础。
我们看到下面标准的图像分类的流程
当需要对图像中的物体在分类基础上,预测其位置时,直接在全连接的输出层加上一个预测bounding box预测层就行。
不看分类的话,也就是相当于预测四个连续值的回归问题,理论上肯定行得通。当然我们知道,卷积神经网络学习到的是图片的局部特征,为什么能预测位置呢?好像有些牵强。我自己的理解是,虽然卷积神经网络好像只是学习到了一些局部的纹理特征,它肯定还是学习到了或者说保存了特征的位置信息(比如你想一想,特征的位置不一样,图像中那个位置的响应也不一样)所以我个人目前的理解来说,我可以理解。
后来我仔细查找资料的印证:
- 特征图的生成: CNN通过一系列的卷积和池化操作,从原始图像中提取有用的特征,并生成一个称为特征图的输出。特征图实际上是源图像的一个缩小版本,其中每个单元包含对应于源图像某一窗口的特征信息。这个特征图可以用于定位,因为每个特征单元的位置信息可以映射回源图像的相应位置。
- 全连接层: 尽管卷积层和池化层能有效提取并保留空间信息,但通常我们在网络的最后几层会使用全连接层来进行精确的定位。全连接层能从前层提取的所有特征中命中目标,这有利于精准的定位。全连接层中的每一个神经元与前一层的所有神经元都有连接。这意味着全连接层接收到的信息是全局的,每个神经元能看到整个图像,而不仅仅是像卷积层那样看到图像的一小部分。
接下来我们看一下,在这种问题背景下,我们该如何对图像进行标记呢?或者说,我们对训练过程中的真实值该如何表示呢?
Pc
:表示的其实就是置信度,在标记中就只有0,1两种,表示有无了(实际上对Pc为0的我们也没有进行标记)。预测的结果就是0~1
之间bx,by,bh,bw
:就是物体位置c1,c2,c3
其实也是分类预测softmax
确定的,表示属于哪一类(Pc
也是softmax那一层决定的,表示确定的这个类的置信度)根据标签中pc
是否为1,对于损失函数也有讲究
pc
为1
,那么就对其正常使用均方差或者设定好的的损失函数pc
为0
,那么算均方差时我们只算(y预测-0)^2
,其他7个值我们并不关心,我只看pc
的预测有多准同时,对于损失函数的选择,你可以对dx,dy,w,h
选择均方差的损失函数,对c1c2,c3
选择log
形式的损失函数,这样搭配使用,也是完全OK的。
总结一下:
图像分类是最基础的任务,它的目标是确定图像中的主要内容。例如,一个图像分类模型可能需要确定一个图像是猫、狗还是车。
单目标定位在图像分类的基础上增加了空间信息,即不仅需要确定图片中的主要内容,还需要定位出这个主要内容在图片中的位置。这通常通过在图像上放置一个边界框来完成
其实上文中,识别物体类别,并且定位到四个关键点(方框的四个角点)可以推广到更普遍的情况。
不论可解释性的情况下,目标检测为什么不能一次性输入图片,然后像图像分类那样通过一个卷积层,直接输出所有预测结果?
首先我其实是没有真正理解神经网络的本质!我们目前学习到的神经网络,或者说一般的、用于预测的神经网络,它的输出都被设计为固定的,或者说我们期待的预测结果的格式就是固定的,我们已经知道只可能是有或者没有物体!比如,上面图像分类和定位,就只有8个输出,表示类别、置信度和位置。这也是为什么对于目标检测这种,输出结果不完全确定的,具体来说,目标的个数以及位置不确定,不能用简单的卷积神经网络来设计从而解决。
Q:如果不考虑可行性,真的下设计一个用简单神经网络输出目标检测,它的根本的不可行性在哪里,请说的更直白透彻一些,结合卷积神经网络
A:确实,我们可以理论上设计一个简单的卷积神经网络用于目标检测,但是会遇到一些根本的问题,这是由卷积神经网络的固有属性决定的。我将基于卷积神经网络(CNN)的工作原理和目标检测问题的特性来说明这个问题。
综上所述,虽然我们可以尝试用简单的卷积神经网络来进行目标检测,但由于上述的一些限制,仅用一个简单的CNN很难有效地处理目标检测问题。这就是为什么我们通常需要用到更复杂的、专门设计用于处理目标检测问题的网络模型,如Faster-RCNN, YOLO, SSD等。
所以为什么讲到锚框,也就是说,让先生成一些大差不差的边界框,然后把这些边界框(或者理解成由边界框裁剪后的图片)输入神经网络,向上文讲的图像分类和定位那样,进行分类和位置预测。
所以到这里,我们可以把单目标分类和预测,看作目标检测的一个子任务。事实上在二阶段目标检测中用到的正是这种思想(当然具体实现细节还需要探讨,但大致思想是这样)。
总结,目标检测网络的主要任务,可以分解为两个部分:
在更具体的视觉,例如YOLO(You Only Look Once)或者Faster R-CNN等目标检测框架,单目标定位就更显其重要性。在YOLO中,整个图像被划分为SxS个格子,每个格子负责预测一个包含对象中心的边界框;在Faster R-CNN中,RPN(Region Proposal Network,区域提议网络)输出的各种候选框,会进入ROI Pooling等一系列处理后,通过全连接层进行边界框回归和类别分类,这就是单目标定位的部分。
因此,我们可以说,单目标定位确实是目标检测中的一个子模块。而目标检测可以理解为对单目标定位的一种扩展,它能够处理任意数目和类别的对象。
当然这只是一个宏观上的理解,我们差不多搞清楚了单目标定位和分类和目标检测的区别和联系,也知道目标检测要比前者复杂很多,当然部署一两段话可以具体解释清楚,下面就详细来看把!
我个人学习后觉得核心在于两点
滑动窗口是模板检测过程中锚框生成的一种方式。
但是这种滑动锚框,获得图像,送入卷积神经网络的方法有一个很大的问题。我们可以看到,对于同一张图像,用这种暴力的方法可以生成上百万甚至更多的锚框,将其锚框内剪裁得到的图像,一个个单独地送入卷积神经网络进行预测,计算机成本和存储成本相当之大! 你可能会想减少滑动窗口滑动的stride,但是这样也会失去精准性。
滑动窗口在神经网络兴起之前也有被应用,那个时候,是将裁剪后的图像送入一个简单的线性分类器,这样的成本会相对较小。但是我们都知道,卷积神经网络的精准度肯定是要高于人工手动设计特征的分类器。
我们可以看到,先用锚框滑动窗口,让后裁剪图片送入卷积神经网络。注意到,锚框滑动窗口和卷积核滑动窗口的过程十分类似。实际上,可以把这个过程合二为一,减少一些计算量:
这个将滑动窗口思想和卷积神经网络相融合从而进行目标检测,由Pierre Sermanet等人于2013年发表的论文,题为"Overfeat: Integrated Recognition, Localization and Detection using Convolutional Networks"所运用。
首先,我们需要把得到全连接层也看成卷积的过程(在全连接层和卷积层之间加入适当的卷积核):
于是,如下图,对于原图像进行适当的填充,我们可以看到最后结果为2x2x4
,其实就是代表有2x2
个锚框得到的结果。这样将滑动窗口思想和卷积稍微结合,从而通过一次向前传播(端到端),而不是截取四个锚框分别向前传播四次,就节省了很大的计算成本。
这个方法虽然提高了检测效率,但是也有一些限制。例如,滑动窗口通常是固定大小的(因为锚框的得到其实是间接的,取决于最后一层输出层映射到原图像的大小,而这个映射关系是由网络决定),这就意味着如果物体的尺度变化很大,那么滑动窗口就很难覆盖到所有物体。但是总的来说,滑动窗口的思想开启了物体检测的新篇章,并且对后续的YOLO,SSD等一系列算法产生了深远影响。
YOLOv1是属于One Stage:端到端目标检测。下面我们对其如何生成bounding box
以及大致思路进行了解。
思路
首先将一幅图像分成 SxS
个网格(grid cell)(相当于将原图像进行SxS
的裁剪,得到SxS
个子图像,每个子图像进行单目标检测,不过这里的所有子图像是并行处理)。哪个 目标物体的中心落在这个网格中,则这个网格负责预测这个目标。更具体来说,一张图片,对应有7×7
个lables
,7x7
表示有7x7
个子区域,每个lables
包括:有无物体、物体类别、位置、置信度等,这些值的按照物体被分配到哪个子区域进行填写!一个物体可能横跨了多个子区域,但是它只在它的中心所在的那个子区域/网格的那个lable进行标记。
但是实际每个子区域输入网络时,它还是按照单目标定位进行预测,也就是说,预测结果可能其他子区域也会认为存在物体,即使该物体的中心点不在此区域!
网络的最终输出是 7×7×30。还是以这个狗为例,7x7 很好理解,图像分为 7x7 个区域进行预测.最终输出 tensor 的前五个数值,分别是 bbox 的 x,y,w,h,c,即 bbox 的中心坐标 x,y,bbox 的宽高 w,h,bbox 的置信度。
可以看到,虽然在逻辑上是分成7x7
个区域“独立”完成目标定位的,但是整个过程是一次卷积,也就是onstage
,端到端!
一个中心点,会检测 2 个 bbox ,这个操作可以减少漏检,因为可以适应不同形状的 bbox,进而提高bbox 的准确率。2 个 bbox 都会保留,最后通过 NMS 选择出最佳的 bbox
后面的 20 个,就是类别的概率,YOLO v1 是在 VOC 数据集上训练的,因此一共 20 个类。
一般会把阈值设置为0.5
,当然为了提高准确性,也可以将阈值设置为更高。
作用:保证一个对象只对应一个且是最优的bounding box。
看下面这个例子,物体的中心点只存在于一个网格,但是其他网格(子区域)在进行预测时也有可能认为物体的中心在其中,或者说预测到同一物体。这个时候,同一个物体会得到多个bounding box
而NMS做的就是,去除冗余框,得到最优预测框。
那我们下面具体看看NMS是如何发挥作用的:
首先看每个框所给出的置信度Pc
,现在有5个bounding box,记为A、B、C、D、E。并将其按照置信度,从大到小排序:A、D、C、E、B
取出现在所有的bounding box置信度最大的那个框:A
遍历剩下所有的bounding box:B、C、D、E,计算其与当前置信度最高的那个bounding box之间的IOU
。B、C与A的IOU超过阈值,那么就扔掉B、C;并标记第一个矩形框A,是我们保留下来的。
从剩下的矩形框D、E中,选择概率最大的D,然后判断E与D的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记D是我们保留下来的第二个矩形框。
上面示例中,因为图像中只有一个类别,所有运行一次NMS就找出来最后的所有边框。实际中,若有多个类别,如
n
个类别,则需要独立的运行n
次NMS。
最后,了解了过程,让我们对非极大值抑制进行总结:非极大值抑制,即找到最大可能的边框,而抑制那些非最大值的边框,固称为非极大值抑制(non-max suppression)
我们上文讲到yolov1算法存在一个局限:一个子区域限定预测一个物体。如果物体很小,一个子区域存在多个物体呢?通过对子区域添加锚框,可以解决这个问题。这也是YOLOv2对v1的改进之处。
可以看到,下面的两个物体:people和car同时落在了一个网格/子区域中,上文我们知道,一个网格只能预测一个物体,那么此时就出现物体了。于是,为了改进这一点,对于一个网格我们提出2个(其实实际实现中不知2个)锚框(anchor box),同时lables
和输出向量的通道数也要随之改变(如下图y的两个表示所示)。通过这种方式,一个网格(子区域)就可以预测多个物体了!
下面是对有无锚框前后的对比总结:
SxS
网格Pc
都标记为0
表示没有一个锚框于物体相关联;对于绿色的网格,有物体存在,且在第二个锚框中的IOU
最大,于是将第二个锚框的Pc
标记为1
,将bx,by,bh,bw
赋值为物体真实位置。根据物体真实位置构建好训练集后,训练好模型,即可进行预测。
得到预测结果会如下图所示(这里每个网格会有2个bounding box),我们还需要进行处理得到最终的结果。
Pc
小于IOU
阈值的那些低置信度bounding boxR-CNN算法最早在2013年被提出,它的出现打开了运用深度学习进行目标检测的大门,从此之后,目标检测的精准度与实时性被不断刷新。R-CNN系列算法自提出之际,就非常引人注目,以至于在之后的很多经典算法中,如SSD、YOLO系列、Mask R-CNN中都能看到它的影子。
R-CNN、Fast R-CNN采用的还是传统的SS(selective search)算法生成推荐区域,计算非常耗时,达不到实时检测的效果。直到Faster R-CNN才使用 RPN(region proposal network) 代替了原来的SS算法,才使得目标检测的时间大大缩短,达到实时性的效果。
来源于传统的计算机视觉技术。在深度学习流行起来之前,传统的计算机视觉技术(例如图像分割、特征提取和局部普适性)常常被用来处理图像识别的问题。
下面是Selective Search的基本思路:
多尺度分割: 首先,基于不同的尺度进行图像分割,产生初始的区域。导出的每一个区域都被看作是潜在的目标对象。
区域合并: 然后,对这些区域进行合并,根据颜色相似性、纹理相似性、尺寸相似性和形状相兼容性等特征,逐渐将相似的区域进行合并。将合并生成的新区域也视为对象的候选区域。
利用多种策略: 在这个过程中,Selective Search会使用多种不同的搜索策略,包括颜色空间、相似度度量、起始区域等,以尽可能多地覆盖到各种类型的对象。
最后,这个步骤会生成大约2000个区域建议。然后,这些区域建议将作为RCNN模型的输入,进行深度学习目标检测。
但需要注意的是,虽然Selective Search方法提出了很多候选区域来增加检测到物体的机会,但这也增大了计算开销,并且合并过程中可能会过度合并,导致目标物体丢失。因此,后来的Fast R-CNN和Faster R-CNN都尝试优化这个步骤,提高检测效率。
R-CNN(全称Regions with CNN features) ,是R-CNN系列的第一代算法,其实没有过多的使用“深度学习”思想,而是将“深度学习”和传统的“计算机视觉”的知识相结合。比如R-CNN pipeline中的第二步和第四步其实就属于传统的“计算机视觉”技术。使用selective search提取region proposals,使用SVM实现分类。
思路
R-CNN算法的检测效果很好,但是检测速度很慢,因此总体效率不高。其主要原因在于:
缺点
2s
2015年,Ross Girshick等人在R-CNN的基础上进行了改进,解决了上述影响R-CNN效率的前两个问题。与R-CNN相比,训练速度快了9倍;测试速度快了213倍;在Pascal VOC数据集上,准确率从62%提升到了66%。
思路
7x7
,独立的输入进全连接层,单独的进行分类和回归Fast R-CNN的改进点:
Fast R-CNN的瓶颈:
虽然Fast R-CNN算法在检测速度和精确度上了很大的提升。但是它仍然不能满足实时目标检测,最大的原因在于:采用SS算法生成推荐区域的方法很耗时,处理每张图像大约需要消耗2秒,大大限制了目标检测的速度。
2015年,由任少卿、何凯明、Ross Girshick、孙剑组成的微软研究团队,提出了Region Proposal Networks取代了原来的SS算法,几乎不消耗计算时间,使得生成推荐区域过程变得非常高效,解决了Fast R-CNN的瓶颈问题。
Faster R-CNN算法将Region Proposal Networks与Fast R-CNN进一步合并为一个单个网络。当采用非常深的VGG-16模型作为骨干网络时,基于该方法的检测系统在GPU上的帧速率为5fps,基本达到实时检测的水平。同时在PASCAL VOC2007、2012和MS COCO数据集上,其检测精度也达到了最好的水平。
如上图所示,Faster R-CNN算法流程主要有以下4个步骤:
思路
RPN的工作过程如下:
总的来说,RPN生成的锚框数量是固定的,但是通过分类预测和NMS筛选后,输出的候选区域数量是不固定的,依赖于具体的图像和对象。
Faster R-CNN和YOLO(You Only Look Once)是两种不同的目标检测框架,而他们主要的时间成本差异在于处理候选区域的方式。
Faster R-CNN首先使用Region Proposal Network(RPN)生成候选区域(或称为Region of Interest, ROI),然后每个ROI都经过ROI Pooling变为统一大小的特征图,再输入到全连接层进行分类和边界框回归。因此,Faster R-CNN必须对每个ROI进行单独处理,这就涉及一定数量的逐个操作,因此相对来说会稍慢一些。
而YOLO则采用了一种全图预测的策略:它将输入图像划分为一个个格子,每个格子预测一定数量的边界框和分类概率。这个过程是全图矩阵操作可以并行计算,因此相对于Faster R-CNN会快一些。
但是值得注意的是,这两种方法在准确率和召回率上可能存在差异。由于Faster R-CNN使用了RPN来生成候选区域,所以有可能在复杂背景和遮挡严重的情况下获得更好的结果。而YOLO由于其对整个图像的一次性处理,可能在处理小对象和大量对象时有更好的效果。具体使用哪种方法,可能需要根据具体任务和数据进行选择。