4

computer vision笔记:anchor box

 2 years ago
source link: https://gsy00517.github.io/computer-vision20200128162333/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

computer vision笔记:anchor box

发表于 2020-01-28 | 更新于: 2020-02-01 | 分类于 人工智能 | 0 | 阅读次数:
字数统计: 1.7k字 | 阅读时长 ≈ 6分钟

之前在deep-learning笔记:着眼于深度——VGG简介与pytorch实现一文中提到了anchor box这一个概念,在我阅读YOLO的论文时,也遇到了这个名词。搞懂之后觉得还是写一下比较好。


bounding box的向量表示

在目标检测和目标跟踪等领域中,对于目标物体的位置和大小我们往往会使用bounding box来框出表示(有时为方便也简写为Bbox,注意不是那个打节拍的口技虽然我也在学哈哈)。下面以目标检测为例,介绍一下如何用向量表示bounding box。
我们一般取图片的左上角为(0,0),取图片的右下角为(1,1)。假如现在我们要对下面这个图像中的目标进行检测,检测该图中是否存在三大将即黄猿、赤犬、青雉。

我们可以使用这样一个8维的向量来表示图片中红色框即输出的bounding box。

其中$p_{c}$表示的是识别目标存在的概率,这里可以简化成1(存在目标)和0(不存在目标)。倘若$p_{c}=0$,也就是认为识别区域中不存在目标,那么向量中后面的7个参数就都是无意义项(don’t cares)。

注意:因为没有进行分割,这里的识别区域是整个图像,而在实际应用中往往进行了较为精细地分割以提高检测效果。

$b_{x}$和$b_{y}$指的是目标所在中心点的坐标,也就是bounding box的中点坐标。注意,这两个坐标的取值必须为0到1之间的数,且坐标系取图片的左上角为(0,0),取图片的右下角为(1,1),千万别搞错了。
$b_{h}$和$b_{w}$指的是bouding box占识别区域总长、宽的比值,在这个例子中取值在0到1之间,但要注意的是,它们的取值也可以超过1,也就是物体的大小超出了识别区域(这在分割图像后可能发生,可以看一下后文图例)。这就相当于以每个识别区域为单位1,我觉得这也是为什么之前设定坐标系时取右下角为(1,1)而不是其他数值的原因之一吧。
这个用于表示bounding box的向量的长度可以这样来计算:length = 5 + 待检测目标类别的总数。这时因为这里的$c_{1}c_{2}c_{3}$采用的是one-hot编码,当$p_{c}=1$时,这三个参数有且仅有一个值为1,即一个bounding box只能表示一个目标。比如bounding box中圈出的是赤犬,那么我们就可以将$c_{1}c_{2}c_{3}$表示为010。
以上文中的图片为例,其bounding box的向量表示应该如下所示。


anchor box

上文提到,我们可以将图像进行分割,以提高检测的效果。注意,这些分割是隐式的。在YOLO等algorithm中,一般有这样的规则,即物体的中心点在哪一个格子内,哪一个格子就负责检测这个物体。这就会导致一个问题。由于我们的检测方式是每一个识别区域(即分割的格子)都只输出一个向量表示其中的bounding box或者不存在目标($p_{c}=0$),因此当检测格子分割得较少时,可能会存在两个目标物体的中点同属一个格子而只能表示出一个物体的问题。这就需要引入anchor box。

比如在上图中,我们对图像进行3x3的分割,假如我们要识别汽车、人、汽车人这三类物体(也就是说要用到8维的向量),而汽车和人的中点都位于同一个格子中。这时再用之前的方法是无法同时识别人和汽车的。这时,我们可以预先定义两个不同形状的anchor box。

注意:在实际应用中往往会指定更多个anchor box。

此时,每个格子的输出向量就要表示成如下形式。此时向量的长度就要这样来计算:length = (5 + 待检测目标类别的总数) x anchor数

为了好看,我们用转置表示。

这里前8个参数是和竖着的anchor box1相关联的,后8个参数是和横着的anchor box2相关联的。
这样,anchor box1与人更近似,我们就用前8个参数标注人的bounding box,anchor box2与汽车更接近,我们就用后8个参数标注汽车的bounding box。此时这里的$b_{h}$和$b_{w}$指的就是anchor box之于格子的比值。因此,我们可以通过增加不同长宽比和尺寸的anchor box使得检测更加具有针对性。
倘若这张图片种只有汽车,那么我们选择与汽车的IoU(交并比)最大的anchor box。比如这里我们就是将第一个$p_{c}$设为0,随后的7个参数都成了无意义项,第二个$p_{c}$设为1,用最后的7个参数标注汽车也就是anchor box2。
一般情况下,我们可以通过更精细地分割图片来大大降低同一格子中同时出现两个物体的中点的可能。不过anchor box还有更多不错的效果值得借鉴,比如可以在目标跟踪中应对目标尺度大小的变化。


关于如何选取anchor box,主要有三种方法:

  1. 人为经验选取

    当我们知道需要预测的目标类型时,我们往往可以合理地使用人工指定的方法设置一系列anchor box。比如设置扁而宽的用于检测汽车,设置长而窄的用于检测人,设置高而大的用于检测汽车人。
  2. 这种方法在后期YOLO论文中有很好的使用,即利用机器学习中的k-means算法,将两类对象形状进行聚类,选择最具有代表性的一组anchor box来代表我们试图检测的一组对象类别。
  3. 作为参数学习

    即作为参数学习。

碰到底线咯 后面没有啦

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK