AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)

版本3有什么新功能?

YOLOv3使用了一些技巧来改进训练和提高性能,包括:多尺度预测、更好的主干分类器等等。全部细节都在我们的论文上!

使用预先训练的模型进行检测

这篇文章将指导你通过使用一个预先训练好的模型用YOLO系统检测物体。如果你还没有安装Darknet,你应该先安装。或者不去阅读所有的东西:

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

cd darknet

make

容易的!

在cfg/子目录中已经有YOLO的配置文件。你必须在这里下载预先训练的权重文件(237MB)。或者运行这个:

wget https://pjreddie.com/media/files/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

.......

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打印出它检测到的物体,它的可信度,以及找到它们所花的时间。我们没有用OpenCV编译Darknet,因此它不能直接显示检测结果。相反,它将它们保存在predictions.png中。您可以打开它来查看检测到的对象。因为我们在CPU上使用Darknet,所以每张图像大约需要6-12秒。如果我们使用GPU版本,速度会快得多。              已经包括了一些例子图片,以防你需要灵感。尝试

data/eagle.jpg, data/dog.jpg, data/person.jpg, or data/horses.jpg!

detect命令是命令的更通用版本的简写。它相当于命令:

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

如果您只想在一个图像上运行检测,则不需要知道这一点,但知道是否要执行其他操作(如在网络摄像头上运行)(稍后将看到)会很有用。

多帧图像

不要在命令行上提供图像,您可以将其留空以尝试一行中的多个图像。相反,当配置和权重完成加载时,您将看到一个提示:

./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只显示置信度为.25或更高的对象。可以通过将-thresh<val>标志传递给yolo命令来更改此值。例如,要显示所有检测,可以将阈值设置为0:

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

产生:

![[全部]

所以这显然不是非常有用,但是可以将其设置为不同的值来控制模型设置的阈值。              Tiny YOLOv3

我们有一个非常小的模型,也适用于约束环境,yolov3 tiny。要使用此模型,请首先下载权重:

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

然后使用Tiny配置文件和权重运行检测:

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

网络摄像头的实时检测

如果看不到结果,在测试数据上运行YOLO就不是很有趣了。与其在一堆图片上运行,不如在网络摄像头的输入上运行!

要运行这个演示,您需要使用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>

这就是我们制作上述YouTube视频的方式。

在VOC上训练YOLO

如果你想使用不同的训练模式、超参数或数据集,你可以从头开始训练YOLO。下面是如何让它在Pascal VOC数据集上工作。

获取Pascal VOC数据

要训练YOLO,您需要2007年至2012年的所有VOC数据。你可以在这里找到数据的链接。要获取所有数据,请创建一个目录来存储所有数据,然后从该目录运行:

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

现在将有一个VOCdevkit/子目录,其中包含所有VOC训练数据。

为VOC生成标签

现在我们需要生成Darknet使用的标签文件。Darknet希望为每个图像创建一个.txt文件,并为图像中的每个真实值对象创建一条线,如下所示:

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

其中x、y、宽度和高度与图像的宽度和高度相关。要生成这些文件,我们将在Darknet的script s/目录中运行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

现在我们把2007年的trainval和2012年的trainval都列在一个大名单上。这就是我们要做的数据设置!

修改Pascal数据的Cfg

现在找到的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模型的权重。你可以在这里下载卷积层的权重(76MB)。

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

训练模型

现在我们可以训练了!运行命令:

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

在COCO上训练YOLO

如果你想使用不同的训练模式、超参数或数据集,你可以从头开始训练YOLO。下面是如何让它在COCO数据集上工作。

获取COCO数据

为了训练YOLO,你需要所有的COCO数据和标签。脚本scripts/get_coco_dataset.sh将为您执行此操作。找出要将COCO数据放在哪里并下载它,例如:

cp scripts/get_coco_dataset.sh data

cd data

bash get_coco_dataset.sh

现在您应该拥有为Darknet生成的所有数据和标签。

修改COCO的cfg

现在找到darknet目录。我们必须更改cfg/coco.data配置文件以指向您的数据:

1 classes= 80

2 train  = <path-to-coco>/trainvalno5k.txt

3 valid  = <path-to-coco>/5k.txt

4 names = data/coco.names

5 backup = backup

您应该用放置coco数据的目录替换<path to coco>。

您还应该修改模型cfg以进行训练,而不是测试。cfg/yolo.cfg应该如下所示:

[net]

# Testing

# batch=1

# subdivisions=1

# Training

batch=64

subdivisions=8

....

训练模型

现在我们可以训练了!运行命令:

./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74

如果要使用多个GPU运行:

./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1,2,3

如果要从检查点停止并重新开始训练:

./darknet detector train cfg/coco.data cfg/yolov3.cfg backup/yolov3.backup -gpus 0,1,2,3

开放图像数据集上的YOLOv3

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

./darknet detector test cfg/openimages.data cfg/yolov3-openimages.cfg yolov3-openimages.weights

老yolo地址怎么了?

如果您使用的是YOLO版本2,您仍然可以在此处找到该网站:

https://pjreddie.com/darknet/yolov2/

引用

如果你在工作中使用YOLOv3,请引用我们的论文!

@article{yolov3,

title={YOLOv3: An Incremental Improvement},

author={Redmon, Joseph and Farhadi, Ali},

journal = {arXiv},

year={2018}

}

AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)的更多相关文章

  1. AlexeyAB DarkNet YOLOv3框架解析与应用实践(六)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(六) 1. Tiny Darknet 听过很多人谈论SqueezeNet. SqueezeNet很酷,但它只是优化参数计数.当大多数高 ...

  2. AlexeyAB DarkNet YOLOv3框架解析与应用实践(五)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(五) RNNs in Darknet 递归神经网络是表示随时间变化的数据的强大模型.为了更好地介绍RNNs,我强烈推荐Andrej K ...

  3. AlexeyAB DarkNet YOLOv3框架解析与应用实践(四)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(四) Nightmare 从前,在一所大学的大楼里,西蒙尼亚.维达第和齐瑟曼有一个很好的主意,几乎和你现在坐的大楼完全不同.他们想,嘿 ...

  4. AlexeyAB DarkNet YOLOv3框架解析与应用实践(三)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(三) ImageNet分类 您可以使用Darknet为1000级ImageNet挑战赛分类图像.如果你还没有安装Darknet,你应该 ...

  5. AlexeyAB DarkNet YOLOv3框架解析与应用实践(一)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(一) Darknet:  C语言中的开源神经网络 Darknet是一个用C和CUDA编写的开源神经网络框架.它速度快,易于安装,支持C ...

  6. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  7. iScroll框架解析——Android 设备页面内 div(容器,非页面)overflow:scroll; 失效解决(转)

    移动平台的活,兼容问题超多,今儿又遇到一个.客户要求在弹出层容器内显示内容,但内容条数过多,容器显示滚动条.按说是So easy,容器设死宽.高,CSS加属性 overflow:scroll; -we ...

  8. .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结

    .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...

  9. [转载]iOS 10 UserNotifications 框架解析

    活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

随机推荐

  1. 从苏宁电器到卡巴斯基第27篇:难忘的三年硕士时光 V

    一发不可收拾 安全领域的公司都喜欢在看雪或者是吾爱破解这样的网站上发布招聘贴,因为这样的话很容易就能够招到适合的人才,也算是精准营销了.而像我这种想进入安全圈的,也会在这里发布自己的求职简历,以期望能 ...

  2. [CTF]ROT5/13/18/47位移密码

    [CTF]ROT5/13/18/47位移密码 ---------------转换网站 https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php ROT5:只对数字 ...

  3. PHP中ftp的连接与操作

    1.操作类 <?phpclass FtpService{ protected $connect = 0; public function __construct() { $this->co ...

  4. 发布 .NET 5 带运行时单文件应用时优化文件体积的方法

    自 .NET 发布起,.NET Framework 运行环境就是其摆脱不掉的桎梏.后来有了 .NET Core ,微软终于将自带运行时和单文件程序带给了我们.即便如此,大部分情况下开发者仍然不太满意: ...

  5. MFC的六大机制

    MFC的六大机制 程序的初始化过程 运行时类型识别 动态创建 永久保存 消息映射 命令传递 运行时类型识别 MFC的运行时类型识别就是在程序运行过程中判断某个对象是否属于某个类,MFC通过为需要进行运 ...

  6. JWT 基本使用

    JWT 基本使用 在上一节中 session 共享功能使用 redis 进行存储,用户量激增时会导致 redis 崩溃,而 JWT 不依赖服务器,能够避免这个问题. 1.传统 session 1.1. ...

  7. java基础——多维数组和稀疏数组

    多维数组 多维数组可以堪称数组的数组,比如二维数组就是一个特殊的一维数组,其中每一个元素都是一个以为数组 而且数组 int a[][]= new int[2][3]; public class Arr ...

  8. [刷题] 198 House Robber

    要求 你是一个小偷,每个房子中有价值不同的宝物,但若偷连续的两栋房子,就会触发报警系统,求最多可偷价值多少的宝物 示例 [3,4,1,2],返回6[3,(4),1,(2)] [4,3,1,2],返回6 ...

  9. [笔记] c和指针

    1.简介 2.基本概念 3.指针 计算机内存的最小单位是位(bit),每个位可以容纳值0或1,单独的位用处不大,通常许多位合成一组作为一个单位,以存储较大范围的值 每个字节包含8位,可以存储无符号值0 ...

  10. 将top命令的输出,写入到文件中 top -b -n 1 -d 3 >>file.txt

    top -b -n 1 -d 3 >>file.txt 解析: -b :batch模式,可以重定向到文件中 -n 1:一共取1次top数据.后边加数字,表示次数 -d 3:每次top时间间 ...