自适应锚框计算

预定义边框就是一组预设的边框,在训练时,以真实的边框位置相对于预设边框的偏移来构建(也就是我们打下的标签)

训练样本。 这就相当于,预设边框先大致在可能的位置“框“出来目标,然后再在这些预设边框的基础上进行调整

一个Anchor Box可以由:边框的纵横比和边框的面积(尺度)来定义,相当于一系列预设边框的生成规则,根据Anchor Box,可以在图像的任意位置,生成一系列的边框

由于Anchor box 通常是以CNN提取到的Feature Map 的点为中心位置,生成边框,所以一个Anchor box不需要指定中心位置。

Faster R-CNN 定义三组纵横比ratio = [0.5,1,2]和三种尺度scale = [8,16,32],可以组合处9种不同的形状和大小的边框。

也就是说,ratio定义的是横纵比,scale是边框的面积

Anchor Box的生成是以CNN网络最后生成的Feature Map上的点为中心的(映射回原图的坐标),以Faster R-CNN为例,使用VGG网络对对输入的图像下采样了16倍,也就是Feature Map上的一个点对应于输入图像上的一个16×16的正方形区域(感受野)。根据预定义的Anchor,Feature Map上的一点为中心 就可以在原图上生成9种不同形状不同大小的边框,如下图:

从上图也可以看出为什么需要Anchor。根据CNN的感受野,一个Feature Map上的点对应于原图的16×1616×16的正方形区域,仅仅利用该区域的边框进行目标定位,其精度无疑会很差,甚至根本“框”不到目标。 而加入了Anchor后,一个Feature Map上的点可以生成9中不同形状不同大小的框,这样“框”住目标的概率就会很大,就大大的提高了检查的召回率;再通过后续的网络对这些边框进行调整,其精度也能大大的提高。

Faster R-CNN进行Anchor Box生成的Feature Map是原图下采样16倍得到的,这样不同的长宽比实际上是将面积为16×16的区域,拉伸为不同的形状,如下图:

也就是说只是中心点一样,面积一样,形状发生了改变

不同的ratio生成的边框的面积是相同的,具有相同的大小。三种不同的面积(尺度),实际上是将上述面积为16×1616×16的区域进行放大或者缩小。
128×128128×128是16×1616×16放大8倍;256×256256×256是放大16倍;512×512512×512则是放大32倍。如下图:

边框计算

在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框

在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数

在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。

但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。

当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭

问题1:为什么需要anchor box?

要了解为什么需要anchor box需要首先了解一下在此之前的一些目标识别方法。

1.滑动窗口

这是比较原始的目标检测方法,给定一个固定尺寸的窗口,根据设定的步伐,一步一步的从左至右、从上至下滑动,把每个窗口输入到卷积神经网络中进行预测和分类,这样做有两个缺点:

  • 由于窗口尺寸固定,因此不适合形变较大的物体
  • 窗口较多,运算量大

2.区域建议

这是R-CNN系列中核心的思想,以Faster R-CNN为例,模型中使用了两个神经网络,一个是是CNN,一个是RPN(Regional Proposal),区域建议网络不负责图像的分类,它只负责选取出图像中可能属于数据集其中一类的候选区域。接下来就是把RPN产生的候选区域输入到分类网络中进行最终的分类。

3.anchor box

anchor box第一次是出现在Faster R-CNN的论文里,要理解anchor box 首先要理解两个问题。

*为什么提出anchor box?*

主要有两个原因:

  • 一个窗口只能检测一个目标
  • 无法解决多尺度问题。

以往的模型一个窗口只能预测一个目标,把窗口输入到分类网络中,最终得到一个预测概率,这个概率偏向哪个类别则把窗口内的目标预测为相应的类别,例如在图中红色框内回归得到的行人概率更大,则认为这个目标为行人。此外,在解决多尺度问题时主要采用一种思想–金字塔,或者是例如DPM模型中经典的特征金字塔。在不同分辨率的特征图下检测不同尺寸的目标。但是这样存在一个问题,就是大大的增加了计算量。

*为什么使用不同尺寸和不同长宽比?*

为了得到更大的交并比(intersection over union, IOU)。

以训练阶段为例。

对于计算机视觉,比较容易理解的是==真实标签(ground truth),==人为为每个目标标记的标签。但是在加入anchor box思想之后,在训练集中,我们将每个锚框视为一个训练样本。因此,为了训练目标模型,需要标记每个anchor box的标签,这里的标签包括两个部分:

  • 类别标签
  • 偏移量

有多个anchor box,到底该选取哪一个呢?这是就要通过交并比进行选择。试想一下,如果用一个固定尺寸的anchor,那么对于anchor的标记就没有了针对性。

举例说明一下,图中棕色的为行人的真实标签,黄色的为车辆的真实标签,红色的框是从feature map映射的anchor box,这样的话通过交并比就很难获取feature map中每个单元对应的标签。

这样的话,可以用anchor box1与行人的交并比比较大,可以用于训练和预测行人,anchor box 2与汽车的交并比较大,可以用于训练和预测汽车。使用不同长宽比和尺寸的anchor box,这样更加具有针对性。

anchor box的尺寸该怎么选择?

目前anchor box的选择主要有三种方式:

  • 人为经验选取
  • k-means聚类
  • 作为超参数进行学习

问题2:anchor box用在哪个阶段?

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

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

1.训练阶段

主要理解训练阶段,训练的时候其实已经打好了锚框,也就是说,在实际预测的时候会生成多个锚框,然后通过迭代是的我们的损失函数最小,让预测的框与之前输入的锚框尽可能相一致

标注

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

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

使用最大交并比(IOU)

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

假设图像中有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mljoanLP-1656498816746)(https://www.zhihu.com/equation?tex=n_a)] 个anchor box,有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F46Sle0g-1656498816746)(https://www.zhihu.com/equation?tex=n_b)] 个真实边界框,这样的话就形成了一个anchor box与真实边界框之间的对应关系矩阵 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mLJgJmcd-1656498816746)(https://www.zhihu.com/equation?tex=X%5Cin+R%5E%7Bn_a%5Ctimes+n_b%7D)] ,那么就根据这个对应关系找出与每个anchor box交并比最大的真实边界框,然后真实边界框的标签作为anchor box的标签,然后计算anchor box相对于真实边界框的偏移量。

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

训练

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

在经过一系列卷积和池化之后,在feature map层使用anchor box,如上图所示,经过一系列的特征提取,最后针对 !3x3 的网格会得到一个 3x3x2x8 的特征层,其中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原文中采用的损失函数为:

L({pi},{ti})=1Ncls∑iLcls(pi,pi∗)+λ1Nreg∑ipi∗Lreg(ti,ti∗)L\left(\left\{p_{i}\right\},\left\{t_{i}\right\}\right)=\frac{1}{N_{c l s}} \sum_{i} L_{c l s}\left(p_{i}, p_{i}^{*}\right)+\lambda \frac{1}{N_{r e g}} \sum_{i} p_{i}^{*} L_{r e g}\left(t_{i}, t_{i}^{*}\right) L({pi​},{ti​})=Ncls​1​i∑​Lcls​(pi​,pi∗​)+λNreg​1​i∑​pi∗​Lreg​(ti​,ti∗​)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufnHnN9r-1656498816747)(https://zhongsy.oss-cn-beijing.aliyuncs.com/img/equation-20220629182732731)] 是类别损失, pi∗p_{i}^{*}pi∗​ 是真实标签,如果是正样本,标注为1,如果是负样本标注为0。同理, Lreg(ti,ti∗)>L_{r e g}\left(t_{i}, t_{i}^{*}\right)>Lreg​(ti​,ti∗​)>为位置偏移损失, ti∗t_{i}^{*}ti∗​是真实边框相对于anchor box的4个参数化坐标的向量,训练的最终目标就是使得损失函数 L({pi},{ti})L\left(\left\{p_{i}\right\},\left\{t_{i}\right\}\right)L({pi​},{ti​}) 最小化,这样会得到使得预测类别 pip_ipi​ 、预测偏移量 $t_i $与真实标注最佳拟合模型参数。

2.预测阶段

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

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

*怎么理解NMS?*

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

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

anchor自适应锚框计算相关推荐

  1. YOLOv7自适应锚框计算

    # 从utils.autoanchor 导入kmean_anchors函数 import utils.autoanchor as autoAnchor'''path: 储存yaml文件路径,yaml文 ...

  2. 【转载】白话谈anchor(锚点)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_43013761/arti ...

  3. 深度解剖(5):白话谈anchor(锚点),不懂来找我!

    以下是我个人关于深度学习的所有见解,其后会对深度学习思想,正反向传播,损失函数,正则惩罚,梯度下降,矩阵求导,网络搭建,等等都进行详细的讲解!只有你想不到的,没有我讲不到的.让我用最通俗的语言,为你留 ...

  4. NB-IOT: Anchor Carrier 锚点载波

    Anchor Carrier定义: Anchor carrier:in NB-IoT, a carrier where the UE assumes that NPSS/NSSS/NPBCH/SIB- ...

  5. 链接标签(anchor)和锚点定位

    一.链接标签 HTML中创建超链接只需要用标签环绕需要被链接的对象即可,基本原格式如下: <a href="跳转目标" target="目标窗口的弹出方式" ...

  6. cocos2d anchor point 锚点解析

    anchor point 究竟是怎么回事? 要解释anchorPoint首先需要理解cocos2d里的坐标系统.在cocos2d中有两个坐标系统,一个是touch input使用的,屏幕坐标系统,其原 ...

  7. anchor base和anchor free, 小物体检测, YOLO V1-3 9000 V4 V5 的区别,yolov5-8, yolox创新点

    文章目录 Anchor base和Anchor Free的区别: 如何增强模型对小物体的检测效果 Yolo基本思想 不同版本的Yolo网络差异 YOLO V1 YOLO V2 YOLO9000 YOL ...

  8. Yolov5总结文档(理论、代码、实验结果)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Mr.Hang@知乎 来源丨https://zhuanlan.zhihu.com/p/44925 ...

  9. CV 面试问题详解宝典—目标检测篇

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨那年当上博士前 来源丨AI约读社 编辑丨极市平台 导读 面试知识点总结 序言 目标检测篇面试知识 ...

最新文章

  1. 爱情也许是最忧伤的童话
  2. OenLDAP 配置记录
  3. 低学历程序员的红利来了,这个政策来的太惊喜!
  4. SAP UI5 初学者教程之十一 :SAP UI5 容器类控件 Page 和 Panel 试读版
  5. 实用素材模板|常见的UI设计手法
  6. 生意场逃不开三个关键词:留存、转化、数据
  7. svn创建tag包的简单流程
  8. ArrayList如何实现增删元素及其缺陷
  9. 回头再说-006 时间音乐
  10. Atitit code 范例 example code 范例 example 更好一些,将最佳实践融入其中。。目录第一章 Springboot 1第二章 Rest api 1第一节
  11. 网络爬虫(网络蜘蛛)之网页抓取
  12. 递归算法经典实例 java_java实现的经典递归算法三例
  13. 南卡和声阔蓝牙耳机哪个比较好用?降噪效果好的蓝牙耳机推荐
  14. 学习笔记之 初试Linux遇到的问题
  15. Ubuntu下将dmg文件转换成dcr和ISO文件
  16. 卡西欧计算器说明书获取方法
  17. Visual Studio 2019背景美化(背景透明化+自定义背景图片)
  18. 织梦全自动php采集插件下载,织梦dedecms自动采集伪原创处理插件-织梦插件
  19. hive中文繁简转化opencc4j
  20. 前端请柬框架_mpvue+小程序云开发,纯前端实现婚礼邀请函(相册小程序)

热门文章

  1. 什么是车载智能系统测试?
  2. 爬自己的微信好友遇到的问题
  3. 你家乡的美食和特色小吃有哪些?
  4. axios----异步请求的库
  5. android设备离线授权方案,adb-Android Studio-设备已连接但“离线”
  6. 当NAT遇到PPTP
  7. 华捷艾米a200摄像头_华捷艾米:3D MR打破行业边界,优化产业结构,让生活更美好...
  8. java泛型之自限定类型和参数协变
  9. java调用ecdh_java – BouncyCastle ECDH密钥协议失败
  10. Codeforces Gym 101158E Infallibly Crack Perplexing Cryptarithm Gym [语法分析]