欢迎光临散文网 会员登陆 & 注册

42 锚框【动手学深度学习v2】

2022-03-10 09:44 作者:如果我是泡橘子  | 我要投稿

锚框(Anchor box)


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



基于锚框的目标检测算法


  • 也有不基于锚框的目标检测算法,但是基于锚框的目标检测算法占主流
  • 以每个像素为中心,生成多个缩放比(scale)宽高比(aspect ratio)不同的边界框(这里的以每个像素点为中心指的是锚框中心点的像素,当中心位置给定时,已知宽和高的锚框是确定的)


关于生成多个锚框:

  • 锚框的宽度和高度分别是 w * s * sqrt(r) 和 h * s / sqrt(r),可得锚框的面积是 w * h * s ^2,因为 s ∈(0,1],可以得到锚框的最大面积是 w * h,也就是输入图像的面积(锚框的宽度和高度的表达式好像有错误,欢迎小伙伴指出)
  • 这里的 n + m - 1 的意思是:在实践中,只考虑包含 s1 或者 r1 的组合,s1 和 m 个宽高比共有 m 个组合,r1 和 n 个缩放比共有 n 个组合,这两种情况中(s1,r1)重复算了一次,所以最终以同一个像素为中心的锚框数量是 n + m - 1,因为输入图像的高度为 h ,宽度为 w,所以输入图像总共有 m * n 个像素,因此对于整个输入图像,总共生成了 w * h * (n + m - 1) 个锚框



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


整个过程中包含两次预测:

  • 类别:预测锚框中所包含物体的类别
  • 位置:预测锚框到边缘框的位置偏移





IoU-交并比



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





在训练数据中标注锚框


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


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


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


如何赋予锚框标号?


  • 目标检测的训练集中带有真实边界框的位置以及其所包围物体类别的标签,所以如果要标记所生成的锚框,可以参考分配到的最接近此锚框的真实边界框的位置和类别标签


步骤:



锚框 P1 - 09:19


  • 上图中的方格表示一个矩阵:4列表示4个边缘框,9行表示9个锚框,每一个小方格中的值表示对应的锚框与边缘框的交并比
  • 然后将整个矩阵中最大的值挑选出来(假设是x23),那么就会将边缘框3中的标号给锚框2,并删除x23所在的行和列的其他值
  • 在剩下的矩阵元素中寻找最大值(假设是x71),则此时会将锚框7与边缘框1关联起来,同理删除掉x71所在的行和列的其他元素
  • 以此类推,直到将所有的边缘框与对应的锚框关联起来,找出x54和x92
  • 赋予锚框标号的算法不止上面这一种



关于锚框的生成

  • 固定生成
  • 根据图片生成锚框





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



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





总结


  • 目前主流的目标检测算法都是基于锚框来预测的
  • 首先以图像的每个像素为中心生成大量不同形状的锚框(不同的算法生成锚框的方法不同),并对每个锚框赋予标号(对锚框赋予标号的方法也有很多种),这样每个锚框就会有一个类别标号相对与边缘框的偏移,因此每个锚框可以作为一个样本进行训练
  • 交并比用于衡量两个边界框的相似性,它等于两个边界框像素区域的交集并集之间的比值
  • 在训练集中,需要给每个锚框两种类型的标签:1、锚框中目标检测的类别;2、锚框相对于真实边缘框的偏移量
  • 在预测的时候会对每个锚框进行预测,会生成大量冗余的预测,可以使用NMS来去掉冗余的预测,从而简化输出





Q&A


  • 1、到底是用C++还是python用于三维视觉,主要取决于产品的芯片性能,可以这么理解吗?
    
    QA P3 - 00:00
    


  • 2、算法能不能仅通过视频(2D)来推测视频中物体的前后关系(3D)?
    
    QA P3 - 00:21
    


  • 3、怎么算锚框框住了一个物体呢?阈值怎么确定?
    
    QA P3 - 00:42
    


  • 4、这里一个锚框只能对应一个真实框吗?
    
    QA P3 - 00:55
    


  • 5、为什么要生成多个训练样本?直接从一张图上不同位置CROP多次出来不行吗?
    
    QA P3 - 01:19
    


  • 6、为什么用锚框后再识别边缘框效果比直接识别边缘框效果更好?理论上不应该步骤越少误差累计越少吗?
    
    QA P3 - 01:38
    


  • 7、不使用anchor box的算法怎样进行目标的判断?
    
    QA P3 - 01:56
    


  • 8、最大的预测值,指的是分类的置信度,还是锚框预测的置信度?这两个置信度是混在一起预测的吗?
    
    QA P3 - 02:14
    

锚框预测没有置信度,只有分类有置信度(锚框是一个回归问题,是没有置信度的)


  • 9、如果识别狗之后还需要对狗内部进行进一步分类,比如大狗和小狗。这时对大狗和小狗的识别正确率是不是肯定低于对整体狗的预测?如果是进一步预测狗头和狗尾巴呢?
    
    QA P3 - 02:44
    


  • 10、nms是不是和标负类差不多?
    
    QA P3 - 03:32
    


  • 11、标记锚框之后,偏移是怎么计算的呢?怎么根据锚框,变换到边缘框?
    
    QA P3 - 03:40
    


  • 12、每次做nms时,是只针对相同类别(只对狗)做循环过滤去除,还是对不同类别(比如猫和狗)都做过滤去除?
    
    QA P3 - 04:18
    


  • 13、一阶段算法是不是就是锚框和分类同时预测,二阶段算法就是分开预测?
    
    QA P3 - 05:05
    


  • 14、为什么每个像素5个锚框?为什么是单个像素级别的?一个锚框不是包含很多个像素吗?
    
    QA P3 - 05:21
    


  • 15、assign_anchor_to_box函数中的真实边缘框是从哪里得到的?既然不知道真实的边缘框在什么位置,又怎么计算出每个锚框的IoU呢?
    
    QA P3 - 05:55
    


  • 16、锚框的宽度和高度分别是w*s*sqrt(r)和h*s/sqrt(r)是怎么计算的呢?
    
    QA P3 - 07:11
    


  • 17、蓝色、紫色、淡蓝色三个框都是0.75,都一样好?怎么再进一步比较呢?根据模型预测的分类置信度?为什么狗没有更好的锚框来表示他呢?只有一个小锚框
    
    QA P3 - 08:14
    


  • 18、为什么要给每个像素做锚框?能合并像素来减少吗?
    
    QA P3 - 08:45
    


  • 19、锚框的损失高数怎么定义?标记框里面东西是什么的时候用图片分类么?
    
    QA P3 - 08:59
    


  • 20、目标检测的loss是怎么计算呢?是看锚框跟实际框的坐标偏差吗?
    
    QA P3 - 09:10
    


  • 21、两个真实框离得很近或者重叠的时候怎么办呢,比如一个行人站在一辆汽车前面,或者两个离得很近的人?
    
    QA P3 - 09:23
    


  • 22、能根据特征点筛选像素再进行添加锚框吗?
    
    QA P3 - 10:10
    





----end----

其他参考:

1、《动手学深度学习》,课程安排,https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_8.pdf

2、《动手学深度学习》,https://zh-v2.d2l.ai/chapter_computer-vision/anchor.html

42 锚框【动手学深度学习v2】的评论 (共 条)

分享到微博请遵守国家法律