GitHub原文:https://github.com/AlexeyAB/darknet#how-to-compile-on-linux

参考博客原址:https://blog.csdn.net/qq_34806812/article/details/81385163

Yolo-v3 and Yolo-v2 for Windows and Linux

(neural network for object detection)

  1. How to use
  2. How to compile on Linux
  3. How to compile on Windows
  4. How to train (Pascal VOC Data)
  5. How to train (to detect your custom objects)
  6. When should I stop training
  7. How to calculate mAP on PascalVOC 2007
  8. How to improve object detection
  9. How to mark bounded boxes of objects and create annotation files
  10. Using Yolo9000
  11. How to use Yolo as DLL
  • Yolo v3 source chart for the RetinaNet on MS COCO got from Table 1 (e): https://arxiv.org/pdf/1708.02002.pdf
  • Yolo v2 on Pascal VOC 2007: https://hsto.org/files/a24/21e/068/a2421e0689fb43f08584de9d44c2215f.jpg
  • Yolo v2 on Pascal VOC 2012 (comp4): https://hsto.org/files/3a6/fdf/b53/3a6fdfb533f34cee9b52bdd9bb0b19d9.jpg

"You Only Look Once: Unified, Real-Time Object Detection (versions 2 & 3)"

A Yolo cross-platform Windows and Linux version (for object detection). Contributtors: https://github.com/pjreddie/darknet/graphs/contributors

This repository is forked from Linux-version: https://github.com/pjreddie/darknet

More details: http://pjreddie.com/darknet/yolo/

This repository supports:

  • both Windows and Linux
  • both OpenCV 2.x.x and OpenCV <= 3.4.0 (3.4.1 and higher isn't supported)
  • both cuDNN v5-v7
  • CUDA >= 7.5
  • also create SO-library on Linux and DLL-library on Windows

Requires:

  • Linux GCC>=4.9 or Windows MS Visual Studio 2015 (v140): https://go.microsoft.com/fwlink/?LinkId=532606&clcid=0x409 (or offline ISO image)
  • CUDA 9.1: https://developer.nvidia.com/cuda-downloads
  • OpenCV 3.4.0: https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.4.0/opencv-3.4.0-vc14_vc15.exe/download
  • or OpenCV 2.4.13: https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.13/opencv-2.4.13.2-vc14.exe/download
    • OpenCV allows to show image or video detection in the window and store result to file that specified in command line -out_filename res.avi
  • GPU with CC >= 3.0: https://en.wikipedia.org/wiki/CUDA#GPUs_supported

Pre-trained models for different cfg-files can be downloaded from (smaller -> faster & lower quality):

  • yolov3.cfg (236 MB COCO Yolo v3) - requires 4 GB GPU-RAM: https://pjreddie.com/media/files/yolov3.weights
  • yolov3-tiny.cfg (34 MB COCO Yolo v3 tiny) - requires 1 GB GPU-RAM: https://pjreddie.com/media/files/yolov3-tiny.weights
  • yolov2.cfg (194 MB COCO Yolo v2) - requires 4 GB GPU-RAM: https://pjreddie.com/media/files/yolov2.weights
  • yolo-voc.cfg (194 MB VOC Yolo v2) - requires 4 GB GPU-RAM: http://pjreddie.com/media/files/yolo-voc.weights
  • yolov2-tiny.cfg (43 MB COCO Yolo v2) - requires 1 GB GPU-RAM: https://pjreddie.com/media/files/yolov2-tiny.weights
  • yolov2-tiny-voc.cfg (60 MB VOC Yolo v2) - requires 1 GB GPU-RAM: http://pjreddie.com/media/files/yolov2-tiny-voc.weights
  • yolo9000.cfg (186 MB Yolo9000-model) - requires 4 GB GPU-RAM: http://pjreddie.com/media/files/yolo9000.weights

Put it near compiled: darknet.exe

You can get cfg-files by path: darknet/cfg/

Examples of results:

Others: https://www.youtube.com/channel/UC7ev3hNVkx4DzZ3LO19oebg

How to use:

Example of usage in cmd-files from build\darknet\x64\:

  • darknet_yolo_v3.cmd - initialization with 236 MB Yolo v3 COCO-model yolov3.weights & yolov3.cfg and show detection on the image: dog.jpg

  • darknet_voc.cmd - initialization with 194 MB VOC-model yolo-voc.weights & yolo-voc.cfg and waiting for entering the name of the image file

  • darknet_demo_voc.cmd - initialization with 194 MB VOC-model yolo-voc.weights & yolo-voc.cfg and play your video file which you must rename to: test.mp4

  • darknet_demo_store.cmd - initialization with 194 MB VOC-model yolo-voc.weights & yolo-voc.cfg and play your video file which you must rename to: test.mp4, and store result to: res.avi

  • darknet_net_cam_voc.cmd - initialization with 194 MB VOC-model, play video from network video-camera mjpeg-stream (also from you phone)

  • darknet_web_cam_voc.cmd - initialization with 194 MB VOC-model, play video from Web-Camera number #0

  • darknet_coco_9000.cmd - initialization with 186 MB Yolo9000 COCO-model, and show detection on the image: dog.jpg

  • darknet_coco_9000_demo.cmd - initialization with 186 MB Yolo9000 COCO-model, and show detection on the video (if it is present): street4k.mp4, and store result to: res.avi

How to use on the command line:

On Linux use ./darknet instead of darknet.exe, like this:./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights

  • Yolo v3 COCO - image: darknet.exe detector test data/coco.data cfg/yolov3.cfg yolov3.weights -i 0 -thresh 0.25
  • Alternative method Yolo v3 COCO - image: darknet.exe detect cfg/yolov3.cfg yolov3.weights -i 0 -thresh 0.25
  • Output coordinates of objects: darknet.exe detector test data/coco.data yolov3.cfg yolov3.weights -thresh 0.25 dog.jpg -ext_output
  • 194 MB VOC-model - image: darknet.exe detector test data/voc.data yolo-voc.cfg yolo-voc.weights -i 0
  • 194 MB VOC-model - video: darknet.exe detector demo data/voc.data yolo-voc.cfg yolo-voc.weights test.mp4 -i 0
  • 194 MB VOC-model - save result to the file res.avidarknet.exe detector demo data/voc.data yolo-voc.cfg yolo-voc.weights test.mp4 -i 0 -out_filename res.avi
  • Alternative method 194 MB VOC-model - video: darknet.exe yolo demo yolo-voc.cfg yolo-voc.weights test.mp4 -i 0
  • 43 MB VOC-model for video: darknet.exe detector demo data/coco.data cfg/yolov2-tiny.cfg yolov2-tiny.weights test.mp4 -i 0
  • Yolo v3 236 MB COCO for net-videocam - Smart WebCam: darknet.exe detector demo data/coco.data cfg/yolov3.cfg yolov3.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0
  • 194 MB VOC-model for net-videocam - Smart WebCam: darknet.exe detector demo data/voc.data yolo-voc.cfg yolo-voc.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0
  • 194 MB VOC-model - WebCamera #0: darknet.exe detector demo data/voc.data yolo-voc.cfg yolo-voc.weights -c 0
  • 186 MB Yolo9000 - image: darknet.exe detector test cfg/combine9k.data yolo9000.cfg yolo9000.weights
  • Remeber to put data/9k.tree and data/coco9k.map under the same folder of your app if you use the cpp api to build an app
  • To process a list of images data/train.txt and save results of detection to result.txt use:
    darknet.exe detector test data/voc.data yolo-voc.cfg yolo-voc.weights -dont_show -ext_output < data/train.txt > result.txt

For using network video-camera mjpeg-stream with any Android smartphone:

  1. Download for Android phone mjpeg-stream soft: IP Webcam / Smart WebCam

    <ul><li>Smart WebCam - preferably:&nbsp;<a href="https://play.google.com/store/apps/details?id=com.acontech.android.SmartWebCam2" rel="nofollow" target="_blank">https://play.google.com/store/apps/details?id=com.acontech.android.SmartWebCam2</a></li><li>IP Webcam:&nbsp;<a href="https://play.google.com/store/apps/details?id=com.pas.webcam" rel="nofollow" target="_blank">https://play.google.com/store/apps/details?id=com.pas.webcam</a></li>
    </ul></li>
    <li>
    <p>Connect your Android phone to computer by WiFi (through a WiFi-router) or USB</p>
    </li>
    <li>
    <p>Start Smart WebCam on your phone</p>
    </li>
    <li>
    <p>Replace the address below, on shown in the phone application (Smart WebCam) and launch:</p>
    </li>
    
  • 194 MB COCO-model: darknet.exe detector demo data/coco.data yolo.cfg yolo.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0
  • 194 MB VOC-model: darknet.exe detector demo data/voc.data yolo-voc.cfg yolo-voc.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0

How to compile on Linux:

Just do make in the darknet directory. Before make, you can set such options in the Makefile: link

  • GPU=1 to build with CUDA to accelerate by using GPU (CUDA should be in /usr/local/cuda)
  • CUDNN=1 to build with cuDNN v5-v7 to accelerate training by using GPU (cuDNN should be in /usr/local/cudnn)
  • CUDNN_HALF=1 to build for Tensor Cores (on Titan V / Tesla V100 / DGX-2 and later) speedup Detection 3x, Training 2x
  • OPENCV=1 to build with OpenCV 3.x/2.4.x - allows to detect on video files and video streams from network cameras or web-cams
  • DEBUG=1 to bould debug version of Yolo
  • OPENMP=1 to build with OpenMP support to accelerate Yolo by using multi-core CPU
  • LIBSO=1 to build a library darknet.so and binary runable file uselib that uses this library. Or you can try to run so LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4 How to use this SO-library from your own code - you can look at C++ example: https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp or use in such a way: LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov3.cfg yolov3.weights test.mp4

How to compile on Windows:

  1. If you have MSVS 2015, CUDA 9.1, cuDNN 7.0 and OpenCV 3.x (with paths: C:\opencv_3.0\opencv\build\include & C:\opencv_3.0\opencv\build\x64\vc14\lib), then start MSVS, open build\darknet\darknet.sln, set x64 and Releasehttps://hsto.org/webt/uh/fk/-e/uhfk-eb0q-hwd9hsxhrikbokd6u.jpeg and do the: Build -> Build darknet. NOTE: If installing OpenCV, use OpenCV 3.4.0 or earlier. This is a bug in OpenCV 3.4.1 in the C API (see #500).

    <p>1.1. Find files&nbsp;<code>opencv_world320.dll</code>&nbsp;and&nbsp;<code>opencv_ffmpeg320_64.dll</code>&nbsp;(or&nbsp;<code>opencv_world340.dll</code>&nbsp;and&nbsp;<code>opencv_ffmpeg340_64.dll</code>) in&nbsp;<code>C:\opencv_3.0\opencv\build\x64\vc14\bin</code>&nbsp;and put it near with&nbsp;<code>darknet.exe</code></p><p>1.2 Check that there are&nbsp;<code>bin</code>&nbsp;and&nbsp;<code>include</code>&nbsp;folders in the&nbsp;<code>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1</code>&nbsp;if aren't, then copy them to this folder from the path where is CUDA installed</p><p>1.3. To install CUDNN (speedup neural network), do the following:</p><ul><li><p>download and install&nbsp;<strong>cuDNN 7.0 for CUDA 9.1</strong>:&nbsp;<a href="https://developer.nvidia.com/cudnn" rel="nofollow" target="_blank">https://developer.nvidia.com/cudnn</a></p></li><li><p>add Windows system variable&nbsp;<code>cudnn</code>&nbsp;with path to CUDNN:&nbsp;<a href="https://hsto.org/files/a49/3dc/fc4/a493dcfc4bd34a1295fd15e0e2e01f26.jpg" rel="nofollow" target="_blank">https://hsto.org/files/a49/3dc/fc4/a493dcfc4bd34a1295fd15e0e2e01f26.jpg</a></p></li>
    </ul><p>1.4. If you want to build&nbsp;<strong>without CUDNN</strong>&nbsp;then: open&nbsp;<code>\darknet.sln</code>&nbsp;-&gt; (right click on project) -&gt; properties -&gt; C/C++ -&gt; Preprocessor -&gt; Preprocessor Definitions, and remove this:&nbsp;<code>CUDNN;</code></p>
    </li>
    <li>
    <p>If you have other version of&nbsp;<strong>CUDA (not 9.1)</strong>&nbsp;then open&nbsp;<code>build\darknet\darknet.vcxproj</code>&nbsp;by using Notepad, find 2 places with "CUDA 9.1" and change it to your CUDA-version, then do step 1</p>
    </li>
    <li>
    <p>If you&nbsp;<strong>don't have GPU</strong>, but have&nbsp;<strong>MSVS 2015 and OpenCV 3.0</strong>&nbsp;(with paths:&nbsp;<code>C:\opencv_3.0\opencv\build\include</code>&nbsp;&amp;&nbsp;<code>C:\opencv_3.0\opencv\build\x64\vc14\lib</code>), then start MSVS, open&nbsp;<code>build\darknet\darknet_no_gpu.sln</code>, set&nbsp;<strong>x64</strong>&nbsp;and&nbsp;<strong>Release</strong>, and do the: Build -&gt; Build darknet_no_gpu</p>
    </li>
    <li>
    <p>If you have&nbsp;<strong>OpenCV 2.4.13</strong>&nbsp;instead of 3.0 then you should change pathes after&nbsp;<code>\darknet.sln</code>&nbsp;is opened</p><p>4.1 (right click on project) -&gt; properties -&gt; C/C++ -&gt; General -&gt; Additional Include Directories:<code>C:\opencv_2.4.13\opencv\build\include</code></p><p>4.2 (right click on project) -&gt; properties -&gt; Linker -&gt; General -&gt; Additional Library Directories:&nbsp;<code>C:\opencv_2.4.13\opencv\build\x64\vc14\lib</code></p>
    </li>
    <li>
    <p>If you have GPU with Tensor Cores (nVidia Titan V / Tesla V100 / DGX-2 and later) speedup Detection 3x, Training 2x:<code>\darknet.sln</code>&nbsp;-&gt; (right click on project) -&gt; properties -&gt; C/C++ -&gt; Preprocessor -&gt; Preprocessor Definitions, and add here:&nbsp;<code>CUDNN_HALF;</code></p><p><strong>Note:</strong>&nbsp;CUDA must be installed only after that MSVS2015 had been installed.</p>
    </li>
    

How to compile (custom):

Also, you can to create your own darknet.sln & darknet.vcxproj, this example for CUDA 9.1 and OpenCV 3.0

Then add to your created project:

  • (right click on project) -> properties -> C/C++ -> General -> Additional Include Directories, put here:

C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include

  • (right click on project) -> Build dependecies -> Build Customizations -> set check on CUDA 9.1 or what version you have - for example as here: http://devblogs.nvidia.com/parallelforall/wp-content/uploads/2015/01/VS2013-R-5.jpg
  • add to project all .c & .cu files and file http_stream.cpp from \src
  • (right click on project) -> properties -> Linker -> General -> Additional Library Directories, put here:

C:\opencv_3.0\opencv\build\x64\vc14\lib;$(CUDA_PATH)lib\$(PlatformName);$(cudnn)\lib\x64;%(AdditionalLibraryDirectories)

  • (right click on project) -> properties -> Linker -> Input -> Additional dependecies, put here:

..\..\3rdparty\lib\x64\pthreadVC2.lib;cublas.lib;curand.lib;cudart.lib;cudnn.lib;%(AdditionalDependencies)

  • (right click on project) -> properties -> C/C++ -> Preprocessor -> Preprocessor Definitions

OPENCV;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)

  • compile to .exe (X64 & Release) and put .dll-s near with .exe: https://hsto.org/webt/uh/fk/-e/uhfk-eb0q-hwd9hsxhrikbokd6u.jpeg

    <ul><li><p><code>pthreadVC2.dll, pthreadGC2.dll</code>&nbsp;from \3rdparty\dll\x64</p></li><li><p><code>cusolver64_91.dll, curand64_91.dll, cudart64_91.dll, cublas64_91.dll</code>&nbsp;- 91 for CUDA 9.1 or your version, from C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\bin</p></li><li><p>For OpenCV 3.2:&nbsp;<code>opencv_world320.dll</code>&nbsp;and&nbsp;<code>opencv_ffmpeg320_64.dll</code>&nbsp;from&nbsp;<code>C:\opencv_3.0\opencv\build\x64\vc14\bin</code></p></li><li><p>For OpenCV 2.4.13:&nbsp;<code>opencv_core2413.dll</code>,&nbsp;<code>opencv_highgui2413.dll</code>&nbsp;and&nbsp;<code>opencv_ffmpeg2413_64.dll</code>&nbsp;from<code>C:\opencv_2.4.13\opencv\build\x64\vc14\bin</code></p></li>
    </ul></li>
    

How to train (Pascal VOC Data):

  1. Download pre-trained weights for the convolutional layers (154 MB): http://pjreddie.com/media/files/darknet53.conv.74and put to the directory build\darknet\x64

  2. Download The Pascal VOC Data and unpack it to directory build\darknet\x64\data\voc will be created dir build\darknet\x64\data\voc\VOCdevkit\:

    <ul><li><a href="http://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar" rel="nofollow" target="_blank">http://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar</a></li><li><a href="http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar" rel="nofollow" target="_blank">http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar</a></li><li><a href="http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar" rel="nofollow" target="_blank">http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar</a></li>
    </ul><p>2.1 Download file&nbsp;<code>voc_label.py</code>&nbsp;to dir&nbsp;<code>build\darknet\x64\data\voc</code>:&nbsp;<a href="http://pjreddie.com/media/files/voc_label.py" rel="nofollow" target="_blank">http://pjreddie.com/media/files/voc_label.py</a></p>
    </li>
    <li>
    <p>Download and install Python for Windows:&nbsp;<a href="https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe" rel="nofollow" target="_blank">https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe</a></p>
    </li>
    <li>
    <p>Run command:&nbsp;<code>python build\darknet\x64\data\voc\voc_label.py</code>&nbsp;(to generate files: 2007_test.txt, 2007_train.txt, 2007_val.txt, 2012_train.txt, 2012_val.txt)</p>
    </li>
    <li>
    <p>Run command:&nbsp;<code>type 2007_train.txt 2007_val.txt 2012_*.txt &gt; train.txt</code></p>
    </li>
    <li>
    <p>Set&nbsp;<code>batch=64</code>&nbsp;and&nbsp;<code>subdivisions=8</code>&nbsp;in the file&nbsp;<code>yolov3-voc.cfg</code>:&nbsp;<a href="https://github.com/AlexeyAB/darknet/blob/ee38c6e1513fb089b35be4ffa692afd9b3f65747/cfg/yolov3-voc.cfg#L3-L4" rel="nofollow" target="_blank">link</a></p>
    </li>
    <li>
    <p>Start training by using&nbsp;<code>train_voc.cmd</code>&nbsp;or by using the command line:</p><p><code>darknet.exe detector train data/voc.data cfg/yolov3-voc.cfg darknet53.conv.74</code></p>
    </li>
    

(Note: To disable Loss-Window use flag -dont_show. If you are using CPU, try darknet_no_gpu.exe instead of darknet.exe.)

If required change pathes in the file build\darknet\x64\data\voc.data

More information about training by the link: http://pjreddie.com/darknet/yolo/#train-voc

Note: If during training you see nan values for avg (loss) field - then training goes wrong, but if nan is in some other lines - then training goes well.

How to train with multi-GPU:

  1. Train it first on 1 GPU for like 1000 iterations: darknet.exe detector train data/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

  2. Then stop and by using partially-trained model /backup/yolov3-voc_1000.weights run training with multigpu (up to 4 GPUs): darknet.exe detector train data/voc.data cfg/yolov3-voc.cfg /backup/yolov3-voc_1000.weights -gpus 0,1,2,3

https://groups.google.com/d/msg/darknet/NbJqonJBTSY/Te5PfIpuCAAJ

How to train (to detect your custom objects):

(to train old Yolo v2 yolov2-voc.cfgyolov2-tiny-voc.cfgyolo-voc.cfgyolo-voc.2.0.cfg, ... click by the link)

Training Yolo v3:

  1. Create file yolo-obj.cfg with the same content as in yolov3.cfg (or copy yolov3.cfg to yolo-obj.cfg) and:
  • change line batch to batch=64
  • change line subdivisions to subdivisions=8
  • change line classes=80 to your number of objects in each of 3 [yolo]-layers:
    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L610
    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L696
    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L783
  • change [filters=255] to filters=(classes + 5)x3 in the 3 [convolutional] before each [yolo] layer
    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L603
    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L689
    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L776

So if classes=1 then should be filters=18. If classes=2 then write filters=21.

(Do not write in the cfg-file: filters=(classes + 5)x3)

(Generally filters depends on the classescoords and number of masks, i.e. filters=(classes + coords + 1)*<number of mask>, where mask is indices of anchors. If mask is absence, then filters=(classes + coords + 1)*num)

So for example, for 2 objects, your file yolo-obj.cfg should differ from yolov3.cfg in such lines in each of 3 [yolo]-layers:

  1. [convolutional]
  2. filters=21
  3. [region]
  4. classes=2
  1. Create file obj.names in the directory build\darknet\x64\data\, with objects names - each in new line

  2. Create file obj.data in the directory build\darknet\x64\data\, containing (where classes = number of objects):

  1. classes= 2
  2. train = data/train.txt
  3. valid = data/test.txt
  4. names = data/obj.names
  5. backup = backup/
  1. Put image-files (.jpg) of your objects in the directory build\darknet\x64\data\obj\

  2. You should label each object on images from your dataset. Use this visual GUI-software for marking bounded boxes of objects and generating annotation files for Yolo v2 & v3: https://github.com/AlexeyAB/Yolo_mark

It will create .txt-file for each .jpg-image-file - in the same directory and with the same name, but with .txt-extension, and put to file: object number and object coordinates on this image, for each object in new line: <object-class> <x> <y> <width> <height>

Where:

  • <object-class> - integer object number from 0 to (classes-1)
  • <x> <y> <width> <height> - float values relative to width and height of image, it can be equal from (0.0 to 1.0]
  • for example: <x> = <absolute_x> / <image_width> or <height> = <absolute_height> / <image_height>
  • atention: <x> <y> - are center of rectangle (are not top-left corner)

For example for img1.jpg you will be created img1.txt containing:

  1. 1 0.716797 0.395833 0.216406 0.147222
  2. 0 0.687109 0.379167 0.255469 0.158333
  3. 1 0.420312 0.395833 0.140625 0.166667
  1. Create file train.txt in directory build\darknet\x64\data\, with filenames of your images, each filename in new line, with path relative to darknet.exe, for example containing:
  1. data/obj/img1.jpg
  2. data/obj/img2.jpg
  3. data/obj/img3.jpg
  1. Download pre-trained weights for the convolutional layers (154 MB): https://pjreddie.com/media/files/darknet53.conv.74and put to the directory build\darknet\x64

  2. Start training by using the command line: darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74

    <p>(file&nbsp;<code>yolo-obj_xxx.weights</code>&nbsp;will be saved to the&nbsp;<code>build\darknet\x64\backup\</code>&nbsp;for each 100 iterations) (To disable Loss-Window use&nbsp;<code>darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -dont_show</code>, if you train on computer without monitor like a cloud Amazaon EC2)</p>
    </li>
    <li>
    <p>After training is complete - get result&nbsp;<code>yolo-obj_final.weights</code>&nbsp;from path&nbsp;<code>build\darknet\x64\backup\</code></p>
    </li>
    
  • After each 100 iterations you can stop and later start training from this point. For example, after 2000 iterations you can stop training, and later just copy yolo-obj_2000.weights from build\darknet\x64\backup\ to build\darknet\x64\ and start training using: darknet.exe detector train data/obj.data yolo-obj.cfg yolo-obj_2000.weights

    <p>(in the original repository&nbsp;<a href="https://github.com/pjreddie/darknet" rel="nofollow" target="_blank">https://github.com/pjreddie/darknet</a>&nbsp;the weights-file is saved only once every 10 000 iterations&nbsp;<code>if(iterations &gt; 1000)</code>)</p>
    </li>
    <li>
    <p>Also you can get result earlier than all 45000 iterations.</p>
    </li>
    

Note: If during training you see nan values for avg (loss) field - then training goes wrong, but if nan is in some other lines - then training goes well.

Note: If you changed width= or height= in your cfg-file, then new width and height must be divisible by 32.

Note: After training use such command for detection: darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights

Note: if error Out of memory occurs then in .cfg-file you should increase subdivisions=16, 32 or 64: link

How to train tiny-yolo (to detect your custom objects):

Do all the same steps as for the full yolo model as described above. With the exception of:

  • Download default weights file for yolov3-tiny: https://pjreddie.com/media/files/yolov3-tiny.weights
  • Get pre-trained weights yolov3-tiny.conv.15 using command: darknet.exe partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
  • Make your custom model yolov3-tiny-obj.cfg based on cfg/yolov3-tiny_obj.cfg instead of yolov3.cfg
  • Start training: darknet.exe detector train data/obj.data yolov3-tiny-obj.cfg yolov3-tiny.conv.15

For training Yolo based on other models (DenseNet201-Yolo or ResNet50-Yolo), you can download and get pre-trained weights as showed in this file: https://github.com/AlexeyAB/darknet/blob/master/build/darknet/x64/partial.cmd If you made you custom model that isn't based on other models, then you can train it without pre-trained weights, then will be used random initial weights.

When should I stop training:

Usually sufficient 2000 iterations for each class(object). But for a more precise definition when you should stop training, use the following manual:

  1. During training, you will see varying indicators of error, and you should stop when no longer decreases 0.XXXXXXX avg:

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: 8

9002: 0.211667, 0.060730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

  • 9002 - iteration number (number of batch)
  • 0.060730 avg - average loss (error) - the lower, the better

When you see that average loss 0.xxxxxx avg no longer decreases at many iterations then you should stop training.

  1. Once training is stopped, you should take some of last .weights-files from darknet\build\darknet\x64\backup and choose the best of them:

For example, you stopped training after 9000 iterations, but the best result can give one of previous weights (7000, 8000, 9000). It can happen due to overfitting. Overfitting - is case when you can detect objects on images from training-dataset, but can't detect objects on any others images. You should get weights from Early Stopping Point:

To get weights from Early Stopping Point:

2.1. At first, in your file obj.data you must specify the path to the validation dataset valid = valid.txt (format of valid.txtas in train.txt), and if you haven't validation images, just copy data\train.txt to data\valid.txt.

2.2 If training is stopped after 9000 iterations, to validate some of previous weights use this commands:

(If you use another GitHub repository, then use darknet.exe detector recall... instead of darknet.exe detector map...)

  • 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

And comapre last output lines for each weights (7000, 8000, 9000):

Choose weights-file with the highest IoU (intersect of union) and mAP (mean average precision)

For example, bigger IOU gives weights yolo-obj_8000.weights - then use this weights for detection.

Example of custom object detection: darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights

  • IoU (intersect of union) - average instersect of union of objects and detections for a certain threshold = 0.24

  • mAP (mean average precision) - mean value of average precisions for each class, where average precision is average value of 11 points on PR-curve for each possible threshold (each probability of detection) for the same class (Precision-Recall in terms of PascalVOC, where Precision=TP/(TP+FP) and Recall=TP/(TP+FN) ), page-11: http://homepages.inf.ed.ac.uk/ckiw/postscript/ijcv_voc09.pdf

mAP is default metric of precision in the PascalVOC competition, this is the same as AP50 metric in the MS COCO competition. In terms of Wiki, indicators Precision and Recall have a slightly different meaning than in the PascalVOC competition, but IoU always has the same meaning.

How to calculate mAP on PascalVOC 2007:

  1. To calculate mAP (mean average precision) on PascalVOC-2007-test:
  • Download PascalVOC dataset, install Python 3.x and get file 2007_test.txt as described here: https://github.com/AlexeyAB/darknet#how-to-train-pascal-voc-data
  • Then download file https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/voc_label_difficult.py to the dir build\darknet\x64\data\ then run voc_label_difficult.py to get the file difficult_2007_test.txt
  • Remove symbol # from this line to un-comment it: https://github.com/AlexeyAB/darknet/blob/master/build/darknet/x64/data/voc.data#L4
  • Then there are 2 ways to get mAP:
    1. Using Darknet + Python: run the file build/darknet/x64/calc_mAP_voc_py.cmd - you will get mAP for yolo-voc.cfgmodel, mAP = 75.9%
    2. Using this fork of Darknet: run the file build/darknet/x64/calc_mAP.cmd - you will get mAP for yolo-voc.cfg model, mAP = 75.8%

(The article specifies the value of mAP = 76.8% for YOLOv2 416×416, page-4 table-3: https://arxiv.org/pdf/1612.08242v1.pdf. We get values lower - perhaps due to the fact that the model was trained on a slightly different source code than the code on which the detection is was done)

  • if you want to get mAP for tiny-yolo-voc.cfg model, then un-comment line for tiny-yolo-voc.cfg and comment line for yolo-voc.cfg in the .cmd-file
  • if you have Python 2.x instead of Python 3.x, and if you use Darknet+Python-way to get mAP, then in your cmd-file use reval_voc.py and voc_eval.py instead of reval_voc_py3.py and voc_eval_py3.py from this directory: https://github.com/AlexeyAB/darknet/tree/master/scripts

Custom object detection:

Example of custom object detection: darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights

How to improve object detection:

  1. Before training:
  • set flag random=1 in your .cfg-file - it will increase precision by training Yolo for different resolutions: link

  • increase network resolution in your .cfg-file (height=608width=608 or any value multiple of 32) - it will increase precision

  • recalculate anchors for your dataset for width and height from cfg-file: darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416 then set the same 9 anchors in each of 3 [yolo]-layers in your cfg-file

  • check that each object are mandatory labeled in your dataset - no one object in your data set should not be without label. In the most training issues - there are wrong labels in your dataset (got labels by using some conversion script, marked with a third-party tool, ...). Always check your dataset by using: https://github.com/AlexeyAB/Yolo_mark

  • desirable that your training dataset include images with objects at diffrent: scales, rotations, lightings, from different sides, on different backgrounds - you should preferably have 2000 different images for each class or more, and you should train 2000*classes iterations or more

  • desirable that your training dataset include images with non-labeled objects that you do not want to detect - negative samples without bounded box (empty .txt files) - use as many images of negative samples as there are images with objects

  • for training with a large number of objects in each image, add the parameter max=200 or higher value in the last layer [region] in your cfg-file

  • for training for small objects - set layers = -1, 11 instead of https://github.com/AlexeyAB/darknet/blob/6390a5a2ab61a0bdf6f1a9a6b4a739c16b36e0d7/cfg/yolov3.cfg#L720 and set stride=4 instead of https://github.com/AlexeyAB/darknet/blob/6390a5a2ab61a0bdf6f1a9a6b4a739c16b36e0d7/cfg/yolov3.cfg#L717

  • If you train the model to distinguish Left and Right objects as separate classes (left/right hand, left/right-turn on road signs, ...) then for disabling flip data augmentation - add flip=0 here: https://github.com/AlexeyAB/darknet/blob/3d2d0a7c98dbc8923d9ff705b81ff4f7940ea6ff/cfg/yolov3.cfg#L17

  • General rule - your training dataset should include such a set of relative sizes of objects that you want to detect:

    <ul><li><code>train_network_width * train_obj_width / train_image_width ~= detection_network_width * detection_obj_width / detection_image_width</code></li><li><code>train_network_height * train_obj_height / train_image_height ~= detection_network_height * detection_obj_height / detection_image_height</code></li>
    </ul></li>
    <li>
    <p>to speedup training (with decreasing detection accuracy) do Fine-Tuning instead of Transfer-Learning, set param&nbsp;<code>stopbackward=1</code>&nbsp;here:&nbsp;<a href="https://github.com/AlexeyAB/darknet/blob/6d44529cf93211c319813c90e0c1adb34426abe5/cfg/yolov3.cfg#L548" rel="nofollow" target="_blank">https://github.com/AlexeyAB/darknet/blob/6d44529cf93211c319813c90e0c1adb34426abe5/cfg/yolov3.cfg#L548</a></p>
    </li>
    
  1. After training - for detection:
  • Increase network-resolution by set in your .cfg-file (height=608 and width=608) or (height=832 and width=832) or (any value multiple of 32) - this increases the precision and makes it possible to detect small objects: link

    <ul><li>you do not need to train the network again, just use&nbsp;<code>.weights</code>-file already trained for 416x416 resolution</li><li>if error&nbsp;<code>Out of memory</code>&nbsp;occurs then in&nbsp;<code>.cfg</code>-file you should increase&nbsp;<code>subdivisions=16</code>, 32 or 64:&nbsp;<a href="https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L4" rel="nofollow" target="_blank">link</a></li>
    </ul></li>
    

How to mark bounded boxes of objects and create annotation files:

Here you can find repository with GUI-software for marking bounded boxes of objects and generating annotation files for Yolo v2 & v3: https://github.com/AlexeyAB/Yolo_mark

With example of: train.txtobj.namesobj.datayolo-obj.cfgair1-6.txtbird1-4.txt for 2 classes of objects (air, bird) and train_obj.cmd with example how to train this image-set with Yolo v2 & v3

Using Yolo9000

Simultaneous detection and classification of 9000 objects:

  • yolo9000.weights - (186 MB Yolo9000 Model) requires 4 GB GPU-RAM: http://pjreddie.com/media/files/yolo9000.weights

  • yolo9000.cfg - cfg-file of the Yolo9000, also there are paths to the 9k.tree and coco9k.maphttps://github.com/AlexeyAB/darknet/blob/617cf313ccb1fe005db3f7d88dec04a04bd97cc2/cfg/yolo9000.cfg#L217-L218

    <ul><li><p><code>9k.tree</code>&nbsp;-&nbsp;<strong>WordTree</strong>&nbsp;of 9418 categories -&nbsp;<code>&lt;label&gt; &lt;parent_it&gt;</code>, if&nbsp;<code>parent_id == -1</code>&nbsp;then this label hasn't parent:&nbsp;<a href="https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.tree" rel="nofollow" target="_blank">https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.tree</a></p></li><li><p><code>coco9k.map</code>&nbsp;- map 80 categories from MSCOCO to WordTree&nbsp;<code>9k.tree</code>:&nbsp;<a href="https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/coco9k.map" rel="nofollow" target="_blank">https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/coco9k.map</a></p></li>
    </ul></li>
    <li>
    <p><code>combine9k.data</code>&nbsp;- data file, there are paths to:&nbsp;<code>9k.labels</code>,&nbsp;<code>9k.names</code>,&nbsp;<code>inet9k.map</code>, (change path to your&nbsp;<code>combine9k.train.list</code>):&nbsp;<a href="https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/combine9k.data" rel="nofollow" target="_blank">https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/combine9k.data</a></p><ul><li><p><code>9k.labels</code>&nbsp;- 9418 labels of objects:&nbsp;<a href="https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.labels" rel="nofollow" target="_blank">https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.labels</a></p></li><li><p><code>9k.names</code>&nbsp;- 9418 names of objects:&nbsp;<a href="https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.names" rel="nofollow" target="_blank">https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/9k.names</a></p></li><li><p><code>inet9k.map</code>&nbsp;- map 200 categories from ImageNet to WordTree&nbsp;<code>9k.tree</code>:&nbsp;<a href="https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/inet9k.map" rel="nofollow" target="_blank">https://raw.githubusercontent.com/AlexeyAB/darknet/master/build/darknet/x64/data/inet9k.map</a></p></li>
    </ul></li>
    

How to use Yolo as DLL

  1. To compile Yolo as C++ DLL-file yolo_cpp_dll.dll - open in MSVS2015 file build\darknet\yolo_cpp_dll.sln, set x64 and Release, and do the: Build -> Build yolo_cpp_dll

    <ul><li>You should have installed&nbsp;<strong>CUDA 9.1</strong></li><li>To use cuDNN do: (right click on project) -&gt; properties -&gt; C/C++ -&gt; Preprocessor -&gt; Preprocessor Definitions, and add at the beginning of line:&nbsp;<code>CUDNN;</code></li>
    </ul></li>
    <li>
    <p>To use Yolo as DLL-file in your C++ console application - open in MSVS2015 file&nbsp;<code>build\darknet\yolo_console_dll.sln</code>, set&nbsp;<strong>x64</strong>&nbsp;and&nbsp;<strong>Release</strong>, and do the: Build -&gt; Build yolo_console_dll</p><ul><li>you can run your console application from Windows Explorer&nbsp;<code>build\darknet\x64\yolo_console_dll.exe</code></li><li>or you can run from MSVS2015 (before this - you should copy 2 files&nbsp;<code>yolo-voc.cfg</code>&nbsp;and&nbsp;<code>yolo-voc.weights</code>&nbsp;to the directory&nbsp;<code>build\darknet\</code>&nbsp;)</li><li>after launching your console application and entering the image file name - you will see info for each object:&nbsp;<code>&lt;obj_id&gt; &lt;left_x&gt; &lt;top_y&gt; &lt;width&gt; &lt;height&gt; &lt;probability&gt;</code></li><li>to use simple OpenCV-GUI you should uncomment line&nbsp;<code>//#define OPENCV</code>&nbsp;in&nbsp;<code>yolo_console_dll.cpp</code>-file:&nbsp;<a href="https://github.com/AlexeyAB/darknet/blob/a6cbaeecde40f91ddc3ea09aa26a03ab5bbf8ba8/src/yolo_console_dll.cpp#L5" rel="nofollow" target="_blank">link</a></li><li>you can see source code of simple example for detection on the video file:&nbsp;<a href="https://github.com/AlexeyAB/darknet/blob/ab1c5f9e57b4175f29a6ef39e7e68987d3e98704/src/yolo_console_dll.cpp#L75" rel="nofollow" target="_blank">link</a></li>
    </ul></li>
    

yolo_cpp_dll.dll-API: link

  1. class Detector {
  2. public:
  3. Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
  4. ~Detector();
  5. std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
  6. std::vector<bbox_t> detect(image_t img, float thresh = 0.2, bool use_mean = false);
  7. static image_t load_image(std::string image_filename);
  8. static void free_image(image_t m);
  9. #ifdef OPENCV
  10. std::vector<bbox_t> detect(cv::Mat mat, float thresh = 0.2, bool use_mean = false);
  11. #endif
  12. };
  • © 2018 GitHub, Inc.

yolov3 官网文档 设计到编译,训练,map等参数测试,windows和linux均有说明相关推荐

  1. huggingface Tokenizers 官网文档学习:tokenizer训练保存与使用

    前言 本文分享学习 huggingface Tokenizers 库记录.我分成了五大主题: 从头快速训练一个 tokenzier 如何使用预训练好的 tokenzier Tokenization 四 ...

  2. Go语言从入门到规范-1.1、Go语言官网文档大纲及环境搭建

    Go语言从入门到规范-1.1.Go语言官网文档大纲及环境搭建 文章目录 Go语言从入门到规范-1.1.Go语言官网文档大纲及环境搭建 前言 一.go简介及学习路径 二.安装go 1.下载Go发行版 2 ...

  3. AFNetworking官网文档及翻译

    AFNetworking2.4.1解析 1.官网文档外加点中文注释 AFNetworking官网(点击进入) AFNetworking翻译注释 Architecture(结构) NSURLConnec ...

  4. 根据官网文档看Spark Streaming对接Kafka的两种方式, 以及如何实现Exactly Once语义

    注: 本文算是本人的学习记录, 中间可能有些知识点并不成熟, 不能保证正确性. 只能算是对官网文档作了个翻译和解读, 随时有可能回来更新和纠错 上一篇文章讨论了Spark Streaming的WAL( ...

  5. OpenHarmony 官网文档有哪些上新?上篇:应用开发文档上新

    随着 OpenAtom OpenHarmony(以下简称"OpenHarmony")系统能力持续升级,已具备支撑复杂带屏标准设备和应用开发的基础能力.相较于旧版本,OpenHarm ...

  6. redis过期机制(官网文档总结)

    官网地址:https://redis.io/commands/expire redis过期定义如下: Set a timeout on key. After the timeout has expir ...

  7. mybatis官网文档mybatis_doc

    在平时的学习中,我们可以去参考官网的文档来学习,这个文档有中文的,方便我们去阅读,而且这里的分类很详细. 官网文档链接:http://www.mybatis.org/mybatis-3/zh/inde ...

  8. vue-awesome-swiper官网文档

    vue-awesome-swiper官网文档 https://www.swiper.com.cn/api/index.html

  9. SAP ME架构官网文档学习总结

    认证平台 SAP ME PAM(Platform Availability Matrix ) 安装的应用以及相应的数据库均可在官网上进行查看https://support.sap.com/pam 最低 ...

最新文章

  1. 小学生python-小学生学python(三)
  2. python 比较两个yaml文件
  3. Hadoop源码分析-Text
  4. .DLL文件是什么?
  5. web python 维护性_Lemon-Web阶段考核(三)
  6. C语言学习记录_2019.02.02
  7. C++AVL树(自平衡二叉查找树)(附完整源码)
  8. Vue.js 入门指南之“前传”(含sublime text 3 配置)
  9. 在springboot中使用springsecurity实现安全控制
  10. Spring Cloud自定义Hystrix请求命令
  11. python绘制双正切激活函数
  12. SQL SERVER数据库开发之触发器的应用
  13. ASP.NET Web API 异常日志记录
  14. python装饰器测试_python 装饰器
  15. 给next添加彩色标签
  16. PHP导出数据库数据字典脚本
  17. 凯恩帝绝对坐标清零_凯恩帝系统加工件数自动清零怎么设置
  18. 计算机软件著作权 评审,软件著作权在评职称过程中有用吗
  19. 老狗——python求中位数
  20. 总结--看帖收“货”

热门文章

  1. 计算机物质文化和非物质文化,中国算盘,堪称计算机的鼻祖,中国非物质文化审遗五周年!...
  2. [转]数学之美-【算法】 - 用来流方式计算UV的基数算法
  3. LeetCode:第13题 罗马数字转整数 python语言实现 2020.2.3
  4. iOS获取图片的区域主色
  5. 纳芯微电子科创板上市:市值262亿 深创投与小米是股东
  6. 如何在iPhone和iPad上的Safari中阻止网站
  7. 【鱼骨图】【数学史】行列式、矩阵论的历史
  8. 计算机故事英语版,少儿英语故事:慢速计算机(1)The Slow Computer (1)
  9. NeurIPS/ICLR/ICML AI三大会国内高校和企业近年中稿量完整统计
  10. iPhone12无法连接电脑的热点