YOLO (You only look once)介绍

本文介绍目标检测经典快速算法YOLO的原理与方法

Ref:Redmon, Joseph, et al. "You Only Look Once: Unified, Real-Time Object Detection." (2015):779-788.

0. 目标检测基础知识

0.0 标签定义方法

目标检测包括分类与定位两个任务,在深度学校中通常采用多任务学习进行预测。下面以三分类(人、车、摩托)举例:

其标签形式为:

其中Pc=1时代表有三类中的目标,否则为背景(此时其他值可以随机设定)如;C1-C3对应三类目标;(Bx,By)为目标框中心点位置,(Bh,Bw)为目标框的长和宽,目标框的四个参数皆为小数,我们将input的长和宽归一化至0~1,这样可以加快训练速度。标签形式如下:

0.1 传统CNN滑动框目标检测方法

从图片中依次滑动目标框送入CNN中:

更改目标框大小继续滑动:

计算成本太高,而且有大量冗余计算。

0.2滑动窗口的卷积实现(Convolutional implementation of sliding windows)

参考论文:Sermanet, Pierre, et al. "OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks." Eprint Arxiv (2013).

该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算,就像这里我们看到的这个4个14×14的方块一样。

我们可以对整张图片进行卷积操作,一次得到所有预测值,如果足够幸运,神经网络便可以识别出汽车的位置。以上就是在卷积层上应用滑动窗口算法的内容,它提高了整个算法的效率。不过这种算法仍然存在一个缺点,就是边界框的位置可能不够准确。

0.3交并比

1.YOLO算法

1.0 从输出分析

YOLO算法输出19*19*5*8的结果向量,我们以3*3*5*8举例。其将原始图片分割为3*3大小9个区域,目标中心点所在区域规定为该区域存在目标。每个区域预测5*8个向量,这里先解释8维向量,即

示意图如下:

注意bw、bh在目标大于单个框时会大于1:

1.1非极大值抑制(Non-max suppression)

算法不是对某个对象检测出一次,而是检测出多次。非极大值抑制这个方法可以确保你的算法对每个对象只检测一次。

假设你需要在这张图片里检测行人和汽车,你可能会在上面放个19×19网格,理论上这辆车只有一个中点,所以它应该只被分配到一个格子里,左边的车子也只有一个中点,所以理论上应该只有一个格子做出有车的预测。

实践中当你运行对象分类和定位算法时,对于每个格子都运行一次,所以这个格子(编号1)可能会认为这辆车中点应该在格子内部,这几个格子(编号2、3)也会这么认为。对于左边的车子也一样,所以不仅仅是这个格子,如果这是你们以前见过的图像,不仅这个格(编号4)子会认为它里面有车,也许这个格子(编号5)和这个格子(编号6)也会,也许其他格子也会这么认为,觉得它们格子内有车。

注意每一类单独进行NMS,按照该类得到的Pc*Ci计算可信度得分:对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框,用非极大值抑制来处理行人类别,用非极大值抑制处理车子类别,然后对摩托车类别进行非极大值抑制,运行三次来得到最终的预测结果。现在要实现非极大值抑制,你可以做的第一件事是(1-2),去掉所有可信度小于阈值的边界框。一般设置为0.6、0.7。其次(2-3),找到得分最大的(亮),计算其余框与其交并比,去除重合度高的(暗)。以此迭代,直至无框。

1.2Anchor Boxes

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

anchor box的思路是,这样子,预先定义两个不同形状的anchor box,或者anchor box形状,你要做的是把预测结果和这两个anchor box关联起来。一般来说,你可能会用更多的anchor box,可能要5个甚至更多,但对于这个视频,我们就用两个anchor box,这样介绍起来简单一些。那么标签变为:2*8=16维。这就是YOLO算法中19*19*5*8中5*8的原因。

现在每个对象都和之前一样分配到同一个格子中,分配到对象中点所在的格子中,以及分配到和对象形状交并比最高的anchor box中。所以这里有两个anchor box,你就取这个对象,如果你的对象形状是这样的(编号1,红色框),你就看看这两个anchor boxanchor box 1形状是这样(编号2,紫色框),anchor box 2形状是这样(编号3,紫色框),然后你观察哪一个anchor box和实际边界框(编号1,红色框)的交并比更高,不管选的是哪一个,这个对象不只分配到一个格子,而是分配到一对,即(grid cell,anchor box)对,这就是对象在目标标签中的编码方式。

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

总得来说,相比于r-cnn系列,YOLO不需要提取候选区域一步做完,在我看来,是长远而言更有希望的方向。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值