2020-9-11 吴恩达DL学习-C4 卷积神经网络-第三周 目标检测(3.9 YOLO 算法--Bounding Box+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.9 YOLO 算法 Putting it together: YOLO algorithm

我们已经学到对象检测算法的大部分组件了,在本节课里,我们会把所有组件组装在一起构成YOLO对象检测算法。
在这里插入图片描述

观察上图,我们先看看如何构造你的训练集。假设你要训练一个算法去检测三种对象,行人、汽车和摩托车,你还需要显式指定完整的背景类别。这里有3个类别标签,如果你要用两个anchor box,那么输出 y y y 的维度就是3×3×2×8,其中

  • 3×3表示3×3个网格,
  • 2是anchor box的数量,
  • 8是向量维度,
    • 8实际上先是5( p c p_c pc b x b_x bx b y b_y by b h b_h bh b w b_w bw
    • 再加上类别的数量( c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3)。

你可以将它看成是3×3×2×8,或者3×3×16。要构造训练集,你需要遍历9个格子,然后构成对应的目标向量。
在这里插入图片描述

先看看左上角第一个格子,里面没什么有价值的东西,行人、车子和摩托车,三个类别都没有出现在左上格子中,所以对应那个格子目标 y y y 就是这样的, y = [ 0 ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ] y=\begin{bmatrix} 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ \end{bmatrix} y=0???????0???????,第一个anchor box的 p c p_c pc 是0,因为没什么和第一个anchor box有关的,第二个anchor box的 p c p_c pc 也是0,剩下这些值是不需要关注。
在这里插入图片描述

3x3网格中大多数格子都是空的,但第三排第二个格子会有这个目标向量 y y y y = [ 0 ? ? ? ? ? ? ? 1 b x b y b h b w 0 1 0 ] y=\begin{bmatrix} 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ 1 \\ b_x \\ b_y \\ b_h \\ b_w \\ 0 \\ 1 \\ 0 \\ \end{bmatrix} y=0???????1bxbybhbw010

如上图,假设你的训练集中,对于车子有这样一个红色边界框,水平方向更长一点。所以如果图中这是你的anchor box,包括anchor box 1(竖向)和anchor box 2(横向),然后红框和anchor box 2的交并比更高,那么车子就和向量的下半部分相关。

要注意,这里和anchor box 1有关的 p c p_c pc 是0,剩下这些分量都是不用关注,然后你的anchor box 2 中 p c = 1 p_c=1 pc=1,然后你要用( b x b_x bx b y b_y by b h b_h bh b w b_w bw)来指定红边界框的位置,然后指定它的正确类别是2( c 1 = 0 c_1=0 c1=0 c 2 = 1 c_2=1 c2=1 c 3 = 0 c_3=0 c3=0),对吧,这是一辆汽车。
在这里插入图片描述

如上图,你这样遍历3×3网格9个格子的所有位置,你会得到一个16维向量,所以最终输出尺寸就是3×3×16。和之前一样,简单起见,我在这里用的是3×3网格,实践中用的可能是19×19×16,或者需要用到更多的anchor box,可能是用了5个anchor box,19×19×5×8,即19×19×40。这就是训练集,然后你训练一个CNN,输入是图片,可能是100×100×3,然后你的卷积网络最后输出尺寸是:在我们例子中是3×3×16或者3×3×2×8。

接下来我们看看你的算法是怎样做出预测的。
在这里插入图片描述

输入图像,你的NN的输出尺寸是这个3×3×2×8,对于9个格子,每个都有对应的向量 y y y。对于左上的格子,那里没有任何对象,那么我们希望你的NN在图中右边蓝色向量的2个 p c p_c pc里是0,然后我们输出一些值,你的NN不能输出问号,不能输出don’t care-s,剩下的我输入一些数字,但这些数字基本上会被忽略,因为NN告诉你,那里没有任何东西,所以输出是不是对应一个类别的边界框无关紧要,所以基本上是一组数字,多多少少都是噪音。
在这里插入图片描述

和左上角格子的边界框不大一样,希望第三行第二个格子的输出 y y y,形式是如上图右边绿色向量,对于anchor box1来说 p c p_c pc是0,然后就是一组数字,就是噪音。希望你的算法能输出一些数字,可以对车子指定一个相当准确的边界框,这就是NN做出预测的过程。

最后你要运行一下非极大值抑制,为了让内容更有趣一些,我们看看一张新的测试图像。
在这里插入图片描述

如果你使用两个anchor box,那么对于9个格子中任何一个都会有两个预测的边界框,其中一个的概率 p c p_c pc很低。但9个格子中,每个都有两个预测的边界框。
在这里插入图片描述

比如说我们得到的边界框是是如上图这样的,注意有一些边界框可以超出所在格子的高度和宽度。接下来你抛弃概率很低的预测,去掉这些连NN都说,这里很可能什么都没有。结果如下图。
在这里插入图片描述

最后,如果你有三个对象检测类别,你希望检测行人,汽车和摩托车,那么你要做的是,对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框,用非极大值抑制来处理行人类别,用非极大值抑制处理车子类别,然后对摩托车类别进行非极大值抑制,运行三次来得到最终的预测结果。
在这里插入图片描述

所以算法的输出最好能够检测出图像里所有的车子,还有所有的行人。

这就是YOLO对象检测算法,这实际上是最有效的对象检测算法之一,包含了整个计算机视觉对象检测领域文献中很多最精妙的思路。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值