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}

}

最新文章

  1. Microsoft QAS架接项目
  2. iOS抓包利器Charles
  3. css相对定位+浮动实现元素位置互换
  4. 蝙蝠算法-python实现
  5. Java设计模式之简单工厂设计模式
  6. codevs3732 解方程
  7. Android App开之标注切图
  8. 语句分类及if语句
  9. ASP.NET Aries 开发框架
  10. 如何用photoshop把一张图片分割成几张图片呢?
  11. d3.js做的柱状图
  12. ubuntu16安装dhcp server
  13. 线程之Callable、Future 和FutureTask使用及源码分析
  14. Python 基础算法
  15. 创建 Pull Request
  16. java中的数据结构[copy]
  17. 微服务Kong(七)——CLI参考
  18. PHP漏洞全解—————9、文件上传漏洞
  19. mongodb系统出错。 发生系统错误 1067。 进程意外终止。
  20. action类中属性驱动和模型驱动的区别

热门文章

  1. 【并发编程】ThreadLocal
  2. kali 中的内置工具
  3. 路由器逆向分析------firmware-mod-kit工具安装和使用说明
  4. hdu1722 切蛋糕
  5. Win64 驱动内核编程-26.强制结束进程
  6. IDEA 导入Springboot 项目:
  7. Java前后端分离的认识
  8. Kafka源码分析(二) - 生产者
  9. Codeforces Round #704 (Div. 2)
  10. [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]