一.锚框(anchor box)/先验框(prior bounding box)

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

1.锚框的作用

对于目标检测任务,有这样一种经典解决方案:遍历输入图像上所有可能的像素框,然后选出正确的目标框,并对位置和大小进行调整就可以完成目标检测任务。这些进行预测的像素框就叫锚框。这些锚框通常都是方形的。

同时,为了增加任务成功的几率,通常会在同一位置设置不同宽高比的锚框(本文的方式在改变宽高比的同时维持面积不变)。此处注明,锚框的设置形式有很多,本文采用SSD的方式进行解释。

2.特征图中的锚框

如果按照上述方案不加改变的执行,即使是一张图片所产生的锚框将多到我们难以承受的地步。对于一个224x224的图片,假设每个位置设置3个不同尺寸的先验框,那么就有224x224x3=150528个锚框;这个数量太大了!所以,更好的处理方式是先对原图进行下采样处理,得到feature map,在feature map中生成锚框。以vgg16的backbone为例,把224x224的输入图片下采样了5次,得到7x7的feature map,那就只需要得到7x7x3=147个先验锚框,这样的设置大大减少了先验框的数量,同时也能覆盖大多数情况。

3.先验框与IOU

在训练任务阶段,可以在输入图片中插入正确的目标框,以供网络学习ground truth信息。而判断一个锚框是否与目标框相近的指标,很自然的可以选择锚框和目标框的IOU(交并比)。 例如,可以设定一个阈值0.5,如果iou<0.5的先验框,这些框我们将其划分为背景,设为背景框,Iou>=0.5的被归到目标先验框。示例见下图

二.先验框的参数

如先前所述,一般会在同一位置生成不同形状和大小的多个锚框来增加预测的成功率。形状和大小分别用宽高比和尺度来描述。

1.尺度(scale)与宽高比(ratio)

尺度:描述基准锚框的大小信息。若尺度为a,那么基准锚框由原图的宽和高分别缩小a倍所得。(注意,若宽高缩小为a倍,面积缩小 a 2 a^2 a2倍)
宽高比:生成锚框的形状信息,即最终生成锚框的宽和长的比。在改变宽高比时,应应维持最终生成的锚框和基准锚框的面积恒定。(详见第3个小标题锚框的坐标描述)

2.锚框的生成位置

如前文所述,先把原图像处理后得到77的feature map,再在对应的feature map中生成锚框。下面给出一个示例,对应的把77的feature map 分割成相等大小的7*7的cell,代表位置信息,并画出了在中间位置的具有不同scale 和 ratio 参数的9个锚框。(注意,这里的cell只代表位置信息,与第一个小标题中的scale参数没有关系,即与生成锚框的大小没关系)
对于锚框的位置描述,一般采用中心位置的坐标,所以应在对应cell的坐标上+0.5。例如,假设上图中画出9个anchors的cell对应的坐标是(3,3),那么anchor的中心坐标应当是(3.5,3.5)

3.生成锚框的参数描述

我们可以用锚框的中心坐标和锚框的宽和高来描述一个锚框。
中心坐标已经在第二个标题中描述过了,不再赘述。介绍宽和高的计算。
假设基准锚框的宽和高是a和b,最终生成锚框的宽和高为x和y,宽高比为k。那么应该有 a ∗ b = x ∗ y a*b=x* y a∗b=x∗y 和 y / x = k y/x=k y/x=k 解方程即可得 x = ( a ∗ b ) / k , y = a ∗ b ∗ k x=\sqrt{(a*b)/k},y=\sqrt{a*b*k} x=(a∗b)/k ​,y=a∗b∗k ​

那么最终生成的锚框可以描述为:
(中心横坐标,中心纵坐标,锚框的宽,锚框的高)

三.分类头和回归头

针对一个目标框,我们生成很多先验框并选取了一个IOU最大的先验框。接下来需要网络对这个先验框的类别做出预测,然后对先验框的位置和大小进行修改。

1.分类头

关于分类框的类别信息,以VOC数据库为例,共有20个类别;此外,我们还需要人为地加入一个背景框类别,一共21个类别需要预测,这种预测被称为分类头预测。

2.回归头

对于位置信息的预测,我们并不对锚框的绝对位置信息做预测,而是对位置锚框相对于目标框的偏差信息做预测,而且这种偏差信息需要经过某种方式的归一化。对这种经过归一化的位置偏差信息做出的预测,叫做回归头预测。

3.边界框的编码

对于位置信息的归一化处理,还可以叫做边界框的编码。此处介绍SSD中的编码方法。
下图中有一个先验框和一个目标框,并结合此图介绍对先验框的编码。


公式如下:

4.解码

解码只需要依据公式反向进行即可。

四.维度分析

假设输入的图像像素为224x224,经过VGG的预处理之后,会输出7x7的特征图,然后我们把特征图放入卷积层分别进行分类头和回归头训练。
基于上面的描述,输出的第一维和第二维即为7x7,而第三维和卷积处理方式有关,下面进行解释。
假设我们:

  • 设置3种不同的尺度:0.2, 0.4, 0.6
  • 设置3种不同的长宽比:1:1, 1:2, 2:1

那么在同一位置,我们将会生成33=9个不同形状大小的锚框。
在分类头中,我们需要预测21个类别,因此,分类头的第三维大小为:21
9=189。整个分类头的维度为:7x7x189。
在回归头中:我们需要预测4个位置信息,所以,回归头的第三维大小为:4*9=36。整个回归头的维度为:7x7x36。
最后, 我们还希望做一些特别的处理,因为我们每个anchor的预测独自成一维,因此,最终结果为:

  • 分类头 batch_size x 441 x 21
  • 回归头 batch_size x 441 x 4

本文参考:
https://datawhalechina.github.io/dive-into-cv-pytorch/#/chapter03_object_detection_introduction/3_3

锚框(anchor box)/先验框(prior bounding box)概念介绍及其生成相关推荐

  1. YOLO-先验框/anchor(锚点)

    目标检测网络(Faster RCNN.SSD.YOLO v2&v3等)中,均有先验框的说法,Faster RCNN中称之为anchor(锚点),SSD称之为prior bounding box ...

  2. 3.3 锚框 or 先验框

    3.3.1 关于先验框 在众多经典的目标检测模型中,均有先验框的说法,有的paper(如Faster RCNN)中称之为anchor(锚 点),有的paper(如SSD)称之为prior boundi ...

  3. 【目标检测】概念理解:region proposal、bounding box、anchor box、ground truth、IoU、NMS、RoI Pooling

    最近刚接触图像识别,理解一些概念十分困难,尤其是动不动就冒出个看不懂的英语,让人抓狂.查了不少资料后做一个总结并加上一些自己的理解,理解若有误,烦请大家指出,相互学习. 本文主要对region pro ...

  4. 饭后时间(四)---SSD先验框的尺寸及计算源码(含代码ssd_anchor.py)

    b站:连翘春风冻傻抱蚁人https://www.bilibili.com/video/av45660456 net-> ssd_vgg_300.py 本文研究核心 准备先验框的尺寸:因为SSD在 ...

  5. Bounding box regression RCNN系列网络中矩形框的计算

    0. bounding-box regression bouding-box regression 在R-CNN论文附录C中有详细的介绍,在后续的论文Fast-RCNN.Faster-RCNN.Mas ...

  6. 理解与总结:YOLOv1中候选框(Bounding Box或者Predict Box)——纯文字真的很干

    各位CV伙伴估计已经看了很多网上许多关于YOLO1的博客,在这里我推荐路过的朋友可以参考以下链接,有一定基础再来看我的这个博客.因为我参考了前人的知识再做的总结,有些小的基础的概念没有详细解释. 参考 ...

  7. 动手学CV-目标检测入门教程3:锚框(anchor)

    3.3 锚框 or 先验框 本文来自开源组织 DataWhale

  8. Ray-AABB问题:判断线段是否相交于轴对齐边界框(Axially Aligned Bounding Box, AABB)

    摘要 Ray-AABB问题:判断线段是否相交于轴对齐边界框(Axially Aligned Bounding Box, AABB) 本文介绍了slab算法的实现,从一个简单实现开始,逐步优化slab算 ...

  9. 【目标检测】在图像上画bounding box框,生成带真实标签gt的图片

    [目标检测]在图像上画bounding box框,生成带真实标签gt的图片 问题/Motivation 数据格式 用到的库 实际代码` 结果展示 问题/Motivation 在制作完数据集后,想看一下 ...

最新文章

  1. 快手用旺旺瓶子做机器人_用平底锅做西多士,早餐不发愁,孩子三天两头点名吃,简单快手...
  2. DHCP之一 DHCP的部署安装
  3. python corr画图_用一张很丑的图学习Python数据可视化基础--热力图
  4. 让 Chrome 崩溃的一行 CSS 代码
  5. C#中的函数参数能不能有默认值的解决方法
  6. centos7将网卡名字改成eth样式
  7. oracle11g设置数据库归档,oracle_Oracle11g RAC开启关闭、设置归档小结,关闭 1.先关数据库: 复制代 - phpStudy...
  8. C/C++中关于qsort的使用
  9. JDK 5.0 中的泛型类型学习
  10. 几种数据库快速csv入库方式整理
  11. 【vue】elementUI报错:_self.$scopedSlots.default is not a function
  12. 商汤物语:全球最大AI独角兽的雄心与优雅
  13. python基础教程菜鸟教程-python菜鸟教程官网
  14. 工具分享:易读文档下载器(同时支持百度/豆丁)
  15. win10内置ubuntu, 启动时提示“指定的网络名不再可用”无法启动解决办法
  16. 云服务器发现安全漏洞怎么解决?
  17. 小小故事--大大道理
  18. python 发送短信验证码
  19. win10家庭组(win10家庭组共享打印机)
  20. Hydro李天放:为了区块链我曾拒绝了李开复

热门文章

  1. NB-IOT技术 UP模式 和CP模式,用户面和控制面,数据面
  2. 小程序canvas 2d 自定义字体
  3. Bi-cubic interpolation
  4. 解决IDEA 2017.3.1安装出现NSIS错误的问题
  5. Java开发(一)概述
  6. linux hive查询数据类型,04-hive的数据类型
  7. GITHUB开源SpringBoot2.0权限管理系统
  8. php 等比缩放类,php等比缩放图片
  9. collate utf8_bin是什么意思
  10. 质谱及其数据分析处理(串联质谱及联用技术)