Anchor

科普环节

这一节,对目标检测有基本概念的同学别看了,去看下面的正文吧,我是在科普。

anchor或者说anchor box就是一个框。目标检测任务可视化来看就是在图片上把目标用一个框框出来。如下图蓝框把猫给标出来了。


Anchor_第1张图片
目标检测可视化

我们先想一想怎么在图片上确定一个物体的位置,或者说怎么去表示这个框。第一种方法我们叫做绝对坐标,就是用框的四个顶点的坐标确定一个框,还有一种方法是中心点定位,使用框中心点的坐标以及框的高度和宽度来确定一个框。

下图是绝对坐标表示框,其中Xmin,Ymin表示左上顶点的坐标,Xman,Ymax表示右下顶点的坐标。一般目标检测任务数据标注就是这样的,当然也有用四个顶点的坐标来表示(可以表示倾斜框)。

Anchor_第2张图片
绝对坐标表示

下图是中心点定位法。其中Cx,Cy是中心点坐标。w和h是框的宽度和高度。

Anchor_第3张图片
中心点定位法

绝对坐标的形式我估计我因为这样比较好标注,不然确定中心点太麻烦了。而中心点定位法是因为这样去预测框更简单,效果更好。所以在数据处理的时候要对坐标进行转换。当然anchor就是基于中心点位的。

这里是正文环节

一般而言,人类做目标检测是直接看一张图片就可以得到高级语义信息,从而判断这一区域是不是目标。但人工智障不行,它比较笨,只能遍历图片上的每一个位置,判断是不是目标。然后我们考虑到图片上物体的大小,形状有太多太多的可能性,这对目标检测任务造成了很大困扰。凭空直接去预测得到检测框比较困难。(其实这里还可以说目标检测one-stage和two-stage方法,下次我再整理吧)

既然人工智障这么吃力,还是让大佬们帮一帮它。大佬们提出了anchor(锚框)方法。大佬用自己的丰富的经验知道了物体目标可能的尺寸,然后把这些尺寸告诉人工智障,说你从里面挑吧,挑一个好的出来。

以下的图片指的都是feature map(特征图),也就是经过backbone(举例VGG16)之后得到的图片。这里我就不说什么anchor尺度对应原图什么的,那个对于理解anchor的思想并没有什么特别的作用,反而比较绕。

我们现在把目光集中到图片上的一个位置,然后这个位置的坐标配合大佬们预设的w和h,就形成了很多个中心点位置相同的框(这就是anchor),然后现在人工智障的工作是从这些框中挑出一个较好的框。对于图片上的每一个位置都是这么操作。

参考下图,那个黑点就是中心点,然后那些框就是anchor。也就是说对于图片的每一个位置都预设了这么些框。

Anchor_第4张图片
anchor

不过我们觉得有点不服,大佬虽然很厉害,但直接预设的w和h就是精确的框的w和h,那我还是不信的。也就是说anchor是比较粗糙的,它只是大致确定了目标,这时候人工智障就可以发挥作用了,它对于每一个anchor都会输出x,y,w,h四个值(offset, 偏移值),用来修正之前粗糙的anchor得到精确的结果。x偏移就是在水平方向调整框的位置,y是负责竖直方向上的调整,w负责调整框的宽,h调整框的高。

它对于每一个anchor还会输出一个得分(置信度),来表示这个框是不是对的。

总而言之,anchor的思想就是,大佬们先预设好了一堆框,预设了物体可能出现的大致位置和尺寸,然后让人工智障去精细调整这些框。这样比让人工智障直接去预测检测框更加简单,模型表现得效果也更加好。人工智障慢慢变化成了人工智能。

然后我们也可以自己去根据自己的数据集去预设anchor。yolov2开始用的是先对数据集的ground truth聚类得到anchor的尺度。

你可能感兴趣的:(Anchor)