作者:Anders Christiansen编译:ronghuaiyang
在使用CNN做物体检测的时候,其中一个最难的概念就是anchor boxes。这也是能够在你自己的数据集上提升性能的其中一个最重要的参数。实际上,如果anchor boxes没有正确的设置,你的神经网络永远也不会知道小物体,大物体和不规则物体的存在,也永远不可能去检测他们。有几个步骤你可以做一下,确保你不会在这个上面栽跟头。
当你使用YOLO或者SSD去在一张图像中检测多个物体的时候,网络实际上进行了几千个预测,而显示给你的只是那些确认是物体的。输出的多个预测具有下面的形式:
Prediction 1:(X, Y, Height, Width), Class
….
Prediction ~80,000: (X, Y, Height, Width), Class
其中,(X, Y, Height, Width)叫做“边界框”,或者说包围这个物体的框。这个框和物体的类别时由人工标注的。
在最简单的例子中,想象一下我们有一个模型,输入下面的图像,输出两个预测:
我们需要告诉我们的网络,我们做的每个预测是不是正确的,这样网络才能学到东西。但是我们该怎样告诉网络,预测是什么呢?预测的类别该是这样吗?
预测1: 梨
预测2: 苹果
或者应该是这样:
预测1: 苹果
预测2: 梨
如果网络的预测是这样的呢:
预测1: 苹果
预测2: 苹果
我们需要我们的网络的两个预测输出能够了解他们的任务是预测苹果还是梨。有几个工具可以这样做。可以给预测指定物体的尺寸,给物体指定物体的高和宽的比例,或者物体在图像的不同的位置,大多数网络3个方法都用。在我们的苹果/梨的图像中,我们可以让预测1用来预测左边的物体,让预测2用来预测右边的物体。现在,我们可以知道预测应该是什么了:
预测1: 梨
预测2: 苹果
目前最先进的检测系统都是这么干的:
- 构建几千的“锚框”或者说“先验框”,这些框表示了用来检测指定的不同的位置,形状和尺寸的物体。
- 对于每个锚框,计算哪个物体的边界框具有最高的归一化的重叠率,这个叫做交并比,IOU。
- 如果最高的IOU大于50%,就告诉这个锚框,你应该检测这个具有最高IOU的物体。
- 否则,如果IOU高于40%,告诉网络,这个检测不靠谱,不要从这个样本中学任何东西。
- 如果最大的IOU低于40%,告诉这个锚框应该预测这里没有物体。
这个在实际中工作的很好,这几千个预测对于决定他们类别的物体是否在图像中出现还是做得很好的。看看https://github.com/kuangliu/pytorch-retinanet,一个最先进的物体检测器,我们可视化一下锚框,一次性可视化有非常多个锚框,而且还只是其中的1%。
使用默认的锚框设置构建出的预测太有针对性了,出现在图中的物体可能对于任何一个锚框都不满足IOU大于50%这个条件。这样的话,神经网络永远不可能知道这些物体的存在,也不可能学会预测它们。我们可以调整一下我们的锚框,变得更小一点,就像这样:
在RetinaNet的设置中,最小的锚框尺寸为32x32,这意味着许多小于这个尺寸的物体不会被检测到。这是一个来自WiderFace的例子,我们将边界框和对应的锚框进行匹配,但是有一些没有匹配上。
这种情况下,只有4个ground truth的边界框和其中的某个锚框重叠。网络永远也不会学习去预测其他的人脸。我们可以通过改变锚框的设置来解决这个问题。
由于我们有非常小的人脸,预测这些人脸需要依赖于周围的像素(比如胳膊,腿之类的),我们减小了最小的锚框的尺寸,但是保留了使用预测32x32尺寸物体时的感受野。使用了新的设置,所有的人脸都至少有了一个锚框,这些我们的网络可以学会如何检测它们了。
作为一个通用的法则,在训练模型之前,关于你的数据集,你应该问问自己下面的问题:
- 我想要检测的物体的最小尺寸是多少?
- 我想要检测的物体的最大尺寸是多少?
- 框和感受野的比例是什么样的?也就是说,预测边界框的时候,依赖周围多少的数据?
- 框的形状是什么?例如,车的检测器的锚框应该是宽比高要大,因为一般拍照时,不会横着拍。
你可以做一个粗略的计算,计算数据集中最极端的尺寸和对应的比例。YOLOv3,另外一个物体检测器,使用了K-means来预测合理的边界框。另外一个选择是,学习锚框的设置(MetaAnchor: Learning to Detect Objects with Customized Anchors)。还有个问题很重要,需要牢记,你不仅仅需要优化物体到锚框的映射,你还要考虑我需要多少周围的像素来纠正检测这个物体。例如,对于小人脸来说,需要依赖于整个的人的身体来进行检测。
一旦你想通了这些问题,你就可以开始设计你的锚框了。确保测试一下,通过编码你的ground truth边界框然后作为预测在解码。你应该可以覆盖你的ground truth的边界框。
同时,记住,如果边界框的中心点和锚框不一样,这个也会降低IOU。即使你有小的锚框,如果锚框之间的步长太大的话,你也会丢掉一些ground truth框。一个改善的方法就是讲IOU的阈值从50%降低到40%。
想了解为什么锚框这么重要,可以看看https://www.liip.ch/en/blog/face-detection-an-overview-and-comparison-of-different-solutions-part1,对比了当前的人脸检测API。你可以发现这些算法除了小的人脸,其他的检测都不错。这里有几个照片的例子,一个人脸也没检测出来。
下面是使用了我们的新模型的照片:
英文原文:https://medium.com/@andersasac/anchor-boxes-the-key-to-quality-object-detection-ddf9d612d4f9
更多文章,请关注微信公众号:AI公园
本文暂时没有评论,来添加一个吧(●'◡'●)