YOLO 升级到 v3 版,速度相比 RetinaNet 快 3.8 倍

雷锋网 AI 研习社按,YOLO 是一种非常流行的目标检测算法,速度快且结构简单。日前,YOLO 作者推出 YOLOv3 版,在 Titan X 上训练时,在 mAP 相当的情况下,v3 的速度比 RetinaNet 快 3.8 倍。在 YOLOv3 官网上,作者展示了一些对比和案例。在论文中,他们对 v3 的技术细节进行了详细说明。雷锋网 AI 研习社将内容编译整理如下。

我们针对 YOLO 做了一些更新,在设计上进行了一些小改动,让它变得更好。当然,我们也训练了这个新网络,它的性能非常优秀。它比前一版本要大一点,但更准确。当然了,不必担心会牺牲速度,它仍然很快。YOLOv3 可以在 22ms 之内执行完一张 320 × 320 的图片,mAP 得分是 28.2,和 SSD 的准确率相当,但是比它快三倍。

此外,它在 Titan X 上经过 51 ms 训练,mAP50 为 57.9,相比之下,RetinaNet 经过 198ms 的训练之后 mAP50 为 57.5。对比起来,两者的性能差异不大,但是 YOLOv3 比 RetinaNet 快 3.8 倍。

所有的代码都在 https://pjreddie.com/yolo/上。

与其他检测器相对比

YOLOv3 非常快速和准确,在 IoU=0.5 的情况下,与 Focal Loss 的 mAP 值相当,但快了 4 倍。此外,大家可以轻松在速度和准确度之间进行权衡,只需改变模型的大小,而不需要重新训练。

在 COCO 数据集上的表现

工作原理

先前的检测系统是让分类器或定位器来执行检测任务。他们将模型应用于图片中,图片里物体的位置和尺寸各异,图像的高得分区域被认为是检测区域。

我们采用了完全不同的方法——将一个简单的神经网络应用于整张图像。该网络将图像分割成一块块区域,并预测每个区域的 bounding box 和概率,此外,预测概率还对这些 bounding box 进行加权。

我们的模型相较基于分类的检测系统有如下优势:它在测试时观察整张图像,预测会由图像中的全局上下文(global context)引导。它还通过单一网络评估做出预测,而不像 R-CNN 这种系统,一张图就需要成千上万次预测。对比起来,YOLO 的速度非常快,比 R-CNN 快 1000 倍,比 Fast R-CNN 快 100 倍。

可以参阅我们的论文(https://pjreddie.com/media/files/papers/YOLOv3.pdf),了解关于完整系统的更多细节。

在 v3 中,有哪些全新的方法呢?

YOLOv3 用了一些小技巧来改进训练、提高性能,包括多尺度预测,更好的主干分类器等等。

同样,详细信息我们也全写在论文(https://pjreddie.com/media/files/papers/YOLOv3.pdf)上了。

用预训练模型进行检测

接下来是利用 YOLO 使用预训练模型来检测物体。请先确认已经安装 Darknet。接下来运行如下语句:

git clone https://github.com/pjreddie/darknet cd darknet make

这样一来 cfg/子目录中就有了 YOLO 配置文件,接下来下载预训练的 weight 文件(237 MB)(https://pjreddie.com/media/files/yolov3.weights),或者运行如下语句:

wget https://pjreddie.com/media/files/yolov3.weights

然后执行检测器:

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

输出如下:

layer filters size input output 0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BFLOPs 1 conv 64 3 x 3 / 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BFLOPs ....... 105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BFLOPs 106 detection truth_thresh: Using default '1.000000' Loading weights from yolov3.weights...Done! data/dog.jpg: Predicted in 0.029329 seconds. dog: 99% truck: 93% bicycle: 99%

Darknet 会输出检测到的物体、confidence 以及检测时间。我们没有用 OpenCV 编译 Darknet,所以它不能直接显示检测情况。检测情况保存在 predictions.png 中。大家可以打开这个图片来查看检测到的对象。我们是在 CPU 上使用 Darknet,检测每张图片大约需要 6-12 秒,如果使用 GPU 将快得多。

我还附上了一些例子给大家提供灵感,你们可以试试 data/eagle.jpg,data/dog.jpg,data/person.jpg 或 data/horses.jpg。

detect 指令是对 command 的常规版本的简写:

./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg

如果你只是想检测图像,并不需要了解这个,但如果你想做其他的事情,比如在网络摄像头上运行 YOLO,这将非常有用(稍后详细描述)。

多个图像

在 command 行不写图像信息的话就可以连续运行多个图片。当加载完配置和权重,你将看到如下提示:

./darknet detect cfg/yolov3.cfg yolov3.weights layer filters size input output 0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BFLOPs 1 conv 64 3 x 3 / 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BFLOPs ....... 104 conv 256 3 x 3 / 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BFLOPs 105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BFLOPs 106 detection Loading weights from yolov3.weights...Done! Enter Image Path:

输入类似 data/horses.jpg 的图像路径来进行边框预测。

一旦完成,它将提示你输入更多路径来检测不同的图像。使用 Ctrl-C 退出程序。

改变检测门限

默认情况下,YOLO 只显示检测到的 confidence 不小于 0.25 的物体。可以在 YOLO 命令中加入-thresh <val>来更改检测门限。例如,将门限设置为 0 可以显示所有的检测结果:

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

网络摄像头实时检测

如果在测试数据上运行 YOLO 却看不到结果,那将很无聊。与其在一堆图片上运行 YOLO,不如选择摄像头输入。

要运行如下 demo,需要用 CUDA 和 OpenCV 来编译 Darknet。接下来运行如下指令:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

YOLO 将会显示当前的 FPS 和预测的分类,以及伴有边框的图像。

你需要一个连接到电脑的摄像头并可以让 OpenCV 连接,否则就无法工作。如果有连接多个摄像头并想选择其中某一个,可以使用 -c <num>(OpenCV 在默认情况下使用摄像头 0)语句。如果 OpenCV 可以读取视频,也可以在视频文件中运行:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

在 VOC 数据集上训练 YOLO

首先需要 2007-2012 年的所有 VOC 数据,这是下载地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/,为了存储数据,执行如下语句:

wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar tar xf VOCtrainval_11-May-2012.tar tar xf VOCtrainval_06-Nov-2007.tar tar xf VOCtest_06-Nov-2007.tar

接下来所有 VOC 训练数据都在 VOCdevkit/ 子目录下。

生成标签

接下来需要生成 Darknet 使用的标签文件。Darknet 需要的.txt 文件格式如下:

<object-class> <x> <y> <width> <height>

x, y, width 和 height 对应图像的宽和高。需要在 Darknet scripts/子目录下运行 voc_label.py 脚本来生成这些文件。

wget https://pjreddie.com/media/files/voc_label.py python voc_label.py

几分钟后,这个脚本将生成所有必需文件。大部分标签文件是在 VOCdevkit/VOC2007/labels/ 和 VOCdevkit/VOC2012/labels/ 下,大家可以在目录下看到如下信息:

ls 2007_test.txt VOCdevkit 2007_train.txt voc_label.py 2007_val.txt VOCtest_06-Nov-2007.tar 2012_train.txt VOCtrainval_06-Nov-2007.tar 2012_val.txt VOCtrainval_11-May-2012.tar

类似 2007_train.txt 的语句列出了图像文件的年份和图像集。Darknet 需要一个包含所有你想要训练的图片的文本文件。在这个例子中,我们训练除了 2007 测试集的所有数据。运行如下语句:

cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

修正

现在去 Darknet 目录,需要改变 cfg/voc.data 配置文件以指向数据:

1 classes= 20 2 train = <path-to-voc>/train.txt 3 valid = <path-to-voc>2007_test.txt 4 names = data/voc.names 5 backup = backup

将<path-to-voc>替换为你存放 VOC 数据的目录。

下载预训练卷积权重

在训练中使用在 Imagenet 上预训练的卷积权重。我们这里使用 darknet53 模型的权重,可以点击这里https://pjreddie.com/media/files/darknet53.conv.74下载卷积层权重:

wget https://pjreddie.com/media/files/darknet53.conv.74

训练模型

接下来执行如下语句进行训练:

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

在 COCO 上的训练与 VOC 上类似,大家可以在这里查看详情。

YOLOv3 论文地址如下:

https://pjreddie.com/media/files/papers/YOLOv3.pdf

原文发布于微信公众号 - AI研习社(okweiwu)

原文发表时间:2018-03-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习思考者

DL开源框架Caffe | 模型微调 (finetune)的场景、问题、技巧以及解决方案

前言 什么是模型的微调?   使用别人训练好的网络模型进行训练,前提是必须和别人用同一个网络,因为参数是根据网络而来的。当然最后一层是可以修改的,因为我们...

62960
来自专栏用户2442861的专栏

文本分类(六):使用fastText对文本进行分类--小插曲

http://blog.csdn.net/lxg0807/article/details/52960072

41510
来自专栏用户2442861的专栏

计算图像相似度——《Python也可以》之一

声明:本文最初发表于赖勇浩(恋花蝶)的博客http://blog.csdn.NET/lanphaday,如蒙转载,敬请确保全文完整,未经同意,不得用于商业用途。

1.5K20
来自专栏Python中文社区

支持向量机原理推导(二)

專 欄 ❈ exploit,Python中文社区专栏作者。希望与作者交流或者对文章有任何疑问的可以与作者联系: Email: 15735640998@163....

20250
来自专栏素质云笔记

caffe︱ImageData层、DummyData层作为原始数据导入的应用

Part1:caffe的ImageData层 ImageData是一个图像输入层,该层的好处是,直接输入原始图像信息就可以导入分析。 在案例中利用Image...

806100
来自专栏PaddlePaddle

【目标检测】SSD目标检测

场景文字识别 目标检测任务的目标是给定一张图像或是视频帧,让计算机找出其中所有目标的位置,并给出每个目标的具体类别。对于人类来说,目标检测是一个非常简单的任务。...

59190
来自专栏听雨堂

用scikit-learn和pandas学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1....

31750
来自专栏贾志刚-OpenCV学堂

tensorflow中实现神经网络训练手写数字数据集mnist

基于tensorflow实现一个简单的三层神经网络,并使用它训练mnist数据集,神经网络三层分别为:

17420
来自专栏专知

【前沿】NIPS2017贝叶斯生成对抗网络TensorFlow实现(附GAN资料下载)

导读 今年五月份康奈尔大学的 Andrew Gordon Wilson 和 Permutation Venture 的 Yunus Saatchi 提出了一个贝...

50380
来自专栏Petrichor的专栏

深度学习: 经典 数据集 汇总

官网:www.cs.toronto.edu/~kriz/cifar 介绍:CIFAR-10数据集说明、TensorFlow CNN 测试CIFAR-10数据...

54530

扫码关注云+社区

领取腾讯云代金券