计算机视觉-5.锚框

 

目标检测算法

目标检测算法中,通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含所感兴趣的目标,并调整区域边界从而更加准确地预测目标的真实边界框(ground-truth bounding box)。

基于锚框的目标检测算法

也有不基于锚框的目标检测算法,但是基于锚框的目标检测算法占主流。
以每个像素为中心,生成多个缩放比(scale)和宽高比(aspect ratio)不同的边界框(这里的以每个像素点为中心指的是锚框中心点的像素,当中心位置给定时,已知宽和高的锚框是确定的)。关于生成多个锚框:
假设输入图像的高度为h,宽度为w。 我们以图像的每个像素为中心生成不同形状的锚框:缩放比为s(0,1],宽高比为r>0。 那么锚框的宽度和高度分别是hsrhs/r。 请注意,当中心位置给定时,已知宽和高的锚框是确定的。

要生成多个不同形状的锚框,让我们设置许多缩放比(scale)取值s1,....,sn和许多宽高比(aspect ratio)取值r1,....,rm。 当使用这些比例和长宽比的所有组合以每个像素为中心时,输入图像将总共whnm有个锚框。 尽管这些锚框可能会覆盖所有真实边界框,但计算复杂性很容易过高。 在实践中,我们只考虑包含s1r1的组合:

(s1,r1),(s1,r2),,(s1,rm),(s2,r1),(s3,r1),,(sn,r1).
也就是说,以同一像素为中心的锚框的数量是n+m1。 对于整个输入图像,将共生成wh(n+m1)个锚框。
image

  • 锚框和边缘框的区别:边缘框bounding box指的是所标号的真实物体的位置;锚框anchor box指的是算法对边缘框,也就是物体真实位置的猜测
  • 提出多个被称为锚框的区域
  • 预测每个锚框里是否含有关注的物体
  • (因为算法本身并不知道边缘框,也就是标号物体真实的位置,如果直接对位置进行预测,预测边缘框的四个坐标值的话相对来讲比较困难,所以一般算法的操作是先提出一些框,然后首先判断这些框中是否包含目标物体,如果确定包含目标物体的话,接下来预测基于该锚框相对于边缘框的偏移,也就是说基于锚框的目标检测不是直接对边缘框的四个坐标值进行预测,而是先提出一些锚框,然后等到差不多包含目标物体的时候,再对锚框进行调整到边缘框的位置)
  • 所以整个过程包含两次猜测:
    • 类别:预测锚框中所包含物体的类别
    • 位置:预测锚框到边缘框的位置偏移

此时我们就需要一个工具来算锚框和真实边缘框之间的相似度

IoU-交并比

image

  • 用于衡量锚框和真实边缘框之间的相似度,两个框之间的交集与两个框的并集的比值
  • 取值范围[0,1]:0表示没有重叠;1表示完全重合(越接近1,两个框的相似度越高)
    它是Jacquard指数的特殊情况(给定两个集合,Jacquard指数表示两个集合的交集和两个集合的并集之间的比值)
    image
    如果将任何边界框的像素区域中的像素看成是集合中的元素,每个框就可以看成是像素的集合,IoU就等价于Jacquard指数

在训练数据中标注锚框

在训练集中,将每个锚框视为一个训练样本,为了训练目标检测模型,需要每个锚框的类别(class,与锚框相关的对象的类别)和偏移量(offset,真实边缘框相对于锚框的偏移量)标签

在预测的时候,首先为每个图像生成多个锚框,预测所有锚框的类别和偏移量,根据预测的偏移量调整它们的位置以获得预测的边缘框,最后只输出符合特定条件的预测边缘框

  • 基于锚框的目标检测是首先提出多个锚框,然后对锚框是否包含所感兴趣的物体以及锚框相对于边缘框的偏移进行预测,所以在训练的时候,每一个锚框是一个训练样本
  • 对于每一个锚框来说,要么被标注成背景(不包含所感兴趣的物体,只包含背景),要么关联上一个真实的边缘框(锚框所框住的物体的标号与所关联的边缘框所包含的物体的标号相同;锚框相对于边缘框的偏移就是相对于它所关联的边缘框的偏移,这个偏移量根据锚框和真实边缘框中心坐标的相对位置以及这两个框的相对大小进行标记)
  • 鉴于数据集内不同的框的位置和大小不同,可以对那些相对位置和大小应用变换,使其获得分布更均匀且易于拟合的偏移量
  • 一般来讲算法会生成大量的锚框,而只有少量的边缘框,绝大部分锚框都是背景,背景类别的锚框通常被称为“负类”锚框,其余的被称为“正类”锚框

如何赋予锚框标号?

步骤:
给定图像,假设锚框是A1,A2,,Ana(a个锚框),真实边界框是B1,B2,,Bnb(b,b),其中。 让我们定义一个矩阵XRna×nb,其中第i行、第j列的元素xij是锚框Ai和真实边界框Bj的IoU。 该算法包含以下步骤。

  1. 在矩阵X中找到最大的元素,并将它的行索引和列索引分别表示为i1j1。然后将真实边界框Bj1分配给锚框Ai1。这很直观,因为Ai1Bj1是所有锚框和真实边界框配对中最相近的。在第一个分配完成后,丢弃矩阵中i1th行和j1th列中的所有元素。

  2. 在矩阵X中找到剩余元素中最大的元素,并将它的行索引和列索引分别表示为i2j2。我们将真实边界框Bj2分配给锚框Aj2,并丢弃矩阵中i2th行和j2th中的所有元素。

  3. 此时,矩阵X中两行和两列中的元素已被丢弃。我们继续,直到丢弃掉矩阵X中列中nb的所有元素。此时已经为这nb个锚框各自分配了一个真实边界框。

  4. 只遍历剩下的nanb个锚框。例如,给定任何锚框Ai,在矩阵X的第ith行中找到与Ai的IoU最大的真实边界框Bj,只有当此IoU大于预定义的阈值时,才将Bj分配给Ai

例如:
下图中的方格表示一个矩阵:4列表示4个边缘框(可以看成4个物体,4个框),9行表示9个锚框,每一个小方格中的值表示对应的锚框与边缘框的交并比
image
然后将整个矩阵中最大的值挑选出来(假设是x23),那么就会将边缘框3中的标号给锚框2,并删除x23所在的行和列的其他值
image
再在剩下的矩阵元素中寻找最大值(假设是x71),则此时会将锚框7与边缘框1关联起来,同理删除掉x71所在的行和列的其他元素
image

以此类推,直到将所有的边缘框与对应的锚框关联起来,找出x54x92
image

使用非极大值抑制(non-maximum suppression,NMS)输出

image

在预测时会为图像生成多个锚框,然后再为这些锚框逐个预测类别和偏移量,一个预测好的边界框是根据其中某个带有预测偏移量的锚框而生成的。所以最终会得到很多相似的具有明显重叠的预测边缘框,而且都是围绕着同一个目标,因此需要对这些相似的框进行剔除,最终保留下来比较干净的预测输出结果
NMS也是剔除方法之一,首先选中所有预测框中非背景类的最大预测值(对类的预测的softmax值,越接近于1置信度越高),然后去掉所有其它和它IoU值大于θ的预测值(也就是去掉和最大预测值相似度比较高的其它锚框),重复这个过程,直到所有的预测框要么被选中,要么被去掉,最终得到一个比较干净的输出(NMS的输出)

在执行非极大值抑制前,可以将置信度较低的预测边缘框移除,从而减少算法中的计算量;也可以对非极大抑制的输出结果进行后处理,比如只保留置信度更高的结果作为最终输出

NMS举个例子:
image

从所有的边界框中挑一个最大的,然后将他保留下来。然后将其他的框和最大的这个进行交并比的计算。如果交并比的数值超过了0.5说明这些框和黄色框的重叠率很高,他们指向的可能是同一个目标。然后可以将交并比取值较大的框进行抑制,最后就输出这个黄色的。
image
下面我们看看这个算法过程:
image
假设每个网格的输出为:

[pcbxbybhbw]

  1. 丢弃所有:pc<0.6的边界框
  2. while循环,遍历所有剩余的边界框:
    2.1 取一个pc最大的边界框,记作max bounding box,作为预测输入
    2.2删除与max bounding box交并比IoU>=0.5的边界框(抑制)
posted @   lipu123  阅读(241)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示