目标检测中Anchor的本质分析
极市导读
本文以人脸识别为例解释了目标检测中Anchor的本质,也就是多尺度的滑动窗口。通过与传统的detection的做法进行比较凸显Anchor的优点,文末还附有Retina-Face的代码链接以及相关论文。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
在object detection的一些非常有名的model上面,有一个最开始非常难以理解的概念----Anchor。这个Anchor在Faster RCNN上面也叫reference boxes,也就是参考框。参考框的意思肯定是会带来先验的知识。首先考虑目标检测的任务,输入图片,输出的是包含目标类别的矩形框(Bounding Boxes)具体可以看下图:
那么一个比较核心的问题,就是这个框的形状和大小,对应的就是在各种anchor-based的文章里面提的非常多的ratio和scale。ratio很简单,就是长宽之比(1:1,1:2, 2:1....),scale可以理解为边长。那为什么会有Anchor这种东西?其起到的作用是什么?其实Anchor的本质就是多尺度的滑动窗口(sliding window in multi-scale)。好像现在还没有人这样去理解他,下面具体来分析。
首先看下传统的detection是怎么做的,比如haar、hog特征的人脸、行人、车辆检测。这些方法是在CNN-based之前的主流方法,只不过后来被CNN打败。其具体的流程如下:
1.生成图像金字塔,因为待检测的物体的scale是变化的
2.用滑动窗口在图片金字塔上面滚动生成很多候选区域(如下面动图所示)
3.各种特征提取(hog)和分类器(svm)来对上面产生的候选区域中的图片信息来分类(比如:是否为人脸)
4.NMS非极大值抑制得到最后的结果
那么CNN以其强大的特征提取能力,自然而然的可以替代步骤3。但是由于步骤1和2的存在是独立于CNN之外,而且需要大量的循环遍历,速度受到了限制。而且要想好的定位精度,必须有比较多的scale和ratio不同的滑窗,这样又增加了时间。那么在深度学习中,我们总是在讲end2end,那么怎么把1/2步骤融合进去?其实在窗口滑动的时候,本质是一个遍历像素的过程,那么我们可以直接为每个像素分配几个不同scale和ratio的窗口矩形,这些矩形的中心都是其所属的像素点。至于scale和ratio的选取,可以根据一些先验知识或者像YOLO-v2一样通过k-means聚类得到。然后每个像素分配几个不同scale和ratio的窗口矩形就是Anchor。其实本质就是把基于像素遍历的一个过程直接分配到每个像素来做,然后CNN是可以直接做基于像素的一个Dense Map的预测的。下面可视化一下Anchor(这里只可视化了200个):
可以看出200个anchor已经基本上覆盖了整个图片了,一般的网络模型的anchor都是在几万个左右,比如Retina-Face的anchor在25000左右。那么我们回到步骤3. 现在就是要用CNN来给这么多个Anchor来分类了,比如是否为人脸。
那么怎么判断这些anchor的分类就比较简单了,就是看这些anchor与给定的矩形框的iou是否满足条件,比如iou>0.5认为是Postive,<0.2认为是Negtive。iou的计算也很简单,如下:
那么我们实际看一张人脸图片中,Postive anchor的可视化情况:
可以看出这些绿色的anchor都是基本上大部分包含了人脸的,是Postive的样本。可以看出这样cnn现在对于分类的基本上没有问题,但是在定位上面会有较大的误差。所以后续还有基于anchor的bbox的坐标的预测,其实本质也是增加CNN的输出的depth,来预测4个值(x, y, w, h)的offset。这个可以详细看下YOLO系列或者Faster RCNN。那么现在anchor的机制本质上,就是一堆变scale和ratio的滑动窗口,只不过通过CNN的Dense Map Prediction的方式整个嵌入到一个end2end的框架里面了。
其实最重要的核心还是弄懂CNN网络的输入与输出的shape
输入是图片、输出的是一个表示各个anchor的classification和localization的预测值
针对人脸检测来看,比如假设有N个anchor,那么输出的shape应该是N*(2 + 4),其中2表示分类的预测,是否为人脸,4表示(x,y,w,h)相对于anchor的offset的预测。
这里强烈推荐Retina-Face的代码:
https://link.zhihu.com/?target=https%3A//github.com/supernotman/RetinaFace_Pytorch
也可以看一下Retina-Face的论文:
https://arxiv.org/pdf/1905.00641.pdfarxiv.org
参考:
https://www.datacamp.com/community/tutorials/object-detection-guidewww.datacamp.com
推荐阅读