机器学习系列(7):目标检测YOLO算法及Python实现以自动驾驶为例

机器学习系列 (7)

图片挂了,大家可移步:
https://mp.weixin.qq.com/s?__biz=MzU4NTY1NDM3MA==&mid=2247483829&idx=1&sn=47e607838b88ebd87ecb104843ffd69d&chksm=fd8608b8caf181aee143675b16a17111f9bc3bfb2ee18bc2bbebb78e3edf3d42eadafe0092df&token=255604471&lang=zh_CN#rd

目标检测之YOLO算法原理及Python实现

目标检测:

  • 1.目标分类
  • 2.目标定位
  • 3.特征点检测
  • 4.滑动窗口检测
  • 5.卷积的滑动窗口实现

YOLO算法:

  • 1.什么是YOLO
  • 2.边界框(Bounding Box)回归
  • 3.交并比(IOU)
  • 4.非极大抑制(NMS)
  • 5.Anchor box
  • 6.候选区域(Region proposals)(optional)
  • 7.YOLO算法总结

YOLO的Python实现:

  • 见文章内容

申明

本文原理解释及公式推导部分均由LSayhi完成,供学习参考,可传播;代码实现部分的框架由Coursera提供,由LSayhi完成,详细数据及代码可在github查阅。
https://github.com/LSayhi/DeepLearning

CSDN博客:https://blog.csdn.net/LSayhi

微信公众号:AI有点可ai(文末附有二维码,感谢您的关注)

一、目标检测

1.目标分类

  • 目标分类即对图像中的物体进行识别分类,是目标检测的第一阶,只要求分辨出对象的类别,常用卷积神经网络(CNN)实现。例如在自动驾驶应用中,目标分类的作用是识别出图片中的物体属于哪一个类别,属于是行人、汽车、自行车、红绿灯、护栏等。

2.目标定位

  • 目标定位即对图像中的物体进行位置识别,是目标检测的第二阶,要求输出对象的坐标信息,坐标常用中心点和长宽来表示。例如在自动驾驶中,目标定位的作用是确定图片中的行人、汽车等物体的具体位置。

3.特征点检测

  • 特征点检测即要对物体的某些特征进行识别,这可以通过神经网络输出相应特征点的坐标来实现,只需要把网络的输出改为特征点的坐标。例如在人脸识别应用中,识别出多组人脸特征点的信息,并根据识别出的特征点信息对此次检测的人脸进行识别。

4.滑动窗口检测

  • 滑动窗口检测即是要通过“滑动”检测窗口,对每一个窗口图像分别输入CNN进行识别,窗口大小可根据实际取值,例如图片像素为6286283,则可取正方形窗口边长为小于628的整数,然后滑动窗口到其它位置,按一定顺序遍历整张图片,输出每一次窗口里是否有物体,是什么物体,性能依赖于窗口大小的选取及滑动的步长,由于CNN需要一个个处理窗口图像,若步长和窗口较小,检测的精度提高,但需要很长的时间;如果步长和窗口较大,虽然时间减小,但可能会降低检测精度。

Figure 1 : 滑动窗口检测示意图

5.滑动窗口的卷积实现

  • 滑动窗口的卷积实现是为了解决滑动窗口检测中的矛盾而提出的一种检测方式。为了构建滑动窗口的卷积实现,首先要将CNN最后的全连接层转化成卷积层,举个例子看一下:假设用来做分类任务的CNN的输入大小是14×14×3的tensor,滤波器的大小是5×5×16,最大池化2×2,再经过两层全连接层,输出为softmax层的大小为4(对应四种检测对象,如行人、汽车、摩托车、背景),那么通过把全连接层替换为卷积层,亦可实现和同样的效果,只不过此时的输出的是1×1×4的tensor,过程如下图所示。

Figure 2 : 全连接转卷积实现

  • 现在通过这个例子来说明为什么滑动窗口的卷积实现更高效,假设现在整张图片的大小是16×16×3,滑动窗口检测的窗口大小为14×14,步长为2,那么对整张图片进行滑动窗口检测需要四次检测,也就是说CNN运行了四次,不难发现(嘿嘿,真的不难!)在四次CNN运行中,有许多计算(卷积操作)是重复的,那么如果减小这些重复计算呢?如果我们对整张16×16×3的团片一起输入CNN进行卷积操作,而不是分四次,那么则有许多公共部分的卷积操作可以共享,大大减小了计算量,结果就是一个2×2×4的块,从正视图的角度看,四个小格子就分别对应普通滑动窗口检测中每一次的结果。

Figure 3 : 滑动窗口的卷积实现

以上就是目标检测的基础内容,下个部分介绍YOLO算法在目标检测中的应用。

二、YOLO算法

1.什么是YOLO

  • YOLO(you only look once)算法是目标检测算法的一种。YOLO算法在处理图像时,比滑动窗口算法时间复杂度更低,它只需“观察”图片一次,就可以检测出图片中的对象,并且可以检测多个对象,还能定位对象所在的位置(即边界),总结来说YOLO算法就是一种能够分类、定位的目标检测算法。接下来将介绍YOLO算法的具体实现。

2.边界框预测(bounding box predictions)

  • 在滑动窗口的实现中,我们在图像中哪一个位置检测物体取决于滑动窗口的大小和步长,所以很有可能出现检测的对象超出窗口的范围或者比窗口小得多,所以虽然能检测到物体,但是对于物体的位置信息却难以精确获得。
  • 在YOLO算法中,我们通过bounding box预测,可以获得物体的精确位置信息。以下图为例,假设下图(figure 4)是一张100×100×3像素的图片,你要训练的CNN的输入为100×100×3,为了方便解释我们将整张图片划为3×3个网格(grid,实际可能划为19×19等更精细),每一个网格中若有物体(指的是物体的中心坐标在此网格内,如果物体有部分在某网格,但中心不在此网格,则该物体不属于此网格),则该网格的置信度设为1,否则设为0(1表示有物体,0表示没有物体)。bounding box就是指的图片中物体的边界信息,由中心坐标(x,y)和宽高(w,h)即可表示,然后对于每一个网格,外加 n 数字编码所需检测的n种类别的物体,在训练集中这些信息都是预先标注好的,中心坐标只有一个,必然属于某个网格,宽和高不属于任一网格,可以跨越多个网格,这就解决了滑动窗口和卷积实现的滑动窗口方法只能按窗口预测位置的不灵活。

Figure 4 : Bounding box 标签设定

  • 总结起来,对于第i个网格,标签Yi为(Pc,bx,by,bh,bw,C1,C2,C3…Cn),Pc取1或0,代表网格中有无物体,bx,by,bh,bw表示物体中心坐标和高度宽度,C1,C2,C3…Cn表示物体的种类的编码,如属于第一类则编码为(1,0,0……0),第二类则(0,1,0……0),依次类推,如果网格中没有物体,则Pc为0,剩下的数字我们不关系其具体值,所以对于整张图片,一共有9个网格,那么这张图片的标签Y就为9个网格标签的集合,示例如下(为了简便,图片中给出了其中三个网格的便签)。比如在这个例中,CNN的输入是100×100×3,经过卷积层池化层等输出的大小为3×3×8,3×3是网格的数量,实际是CNN提取到的3×3的网格特征,8是每个网格的标签,我们通过将训练集输入网络,让网络学习到这种标签的方式,在验证集上验证,并运用到测试集上,部署到实际系统中。

3.交并比

  • 交并比(IOU),即交集和并集的比值。在YOLO算法中,交并比是用来判断定位是否准确的一个指标。如果网络预测的边界框和实际的边界框是高度重合的,则交并比会比较大,反之,则小。所以,交并比越大,则预测的位置信息就越准确。一般我们认为IOU>0.6时定位准确,当然阈值越大,则精度越高。这一概念将运动到非极大抑制中。

Figure 5 : 交并比IOU

4.非极大抑制:

  • 非极大抑制(Non-Max suppression,NMS),即是抑制非极大值(不是最大值,这点在讲述具体内容时可以更加明显理解)的表现。当我们在运行CNN进行Bouding box预测时,对于图像中的每一单个物体,我们需要做到的的是正确分类并且输出有且仅有一个边界框,然而在实际中,由于不是所有CNN提取的物体特征都属于一个网格(虽然一个物体的中心只有一个,但是CNN不一定能准确判断出对应区域只有一个物体),所以很有可能有多个网格输出同一区域同一个物体的积极标签,这时候它们输出的分类是一样的,只不过中心坐标和宽高不一样而已(但有交集)。那么如何解决这个问题呢?我们知道,由于网格大小和物体大小的非包含关系,可能出现对同一个物体进行多次预测,得到多个边界框,但可以理解的是,由于都是预测同一个物体,这些边界框是会有比较大交集的,这个时候想只保留其中的一个最可能是实际物体位置的边界框,由交并比的概念,我们可以对满足[①预测结果是同一个物体且②边界框交并比大于某选定阈值]这两个条件的边界框进行非极大抑制,就是去掉概率(Pc×Ci)小的,保留概率最大的那个框。当然,对于那些交并比低于阈值的,我们也同样对他们运行NMS。
  • 具体流程,举例说明。对于这张图片,共有19×19个网格,我们让CNN输出19×19×8的大小预测每个网格是否有物体,是什么物体,物体坐标信息,在这个有19×19网格的图片中有两俩车,对于每辆车,可能会有多个网格输出它们那有车(Pc×ci大,且(bx,by)即中心坐标在它那),如Figure 6。

Figure 6 : 可能对同一物体多次预测

  • 那么输出的边界框就可能为,如Figure 7,这时我们先找到对于车辆这一种类所有预测的框的置信度(概率值)中最大的一个,即右边那辆车的0.9的那个框,将它保留,然后将和它有很高交并比的其它框抑制(变暗),由于左边那辆车的几个框与右边交并比为0,所以暂时不会被抑制(这就是为什么称“非极大抑制”,而不是“非最大抑制”),同样的,在除去保留的那个框后,找到所有没有被抑制框中,找置信度最大的那个,也就是左边的那个0.8的框,然后同样对和它有高交并比的框进行非极大抑制,最后剩下了右边0.9和左边0.8两个框,完成预测。如Figure 8所示

Figure 7 : 非极大抑制过程


Figure 8 : 非极大抑制结果

Anchor box:

  • Anchor box, 是为了解决在同一网格中存在多个物体中心点的情形而提出的,即可以让一个格子拥有检测多个对象的能力。见Figure9,图中人和汽车的中点落在了同一个网格中,而根据标签的编码方式一个网格只能给出一个输出,如何解决,Anchor box就是一种解决方式。

Figure 9 : 同一网格多个对象


Figure 10 : 同一网格多个对象

  • 该方法即是通过预先设定多个Anchor box,让对象不仅和网格对应,还对应Anchor box,anchor box的形状和新的标签编码方式可见图Figure10.此例中以两个Anchor box为例,标签Y相当于在原先的标签上复制了一次,对应两个不同形状的Anchor box。在训练集中,由于行人形状与Anchor box 1更相似,我们把其编码赋值给标签的第一部分(上半部分)里,汽车更像Anchor box 2,我们赋值给第二部分(下半部分)。这样,图像中的对象不仅和网格有关,还与Anchor box关联起来。那么Anchor box的形状如何选取?个数?一般是根据实际情况人工选取形状和个数,但也可以用K-means的方法自动选择,具体可见YOLO的论文。总结来说,Anchor box方法通过拓展标签向量的维数赋能YOLO的每一个网格,使其可以同时检测多个对象。

候选区域

  • 候选区域(RP),候选区域是在计算机视觉领域一个比较有影响力的概念,它可以加快滑动窗口等方法的速度。候选区域即通过事先找出图像中可能会存在对象的区域(通过图像分割等),然后在对这些区域运行CNN,我们把这称为(作者Ross Girshick,Jeff Donahue,Trevor Darrell,Jitendra Malik),RCNN的速度比CNN快得多。

Figure 11 : 图像分割

  • 后来,在此基础上又提出了(作者Ross Girshik),大致就是把RCNN的滑动窗口实现改成了卷积滑动窗口实现,这进一步提高了速度;又后来(hahaha),Faster -RCNN(任少卿 (Shaoqing Ren)、 何凯明 (Kaiming He)、 Ross Girshick和孙剑 (Jiangxi Sun)被提出,这种方式通过CNN获得候选区域,比图像分割算法更快[Figure 12]。“但这些算法有一个共同的缺点是需要两步,第一步是得到候选区域,第二步对候选区域运行CNN,而YOLO算法只需一步,可能会是个长远来说更有希望的发展方向”[Andrew Ng]。

Figure 12 : 基于候选区域的算法对比

YOLO算法总结

  • 1.**Training ** :训练集集数据标签使用Anchor box方式,CNN结构输入为(j×j×k,j×j为像素维度,k为通道维度),输出为(n×n×m×L,n×n为网格维度,m为Anchor的个数维度,L为每个Anchor的长度维度),其中L=1+4+H,1是概率维度,4是box坐标维度,H是种类维度的tensor;
  • 2.Prediction :将训练好的网络保存,输入想要测试的图片,输出(n×n×m×L)维度的tensor,得到预测的标签信息;
  • 3.**Fliter + NMS **:将预测概率低于阈值标签所对应Anchor box过滤,然后分别对每一个类别单独运行非极大抑制,得到最终结果。

3.1 本文相应的代码及资料已经以.ipynb文件和.pdf形式在github中给出。

.ipynb文件在链接/Coursera-deeplearning深度学习/课程4/week3/

.pdf文件在链接/Coursera-deeplearning深度学习

github地址:https://github.com/LSayhi/DeepLearning

机器学习系列(7):目标检测YOLO算法及Python实现以自动驾驶为例_第1张图片

你可能感兴趣的:(机器学习系列(7):目标检测YOLO算法及Python实现以自动驾驶为例)