ai分类评估指标详解(AI目标检测中Anchor的本质分析)

『运筹OR帷幄』原创作者:董云龙,现在小编就来说说关于ai分类评估指标详解?下面内容希望能帮助到你,我们来一起看看吧!

ai分类评估指标详解(AI目标检测中Anchor的本质分析)

ai分类评估指标详解

『运筹OR帷幄』原创

作者:董云龙

董云龙,华中科技大学在读博士生,研究方向:数据科学、人工智能。

编者按

现在Anchor的机制本质上,就是一堆变scale和ratio的滑动窗口,只不过通过CNN的Dense Map Prediction的方式整个嵌入到一个end2end的框架里面了。其实最重要的核心还是弄懂CNN网络的输入与输出的shape,输入是图片、输出的是一个表示各个Anchor的classification和localization的预测值。弄懂anchor的本质对理解现阶段的先进目标检测算法有巨大的帮助。

物体检测(object detection)是计算机视觉中的经典问题之一,其任务是用矩形框去标出图像中物体的位置,并给出物体的类别。object detection的应用非常广泛,比如可以应用在自动驾驶(车辆检测、行人检测与交通标志检测等),安防领域(人脸检测,火焰烟雾检测,安全帽检测与口罩检测等),以及在工业场合下的瑕疵检测(钢材质量检测,纺织品检测与手机点胶检测等)。

随着深度学习的发展,大量优异的目标检测算法被提出,其中肯定不得不提到非常有名的Faster-RCNN系列以及YOLO系列。这两个系列在发展的过程中,都不约而同的采用了Anchor机制, 这是一个在最开始非常难以理解的概念。这个Anchor在Faster RCNN上面也叫reference boxes,也就是参考框。参考框的意思肯定是会带来先验的知识。首先考虑目标检测的任务,输入图片,输出的是包含目标类别的矩形框(Bounding Boxes,一般缩写为bbox)具体可以看下图:

那么一个比较核心的问题,就是这个框的形状和大小,对应的就是在各种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打败。其具体的流程如下:

生成图像金字塔,因为待检测的物体的scale是变化的

用滑动窗口在图片金字塔上面滚动生成很多候选区域(如下面动图所示)

各种特征提取(hog)和分类器(svm)来对上面产生的候选区域中的图片信息来分类(比如:是否为人脸)

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的预测。

下图是人脸检测的一个效果图:

参考文献:

1、强烈推荐Retina-Face的代码:

supernotman/RetinaFace_Pytorchgithub.com

2、Retina-Face的论文:

http://arxiv.org/pdf/1905.00641.pdfarxiv.org

3、参考教程:

http://www.datacamp.com/community/tutorials/object-detection-guidewww.datacamp.com

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页