前言: 自从Joseph Redmon提出了yolov3后,其darknet仓库已经获得了16k的star,足以说明darknet的流行。该作者最新一次更新也是一年前了,没有继续维护。不过自来自俄国的大神AlexeyAB在不断地更新darknet, 不仅添加了darknet在window下的适配,而且实现了多种SOTA目标检测算法。AlexeyAB也在库中提供了一份详细的建议,从编译、配置、涉及网络到测量指标等,一应俱全。通过阅读和理解AlexeyAB的建议,可以为我们带来很多启发。本文是来自翻译AlexeyAB的darknet中的README,并在翻译的过程中加入我们的一些经验。
./scripits/get_coco_dataset.sh
来获取数据集。./scripits/get_openimages_dataset.py
获取数据集,并按照规定的格式重排训练集。./scripits/voc_label.py
对数据集标注进行处理。./scripits/get_imagenet_train.sh
获取数据集,运行./scripits/imagenet_label.sh
用于验证集。https://github.com/AlexeyAB/darknet/tree/master/scripts#datasets
结果示意:
其他测试结果可以访问:https://www.youtube.com/user/pjreddie/videos
[conv_lstm]
层或者[crnn]
层来实现针对视频的目标检测。[net] mixup=1 cutmix=1 mosaic=1 blur=1
。mini_batch_size
和准确性。random=1
)的时候优化了内存分配。darknet detector map
命令即可。-map
标志即可。-json_port
,-mjpeg_port
选项,支持作为json和mjpeg 服务器来在线获取的结果。可以使用你的编写的软件或者web浏览器与json和mjpeg服务器连接。https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp
Linux中使用./darknet,window下使用darknet.exe.
Linux中命令格式类似./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights
Linux中的可执行文件在根目录下,Window下则在\build\darknet\x64
文件夹中。以是不同情况下应该使用的命令:
darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25
darknet.exe detector test cfg/coco.data yolov3.cfg yolov3.weights -ext_output dog.jpg
darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights -ext_output test.mp4
darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights -c 0
darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights http://192.168.0.80:8080/video?dummy=param.mjpg
darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights test.mp4 -out_filename res.avi
darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights test.mp4
ip-address:8070
和 8090
: ./darknet detector demo ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output
darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
darknet.exe detect cfg/yolov3.cfg yolov3.weights -i 0 -thresh 0.25
http://ec2-35-160-228-91.us-west-2.compute.amazonaws.com:8090
(Darknet 必须使用OpenCV进行编译才能使用该功能): ./darknet detector train cfg/coco.data yolov3.cfg darknet53.conv.74 -dont_show -mjpeg_port 8090 -map
darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights
darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -ext_output -dont_show -out result.json < data/train.txt
darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -dont_show -ext_output < data/train.txt > result.txt
data/new_train.txt
,可以让结果保存为Yolo训练所需的格式,标注文件为 .txt
。通过这种方法可以迅速增加训练数据量。具体命令为:darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25 -dont_show -save_labels < data/new_train.txt
darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights -iou_thresh 0.75
利用Video-Camera和Mjepg-Stream在Android智能设备中运行YOLOv3
https://play.google.com/store/apps/details?id=com.acontech.android.SmartWebCam2
https://play.google.com/store/apps/details?id=com.pas.webcam
Yolo v3 COCO-model: darknet.exe detector demo data/coco.data yolov3.cfg yolov3.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0
CMakeList.txt是一个尝试发现所有安装过的、可选的依赖项(比如CUDA,cuDNN, ZED)的配置文件,然后使用这些依赖项进行编译。它将创建一个共享库文件,这样就可以使用Darknet进行代码开发。
在克隆了项目库以后按照以下命令进行执行:
mkdir build-release
cd build-release
cmake ..
make
make install
在克隆了项目库以后,直接运行make
命令,需要注意的是Makefile中有一些可选参数:
/usr/local/cuda
中)。/usr/local/cudnn
中)。建议使用以下方法来完成Window下Darknet的编译,需要环境有:Visual Studio 15/17/19, CUDA>10.0, cuDNN>7.0, OpenCV>2.4
使用CMake-GUI编译流程:
如果你已经满足Visual Studio 15/17/19 、CUDA>10.0、 cuDNN>7.0、OpenCV>2.4的条件, 那么推荐使用通过CMake-GUI的方式进行编译。
否则按照以下步骤进行编译:
vcpkg install opengl
。VCPKG_ROOT
, 指向vcpkg的安装路径。VCPKG_DEFAULT_TRIPLET
将其指向x64-windows。PS \> cd $env:VCPKG_ROOT
PS Code\vcpkg> .\vcpkg install pthreads opencv[ffmpeg]
#replace with opencv[cuda,ffmpeg] in case you want to use cuda-accelerated openCV
.\build.ps1
进行编译。如果要使用Visual Studio,将在Build后找到CMake为您创建的两个自定义解决方案,一个在build_win_debug
中,另一个在build_win_release
中,其中包含适用于系统的所有配置标志。如果你有CUDA10.0、cuDNN 7.4 和OpenCV 3.x , 那么打开build\darknet\darknet.sln
, 设置x64和Release 然后运行Build, 进行darknet的编译,将cuDNN加入环境变量中。
C:\opencv_3.0\opencv\build\x64\vc14\bin
找到opencv_world320.dll
和opencv_ffmpeg320_64.dll
, 然后将其复制到darknet.exe
同级目录中。C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
中检查是否含有bin和include文件夹。如果没有这两个文件夹,那就将他们从CUDA安装的地方复制到这个地方。CUDNN
。将cudnn64_7.dll
复制到\build\darknet\x64
中。如果你是用的是其他版本的CUDA(不是CUDA 10.0), 那么使用Notepad打开build\darknet\darknet.vxcproj
, 将其中的CUDA 10.0替换为你的CUDA的版本。然后打开\darknet.sln
, 然后右击工程,点击属性properties, 选择CUDA C/C++, 然后选择Device , 然后移除compute_75,sm_75
。之后从第一步从头开始执行。
如果你没有GPU但是有OpenCV3.0, 那么打开build\darknet\darknet_no_gpu.sln
, 设置x64和Release, 然后运行build -> build darknet_no_gpu。
如果你只安装了OpenCV 2.4.14,那你应该修改\darknet.sln
中的路径。
C:\opencv_2.4.13\opencv\build\include
C:\opencv_2.4.13\opencv\build\x64\vc14\lib
如果你的GPU有Tensor Cores(Nvidia Titan V/ Tesla V100/ DGX-2等型号), 可以提升目标检测模型测试速度为原来的3倍,训练速度变为原来的2倍。\darknet.sln
-> (右键点击工程) -> properties -> C/C++ -> Preprocessor -> Preprocessor Definitions, and add here: CUDNN_HALF;
注意:CUDA 必须在Visual Studio安装后再安装。
下载预训练模型 (154 MB): http://pjreddie.com/media/files/darknet53.conv.74
将其放在 build\darknet\x64
文件夹中。
下载pascal voc数据集并解压到 build\darknet\x64\data\voc
放在 build\darknet\x64\data\voc\VOCdevkit\
文件夹中:
http://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
。http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
。http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
。2.1 下载 voc_label.py
到 build\darknet\x64\data\voc
,地址为: http://pjreddie.com/media/files/voc_label.py。
下载并安装python: https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe
运行命令: python build\darknet\x64\data\voc\voc_label.py
(来生成文件: 2007_test.txt, 2007_train.txt, 2007_val.txt, 2012_train.txt, 2012_val.txt)。
运行命令: type 2007_train.txt 2007_val.txt 2012_*.txt > train.txt
。
在 yolov3-voc.cfg
文件中设置 batch=64
和subdivisions=8
。
使用 train_voc.cmd
或者使用以下命令开始训练:
darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
。
(Note: 如果想要停止loss显示,添加 -dont_show
标志. 如果使用CPU运行, 用darknet_no_gpu.exe
代替 darknet.exe
。)
如果想要改数据集路径的话,请修改 build\darknet\cfg\voc.data
文件。
Note: 在训练中如果你看到avg为nan,那证明训练出错。但是如果在其他部分出现nan,这属于正常现象,训练过程是正常的。
darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
。/backup/yolov3-voc_1000.weights
使用多GPU (最多4个GPU): darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg /backup/yolov3-voc_1000.weights -gpus 0,1,2,3
。在多GPU训练的时候,learning rate
需要进行修改,比如单gpu使用0.001
,那么多gpu应该使用0.001/GPUS。然后cfg
文件中的burn_in
参数和max_batches
参数要设置为原来的GPUS倍。
训练较早提出的Yolo 系列算法如yolov2-voc.cfg
, yolov2-tiny-voc.cfg
, yolo-voc.cfg
, yolo-voc.2.0.cfg
,请看https://github.com/AlexeyAB/darknet/tree/47c7af1cea5bbdedf1184963355e6418cb8b1b4f#how-to-train-pascal-voc-data
。
Training Yolo v3:
yolov3.cfg
内容相同的 yolo-obj.cfg
或者直接复制然后重命名为yolo-obj.cfg
然后设置cfg
文件中 batch=64
。
设置cfg
文件中 subdivisions=16
。
设置cfg
文件中max_batches
参数 (一般可以设置为classes*2000
但是不要低于 4000
), 比如 如果你有三个类,那么设置max_batches=6000
。
设置steps
参数,一般为80%和90%的max_batches
。比如 steps=4800,5400
设置网络输入长宽必须能够整除32,比如 width=416 height=416
`
修改yolo层中的 classes=80
改为你的类别的个数,比如classes=3
:
修改yolo层前一个卷积层convolutional输出通道数。修改的filter
个数有一定要求,按照公式filters=(classes+5)×3
来设置。这里的5
代表x, y, w, h, conf
, 这里的3
代表分配3
个anchor。
如果使用 [Gaussian_yolo]
(Gaussian_yolov3_BDD.cfg),filters
计算方式不太一样,按照 filters=(classes + 9)x3
进行计算。
通常来讲,filters的个数计算依赖于类别个数,坐标以及mask
的个数(cfg
中的mask
参数也就是anchors
的个数)。
举个例子,对于两个目标,你的 yolo-obj.cfg
和yolov3.cfg
不同的地方应该在每个[yolo]/[region]
层的下面几行:
[convolutional]
filters=21
[region]
classes=2
build\darknet\x64\data\
创建文件 obj.names
, 每行一个类别的名称。build\darknet\x64\data\
创建obj.data
, 具体内容如下: classes= 2 # 你的类别的个数
train = data/train.txt # 存储用于训练的图片位置
valid = data/test.txt # 存储用于测试的图片的位置
names = data/obj.names # 每行一个类别的名称
backup = backup/
build\darknet\x64\data\obj\
文件夹下。Yolo_mark
这个可视化GUI软件来标注出目标框并且产生标注文件。地址: https://github.com/AlexeyAB/Yolo_mark
。软件将会为每一个图像创建一个txt
文件,并将其放在同一个文件夹中,命名与原图片的名称相同,唯一不同的就是后缀是txt。txt标注文件中每一个目标独占一行,按照
的格式排布。
具体参数解释:
-是从 0
到 (classes-1)
的整数,代表具体的类别。
- 是归一化到(0.0 to 1.0]
之间的浮点数,都是相对于图片整体的宽和高的一个相对值。
比如:
或者
需要注意的是:
- 是标注框的中心点,而不是左上角。请注意格式。
举个例子,img1.txt中内容如下,代表有两个类别的三个目标:
1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667
build\darknet\x64\data\
文件夹中创建train.txt文件,每行包含的是训练集图片的内容。其路径是相对于 darknet.exe
的路径或者绝对路径: data/obj/img1.jpg
data/obj/img2.jpg
data/obj/img3.jpg
下载预训练权重,并将其放在 build\darknet\x64
文件夹中。
csresnext50-panet-spp.cfg
(133 MB):请查看原工程。yolov3.cfg, yolov3-spp.cfg
(154 MB):请查看原工程。yolov3-tiny-prn.cfg , yolov3-tiny.cfg
(6 MB):请查看原工程。enet-coco.cfg (EfficientNetB0-Yolov3)
:请查看原工程。使用以下命令行开始训练: darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74
。
对于linux用户使用以下命令开始训练: ./darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74
(使用./darknet
而不是 darknet.exe
)。
yolo-obj_last.weights
将会保存在 build\darknet\x64\backup\
文件夹中,每100个迭代保存一次。yolo-obj_xxxx.weights
将会保存在 build\darknet\x64\backup\
文件夹中,每1000个迭代保存一次。darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -dont_show
。darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -dont_show -mjpeg_port 8090 -map
,然后在浏览器中打开 URL http://ip-address:8090
。如果想训练的过程中同步显示mAP(每四个epoch进行一次更新),运行命令: darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -map
。
训练结束以后,将会在文件夹build\darknet\x64\backup\
中得到权重文件 yolo-obj_final.weights
。
darknet.exe detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights
,而不需要重头开始训练。注意:
avg
指标变为nan
,那证明训练过程有误,可能是数据标注越界导致的问题。但是其他指标有nan
是正常的。width
,height
的时候必须要保证两者都能够被32整除。darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
Ouf of memery
问题,那说明显卡的显存不够,你可以通过设置subdivisions
参数,将其从原来的16
提高为32
或者64
,这样就能降低使用的显存,保证程序正常运行。训练tiny yolo与以上的训练过程并无明显区别,除了以下几点:
https://pjreddie.com/media/files/yolov3-tiny.weights
darknet.exe partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
, 这里的15代表前15个层,也就是backbone所在的层。cfg/yolov3-tiny_obj.cfg
而不是 yolov3.cfg
darknet.exe detector train data/obj.data yolov3-tiny-obj.cfg yolov3-tiny.conv.15
如果想使用其他backbone进行训练比如 DenseNet201-Yolo或者ResNet50-Yolo, 你可以在以下链接中找到:https://github.com/AlexeyAB/darknet/blob/master/build/darknet/x64/partial.cmd
如果你采用的是自己设计的backbone,那就无法进行迁移学习,backbone可以直接进行参数随机初始化。
建议为每个类分配至少2000次迭代,但是整体迭代次数不应少于4000次。如果想要更加精准地定义什么时候该停止训练,需要使用以下方法:
Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 89002: 0.211667, 0.60730 avg, 0.001000 rate, 3.868000 seconds, 576128 images
Loaded: 0.000000 seconds
9002 - 代表当前的迭代次数。
0.60730 avg - average loss (error) - 这个指标是平均loss, 其越低越好。
在这个指标不再下降的时候就可以停止训练了。最终的值大概分布在0.05-3.0之间,小而简单的模型通常最终loss比较小,大而复杂的loss可能会比较大。
训练完成后,你就可以从 darknet\build\darknet\x64\backup
文件夹中取出比较靠后的几个weights
文件,并对他们进行测试,选择最好的权重文件。
举个例子,你在9000
次迭代后停止训练,但最好的权重可能是7000,8000,9000
次的值。这种情况的出现是由于过拟合导致的。过拟合是由于过度学习训练集的分布,而降低了模型在测试集的泛化能力。
Early Stopping Point示意图:
为了得到在early stopping point处的权重:
2.1 首先,你的obj.data文件中应该含有valid=valid.txt一项,用于测试在验证集的准确率。如果你没有验证集图片,那就直接复制train.txt重命名为valid.txt。
2.2 假如你选择在9000
次迭代后停止,那可以通过以下命令测试7000,8000,9000
三个模型的相关指标。选择最高mAP
或者最高IoU
的模型最为最终模型。
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_8000.weights
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_9000.weights
或者你可以选择使用-map
标志符来直接实时测试mAP值:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -map
然后你就能得到loss曲线和mAP曲线,mAP每4个epoch对验证集进行一次测试,并将结果显示在图中。
指标解释
mAP 是Pascal VOC竞赛的默认指标,与MS COCO竞赛中的AP50指标是一致的。
Precision和Recall参数在Pascal VOC竞赛中略微不同,但 IoU 的意义都是相同的.
下载VOC数据集,安装python并且下载``2007_test.txt文件,具体可以参考链接:
https://github.com/AlexeyAB/darknet#how-to-train-pascal-voc-data`
下载文件 https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/voc_label_difficult.py
到 build\darknet\x64\data\
文件夹,然后运行 voc_label_difficult.py
从而得到 difficult_2007_test.txt
。
将下面voc.data文件中的第四行#删除
classes= 20
train = data/train_voc.txt
valid = data/2007_test.txt
#difficult = data/difficult_2007_test.txt
names = data/voc.names
backup = backup/
然后就有两个方法来计算得到mAP:
build/darknet/x64/calc_mAP_voc_py.cmd
,你将得到 yolo-voc.cfg
模型的mAP值, mAP = 75.9%build/darknet/x64/calc_mAP.cmd
-你将得到 yolo-voc.cfg
模型, 得到mAP = 75.8%YOLOv3的论文:https://arxiv.org/pdf/1612.08242v1.pdf
指出对于416x416的YOLOv2,Pascal Voc上的mAP值是76.8%。我们得到的值较低,可能是由于模型在进行检测时的代码略有不同。
如果你想为tiny-yolo-voc
计算mAP值,将脚本中tiny-yolo-voc.cfg
取消注释,将yolo-voc.cfg
注释掉。
如果你是用的是python 2.x 而不是python 3.x, 而且你选择使用Darknet+Python的方式来计算mAP, 那你应该使用 reval_voc.py
和 voc_eval.py
而不是使用 reval_voc_py3.py
和 voc_eval_py3.py
。以上脚本来自以下目录:https://github.com/AlexeyAB/darknet/tree/master/scripts
。
目标检测的例子:darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
训练之前:
在cfg
文件中将random
设为1:这将在Yolo中使用多尺度训练,会提升检测模型准确率。
在cfg
文件中把输入分辨率增大(height=608
, width=608
或者其他任意32的倍数):这将提升检测模型准确率。
检查你要检测的每个目标在数据集中是否被标记,数据集中任何目标都不应该没有标签。在大多数训练出问题的情况中基本都是有错误的标签(通过使用某些转换脚本,使用第三方工具标注来获得标签),可以通过https://github.com/AlexeyAB/Yolo_mark
来检查你的数据集是否全部标注正确。
我的损失函数很高并且mAP很低,训练出错了吗?在训练命令末端使用-show_imgs
标志来运行训练,你是否能看到有正确的边界预测框的目标(在窗口或者aug_...jpg
)?如果没有,训练是发生错误了。
对于你要检测的每个目标,训练数据集中必须至少有一个相似的目标,它们具有大致相同的形状,物体侧面姿态,相对大小,旋转角度,倾斜度,照明度等。理想的是,你的训练数据集包括具有不同比例,旋转角度,照明度,物体侧面姿态和处于不同背景的目标图像,你最好拥有2000张不同的图像,并且至少训练2000×classes
轮次。
希望你的训练数据集图片包含你不想检测的未标注的目标,也即是无边界框的负样本图片(空的.txt
文件),并且负样本图片的数量和带有目标的正样本图片数量最好一样多。
标注目标的最佳方法是:仅仅标记目标的可见部分或者标记目标的可见和重叠部分,或标记比整个目标多一点(有一点间隙)?根据你希望如何检测目标来进行标记。
为了对图片中包含大量目标的数据进行训练,添加max=200
或者更高的值在你cfg
文件中yolo
层或者region
层的最后一行(YOLOv3可以检测到的目标全局最大数量为0,0615234375*(width*height)
其中width
和height
是在cfg
文件中的[net]
部分指定的)。
对于小目标的训练(把图像resize到416x416大小后小于16x16的目标):设置layers = -1, 11
而不是layers=-1, 36
;设置stride=4
而不是stride=2
。
对于既有大目标又有小目标的训练使用下面的模型:
https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3_5l.cfg
。https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny_3l.cfg
。https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-spp.cfg
。如果你要训练模型将左右目标分为单独的类别(左/右手,左/右交通标志),那就禁用翻转的数据扩充方式,即在数据输入部分添加flip=0
。
一般规则:你的训练数据集应包括一组您想要检测的相对大小的目标,如下:
train_network_width * train_obj_width / train_image_width ~= detection_network_width * detection_obj_width / detection_image_width
train_network_height * train_obj_height / train_image_height ~= detection_network_height * detection_obj_height / detection_image_height
即,对于测试集中的每个目标,训练集中必须至少有一个同类目标和它具有大约相同的尺寸:
object width in percent from Training dataset
~= object width in percent from Test dataset
也就是说,如果训练集中仅存在占图像比例80%-90%的目标,则训练后的目标检测网络将无法检测到占图像比例为1-10%的目标。
为了加快训练速度(同时会降低检测精度)使用微调而不是迁移学习,在[net]下面设置stopbackward=1
。然后执行下面的命令:./darknet partial cfg/yolov3.cfg yolov3.weights yolov3.conv.81 81
这将会创建yolov3.conv.81
文件,然后使用yolov3.conv.81
文件进行训练而不是darknet53.conv.74
。
在观察目标的时候,从不同的方向、不同的照明情况、不同尺度、不同的转角和倾斜角度来看,对神经网络来说,它们都是不同的目标。因此,要检测的目标越多,应使用越复杂的网络模型。
为了让检测框更准,你可以在每个yolo
层添加下面三个参数ignore_thresh = .9 iou_normalizer=0.5 iou_loss=giou
,这回提高[email protected],但会降低[email protected]。
当你是神经网络方面的专家时,可以重新计算相对于width
和height
的anchors
:darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
然后在3个[yolo]
层放置这9个anchors
。但是你需要修改每个[yolo]
层的masks
参数,让第一个[yolo]
层的anchors
尺寸大于60x60,第二个[yolo]
层的anchors
尺寸大于30x30,剩下就是第三个[yolo]
层的mask
。宁外,你需要修改每一个[yolo]
层前面的filters=(classes + 5)x
。如果很多计算的anchors
都找不到合适的层,那还是使用Yolo的默认anchors
吧。
训练之后:
.cfg
文件中设置(height=608
and width=608
)或者(height=832
and width=832
)或者任何32的倍数,这会提升准确率并使得对小目标的检测更加容易。
416x416
分辨率训练出来的.weights
模型文件。608x608
或者832x832
来训练,注意如果Out of memory
发生了,你应该在.cfg
文件中增加subdivisions=16,32,64
。下面的工程提供了用于标记目标边界框并为YOLO v2&v3 生成标注文件的带图像界面软件,地址为:https://github.com/AlexeyAB/Yolo_mark
。
例如对于只有两类目标的数据集标注后有以下文件train.txt
,obj.names
,obj.data
,yolo-obj.cfg
,air 1-6.txt
,bird 1-4.txt
,接着配合train_obj.cmd
就可以使用YOLO v2和YOLO v3来训练这个数据集了。
下面提供了5重常见的目标标注工具:
https://github.com/AlexeyAB/Yolo_mark
https://github.com/tzutalin/labelImg
https://github.com/Cartucho/OpenLabeling
https://www.ccoderun.ca/darkmark/
https://github.com/opencv/cvat
同时检测和分类9000个目标:darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights data/dog.jpg
yolo9000.weights
:186Mb的YOLO9000模型需要4G GPU显存,训练好的模型下载地址:http://pjreddie.com/media/files/yolo9000.weights
。
yolo9000.cfg
:YOLO9000的c网络结构文件,同时这里也有9k.tree
和coco9k.map
文件的路径。
tree=data/9k.tree
map = data/coco9k.map
9k.tree
:9418个类别的单词数,每一行的形式为
,如果parent_id==-1
那么这个标签没有父类别,地址为:https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.tree
。coco9k.map
:将MSCOCO的80个目标类别映射到9k.tree
的文件,地址为:https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/coco9k.map
。combine9k.data
:数据文件,分别是9k.labels
。9k.names
,inet9k.map
的路径(修改combine9k.train.list
文件的路径为你自己的)。地址为:https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/combine9k.data
。
9k.labels
:9418类目标的标签。地址为:https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.labels
。
9k.names
:9418类目标的名字。地址为:https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.names
。
inet9k.map
:将ImageNet的200个目标类别映射到9k.tree
的文件,地址为:https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/inet9k.map
。
在Linux上。
build.sh
或者cmake
编译darknet
或者Makefile
重的LIBSO=0
改为LIBSO=1
,然后执行make
编译darknet
在Windows上。
build.ps1
或者cmake
编译darknet
或者build\darknet\yolo_cpp_dll.sln
或build\darknet\yolo_cpp_dll_no_gpu.sln
解决方法编译darknet
这里有两个API:
https://github.com/AlexeyAB/darknet/blob/master/include/darknet.h
https://github.com/AlexeyAB/darknet/blob/master/darknet.py
https://github.com/AlexeyAB/darknet/blob/master/darknet_video.py
https://github.com/AlexeyAB/darknet/blob/master/include/yolo_v2_class.hpp
https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp
yolo_cpp_dll.dll
:打开build\darknet\yolo_cpp_dll.sln
解决方案,编译选项选X64和Release,然后执行Build->Build yolo_cpp_dll就,编译的一些前置条件为:CUDNN
。在自己的C++工程中将Yolo当成DLL文件使用:打开build\darknet\yolo_console_dll.sln
解决方案,编译选项选X64和Release,然后执行Build->Build yolo_console_dll:
build\darknet\x64\yolo_console_dll.exe
可执行程序并使用下面的命令: yolo_console_dll.exe data/coco.names yolov3.cfg yolov3.weights test.mp4
yolo_console_dll.cpp
中的//#define OPENCV
取消注释。yolo_cpp_dll.dll
-API:https://github.com/AlexeyAB/darknet/blob/master/include/yolo_v2_class.hpp
struct bbox_t {
unsigned int x, y, w, h; // (x,y) - top-left corner, (w, h) - width & height of bounded box
float prob; // confidence - probability that the object was found correctly
unsigned int obj_id; // class of object - from range [0, classes-1]
unsigned int track_id; // tracking id for video (0 - untracked, 1 - inf - tracked object)
unsigned int frames_counter;// counter of frames on which the object was detected
};
class Detector {
public:
Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
~Detector();
std::vector detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
std::vector detect(image_t img, float thresh = 0.2, bool use_mean = false);
static image_t load_image(std::string image_filename);
static void free_image(image_t m);
#ifdef OPENCV
std::vector detect(cv::Mat mat, float thresh = 0.2, bool use_mean = false);
std::shared_ptr mat_to_image_resize(cv::Mat mat) const;
#endif
};
AlexeyAB版本Darknet链接
https://github.com/AlexeyAB/darknet
“GiantPandaCV”是由两位对计算机视觉心怀热情的95后创建的,专注于深度学习基础路线,不盲目追求热点,按照科学的计算机视觉学习路线踏实而坚定地走下去。
目前公众号有两位作者,分别是BBuf和pprp,分别负责不同方向的论文阅读和写作,同时会分享在我们入门、深入计算机视觉的过程,想法,以及走过的弯路。
欢迎对计算机视觉感兴趣或者遇到一些麻烦的朋友们添加BBuf或者pprp的微信,我们将你带入一个热心分享、共同解决困难的集体!
欢迎添加BBuf的微信:
欢迎添加pprp的微信:
欢迎您的加入,愿与君共同成长。