深度学习笔记(39) Anchor Boxes


1. 一个格子多个对象检测问题

到目前为止学到的对象检测中的一个问题是
对象检测中存在的一个问题是每个格子只能检测出一个对象

在这里插入图片描述
假设有这样一张图片,对于这个例子,继续使用3×3网格
注意行人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中
所以对于那个格子,如果 y 输出这个向量如上图
可以检测这三个类别,行人、汽车和摩托车,它将无法输出检测结果
如果想让一个格子检测出多个对象,可以使用anchor box这个概念


2. Anchor box

上述问题必须从两个检测结果中选一个
在这里插入图片描述
而anchor box的思路是这样子的
预先定义两个不同形状的anchor box,或者anchor box形状
要做的是把预测结果和这两个anchor box关联起来
一般来说,可能会用更多的anchor box,可能要5个甚至更多
但对于这个图片,就用两个anchor box,这样介绍起来简单一些

要做的是定义类别标签
用的向量不再是 [pc bx by bh bw c1 c2 c3]T
而是重复两次:[pc bx by bh bw c1 c2 c3 pc bx by bh bw c1 c2 c3]T

在这里插入图片描述
前面的pc,bx,by,bh,bw,c1,c2,c3(绿色方框标记的参数)是和anchor box 1关联的8个参数
后面的8个参数(橙色方框标记的元素)是和anchor box 2相关联

在这里插入图片描述
因为行人的形状更类似于anchor box 1的形状,而不是anchor box 2的形状
所以可以用这8个数值(前8个参数),这么编码pc=1,代表有个行人
用bx,by,bh和bw来设置行人的边界框
然后用c1,c2,c3(c1=1,c2=0,c3=0)来说明这个对象是个行人

然后是车子,因为车子的边界框比起anchor box 1更像anchor box 2的形状,就可以这么编码
这里第二个对象是汽车,然后有这样的边界框等等
这里所有参数都和检测汽车相关(pc=1,bx,by,bh,bw,c1=0,c2=1,c3=0)


3. 对象形状交并比

在这里插入图片描述
总结一下,用anchor box之前,做的是
对于训练集图像中的每个对象,都根据那个对象中点位置分配到对应的格子中
所以输出y就是3×3×8,因为是3×3网格
对于每个网格位置,都有输出向量
包含pc,然后边界框参数bx,by,bh和bw,然后c1,c2,c3

现在用到anchor box这个概念,是这么做的
现在每个对象都和之前一样分配到同一个格子中,分配到对象中点所在的格子中
以及分配到和对象形状交并比最高的anchor box中

如果对象形状是编号1(红色框),就看看这两个anchor box
anchor box 1形状是编号2(紫色框),anchor box 2形状是这样(编号3,紫色框)
然后观察哪一个anchor box和实际边界框(编号1,红色框)的交并比更高

但不管选的是哪一个,这个对象不只分配到一个格子
而是分配到一对,即(grid cell,anchor box)对
这就是对象在目标标签中的编码方式

所以现在输出 y 就是3×3×16,现在是16维的
或者也可以看成是3×3×2×8,因为现在这里有2个anchor box,而 y 是8维的
如果有更多对象,那么y 的维度会更高


3. 一个格子一个对象检测问题

使用了anchor box,但现在其中一个格子有车,没有行人
在这里插入图片描述
如果它里面只有一辆车,那么假设车子的边界框形状更像anchor box 2
如果这里只有一辆车,行人走开了
那么anchor box 2分量还是一样的

要记住 y向量是对应anchor box 2的分量和anchor box 1对应的向量分量
anchor box 1对应的向量分量要填的就是,里面没有任何对象
所以 pc=0,然后剩下的就是 don’t care-s (即?)


4. 额外的细节

现在还有一些额外的细节,如果有两个anchor box
但在同一个格子中有三个对象,这种情况算法处理不好
希望这种情况不会发生,但如果真的发生了,这个算法并没有很好的处理办法

对于这种情况,就引入一些打破僵局的默认手段
还有这种情况,两个对象都分配到一个格子中
而且它们的anchor box形状也一样,这是算法处理不好的另一种情况

需要引入一些打破僵局的默认手段,专门处理这种情况
希望数据集里不会出现这种情况,其实出现的情况不多
所以对性能的影响应该不会很大

建立anchor box这个概念,是为了处理两个对象出现在同一个格子的情况
实践中这种情况很少发生,特别是如果用的是19×19网格而不是3×3的网格
两个对象中点处于361个格子中同一个格子的概率很低
确实会出现,但出现频率不高

也许设立anchor box的好处在于anchor box能让学习算法能够更有征对性
特别是如果数据集有一些很高很瘦的对象,比如说行人
还有像汽车这样很宽的对象,这样算法就能更有针对性的处理
这样有一些输出单元可以针对检测很宽很胖的对象,比如说车子
然后输出一些单元,可以针对检测很高很瘦的对象,比如说行人


5. Anchor box的选择

人们一般手工指定anchor box形状,可以选择5到10个anchor box形状
覆盖到多种不同的形状,可以涵盖想要检测的对象的各种形状

还有一个更高级的版本
如果接触过一些机器学习,可能知道后期YOLO论文中有更好的做法
就是所谓的k-平均算法,可以将两类对象形状聚类
如果用它来选择最具有代表性的一组anchor box,可以代表试图检测的十几个对象类别
但这其实是自动选择anchor box的高级方法

如果人工选择一些形状,合理的考虑到所有对象的形状
预计会检测的很高很瘦或者很宽很胖的对象,这应该也不难做


参考:

《神经网络和深度学习》视频课程


相关推荐:

深度学习笔记(38) 非极大值抑制
深度学习笔记(37) 交并比
深度学习笔记(36) 边界框预测
深度学习笔记(35) 滑动窗口的卷积实现
深度学习笔记(34) 目标检测


谢谢!

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氢键H-H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值