吴恩达deeplearning之CNN—目标检测(2)
5. Bounding Box预测
这一部分主要讨论看怎么能得到更为精准的边界框。
在滑动窗口算法中,通过取离散的位置集合然后再上面跑分类器,在有的情况下这些边界框没有一个能完美匹配汽车位置,甚至最合适的边界框可能并不是正方形而是长方形,怎么让边界框的输出更为精准?
其中一个能得到更精准的边界框的算法是YOLO算法,YOLO算法[1]的意思是你只看一次。比如你的输入图像是100*100的,然后再图像上放一个网格,为了介绍起来简单一些,这里用3*3网格,实际实现时会用更精细的网格,可能19*19,基本思路是使用图像分类和定位算法,然后将算法应用到9个格子上。更具体一点,你需要如下定义训练标签:
对于9个格子中的每一个,指定一个标签y,y是8维向量
怎么指定边界框?
6.交并比(IOU)
在对象检测中,希望能同时定位对象,如果实际是红色边框,你的算法给出紫色的边框,那么如何判断算法给出结果的好坏呢?所以交并比(Intersection over union)函数做的是,计算两个边界框交集和并集之比,两个边界框的并集为绿色斜线标识区域,交集是黄色斜线标识区域,那么IOU就是交集的面积除以并集的面积,一般约定在计算机检测任务中
7.非极大值抑制
到目前为止我们学习到的对象检测中的一个问题是,算法可能对同一个对象作出多次检测,所以算法对某个对象不是检测出一次而是检测出多次。非最大值抑制方法可以确保算法对每个对象只检出一次。
举个例子,假设你需要从图像中检测出行人和汽车,你可以在上面放个19*19网格,理论上每个车只有一个中点,所以只应该分配到一个格子里,理论上也只应该有一个格子作出有车的预测,实践中当你跑对象分类和定位算法时,可能不止中心点所在区域会作出有车的预测。
非极大值抑制,做的事情就是对所有作出有车预测的结果进行清理,下图中的数字为
所以非最大值抑制就是只输出概率值最大的分类结果,但抑制很接近,但不是最大值的其他预测结果
从以下示例中我们看一些算法的细节,对一个19*19的网格,最终得到19*19*8 的输出尺寸,只做汽车检测的话,把输出结果简化为
8.Anchor Boxes
Anchor Boxes可以进一步的改善目标检测算法的效果,到目前为止我们每个格子都只能检测出一个对象,如果你想让一个格子检测出多个对象,你可以使用anchor box的概念。
假设你有下面一幅图像,我们依然采用3*3的网格,注意行人的中点和汽车的中点几乎在同一个地方,两者都落在了同一个格子中,对于那个格子,如果你按照
总结一下在用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个格子每个都有对应的向量,对于左上角的会输出
运行非最大抑制:
用两个anchor box,对于9个格子中任何一个都会有两个预测的边界框,边界框可以超出格子的高度和宽度,如下图所示。去掉
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