深度学习笔记(40) YOLO


1. YOLO对象检测算法

之前已经学到对象检测算法的大部分组件:

博文组件作用
深度学习笔记(32) 目标定位目标定位标记目标位置
深度学习笔记(33) 特征点检测特征点检测设定特征点
深度学习笔记(34) 目标检测滑动窗口目标检测在图片中检测到目标
深度学习笔记(35) 滑动窗口的卷积实现卷积实现减少计算成本
深度学习笔记(36) 边界框预测YOLO分配给包含对象中点的格子输出最精准的边界框
深度学习笔记(37) 交并比交并比IoU评价对象检测算法
深度学习笔记(38) 非极大值抑制非极大值抑制确保算法对每个对象只检测一次
深度学习笔记(39) Anchor BoxesAnchor Boxes确保算法一个格子能检测多个对象

现在把所有组件组装在一起构成和优化之前提及到的 YOLO对象检测算法


2. 构造训练集

先看看如何构造训练集
在这里插入图片描述
假设要训练一个算法去检测三种对象,行人、汽车和摩托车
还需要显式指定完整的背景类别

这里有3个类别标签,如果要用两个anchor box
那么输出 y 就是3×3×2×8
其中3×3表示3×3个网格,2是anchor box的数量,8是向量维度
8实际上先是5(pc,bx,by,bh,bw)再加上类别的数量3(c1,c2,c3
可以将它看成是3×3×2×8,或者3×3×16
要构造训练集,需要遍历9个格子,然后构成对应的目标向量y

在这里插入图片描述
anchor box 1(编号4),anchor box 2(编号5)如图所示

先看看第一个格子(编号1)
里面没什么有价值的东西,行人、车子和摩托车,三个类别都没有出现
所以对应那个格子目标y=[0 ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ?]T
第一个anchor box的 pc 是0,因为没什么和第一个anchor box有关的
第二个anchor box的 pc 也是0,剩下这些值是don’t care-s

现在网格中大多数格子都是空的
但那里的格子(编号2)会有这个目标向量y,y=[0 ? ? ? ? ? ? ? 1 bx by bh bw 0 1 0]T
所以假设训练集中,对于车子有这样一个边界框(编号3),水平方向更长一点

然后红框和anchor box 2的交并比更高
那么车子就和向量的下半部分相关

要注意,这里和anchor box 1有关的 pc 是0,剩下这些分量都是don’t care-s
然后第二个 pc=1,然后要用这些(bx,by,bh,bw)来指定红边界框的位置
然后指定它的正确类别是2(c1=0,c2=1,c3=0),这是一辆汽车

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


3. 预测

接下来算法是怎样做出预测的

输入图像,神经网络的输出尺寸是这个3××3×2×8,对于9个格子,每个都有对应的向量
对于左上的格子(编号1),那里没有任何对象
那么希望神经网络在那里(第一个pc)输出的是0,这里(第二个pc)是0
然后输出一些值,神经网络不能输出问号,不能输出don’t care-s,剩下的输入一些数字
但这些数字基本上会被忽略,因为神经网络告诉你,那里没有任何东西
所以输出是不是对应一个类别的边界框无关紧要
所以基本上是一组数字,多多少少都是噪音(输出 y 如编号3所示)。

在这里插入图片描述
和这里的边界框不大一样,希望y的值
那个左下格子(编号2)的输出y(编号4所示),形式是
对于边界框1来说(pc)是0,然后就是一组数字
就是噪音,anchor box 1对应行人
此格子中无行人,pc=0,bx=?,by=?,bh=?,bw=?,c1=?c2=?,c3=?

希望算法能输出一些数字
可以对车子指定一个相当准确的边界框,anchor box 2对应汽车
此格子中有车,pc=1,bx,by,bh,bw,c1=0,c2=1,c3=0
这就是神经网络做出预测的过程


3. 非极大值抑制

最后要运行一下非极大值抑制
看看一张新的测试图像
这就是运行非极大值抑制的过程

如果使用两个anchor box
那么对于9个格子中任何一个都会有两个预测的边界框,其中一个的概率pc很低
但9个格子中,每个都有两个预测的边界框

在这里插入图片描述
比如说得到的边界框如图,注意有一些边界框可以超出所在格子的高度和宽度(编号1所示)
接下来抛弃概率很低的预测,去掉这些连神经网络都说,这里很可能什么都没有
所以需要抛弃这些(编号2所示)

最后,如果有三个对象检测类别,希望检测行人,汽车和摩托车
那么要做的是,对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框
用非极大值抑制来处理行人类别,用非极大值抑制处理车子类别,然后对摩托车类别进行非极大值抑制
运行三次来得到最终的预测结果
所以算法的输出最好能够检测出图像里所有的车子,还有所有的行人(编号3所示)

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


参考:

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


相关推荐:

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


谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

氢键H-H

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

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

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

打赏作者

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

抵扣说明:

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

余额充值