目标检测-锚框(先验框)

2021年11月17日 4点热度 0条评论 来源: &刘仔很忙

 在众多经典的目标检测模型中,均有先验框的说法,有的paper(如Faster RCNN)中称之为anchor(锚点),有的paper(如SSD)称之为prior bounding box(先验框),实际上是一个概念。

接下来需要介绍3个概念:

  • 设置不同尺度的先验框
  • 先验框与特征图的对应
  • 先验框类别信息的确定

设置不同尺度的先验框

SSD 算法在先验框匹配上,采用了两个原则:

  • 对于图像中每一个 ground truth 找到与其 IOU 最大的的先验框, 该先验框为正样本, 若一个先验框没有与任何的 ground truth 匹配,则为负样本。
  • 对于剩下的未匹配的先验框,若与某个 ground truth 的 IOU 大于某个阈值(一般取0.5),则该先验框也与 ground truth 匹配

通常,为了覆盖更多可能的情况,在图中的同一个位置,我们会设置几个不同尺度的先验框。这里所说的不同尺度,不单单指大小,还有长宽比,如下面的示意图所示:

可以看到,通过设置不同的尺度的先验框,就有更高的概率出现对于目标物体有良好匹配度的先验框(体现为高IoU)。

先验框与特征图的对应

除了不同尺度,我们肯定要将先验框铺洒在图片中不同位置上面。

但是遍历原图每个像素,设置的先验框就太多了,完全没必要。如图3-13所示。一个224x224的图片,假设每个位置设置3个不同尺寸的先验框,那么就有224x224x3=150528个,但是如果我们不去遍历原图,而是去遍历原图下采样得到的feature map呢?以vgg16的backbone为例,下采样了5次,得到7x7的feature map,那就只需要得到7x7x3=147个先验,这样的设置大大减少了先验框的数量,同时也能覆盖大多数情况。

我们就将先验框的设置位置与特征图建立一一对应的关系。而且,通过建立这种映射关系,我们可以通过特征图,直接一次性的输出所有先验框的类别信息以及坐标信息,而不是想前面一直描述的那样,每个候选框都去独立的进行一次分类的预测,这样太慢了(阅读后面的章节后,你将会深刻理解这段话的含义,以及建立这种一一映射的重要意义)。

先验框类别信息的确定

我们铺设了很多的先验框,我们先要给出这些先验框的类别信息,才能让模型学着去预测每个先验框是否对应着一个目标物体。

这些先验框中有很多是和图片中我们要检测的目标完全没有交集或者有很小的交集,

我们的做法是,设定一个IoU阈值,例如iou=0.5,与图片中目标的iou<0.5的先验框,这些框我们将其划分为背景,Iou>=0.5的被归到目标先验框,通过这样划分,得到供模型学习的ground truth信息,如图

 

我们根据锚框与真实边界框在图像中的位置来分析这些标注的类别。首先,在所有的“锚框—真实边界框”的配对中,锚框\(A_4\)与猫的真实边界框的交并比最大,因此锚框\(A_4\)的类别标注为猫。不考虑锚框\(A_4\)或猫的真实边界框,在剩余的“锚框—真实边界框”的配对中,最大交并比的配对为锚框\(A_1\)和狗的真实边界框,因此锚框\(A_1\)的类别标注为狗。接下来遍历未标注的剩余3个锚框:与锚框\(A_0\)交并比最大的真实边界框的类别为狗,但交并比小于阈值(默认为0.5),因此类别标注为背景;与锚框\(A_2\)交并比最大的真实边界框的类别为猫,且交并比大于阈值,因此类别标注为猫;与锚框\(A_3\)交并比最大的真实边界框的类别为猫,但交并比小于阈值,因此类别标注为背景。

 

 

我们不是直接预测目标框,而是回归对于anchor要进行多大程度的调整,才能更准确的预测出边界框的位置。那么我们的目标就是需要找一种方法来量化计算这个偏差。

对于一只狗的目标边界框和先验框的示例如下图所示:

我们的模型要预测anchor与目标框的偏移,并且这个偏移会进行某种形式的归一化,这个过程我们称为边界框的编码。

这里我们使用的是与SSD完全一致的编码方法,具体公示表达如下:

模型预测并输出的是这个编码后的偏移量(gcx​,gcy​,gw​,gh​),最终只要再依照公式反向进行解码,就可以得到预测的目标框的信息。

anchor box用在哪个阶段?

当然是既用于训练阶段,也用于预测阶段。但问题来了,在训练阶段和预测阶段都是怎么使用的?

前面看的云里雾里的没事,这里详细讲一下。

1.训练阶段

标注

在训练阶段,是把anchor box作为训练样本,为了训练样本我们需要为每个锚框标注两类标签:一是锚框所含目标的类别,简称类别;二是真实边界框相对锚框的偏移量,简称偏移量(offset)。在目标检测时,我们首先生成多个锚框,然后为每个锚框预测类别以及偏移量,接着根据预测的偏移量调整锚框位置从而得到预测边界框,最后筛选需要输出的预测边界框。

已经知道每个目标的ground truth,怎么标注anchor box的标签呢?

使用最大交并比(IOU)

图片来源于动手学深度学习

假设图像中有  个anchor box,有  个真实边界框,这样的话就形成了一个anchor box与真实边界框之间的对应关系矩阵  ,那么就根据这个对应关系找出与每个anchor box交并比最大的真实边界框,然后真实边界框的标签作为anchor box的标签,然后计算anchor box相对于真实边界框的偏移量。

这样的话就标记好了每个anchor box:标签和偏移量。

训练

训练阶段在什么时候触发anchor box?

在经过一系列卷积和池化之后,在feature map层使用anchor box,如上图所示,经过一系列的特征提取,最后针对  的网格会得到一个  的特征层,其中2是anchor box的个数,以《deep learning》课程为例选择两个anchor box,8代表每个anchor box包含的变量数,分别是4个位置偏移量、3个类别(one-hot标注方式)、1个anchor box标注(如果anchor box与真实边框的交并比最大则为1,否则为0)。

到了特征层之后对每个cell映射到原图中,找到预先标注的anchor box,然后计算这个anchor box与ground truth之间的损失,训练的主要目的就是训练出用anchor box去拟合真实边框的模型参数。

看一下损失函数会更加有助于理解这个概念,Faster R-CNN原文中采用的损失函数为:

 

 是类别损失,  是真实标签,如果是正样本,标注为1,如果是负样本标注为0。同理,  为位置偏移损失,  是真实边框相对于anchor box的4个参数化坐标的向量,训练的最终目标就是使得损失函数  最小化,这样会得到使得预测类别  、预测偏移量  与真实标注最佳拟合模型参数。

2.预测阶段

在模型的预测阶段,怎么才能获得预测的边界框呢?

首先在图像中生成多个anchor box,我们根据锚框及其预测偏移量得到预测边界框。。由于阈值和anchor box数量选择的问题,同一个目标可能会输出多个相似的预测边界框,这样不仅不简洁,而且会增加计算量,为了解决这个问题,常用的措施是使用非极大值抑制(non-maximum suppression,NMS)。

怎么理解NMS?

NMS就是一个抑制冗余的反复迭代-遍历的过程。

对于一个预测边界框  ,模型最终会输出会计算它属于每个类别的概率值,其中概率值最大对应的类别就是预测边界框的类别。在同一副图像上,把所有预测边界框(不区分类别)的预测概率从大到小进行排列,然后取出最大概率的预测边界框  作为基准,然后计算剩余的预测边界框与  的交并比,如果大于给定的某个阈值,则将这个预测边界框移除。这样的话保留了概率最大的预测边界框并移除了其他与其相似的边界框。接下来要做的就是从剩余的预测边界框中选出概率值最大的预测边界框  计算过程重复上述的过程。

 

参考文章:

SSD中的先验框:https://zhuanlan.zhihu.com/p/79854543

锚框综述:https://zhuanlan.zhihu.com/p/63024247

目标检测基础:https://www.cnblogs.com/hichens/p/12354999.html

    原文作者:&刘仔很忙
    原文地址: https://blog.csdn.net/lzw66666/article/details/111396532
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。