anchor设置 yolo_目标检测中Anchor(先验框)的作用
目标检测网络(Faster RCNN、SSD、YOLO v2&v3等)中,均有先验框的说法,Faster RCNN中称之为anchor(锚点),SSD称之为prior bounding box(先验框),实际上是一个概念。Anchor设置的合理与否,极大的影响着最终模型检测性能的好坏。
1. 什么是Anchor?
一句话概括——提前在图像上预设好的不同大小,不同长宽比的框,先验框示意如下:
同一位置设置多个不同尺度先验框
2. 为什么引入Anocher?
使得模型更容易学习。
目标检测中模型不仅需要学习目标的类别,更需要学习到目标的位置和大小,这不是一个简单的任务。举个简单的例子。
YOLOv1是较早的one-stage目标检测方法(YOLOv1没有设计Anocher),它最后采用全连接层直接对边界框进行预测,由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,使得YOLOv1在训练过程中学习适应不同物体的形状比较困难,这也导致YOLOv1在精确定位方面不如Faster R-CNN,如下:
使用anchor boxes之后,YOLOv2的召回率大大提升,所以在Yolo之后的版本中,均保留了先验框。
3. Anocher为什么要使用不同尺寸和长宽比?
为了得到更大的交并比(intersection over union, IOU)。
通过设置不同的尺度的先验框,就有更高的概率出现对于目标物体有良好匹配度的先验框(体现为高IoU)。
如下所示:
左图我们更希望模型选择红色的先验框,右图希望模型选择蓝色的先验框,这样使得模型更容易学习。
4. Anochor Box的尺寸该怎么选择?
anchor一般都是通过人工设计的。例如,在SSD、Faster-RCNN中,设计了9个不同大小和宽高比的anchor。然而,通过人工设计的anchor存在一个弊端,就是并不能保证它们一定能很好的适合数据集,如果anchor的尺寸和目标的尺寸差异较大,则会影响模型的检测效果。目前anchor box的选择主要有三种方式:
- 人为经验选取
- k-means聚类
- 作为超参数进行学习
在论文YOLOv2中提到了这个问题,作者建议使用K-means聚类来代替人工设计,通过对训练集的bounding box进行聚类,自动生成一组更加适合数据集的anchor,可以使网络的检测效果更好。
Instead of choosing priors by hand, we run k-means clustering on the training set bounding boxes to automatically find good priors. If we use standard k-means withEuclidean distance larger boxes generate more error than smaller boxes. However, what we really want are priors that lead to good IOU scores, which is independent of the size of the box.
虽然设置更多的先验框,IOU能获得一定的提升,但模型的复杂度随之增加,如下图,为了平衡模型的准确度和复杂度,YOLOv2的作者最终选择了K=5个先验框。