目标检测(Object detection)——吴恩达

        目标检测是计算机视觉领域中一个新兴的应用方向。在构建目标检测之前,我们先首先一下目标定位。 

 

一、目标定位(Object localization)

        

        对于图片分类我们已经很熟悉了,如上图最左图所示,将图片输入到模型中,并输出其类别(汽车),这就是图片分类。那什么是目标定位?这意味着我们不仅要用模型来判断图中是不是一辆汽车,还要在图片中标记处它的位置,并且用红色方框把汽车圈起来,这就是目标定位问题。其中,定位的意思是判断汽车在图片中的具体位置。

        在目标检测中,图片可以含有多个同种类的目标,甚至在一张图片中会有多个不同类别的目标。但在此处,我们针对于只有一个较大的目标在图片中间位置进行研究。

        如上图所示,如果只是单单对图片进行分类的话,通常我们将图片作为输入,输入到多层卷积神经网络中,卷积神经网络会输出一个特征向量,并反馈给softmax单元来预测图片的类型。假如我们要分类的是行人、汽车、摩托、背景(意味着不含前面三种),那么经过softmax处理过后,输出为各个类别的概率,从而进行分类。

        那怎么定位图片中汽车的位置?通过让神经网络多输出几个单元,即输出一个边界框。具体来说就是让神经网络多输出四个数字bx,by,bh,bw,这四个数字可以代表一个边界框。 首先我们约定图片的左上角为坐标(0,0),右下角的坐标为(1,1)。要确定边界框的位置,需要指定红色方框的中心点(bx,by),边界框的高度为bh,边界框的宽度为bw。因此训练集不仅包括神经网络要预测的目标的类别标签,还要包括边界框的这四个数字,接着按照监督学习的方法,输出一个标签还有四个参数值。

        举个例子,在例图中,图片的类别为 汽车,bx大小约为0.5,代表汽车的中心点在图片水平方向的中间位置,by的大小约为0.7,代表汽车的中心点在图片垂直方向,距离底部3/10位置,bh约为0.3,代表方框高度约为图片总高度的0.3倍,bw约为0.4,代表方框宽度约为图片总高度的0.4倍

        那如何为监督学习任务定义目标标签y?

        

        首先要确立一点的是,本例中只含有四个分类。

        目标标签y的定义如下:

        pc代表图中是否含有目标,如果目标属于前三类(行人、汽车、摩托车),则pc=1,如果是背景,则图中没有要检测的目标,则pc=0。如果检测到目标,即pc=1,就输出被检测对象的边界框参数bx,by,bh,bw。最后,如果pc=1,那么同时输出c1,c2,c3,表示该目标属于行人、汽车、摩托车中的哪一类。因为我们假设图片中只含有一个目标,所以这个目标定位问题的图中最多只会出现一个目标。

        以汽车样本为例,那么输出的pc=1,bx=0.5,by=0.7,bh=0.3,bw=0.4,c1=0,c2=1,c3=0。那如果图片中没有目标呢?那么pc=0,其余均为?(未知值),在这种情况下,pc=0,其余的值就变得没有意义,不用加以考虑。

        那如何定义其损失函数?其参数为类别y和网络输出yhat,如果采用平方误差策略,那么:

其中y1至y8,分别代表pc,bx,by,bh,bw,c1,c2,c3。

        如果图片中存在目标,那么y1=1,所以y1=pc,此时损失值就是不同元素的平方和。

        如果图片中不存在目标,那么y1=0,也就是pc=0,此时的损失值为(yhat-y)²,因为对于这种情况,我们不对其他元素进行考虑,只需要关注神经网络输出pc的准确度。

        ​ 

 二、特征点检测(Landmark detection)

        了解了如何用神经网络对目标进行定位,即通过输出四个参数值bx,by,bh,bw给出图片中对象的边界框。更开阔地说,神经网络可以通过输出图片上特征点地(x,y)坐标来实现对目标特征的识别。

        假如你要对人脸的特征进行提取,假设人脸有64个特征点。选定特征点个数,并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征点的位置。

        具体做法是,准备一个卷积网络和特征及,将人脸图片输入卷积网络,输出1或者0,1表示有人脸,0表示没有人脸,然后输出64个特征点的坐标。所以最终输出64*2+1=129个输出单元。

        另一个例子就行,如果你对人体姿态检测感兴趣,你还可以定义一些关键特征点,如胸部的中点,左肩,左肘,腰等等。然后通过神经网络标注人物姿态的关键特征点,再输出这些标注过的特征点,就相当于输出了人物的姿态动作。当然,要你需要设定这些关键特征点。

        但特征点检测的数据集难以制作,需要耗费大量的人力。

         

三、目标检测(Object detection)

        通过目标定位和特征点检测的学习之后,接下来构建一个目标检测算法。学习如何通过卷积网络进行目标检测,采用的是基于滑动窗口的目标检测算法。

        假如你想构建一个汽车检测算法,那么首先要创建一个标签训练集x和y,如图所示。

         在有了对应的x、y训练集之后,就可以开始训练卷积神经网络,输入图片,输出y,0或1来代表图片中是否有汽车。训练完这个卷积神经网络,就可以用它来实现滑动窗口目标检测,具体步骤如下。 

        

        首先选定一个特定大小的窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。接下来对第二个图像进行处理,即红色方框向右滑动之后的区域,输入给卷积网络进行处理,而后处理第三个图像,依次重复操作,知道这个窗口滑过图像的每个角落。

        或许我们可以选择更大的窗口,进行扫描。

         

        这种算法叫做滑动窗口目标检测算法,因为我们以某个步长滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断厘米是否有汽车的存在。

        滑动窗口目标检测算法也有很明显的缺点,就是计算成本,因为你在图片中划分出太多的小方块,需要卷积神经网络一一进行处理。如果你选的步长较大,虽然会减少输入卷积神经网络的窗口个数,但是太大的步长可能会影响性能(即有可能造成存在汽车但无法正确识别)。反之,如果采用小的步长,这意味着超高的计算成本。

        所以在神经网络兴起之前,通常采用简单的分类器进行检测,简单的分类器的计算成本并没有卷积神经网络的计算成本高。所以在神经网络兴起之前,采用简单的分类器的滑动窗口目标检测法表现良好,是个不错的方法。

        现如今,卷积神经网络兴起,计算成本问题大大增加,但也有了很好的解决方案!

四、卷积的滑动窗口实现(Convolutional implementation of sliding windows)

        由于卷积网络实现滑动窗口目标检测算法计算成本很大,效率很低。随之提出就是卷积的滑动窗口实现,即在卷积层上应用这个算法。

        首先要知道如何把神经网络的全连接层转化成卷积层,如下:

        假设一个目标检测算法输入一个14x14x3的图像,卷积核大小为5x5,数量是16,处理过后的feature maps大小为10x10x16。然后通过2x2的最大池化操作,图像减小到5x5x16。而后添加两个含有400个神经元的全连接层,最后通过softmax单元输出y。那如何把全连接层转化为卷积层?

        通过用5x5的卷积核来实现,数量是400个,输入图像大小为5x5x16,用5x5的卷积核对它进行卷积操作,输出为1x1x400,从数学的角度上来看,它和全连接层是一样的,因为这400个节点每个节点都由5x5x16的卷积核生成,所以每个值都是上一层这些5x5x16个值通过某个函数的输出结果。而后在这基础上再利用400个1x1x400的卷积核,得到1x1x400的feature map,最后通过4个1x1x400的卷积核得到1x1x4的输出层。 以上就是用卷积层代替全连接层的过程。

        

        那如何实现卷积的滑动窗口?

       

       

       假设向滑动卷积窗口输入14x14x3的图片,和前面一样,神经网络最后的输出层,即softmax单元的输出是1x1x4。假设输入给卷积神经网络的图片大小是14x14x3,测试集的图片是16x16x3,现在给测试图片加上黄色条块,在最初的滑动窗口算法中,会将下图蓝色区域输入卷积神经网络,而后输出结果。接着滑动窗口,步幅为两个像素,向右滑动两个像素。而后再向下,从左至右。反复操作。我们在这个16x16x3的小图像上滑动窗口,卷积神经网络运行了四次,输出了四个标签2x2x4。

        

         但不难发现,这四次卷积操作中很多计算都是重复的。所以执行滑动窗口的卷积使卷积神经网络在这4次前向传播过程中共享很多计算。最终,总共滑动了四次,在输出层这四个子方块中,分别代表每次滑动输入卷积神经网络的结果。

        以上就是卷积层上应用滑动窗口算法的内容,提高了整个算法的效率。不过算法仍然存在一个缺点,就是边界框的位置可能不够准确。

五、Boundind Box预测(Bounding box predictions)

        往往,我们在滑动窗口法中,没有任何一个边界框能够完美匹配汽车的位置,那有没有办法让这个算法输出更精确的边界框呢?

        一个更精准边界框的算法是YOLO(You only look once)算法,具体做法如下:

         假设你输入的图像是100x100的,然后在图像上放一个网格,以3x3网格为例(在实际实现时会使用更精细的网络,可能是19x19)。利用之前介绍的图像分类和定位算法,并一一应用在9个格子中。所以9个格子的每一个格子指定一个标签y,y是8维的,与之前定义的类似:

         YOLO的做法就是,取目标的中点,然后将这个目标分配给包含目标中点的格子。所以图中左边汽车就分配到第四个格子,右边汽车就分配到第六个格子,所以即使中心格子(第5个格子)同时拥有两辆车的一部分,但我们当作它不含目标。

        所以你训练输入为100x100x3的神经网络,并且将图像分为9个格子,通过网络模型,你会得到一个8维的输出向量,因为把图像分成了3*3的网格,所以有9个格子,所以总的输出尺寸是3x3x8。每一个1x1x8代表一个方格的标签(先不讨论一个方格存在多个目标的情况)。如果你使用更精细的网格19x19,那么输出就是19x19x8。

        重申一下,把目标分配到一个格子的过程是,通过观察目标中点,然后将目标分配到其中心点所在的格子,所以即使对象可以横跨多个格子,也只会被分配到其中一个格子。

        所以这能让神经网络输出边界框,不会受到滑动窗口分类器的步长大小限制。其次,这是一个卷积实现,你不用在3x3的网格上跑9次算法,又或者你不用在19x19的网格上跑361次算法。并且在卷积神经网络中有很多共享计算步骤,所以这个算法效率很高,也是YOLO受欢迎的原因之一。

        那这方格中怎么定义边框?

        在YOLO算法中,对于编号为1的方格,我们约定方格的左上角为(0,0),右下角为(1,1),所以bx约为0.4,by约为0.3,bh约为0.9,bw约为0.5。bx,by的值是介于0~1之间的,bh,bw的值可能会大于1。

         

        

六、交并比(Intersection over union)

        那如何判断你的目标检测算法是否有效呢?方法即交并比。

        

        在目标检测任务中,如何评价你的边界框的好坏? 交并比IOU,就是两个边框的交集和并集之比。以上图为例,假设紫色边框是神经网络输出结果,红色边框是标签,那么两个边框的交际就是橙色部分,两个边框的并集就是绿色部分。两者相除,越大则代表定位的越准确。一般来说,在目标检测任务中,如果IOU大于0.5就代表说检测正确。但实际上这0.5是人为约定的,如果你希望更严格一点,也可以将IOU设为0.6,0.7等等。

七、非极大值抑制(Non-max suppression)

        到目前为止学习到可能存在的一个问题是,算法可能对同一个目标做出多次检测,所以算法不是对某个目标检测一次,而是检测出多次。非极大值抑制这个方法可以确保你的算法对每个目标只检测一次。

        假设你将图片分割成19x19个格子,理论上每辆车只有一个重点,所以每辆车应该只被分配到一个格子里。但实际上你运行算法时,对于有些(编号1,2,3)格子,可能会认为车辆的中心在自己的格子范围内,同理有些格子(编号4,5,6)也会同时认为车辆的中心在自己的范围内。他们都认为自己格子所在的范围内有车。

        所以非极大值抑制时怎么起效的呢?编号1,2,3,4,5,6的格子他们都会预测出一个pc值,代表格子里有车的概率。首先,观察每个格子检测结果的pc检测概率,首先对概率最高的方框做高亮标记。而后非极大值抑制就会逐一审视剩下的矩形框,所有与高亮的边框有很高交并比的边框都会被抑制。重复以上操作,逐一观察剩下的矩形,找出概率pc最高的一个,然后对与其IOU值很高的矩形进行抑制。

八、锚框(Anchor Boxes)

        目前为止,我们讨论的是目标检测中每个格子只能检测出一个目标,如果你想让一个格子检测出多个对象,你可以使用anchor box这个概念。举例如下:

        假设对一张图片使用3x3的网格分割,值得注意的是,图中行人和汽车的中心点都在一个格子中。所以,如果这个网格输出y如图所示,那么可以检测行人、汽车、摩托车这三个类别,它无法同时检测出两个结果,必须从两个检测结果中选取一个。

         

        而anchor box的思路就是,预定义多个(这边取两个)不同形状的anchor box,将预测结果和这两个anchor box关联起来。那么类别标签将被重新定义:

         前面的八个参数和anchor box1相关,后面的八个参数和anchor box2相关,因为anchor box1的形状与行人的形状更相似,所以用前八个参数来代表行人,假如pc=1,代表有个行人,bx,by,bh,bw代表行人的边框,c1=1,c2=0,c3=0代表目标是个行人。同样的,因为车子的边框和anchor box2较为类似,所以可以这么编码pc=1,bx,by,bh,bw,c1=0,c2=1,c3=0。

        总结以下,图中的每个目标都和之前一样分配到同一个格子中,选择与目标边界框有较高交并比的anchor box来对目标进行预测。举例如下:

         

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值