介绍
了解更多关于YOLO(在darknet中)的信息并下载权重文件这里。如果找不到权重文件,我上传了一些文件这里,包括v1.0的yolo-full
和yolo-tiny
,v1.1的tiny-yolo-v1.1
以及v2的yolo
和tiny-yolo-voc
。
请查看下面的演示,或在这个imgur上查看。
依赖项
Python3, tensorflow 1.0, numpy, opencv 3。
引用
@article{trieu2018darkflow,
title={Darkflow},
author={Trieu, Trinh Hoang},
journal={GitHub Repository. Available online: https://github. com/thtrieu/darkflow (accessed on 14 February 2019)},
year={2018}
}
开始
你可以选择以下三种方式之一来开始使用darkflow。
-
仅在本地构建Cython扩展。注意:如果以这种方式安装,你必须在克隆的darkflow目录中使用
./flow
而不是flow
,因为darkflow没有全局安装。python3 setup.py build_ext --inplace
-
让pip在开发模式下全局安装darkflow(仍然可以全局访问,但代码的更改会立即生效)
pip install -e .
-
使用pip全局安装
pip install .
更新
在Tensorflow上的Android演示这里
我正在寻找帮助:
- 问题跟踪中的
help wanted
标签
解析注释
如果你不打算进行训练或微调(你只想对已训练的网络进行前向传播),可以跳过此部分。
例如,如果你只想处理3个类别tvmonitor
,person
,pottedplant
,编辑labels.txt
如下:
tvmonitor
person
pottedplant
就这样,darkflow
会处理剩下的部分。你也可以通过--labels
标志设置darkflow从自定义标签文件加载(例如--labels myOtherLabelsFile.txt
)。当处理多个具有不同输出标签集的模型时,这可能很有用。如果没有设置这个标志,darkflow将默认从labels.txt
加载(除非你使用了专为COCO或VOC数据集设计的已识别.cfg
文件 - 在这种情况下,标签文件将被忽略,并加载COCO或VOC标签)。
设计网络
如果你使用的是原始配置之一,可以跳过此部分,否则,请参见以下示例:
...
[convolutional]
batch_normalize = 1
size = 3
stride = 1
pad = 1
activation = leaky
[maxpool]
[connected]
output = 4096
activation = linear
...
使用flow
流动图形
# 查看其选项
flow --h
首先,让我们仔细看看一个非常有用的选项--load
。
# 1. 加载tiny-yolo.weights
flow --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights
# 2. 要完全初始化一个模型,省略--load选项
flow --model cfg/yolo-new.cfg
# 3. 重新使用tiny的前几层来初始化`yolo-new`非常有用
flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights
# 这将打印出哪些层被重用,哪些层被初始化
默认文件夹sample_img/
中的所有输入图像都会通过网络流动,预测结果放在sample_img/out/
。我们可以始终为这样的前向传递指定更多参数,例如检测阈值、批处理大小、图像文件夹等。
# 使用tiny yolo和100% GPU使用率前向传播sample_img/中的所有图像
flow --imgdir sample_img/ --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights --gpu 1.0
可以生成包含每个边界框像素位置描述的json输出。每个预测结果默认存储在sample_img/out
文件夹中。以下是一个json数组的示例。
# 使用tiny yolo和JSON输出前向传播sample_img/中的所有图像。
flow --imgdir sample_img/ --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights --json
JSON输出:
[{"label":"person", "confidence": 0.56, "topleft": {"x": 184, "y": 101}, "bottomright": {"x": 274, "y": 382}},
{"label": "dog", "confidence": 0.32, "topleft": {"x": 71, "y": 263}, "bottomright": {"x": 193, "y": 353}},
{"label": "horse", "confidence": 0.76, "topleft": {"x": 412, "y": 109}, "bottomright": {"x": 592,"y": 337}}]
- 标签:不言自明
- 置信度:介于0到1之间(yolo对该检测结果的置信度)
- 左上角:框的左上角像素坐标
- 右下角:框的右下角像素坐标
训练新模型
训练很简单,你只需要添加选项--train
。如果这是第一次训练新配置,将解析训练集和注释。要指向训练集和注释,使用选项--dataset
和--annotation
。以下是一些示例:
# 从yolo-tiny初始化yolo-new,然后在100% GPU上训练网络:
flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights --train --gpu 1.0
# 完全初始化yolo-new并使用ADAM优化器训练
flow --model cfg/yolo-new.cfg --train --trainer adam
在训练期间,脚本会偶尔将中间结果保存到Tensorflow检查点,存储在ckpt/
中。要在执行训练/测试前恢复到任何检查点,请使用--load [checkpoint_num]
选项,如果checkpoint_num < 0
,darkflow
将通过解析ckpt/checkpoint
加载最近的保存。
# 恢复最近的检查点进行训练
flow --train --model cfg/yolo-new.cfg --load -1
在步骤1500时测试检查点
flow --model cfg/yolo-new.cfg --load 1500
从原始版本微调yolo-tiny
flow --train --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights
Pascal VOC 2007上训练的示例:
```bash
# 下载Pascal VOC数据集:
curl -O https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
# Pascal VOC注释格式示例:
vim VOCdevkit/VOC2007/Annotations/000001.xml
# 在Pascal数据集上训练网络:
flow --model cfg/yolo-new.cfg --train --dataset "~/VOCdevkit/VOC2007/JPEGImages" --annotation "~/VOCdevkit/VOC2007/Annotations"
在自己的数据集上训练
下面的步骤假设我们使用tiny YOLO并且我们的数据集有3个类别
-
创建配置文件
tiny-yolo-voc.cfg
的副本并根据你的喜好重命名为tiny-yolo-voc-3c.cfg
(请务必保持原始的tiny-yolo-voc.cfg
文件不变,见下文解释)。 -
在
tiny-yolo-voc-3c.cfg
中,将[region]层(最后一层)的类别数修改为你将要训练的类别数。在我们的例子中,类别数设为3。... [region] anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 bias_match=1 classes=3 coords=4 num=5 softmax=1 ...
-
在
tiny-yolo-voc-3c.cfg
中,将[卷积]层(倒数第二层)的过滤器数修改为 num * (classes + 5)。在我们的例子中,num 是5,类别数是3,所以5 * (3 + 5) = 40,因此过滤器数设为40。... [convolutional] size=1 stride=1 pad=1 filters=40 activation=linear [region] anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 ...
-
修改
labels.txt
以包含你要训练的标签(标签数应与你在tiny-yolo-voc-3c.cfg
文件中设置的类别数相同)。在我们的例子中,labels.txt
将包含3个标签。label1 label2 label3
-
在训练时引用
tiny-yolo-voc-3c.cfg
模型。flow --model cfg/tiny-yolo-voc-3c.cfg --load bin/tiny-yolo-voc.weights --train --annotation train/Annotations --dataset train/Images
-
为什么要保持原始的
tiny-yolo-voc.cfg
文件不变?当darkflow检测到你加载
tiny-yolo-voc.weights
时,它会在cfg/文件夹中查找tiny-yolo-voc.cfg
并将该配置文件与您设置的新的--model cfg/tiny-yolo-voc-3c.cfg
进行比较。在这种情况下,除了最后两层之外,每一层都会有完全相同的权重数,因此它会将权重加载到所有层中,直到最后两层,因为它们现在包含不同数量的权重。
摄像头/视频文件演示
要在完全使用CPU上运行的演示:
flow --model cfg/yolo-new.cfg --load bin/yolo-new.weights --demo videofile.avi
要在完全使用GPU上运行的演示:
flow --model cfg/yolo-new.cfg --load bin/yolo-new.weights --demo videofile.avi --gpu 1.0
要使用您的网络摄像头/相机,只需将 videofile.avi
替换为关键字 camera
。
要保存带有预测边界框的视频,请添加 --saveVideo
选项。
从其他python应用程序中使用darkflow
请注意 return_predict(img)
必须接收一个 numpy.ndarray
。你的图像必须事先加载并传递给 return_predict(img)
。传递文件路径是无效的。
return_predict(img)
的结果将是一个字典列表,代表每个检测到的对象的值,其格式与上述JSON输出相同。
from darkflow.net.build import TFNet
import cv2
options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}
tfnet = TFNet(options)
imgcv = cv2.imread("./sample_img/sample_dog.jpg")
result = tfnet.return_predict(imgcv)
print(result)
将构建的图保存为protobuf文件(.pb
)
## 将最新的检查点保存为protobuf文件
flow --model cfg/yolo-new.cfg --load -1 --savepb
## 将图和权重保存为protobuf文件
flow --model cfg/yolo.cfg --load bin/yolo.weights --savepb
在保存 .pb
文件时,还会生成一个 .meta
文件。这个 .meta
文件是 meta
字典中所有内容的JSON转储,包含了后处理所需的信息,如 anchors
和 labels
。这样,所有你需要用来从图中进行预测和后处理的内容都包含在这两个文件中——不需要再携带 .cfg
或任何标签文件。
生成的 .pb
文件可以用于将图迁移到移动设备(JAVA / C++ / Objective-C++)。输入张量和输出张量的名称分别为 'input'
和 'output'
。要进一步使用此protobuf文件,请参考 Tensorflow
的官方C++ API文档 这里。要在比如说iOS应用程序上运行,只需将文件添加到Bundle Resources中,并在源代码中更新此文件的路径。
此外,darkflow支持从 .pb
和 .meta
文件加载以生成预测(而不是从 .cfg
和检查点或 .weights
加载)。
## 基于protobuf文件对sample_img中的图像进行前向传播预测
flow --pbLoad built_graph/yolo.pb --metaLoad built_graph/yolo.meta --imgdir sample_img/
如果你想在使用 return_predict()
时加载 .pb
和 .meta
文件,你可以将 "pbLoad"
和 "metaLoad"
选项替换为你通常设置的 "model"
和 "load"
选项。
就是这样。