吴恩达deeplearning之CNN—目标检测(2)

来源:互联网 发布:大数据交易交易的是啥 编辑:程序博客网 时间:2024/06/06 00:15

5. Bounding Box预测

     这一部分主要讨论看怎么能得到更为精准的边界框。

     在滑动窗口算法中,通过取离散的位置集合然后再上面跑分类器,在有的情况下这些边界框没有一个能完美匹配汽车位置,甚至最合适的边界框可能并不是正方形而是长方形,怎么让边界框的输出更为精准?
     其中一个能得到更精准的边界框的算法是YOLO算法,YOLO算法[1]的意思是你只看一次。比如你的输入图像是100*100的,然后再图像上放一个网格,为了介绍起来简单一些,这里用3*3网格,实际实现时会用更精细的网格,可能19*19,基本思路是使用图像分类和定位算法,然后将算法应用到9个格子上。更具体一点,你需要如下定义训练标签:
     对于9个格子中的每一个,指定一个标签y,y是8维向量[pc,bx,by,bh,bw,c1,c2,c3],含义和之前讲述的目标定位是一样的,所以最终图像输出的标签尺寸是3*3*8,如果你现在要训练一个输入图像是100*100*3的图像,然后你有一个普通卷积网络,最后就映射到一个3*3*8的输出尺寸,这类算法的优点是可以输出精确的边界框,所以测试的时候你做的是喂入输入图像X,然后经过正向传播,得出输出y,然后对于这里3*3位置对应的9个输出就反应对应位置是否包含对象,以及对象的具体位置和类型。只要每个区域中对象个数不超过一个,这个算法应该是没问题的。在这里举例用的是3*3的网格,但是在实际应用中会选用更精细的19*19网格,所以输出结果就是19*19*8,这样的网络精细的多,多个对象分配到同一个网格中的概率也就小很多。首先,这个算法和图像分类和定位算法很类似,同样输出了对象的具体问题,也就不会受到滑动窗口分类器的步长大小限制;其次,这是一个卷积实现并没有在3*3的网格上跑9次算法,这是单次卷积实现,共享了很多计算步骤,所以算法的计算效率很高。YOLO算法几乎可以达到实时识别的效率
这里写图片描述

     怎么指定边界框?
这里写图片描述

6.交并比(IOU)

     在对象检测中,希望能同时定位对象,如果实际是红色边框,你的算法给出紫色的边框,那么如何判断算法给出结果的好坏呢?所以交并比(Intersection over union)函数做的是,计算两个边界框交集和并集之比,两个边界框的并集为绿色斜线标识区域,交集是黄色斜线标识区域,那么IOU就是交集的面积除以并集的面积,一般约定在计算机检测任务中IOU0.5 就说检测正确,如果预测器和实际边界框完美重叠IOU=1,如果希望更严格一点,你可以调大IOU的阈值。下一部分讨论的非最大抑制可以让YOLO算法的输出效果更好。
这里写图片描述

7.非极大值抑制

     到目前为止我们学习到的对象检测中的一个问题是,算法可能对同一个对象作出多次检测,所以算法对某个对象不是检测出一次而是检测出多次。非最大值抑制方法可以确保算法对每个对象只检出一次。
举个例子,假设你需要从图像中检测出行人和汽车,你可以在上面放个19*19网格,理论上每个车只有一个中点,所以只应该分配到一个格子里,理论上也只应该有一个格子作出有车的预测,实践中当你跑对象分类和定位算法时,可能不止中心点所在区域会作出有车的预测。
这里写图片描述
     非极大值抑制,做的事情就是对所有作出有车预测的结果进行清理,下图中的数字为Pc作出有车预测的可信度,首先找出Pc值最大的,下图为0.9,将其高亮标识,然后非最大值抑制就会逐一审视剩下的矩形,所有和这个最大的边界框有高IOU或高重叠区域的其它边界框就会被抑制,所以Pc=0.6Pc=0.7Pc=0.9的浅蓝色区域重叠度很高所以会抑制变暗,然后继续审视剩下的矩形区域,找出Pc最高的一个,也就是0.8的矩形区域,然后非最大值抑制算法就会去掉其它IOU值高的区域,如果直接把抑制区域抛弃就剩下两个高亮显示的区域,就是最终的预测结果。
     所以非最大值抑制就是只输出概率值最大的分类结果,但抑制很接近,但不是最大值的其他预测结果
这里写图片描述
这里写图片描述
     从以下示例中我们看一些算法的细节,对一个19*19的网格,最终得到19*19*8 的输出尺寸,只做汽车检测的话,把输出结果简化为[pc,bx,by,bh,bw] ,你要做的第一件事情是去掉所有pc0.6的边界框,也就是抛弃哪些出车汽车概率比较低的区域,剩下的就是按照非最大抑制的思路,找出最终的预测边界框。我们这里描述的都是一个对象的情况,如果尝试同时检测三个对象,比如行人、汽车和摩托,那么输出向量就会有三个额外分量,正确的做法是,独立进行三次非最大值抑制,对每个输出类别都做一次。

8.Anchor Boxes

     Anchor Boxes可以进一步的改善目标检测算法的效果,到目前为止我们每个格子都只能检测出一个对象,如果你想让一个格子检测出多个对象,你可以使用anchor box的概念。
假设你有下面一幅图像,我们依然采用3*3的网格,注意行人的中点和汽车的中点几乎在同一个地方,两者都落在了同一个格子中,对于那个格子,如果你按照[pc,bx,by,bh,bw,c1,c2,c3]的方式去输出,只能表示一个对象,anchor box解决这个问题的思路是这样的,预先顶一个两个不同形状的anchor box,你需要做的是把预测结果和两个anchor box关联起来,一般你可能会用更多的anchor box,也许要5个甚至更多,这里就用两个。用的向量也不再是之前的[pc,bx,by,bh,bw,c1,c2,c3],而是重复两次入下图右下角所示。
这里写图片描述
     总结一下在用anchor box之前,对于训练集图像中的每个对象都根据那个对象中点的位置分配到对应的格子中,所以输出就是3*3*8。用anchor box以后对每个对象和之前一样分配到对象中点所在格子中,但是它还分配到一个anchor box,和对象形状交并比最高的anchor box,所以这里有两个anchor box你就取这个对象看看,如果你的对象形状是瘦高的就用anchor box1,如果是宽矮的就用anchor box2,然后观察哪个anchor和实际边框的交并比高,不管选的哪一个,这个对象不只分配到一个格子,而是分配到一对格子和anchor box对,这就是对象在目标标签中的编码方式,所以现在输出y就是3*3*16。
这里写图片描述
     对一个具体的示例,行人更类似于anchor box1,把它分配到向量的上半部分,车子的形状更类似于anchor box2,分配到图像的下半部分。如果图像中只有汽车,没有行人那输出就和下图右侧的标签y一致。
这里写图片描述
     建立anchor box这个概念是为了处理两个对象在同一个格子的情况,实践中这种情况很少发生

9.YOLO算法

     前面已经把目标检测的各个部分进行了讲解,这里把其串联起来就构成了YOLO算法本身。
首先看如何构建训练集:
     假设构建一个算法要是被三种目标:行人、汽车、摩托,你需要显示指定完整的背景类别,如果要用两个anchor box,那么输出标签y大小为3*3*16,要构造训练集,需要遍历9个方格,然后构成对应的目标向量y。每个方格对应的示例目标向量如下图所示:
这里写图片描述
其次如何进行预测:
     输入图像,神经网络的输出尺寸是3*3*16,对于9个格子每个都有对应的向量,对于左上角的会输出[0,?,?,?,?,?,?,?0,?,?,?,?,?,?,?],pc=0表示没有任何对象,此时为?的值就不再关心,但是在算法中会输出一些噪声数值,这些并不重要,包含汽车的方格会输出[0,?,?,?,?,?,?,?1,bx,by,bh,bw,0,1,0]
运行非最大抑制:
     用两个anchor box,对于9个格子中任何一个都会有两个预测的边界框,边界框可以超出格子的高度和宽度,如下图所示。去掉pc比较低的值,如果你有三个对象检测类别,对每个类别单独运行非最大值抑制,结果就是那个类别的边界框
这里写图片描述
这里写图片描述
这里写图片描述

10. RPN网络

     候选区域在计算机视觉领域是非常有影响力的概念,因为吴恩达在平常工作中很少使用,所以他把这部分做成了选修课程。
     还记得滑动窗口检测算法吗?窗口会在图像上进行滑动计算每个窗口的预测值,判断窗口中是否包含车辆、行人和摩托车,这个算法的缺点是在没有任何信息的区域内浪费时间,比如左下角基本是空的,所有文献[2]提出了一种R-CNN算法,意思是带区域的卷积网络,这个算法尝试选出一些区域,在这些有意义的区域上运行卷积网络,这样就不用针对每个滑动窗口跑检测算法,而是只选择一些窗口运行卷积网络。选候选区的方法是,运行图像分割算法,如下图右侧所示,为了找出可能存在的对象区域,比如选出分割算法中有明显色块的区域,最后选出2000个色块就只需要在这2000个区域跑卷积分类器即可。
这里写图片描述
     R-CNN算法还是很慢的,有很多工作去优化R-CNN算法
这里写图片描述

参考文献

[1]You only look once:unified real-time object detection. Redmon et al. 2015
[2]Rich feature hierarchies for accurate object detection and semantic segmentation Girshil et.al 2013

原创粉丝点击