2020-9-10 吴恩达DL学习-C4 卷积神经网络-第三周 目标检测(3.8 Anchor Boxes-处理识别两个对象出现在同一个格子)

274 篇文章 24 订阅
233 篇文章 0 订阅

1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

3.8 Anchor Boxes

到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象,如果你想让一个格子检测出多个对象,你可以这么做,就是使用anchor box这个概念,我们从一个例子开始讲吧。
在这里插入图片描述

如上图,假设你有这样一张图片,我们使用3×3网格,注意行人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中。所以对于那个格子,输向量 y = [ p c b x b y b w b h c 1 c 2 c 3 ] y= \begin{bmatrix} p_c \\ b_x \\ b_y \\ b_w \\ b_h \\ c_1 \\ c_2 \\ c_3 \\ \end{bmatrix} y=pcbxbybwbhc1c2c3,如果你要检测这三个类别,行人、汽车和摩托车,它将无法输出检测结果,所以我必须从两个检测结果中选一个。
在这里插入图片描述

而anchor box的思路是这样子,如上图,预先定义两个不同形状的anchor box,或者anchor box形状,你要做的是把预测结果和这两个anchor box关联起来。一般来说,你可能会用更多的anchor box,可能要5个甚至更多,但对于本节课,我们就用两个anchor box,这样介绍起来简单一些。

你要做的是定义类别标签,用的向量不再是上面这个 [ p c b x b y b w b h c 1 c 2 c 3 ] \begin{bmatrix} p_c \\ b_x \\ b_y \\ b_w \\ b_h \\ c_1 \\ c_2 \\ c_3 \\ \end{bmatrix} pcbxbybwbhc1c2c3

而是重复两次, [ p c b x b y b w b h c 1 c 2 c 3 p c b x b y b w b h c 1 c 2 c 3 ] \begin{bmatrix} p_c \\ b_x \\ b_y \\ b_w \\ b_h \\ c_1 \\ c_2 \\ c_3 \\ p_c \\ b_x \\ b_y \\ b_w \\ b_h \\ c_1 \\ c_2 \\ c_3 \\ \end{bmatrix} pcbxbybwbhc1c2c3pcbxbybwbhc1c2c3

其中上半部分是和anchor box 1关联的8个参数,下半部分的8个参数是和anchor box 2相关联。
在这里插入图片描述

因为行人的形状更类似于anchor box 1的形状,而不是anchor box 2的形状,所以你可以用上半部分8个数值,这么编码 p c = 1 p_c=1 pc=1代表有个行人,用 b x b_x bx b y b_y by b w b_w bw b h b_h bh来编码包住行人的边界框,然后用( c 1 = 1 c_1=1 c1=1 c 2 = 0 c_2=0 c2=0 c 3 = 0 c_3=0 c3=0)来说明这个对象是个行人。

然后是车子,因为车子的边界框比起anchor box 1更像anchor box 2的形状,你就可以这么编码,这里第二个对象是汽车,然后有这样的边界框等等,这里所有参数都和检测汽车相关( p c = 1 p_c=1 pc=1 b x b_x bx b y b_y by b w b_w bw b h b_h bh c 1 = 0 c_1=0 c1=0 c 2 = 1 c_2=1 c2=1 c 3 = 0 c_3=0 c3=0)。

在这里插入图片描述

对比

总结一下,用anchor box之前,你做的是,对于训练集图像中的每个对象,都根据那个对象中点位置分配到对应的格子中,所以输出 y y y就是3×3×8,因为是3×3网格,对于每个网格位置,我们有输出向量,包含 p c p_c pc,然后边界框参数 b x b_x bx b y b_y by b w b_w bw b h b_h bh,然后 c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3

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

所以这里有两个anchor box,而你取的对象,如果你的对象形状是如上图中的红色框,你就看看这两个anchor box。anchor box 1形状是如竖向紫色框,anchor box 2形状是横向紫色框,你观察哪一个anchor box和对象实际边界框(红色框)的交并比更高。

不管选的是哪一个,这个对象不只分配到一个格子,而是分配到一对,即(格子和anchor box)对,这就是对象在目标标签中的编码方式。所以现在输出 y y y就是3×3×16,前面的介绍中你们看到 y y y 现在是16维的,或者你也可以看成是3×3×2×8,因为现在这里有2个anchor box,如果你有更多对象,那么 y y y 的维度会更高。

再回到本课的例子中。
在这里插入图片描述

对于行人更类似于anchor box 1的形状(竖向矩形),所以对于行人来说,我们将她分配到向量 y y y的上半部分。 p c = 1 p_c=1 pc=1,有一个边界框包住行人,如果行人是类别1,那么 c 1 = 1 c_1=1 c1=1 c 2 = 0 c_2=0 c2=0 c 3 = 0 c_3=0 c3=0

而车子的形状更像anchor box 2(横向矩形),所以这个向量下半部分是 p c = 1 p_c=1 pc=1 ,然后和车相关的边界框,然后 c 1 = 0 c_1=0 c1=0 c 2 = 1 c_2=1 c2=1 c 3 = 0 c_3=0 c3=0
在这里插入图片描述

现在其中一个格子有车,没有行人,如果它里面只有一辆车,那么假设车子的边界框形状是像anchor box 2(横向矩形),那么anchor box 2分量还是一样的。而anchor box 1分量里面没有任何对象,所以 p c = 0 p_c=0 pc=0,然后剩下的就不需要关心。

现在还有一些额外的细节

  • 如果你有两个anchor box,但在同一个格子中有三个对象,这种情况算法不好处理。你希望这种情况不会发生,但如果真的发生了,这个算法并没有很好的处理办法,对于这种情况,我们就引入一些打破僵局的默认手段。
  • 还有这种情况,两个对象都分配到一个格子中,而且它们的anchor box形状也一样,这是算法处理不好的另一种情况,你需要引入一些打破僵局的默认手段,专门处理这种情况,希望你的数据集里不会出现这种情况,其实出现的情况不多,所以对性能的影响应该不会很大。

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

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

最后,你应该怎么选择anchor box呢?

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

还有一个更高级的版本,我就简单说一句,你们如果接触过一些ML,可能知道后期YOLO论文中有更好的做法,就是所谓的k-平均算法,可以将两类对象形状聚类,如果我们用它来选择一组anchor box,选择最具有代表性的一组anchor box,可以代表你试图检测的十几个对象类别,但这其实是自动选择anchor box的高级方法。如果你就人工选择一些形状,合理的考虑到所有对象的形状,你预计会检测的很高很瘦或者很宽很胖的对象,这应该也不难做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值