一文详解 YOLO 2 与 YOLO 9000 目标检测系统

来源:互联网 发布:淘宝网卖家申请 编辑:程序博客网 时间:2024/06/05 10:36

一文详解 YOLO 2 与 YOLO 9000 目标检测系统

from 雷锋网

雷锋网 AI 科技评论按:YOLO 是 Joseph Redmon 和 Ali Farhadi 等人于 2015 年提出的第一个基于单个神经网络的目标检测系统。在今年 CVPR 上,Joseph Redmon 和 Ali Farhadi 发表的 YOLO 2 进一步提高了检测的精度和速度。这次讲座的主讲人为王东,前硅谷资深工程师。

讲解顺序和论文结构类似,先讲 YOLO 2 的网络结构,重点分析如何产生目标边框和分类,以及相关的损失函数。训练 YOLO 2 的第一步是在 ImageNet 上预先学习 darknet-19,在 224x224 图像上,它仅需 5.58 个 G-ops。此外,YOLO 2 在 VOC2007,VOC2012 和 COCO 检测数据集上有很好的表现。

在 YOLO 2 的基础上,论文中进一步提出了 YOLO 9000,可以产生 9418 个类别的目标检测。首先是需要建立一个基于 wordNet 结构的 wordTree。这个树包含 imagenet 上最流行的 9000 个分类,还有 COCO 的 80 个大类。YOLO 9000 的最后一层采用层次分类的方法,来计算 400 多个条件概率,用它来产生目标的最终分类。

                                           

目标检测

首先是目标检测,目标检测和图像分类的不同是图像分类只需要识别出图中的物体,而目标检测需要在图片中精确找到物体所在位置,并标注出物体的类别。物体的位置一般用边框(bounding box)标记,一个图像中可能有好几个边框,目标检测需要给出边框里物体的类别和概率。

关于 YOLO2

YOLO2 结构

YOLO 2 采用神经网络结构,有 32 层。结构比较常规,包含一些卷积和最大池化,其中有一些 1*1 卷积,采用 GoogLeNet 一些微观的结构。其中要留意的是,第 25 层和 28 层有一个 route。例如第 28 层的 route 是 27 和 24,即把 27 层和 24 层合并到一起输出到下一层,route 层的作用是进行层的合并。30 层输出的大小是 13*13,是指把图片通过卷积或池化,最后缩小到一个 13*13 大小的格。每一个格的 output 数量是 125(5*25),5 是指对每一个 13*13 的小格配有 5 个边框,25 则是指每一个边框输出了 25 个浮点数。25 个是 YOLO 2 对 VOC 的结构。VOC 一共有 20 个 class,在 25 个数中,有 20 个是 class 的 probability,剩下的 5 个中,有四个表示 stx、sty、tw、th,这 4 个来识别边框的位置和大小,还有一个数是 confidence,表示边框预测里有真正的对象的概率。所以一共是 13*13*125 个数。

 

YOLO2 Forward 计算边框

现在讲一下怎样把 stx、sty、tw、th 变成输出边框。如右图所示,里面的 σ ( tx ) 可以理解为 stx,σ ( ty ) 可以理解为 sty。每一个输出的 bbox 是针对于一个特定的 anchor,anchor 其实是参考 bbox 的 width 及 height。对于 VOC 来讲,产生了 5 个固定的参考。

如图,给出了 stx、sty、tw、th 之后,通过简单的公式,就可以计算出最后输出的边框的位置和大小。具体是否要输出当前的边框,它的概率,还有生成的物体的类别,这个取决于后面的 probability 和 confidence。Confidence 表示有没有物体,假设有物体之后,probability 表示物体的概率。

YOLO forward 分类

通过将 confidence 和最大可能输出的类的 probability 相乘之后,要是得出的结果大于门限 0.24,就会输出当前计算出的 bbox 的大小和位置,同时会输出是哪一个类,probability 大小是多少。一共会生成 13*13*5 个 bbox,然后根据 probability,通过 filter,产生出最后预测的物体和其边框。

YOLO2 例子

举一个例子,就是最前面那个有狗,有轿车,有自行车的图像,比较图中最后的三行就可以看出来,里面有轿车,狗和自行车,也能看到 probability 和 bbox 分别是什么,它们分别表示概率、大小和位置。具体来讲,从第一行,可以看出轿车的 class_id 为 6,通过 row 和 col 可以看出大概的位置,还给出了 anchor_id。第二行可以看到轿车的 confidence 和 stx。

YOLO2 损失函数

前面讲的是 forward 的过程,即给了一个图像和神经网络,怎么得到识别的物体概率和位置。那么具体的训练过程是如何的呢,怎么去进行训练?论文了中给了一个损失函数。要是给予一个合适的损失函数,给一定的数据去训练,那么神经网络就会得到好的表现。

进行训练的一共有四类 loss,他们 weight 不同,分别是 object、noobject、class、coord。总体 loss 是四个部分的平方和。具体的计算步骤以及如何选择过程如 PPT 所示。

Darknet-19 计算量

上面讲述了训练函数和训练对象,大家都需要先选择预训练函数。另外,对于 YOLO 2 来说,主要是想提高精度和速度,重点是 base network 要好。YOLO 2 采用的是 Darknet-19 预训练模型。右图是在 ImageNet 上使用的一些模型,分别给出了他们的计算量和精度。在 224x224 的图片上,图中 VGG16 需要 30.69 个 G-ops,基于 GoogLeNet 的 YOLO 需要 8.52 个 G-ops。而 Darknet-19 更小,G-opsS 是 5.58。

VOC 2007 准确度和速度

论文中列出了一些 YOLO 2 在标准目标检测集上的表现,由于 YOLO 2 网络只包含卷积层和池化层,因此可以接受任意尺寸的图像输入。从图中可以看到 R-CNN 和 SSD 的精度也是比较高的,但 SSD 是基于 VCC-16 来预训练,fps 比较慢。YOLO 2 的精度相对 YOLO 提高了很多,速度也有相应提升。对于 YOLO 2,不同的图像大小也会产生不同的 mAP。

在 VOC 2012 和 COCO 上的准确度

接下俩是在 VOC 2012 和 COCO 上的准确度,COCO 是比 VOC 难的用于目标检测的 benchmark,COCO 里有 80 个类, VOC 里有 20 个。从图中可以看出 SSD 的精度比 YOLO 2 要高,可能的原因是 COCO 里有比较小的物体。从图中也可以看出 YOLO 2 的速度依然很快。

YOLO 与 YOLO2 的比较

从图中可以看到采用不同的步骤之后,YOLO 2 相较 YOLO 的提升。可以看到 mAP 明显提高。

与 Faster-rcnn 的比较

以前基于 rcnn 的过程不是一次计算出来的,首先要前向计算出 proposal,然后再去 go through 下面的层,一个一个 proposal 去分类,所以基于 rcnn 的网络会比较慢。

SSD

SSD 是当前最精确的一种目标检测算法,是基于单个神经网络。如图,前面几层是 VGG 网络,它主要是加入卷积特征层,得到不同尺度的特征层,从而实现多尺度目标检测。对于每个添加的特征层,使用一组卷积滤波器,可以得到一组固定数目的目标检测的预测 。

SSD 方法获取目标位置和类别的机理跟 YOLO 方法一样,都是使用回归,但是 YOLO 对小目标检测效果不好,而 SSD 则在不同的 feature map 上分割成 grid 然后去做回归,效果会好一点。

前面讲的就是 YOLO2 的部分,在一些小的物体的检测上不如 ssd,但在精度、准确度上都和 ssd 很接近,最大的优点是非常快。 

YOLO 9000

YOLO 9000 是论文的第二部分,它的主要优点是可以检测 9418 个类。这个数目非常惊人,因为检测数据不容易得到,人工标记比较困难。

图中是论文里的几个检测的例子。

YOLO 9000 的基本触发是用少量的有检测标注的数据和大量的图像分类数据合并到一块,来互相帮助,产生出可以生成很多类的预测。

具体实践过程  

首先建立标签树(WordTree),这个树很大,如图红色的部分是 ImageNet 里面最流行的九千个类别,检测数据是来自 COCO 里面的 80 个类。这个标签树是基于 WordNet 构建的,总共 9418 个类,1846 个内部节点。可以在每个 tree 的节点做一个 softmax,节点概率是从原点的路径上的条件概率的乘积,最后输出的标签是节点概率高于阈值(0.5)的最深节点。

使用 WordTree 整合了数据集之后就可以在数据集(分类 - 检测数据)上利用层次分类的办法训练模型,使该系统可以识别超过 9000 种物品。训练时检测数据 wordTree 上的路径都有 class loss,而 imagenet 数据只有 class loss 和 noobj loss。
YOLO 9000 结构

如图所示,与之前相比,它的结构简化到 24 层,第 23 层是 17*17*28269,17*17 和以前 YOLO 2 的 13*13 类似,只是把 prediction 网格变成了 17*17。然后每个位置有 28269(3*(4+1+9418)),3 是指每一个位置给了三个 bounding box,每个 bounding box 包含有 stx,sty,tw,th,confidence 和 9418 个类。给了这些数之后就可以通过 WordTree 产生所需要的 bbox 等。

YOLO 9000 的结果

如图是 YOLO 9000 在 ilsvrc 2014 上的表现。Ilsvrc 2014 一共有 200 个 category,ssd300 在这个数据集上训练完以后可以得到 43.4mAP,YOLO 9000 只能得到 19.7mAP。区别是 YOLO 9000 在训练过程中根本没有利用 ImageNet 上的 ilsvrc 训练数据,只利用了 COCO 和 ImageNet 数据,能得到 19.7 也是非常不错的结果。图右可以看出在不同类别的图像检测上的表现,可以看到在检测动物时表现最好,因为 COCO 上有一些动物的类。

总结:

YOLO 2 相比 YOLO,提高了速度和准确率,基于 darknet-19 模型,除去完全连接层,用了边框聚类,两层组合,采用图像多分辨率的训练。

YOLO 9000 可以利用无边框的数据和有边框的数据一起来实现 9418 类的监测。采用 wordTree 层次分类的办法。

下面为大家提供一些 github 上的开源代码,有训练好的 YOLO 2 和 YOLO 9000 模型。

https://pjreddie.com/darknet/

https://github.com/philipperemy/yolo-9000

雷锋网 AI 科技评论编辑整理。雷锋网

原创粉丝点击