目标检测中Anchor的本质分析

极市平台

共 1535字,需浏览 4分钟

 ·

2020-11-24 16:22

↑ 点击蓝字 关注极市平台

作者丨东林钟声@知乎
来源丨https://zhuanlan.zhihu.com/p/84398108
编辑丨极市平台

极市导读

 

本文以人脸识别为例解释了目标检测中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



推荐阅读





    添加极市小助手微信(ID : cvmart2),备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳),即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群:月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~

    △长按添加极市小助手

    △长按关注极市平台,获取最新CV干货

    觉得有用麻烦给个在看啦~  


    浏览 19
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    分享
    举报
    评论
    图片
    表情
    推荐
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    分享
    举报