GithubHelp home page GithubHelp logo

alexeyab / darknet Goto Github PK

View Code? Open in Web Editor NEW

This project forked from pjreddie/darknet

21.6K 486.0 8.0K 14.41 MB

YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )

Home Page: http://pjreddie.com/darknet/

License: Other

Makefile 0.29% Python 4.54% Shell 0.57% Cuda 14.65% C 62.06% C++ 12.46% Batchfile 0.57% C# 0.27% CMake 1.69% PowerShell 2.89%
dnn deep-learning deep-neural-networks deep-learning-tutorial object-detection computer-vision neural-network yolo yolov3 yolov4 scaled-yolov4 scaledyolov4

darknet's Introduction

Yolo v4, v3 and v2 for Windows and Linux

(neural networks for object detection)




YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

YOLOv7 is more accurate and faster than YOLOv5 by 120% FPS, than YOLOX by 180% FPS, than Dual-Swin-T by 1200% FPS, than ConvNext by 550% FPS, than SWIN-L by 500% FPS, than PPYOLOE-X by 150% FPS.

YOLOv7 surpasses all known object detectors in both speed and accuracy in the range from 5 FPS to 160 FPS and has the highest accuracy 56.8% AP among all known real-time object detectors with 30 FPS or higher on GPU V100, batch=1.

  • YOLOv7-e6 (55.9% AP, 56 FPS V100 b=1) by +500% FPS faster than SWIN-L C-M-RCNN (53.9% AP, 9.2 FPS A100 b=1)
  • YOLOv7-e6 (55.9% AP, 56 FPS V100 b=1) by +550% FPS faster than ConvNeXt-XL C-M-RCNN (55.2% AP, 8.6 FPS A100 b=1)
  • YOLOv7-w6 (54.6% AP, 84 FPS V100 b=1) by +120% FPS faster than YOLOv5-X6-r6.1 (55.0% AP, 38 FPS V100 b=1)
  • YOLOv7-w6 (54.6% AP, 84 FPS V100 b=1) by +1200% FPS faster than Dual-Swin-T C-M-RCNN (53.6% AP, 6.5 FPS V100 b=1)
  • YOLOv7x (52.9% AP, 114 FPS V100 b=1) by +150% FPS faster than PPYOLOE-X (51.9% AP, 45 FPS V100 b=1)
  • YOLOv7 (51.2% AP, 161 FPS V100 b=1) by +180% FPS faster than YOLOX-X (51.1% AP, 58 FPS V100 b=1)

more5


image


More details in articles on medium:

Manual: https://github.com/AlexeyAB/darknet/wiki

Discussion:

About Darknet framework: http://pjreddie.com/darknet/

Darknet Continuous Integration CircleCI Contributors License: Unlicense DOI arxiv.org arxiv.org colab colab

Darknet Logo

scaled_yolov4 AP50:95 - FPS (Tesla V100) Paper: https://arxiv.org/abs/2011.08036


modern_gpus AP50:95 / AP50 - FPS (Tesla V100) Paper: https://arxiv.org/abs/2004.10934

tkDNN-TensorRT accelerates YOLOv4 ~2x times for batch=1 and 3x-4x times for batch=4.

GeForce RTX 2080 Ti

Network Size Darknet, FPS (avg) tkDNN TensorRT FP32, FPS tkDNN TensorRT FP16, FPS OpenCV FP16, FPS tkDNN TensorRT FP16 batch=4, FPS OpenCV FP16 batch=4, FPS tkDNN Speedup
320 100 116 202 183 423 430 4.3x
416 82 103 162 159 284 294 3.6x
512 69 91 134 138 206 216 3.1x
608 53 62 103 115 150 150 2.8x
Tiny 416 443 609 790 773 1774 1353 3.5x
Tiny 416 CPU Core i7 7700HQ 3.4 - - 42 - 39 12x

Youtube video of results

Yolo v4 Scaled Yolo v4

Others: https://www.youtube.com/user/pjreddie/videos

How to evaluate AP of YOLOv4 on the MS COCO evaluation server

  1. Download and unzip test-dev2017 dataset from MS COCO server: http://images.cocodataset.org/zips/test2017.zip
  2. Download list of images for Detection tasks and replace the paths with yours: https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/testdev2017.txt
  3. Download yolov4.weights file 245 MB: yolov4.weights (Google-drive mirror yolov4.weights )
  4. Content of the file cfg/coco.data should be
classes= 80
train  = <replace with your path>/trainvalno5k.txt
valid = <replace with your path>/testdev2017.txt
names = data/coco.names
backup = backup
eval=coco
  1. Create /results/ folder near with ./darknet executable file
  2. Run validation: ./darknet detector valid cfg/coco.data cfg/yolov4.cfg yolov4.weights
  3. Rename the file /results/coco_results.json to detections_test-dev2017_yolov4_results.json and compress it to detections_test-dev2017_yolov4_results.zip
  4. Submit file detections_test-dev2017_yolov4_results.zip to the MS COCO evaluation server for the test-dev2019 (bbox)

How to evaluate FPS of YOLOv4 on GPU

  1. Compile Darknet with GPU=1 CUDNN=1 CUDNN_HALF=1 OPENCV=1 in the Makefile
  2. Download yolov4.weights file 245 MB: yolov4.weights (Google-drive mirror yolov4.weights )
  3. Get any .avi/.mp4 video file (preferably not more than 1920x1080 to avoid bottlenecks in CPU performance)
  4. Run one of two commands and look at the AVG FPS:
  • include video_capturing + NMS + drawing_bboxes: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -dont_show -ext_output
  • exclude video_capturing + NMS + drawing_bboxes: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -benchmark

Pre-trained models

There are weights-file for different cfg-files (trained for MS COCO dataset):

FPS on RTX 2070 (R) and Tesla V100 (V):

CLICK ME - Yolo v3 models
CLICK ME - Yolo v2 models

Put it near compiled: darknet.exe

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

Requirements for Windows, Linux and macOS

Yolo v4 in other frameworks

Datasets

  • MS COCO: use ./scripts/get_coco_dataset.sh to get labeled MS COCO detection dataset
  • OpenImages: use python ./scripts/get_openimages_dataset.py for labeling train detection dataset
  • Pascal VOC: use python ./scripts/voc_label.py for labeling Train/Test/Val detection datasets
  • ILSVRC2012 (ImageNet classification): use ./scripts/get_imagenet_train.sh (also imagenet_label.sh for labeling valid set)
  • German/Belgium/Russian/LISA/MASTIF Traffic Sign Datasets for Detection - use this parser: https://github.com/angeligareta/Datasets2Darknet#detection-task
  • List of other datasets: https://github.com/AlexeyAB/darknet/tree/master/scripts#datasets

Improvements in this repository

  • developed State-of-the-Art object detector YOLOv4
  • added State-of-Art models: CSP, PRN, EfficientNet
  • added layers: [conv_lstm], [scale_channels] SE/ASFF/BiFPN, [local_avgpool], [sam], [Gaussian_yolo], [reorg3d] (fixed [reorg]), fixed [batchnorm]
  • added the ability for training recurrent models (with layers conv-lstm[conv_lstm]/conv-rnn[crnn]) for accurate detection on video
  • added data augmentation: [net] mixup=1 cutmix=1 mosaic=1 blur=1. Added activations: SWISH, MISH, NORM_CHAN, NORM_CHAN_SOFTMAX
  • added the ability for training with GPU-processing using CPU-RAM to increase the mini_batch_size and increase accuracy (instead of batch-norm sync)
  • improved binary neural network performance 2x-4x times for Detection on CPU and GPU if you trained your own weights by using this XNOR-net model (bit-1 inference) : https://github.com/AlexeyAB/darknet/blob/master/cfg/yolov3-tiny_xnor.cfg
  • improved neural network performance ~7% by fusing 2 layers into 1: Convolutional + Batch-norm
  • improved performance: Detection 2x times, on GPU Volta/Turing (Tesla V100, GeForce RTX, ...) using Tensor Cores if CUDNN_HALF defined in the Makefile or darknet.sln
  • improved performance ~1.2x times on FullHD, ~2x times on 4K, for detection on the video (file/stream) using darknet detector demo...
  • improved performance 3.5 X times of data augmentation for training (using OpenCV SSE/AVX functions instead of hand-written functions) - removes bottleneck for training on multi-GPU or GPU Volta
  • improved performance of detection and training on Intel CPU with AVX (Yolo v3 ~85%)
  • optimized memory allocation during network resizing when random=1
  • optimized GPU initialization for detection - we use batch=1 initially instead of re-init with batch=1
  • added correct calculation of mAP, F1, IoU, Precision-Recall using command darknet detector map...
  • added drawing of chart of average-Loss and accuracy-mAP (-map flag) during training
  • run ./darknet detector demo ... -json_port 8070 -mjpeg_port 8090 as JSON and MJPEG server to get results online over the network by using your soft or Web-browser
  • added calculation of anchors for training
  • added example of Detection and Tracking objects: https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp
  • run-time tips and warnings if you use incorrect cfg-file or dataset
  • added support for Windows
  • many other fixes of code...

And added manual - How to train Yolo v4-v2 (to detect your custom objects)

Also, you might be interested in using a simplified repository where is implemented INT8-quantization (+30% speedup and -1% mAP reduced): https://github.com/AlexeyAB/yolo2_light

How to use on the command line

If you use build.ps1 script or the makefile (Linux only) you will find darknet in the root directory.

If you use the deprecated Visual Studio solutions, you will find darknet in the directory \build\darknet\x64.

If you customize build with CMake GUI, darknet executable will be installed in your preferred folder.

  • Yolo v4 COCO - image: ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
  • Output coordinates of objects: ./darknet detector test cfg/coco.data yolov4.cfg yolov4.weights -ext_output dog.jpg
  • Yolo v4 COCO - video: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
  • Yolo v4 COCO - WebCam 0: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
  • Yolo v4 COCO for net-videocam - Smart WebCam: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights http://192.168.0.80:8080/video?dummy=param.mjpg
  • Yolo v4 - save result videofile res.avi: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
  • Yolo v3 Tiny COCO - video: ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights test.mp4
  • JSON and MJPEG server that allows multiple connections from your soft or Web-browser ip-address:8070 and 8090: ./darknet detector demo ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output
  • Yolo v3 Tiny on GPU #1: ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
  • Alternative method Yolo v3 COCO - image: ./darknet detect cfg/yolov4.cfg yolov4.weights -i 0 -thresh 0.25
  • Train on Amazon EC2, to see mAP & Loss-chart using URL like: http://ec2-35-160-228-91.us-west-2.compute.amazonaws.com:8090 in the Chrome/Firefox (Darknet should be compiled with OpenCV): ./darknet detector train cfg/coco.data yolov4.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
  • 186 MB Yolo9000 - image: ./darknet detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights
  • Remember 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.json file use: ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output -dont_show -out result.json < data/train.txt
  • To process a list of images data/train.txt and save results of detection to result.txt use: ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show -ext_output < data/train.txt > result.txt
  • To process a video and output results to a json file use: darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights file.mp4 -dont_show -json_file_output results.json
  • Pseudo-labelling - to process a list of images data/new_train.txt and save results of detection in Yolo training format for each image as label <image_name>.txt (in this way you can increase the amount of training data) use: ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25 -dont_show -save_labels < data/new_train.txt
  • To calculate anchors: ./darknet detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
  • To check accuracy mAP@IoU=50: ./darknet detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
  • To check accuracy mAP@IoU=75: ./darknet detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights -iou_thresh 0.75
For using network video-camera mjpeg-stream with any Android smartphone
  1. Download for Android phone mjpeg-stream soft: IP Webcam / Smart WebCam

  2. Connect your Android phone to the computer by WiFi (through a WiFi-router) or USB

  3. Start Smart WebCam on your phone

  4. Replace the address below, shown in the phone application (Smart WebCam) and launch:

  • Yolo v4 COCO-model: ./darknet detector demo data/coco.data yolov4.cfg yolov4.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0

How to compile on Linux/macOS (using CMake)

The CMakeLists.txt will attempt to find installed optional dependencies like CUDA, cudnn, ZED and build against those. It will also create a shared object library file to use darknet for code development.

To update CMake on Ubuntu, it's better to follow guide here: https://apt.kitware.com/ or https://cmake.org/download/

git clone https://github.com/AlexeyAB/darknet
cd darknet
mkdir build_release
cd build_release
cmake ..
cmake --build . --target install --parallel 8

Using also PowerShell

Install: Cmake, CUDA, cuDNN How to install dependencies

Install powershell for your OS (Linux or MacOS) (guide here).

Open PowerShell type these commands

git clone https://github.com/AlexeyAB/darknet
cd darknet
./build.ps1 -UseVCPKG -EnableOPENCV -EnableCUDA -EnableCUDNN
  • remove options like -EnableCUDA or -EnableCUDNN if you are not interested into
  • remove option -UseVCPKG if you plan to manually provide OpenCV library to darknet or if you do not want to enable OpenCV integration
  • add option -EnableOPENCV_CUDA if you want to build OpenCV with CUDA support - very slow to build! (requires -UseVCPKG)

If you open the build.ps1 script at the beginning you will find all available switches.

How to compile on Linux (using make)

Just do make in the darknet directory. (You can try to compile and run it on Google Colab in cloud link (press «Open in Playground» button at the top-left corner) and watch the video link ) 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 4.x/3.x/2.4.x - allows to detect on video files and video streams from network cameras or web-cams
  • DEBUG=1 to build 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 runnable 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/yolov4.cfg yolov4.weights test.mp4
  • ZED_CAMERA=1 to build a library with ZED-3D-camera support (should be ZED SDK installed), then run LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights zed_camera
  • You also need to specify for which graphics card the code is generated. This is done by setting ARCH=. If you use a newer version than CUDA 11 you further need to edit line 20 from Makefile and remove -gencode arch=compute_30,code=sm_30 \ as Kepler GPU support was dropped in CUDA 11. You can also drop the general ARCH= and just uncomment ARCH= for your graphics card.

How to compile on Windows (using CMake)

Requires:

In Windows:

  • Start (button) -> All programs -> CMake -> CMake (gui) ->

  • look at image In CMake: Enter input path to the darknet Source, and output path to the Binaries -> Configure (button) -> Optional platform for generator: x64 -> Finish -> Generate -> Open Project ->

  • in MS Visual Studio: Select: x64 and Release -> Build -> Build solution

  • find the executable file darknet.exe in the output path to the binaries you specified

x64 and Release

How to compile on Windows (using vcpkg)

This is the recommended approach to build Darknet on Windows.

  1. Install Visual Studio 2017 or 2019. In case you need to download it, please go here: Visual Studio Community. Remember to install English language pack, this is mandatory for vcpkg!

  2. Install CUDA enabling VS Integration during installation.

  3. Open Powershell (Start -> All programs -> Windows Powershell) and type these commands:

Set-ExecutionPolicy unrestricted -Scope CurrentUser -Force
git clone https://github.com/AlexeyAB/darknet
cd darknet
.\build.ps1 -UseVCPKG -EnableOPENCV -EnableCUDA -EnableCUDNN

(add option -EnableOPENCV_CUDA if you want to build OpenCV with CUDA support - very slow to build! - or remove options like -EnableCUDA or -EnableCUDNN if you are not interested in them). If you open the build.ps1 script at the beginning you will find all available switches.

How to train with multi-GPU

  1. Train it first on 1 GPU for like 1000 iterations: darknet.exe detector train cfg/coco.data cfg/yolov4.cfg yolov4.conv.137

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

If you get a Nan, then for some datasets better to decrease learning rate, for 4 GPUs set learning_rate = 0,00065 (i.e. learning_rate = 0.00261 / GPUs). In this case also increase 4x times burn_in = in your cfg-file. I.e. use burn_in = 4000 instead of 1000.

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

How to train (to detect your custom objects)

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

Training Yolo v4 (and v3):

  1. For training cfg/yolov4-custom.cfg download the pre-trained weights-file (162 MB): yolov4.conv.137 (Google drive mirror yolov4.conv.137 )
  2. Create file yolo-obj.cfg with the same content as in yolov4-custom.cfg (or copy yolov4-custom.cfg to yolo-obj.cfg) and:

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 classes, coords 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 yolov4-custom.cfg in such lines in each of 3 [yolo]-layers:

[convolutional]
filters=21

[region]
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):
classes = 2
train  = data/train.txt
valid  = data/test.txt
names = data/obj.names
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_center> <y_center> <width> <height>

Where:

  • <object-class> - integer object number from 0 to (classes-1)

  • <x_center> <y_center> <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>

  • attention: <x_center> <y_center> - are center of rectangle (are not top-left corner)

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

    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
    
  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:
data/obj/img1.jpg
data/obj/img2.jpg
data/obj/img3.jpg
  1. Download pre-trained weights for the convolutional layers and 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 yolov4.conv.137

    To train on Linux use command: ./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 (just use ./darknet instead of darknet.exe)

    • (file yolo-obj_last.weights will be saved to the build\darknet\x64\backup\ for each 100 iterations)
    • (file yolo-obj_xxxx.weights will be saved to the build\darknet\x64\backup\ for each 1000 iterations)
    • (to disable Loss-Window use darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show, if you train on computer without monitor like a cloud Amazon EC2)
    • (to see the mAP & Loss-chart during training on remote server without GUI, use command darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map then open URL http://ip-address:8090 in Chrome/Firefox browser)

8.1. For training with mAP (mean average precisions) calculation for each 4 Epochs (set valid=valid.txt or train.txt in obj.data file) and run: darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map

8.2. One can also set the -mAP_epochs in the training command if less or more frequent mAP calculation is needed. For example in order to calculate mAP for each 2 Epochs run darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map -mAP_epochs 2

  1. After training is complete - get result yolo-obj_final.weights from path build\darknet\x64\backup\

    • 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 start training using: darknet.exe detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights

    (in the original repository https://github.com/pjreddie/darknet the weights-file is saved only once every 10 000 iterations if(iterations > 1000))

    • Also you can get result earlier than all 45000 iterations.

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 file with the first 29-convolutional layers of yolov4-tiny: https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29 (Or get this file from yolov4-tiny.weights file by using command: darknet.exe partial cfg/yolov4-tiny-custom.cfg yolov4-tiny.weights yolov4-tiny.conv.29 29
  • Make your custom model yolov4-tiny-obj.cfg based on cfg/yolov4-tiny-custom.cfg instead of yolov4.cfg
  • Start training: darknet.exe detector train data/obj.data yolov4-tiny-obj.cfg yolov4-tiny.conv.29

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 not less than number of training images and not less than 6000 iterations in total. But for a more precise definition of 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.60730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

  • 9002 - iteration number (number of batch)

  • 0.60730 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. The final average loss can be from 0.05 (for a small model and easy dataset) to 3.0 (for a big model and a difficult dataset).

    Or if you train with flag -map then you will see mAP indicator Last accuracy [email protected] = 18.50% in the console - this indicator is better than Loss, so train while mAP increases.

  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 over-fitting. Over-fitting - 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:

Over-fitting

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.txt as 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 compare last output lines for each weights (7000, 8000, 9000):

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

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

Or just train with -map flag:

darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map

So you will see mAP-chart (red-line) in the Loss-chart Window. mAP will be calculated for each 4 Epochs using valid=valid.txt file that is specified in obj.data file (1 Epoch = images_in_train_txt / batch iterations)

(to change the max x-axis value - change max_batches= parameter to 2000*classes, f.e. max_batches=6000 for 3 classes)

loss_chart_map_chart

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

  • IoU (intersect over union) - average intersect over 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.

precision_recall_iou

Custom object detection

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

Yolo_v2_training Yolo_v2_training

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=608, width=608 or any value multiple of 32) - it will increase precision

  • check that each object that you want to detect is 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

  • my Loss is very high and mAP is very low, is training wrong? Run training with -show_imgs flag at the end of training command, do you see correct bounded boxes of objects (in windows or in files aug_...jpg)? If no - your training dataset is wrong.

  • for each object which you want to detect - there must be at least 1 similar object in the Training dataset with about the same: shape, side of object, relative size, angle of rotation, tilt, illumination. So desirable that your training dataset include images with objects at different: 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

  • What is the best way to mark objects: label only the visible part of the object, or label the visible and overlapped part of the object, or label a little more than the entire object (with a little gap)? Mark as you like - how would you like it to be detected.

  • for training with a large number of objects in each image, add the parameter max=200 or higher value in the last [yolo]-layer or [region]-layer in your cfg-file (the global maximum number of objects that can be detected by YoloV3 is 0,0615234375*(width*height) where are width and height are parameters from [net] section in cfg-file)

  • for training for small objects (smaller than 16x16 after the image is resized to 416x416) - set layers = 23 instead of

    layers = 54

  • for training for both small and large objects use modified models:

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

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

    • 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

    I.e. for each object from Test dataset there must be at least 1 object in the Training dataset with the same class_id and about the same relative size:

    object width in percent from Training dataset ~= object width in percent from Test dataset

    That is, if only objects that occupied 80-90% of the image were present in the training set, then the trained network will not be able to detect objects that occupy 1-10% of the image.

  • to speedup training (with decreasing detection accuracy) set param stopbackward=1 for layer-136 in cfg-file

  • each: model of object, side, illumination, scale, each 30 grad of the turn and inclination angles - these are different objects from an internal perspective of the neural network. So the more different objects you want to detect, the more complex network model should be used.

  • to make the detected bounded boxes more accurate, you can add 3 parameters ignore_thresh = .9 iou_normalizer=0.5 iou_loss=giou to each [yolo] layer and train, it will increase [email protected], but decrease [email protected].

  • Only if you are an expert in neural detection networks - 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. But you should change indexes of anchors masks= for each [yolo]-layer, so for YOLOv4 the 1st-[yolo]-layer has anchors smaller than 30x30, 2nd smaller than 60x60, 3rd remaining, and vice versa for YOLOv3. Also you should change the filters=(classes + 5)*<number of mask> before each [yolo]-layer. If many of the calculated anchors do not fit under the appropriate layers - then just try using all the default anchors.

  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

  • it is not necessary to train the network again, just use .weights-file already trained for 416x416 resolution

  • to get even greater accuracy you should train with higher resolution 608x608 or 832x832, note: if error Out of memory occurs then in .cfg-file you should increase subdivisions=16, 32 or 64: link

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 - v4: https://github.com/AlexeyAB/Yolo_mark

With example of: train.txt, obj.names, obj.data, yolo-obj.cfg, air1-6.txt, bird1-4.txt for 2 classes of objects (air, bird) and train_obj.cmd with example how to train this image-set with Yolo v2 - v4

Different tools for marking objects in images:

  1. in C++: https://github.com/AlexeyAB/Yolo_mark
  2. in Python: https://github.com/tzutalin/labelImg
  3. in Python: https://github.com/Cartucho/OpenLabeling
  4. in C++: https://www.ccoderun.ca/darkmark/
  5. in JavaScript: https://github.com/opencv/cvat
  6. in C++: https://github.com/jveitchmichaelis/deeplabel
  7. in C#: https://github.com/BMW-InnovationLab/BMW-Labeltool-Lite
  8. DL-Annotator for Windows ($30): url
  9. v7labs - the greatest cloud labeling tool ($1.5 per hour): https://www.v7labs.com/

How to use Yolo as DLL and SO libraries

  • on Linux
    • using build.sh or
    • build darknet using cmake or
    • set LIBSO=1 in the Makefile and do make
  • on Windows
    • using build.ps1 or
    • build darknet using cmake or
    • compile build\darknet\yolo_cpp_dll.sln solution or build\darknet\yolo_cpp_dll_no_gpu.sln solution

There are 2 APIs:


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

    • You should have installed CUDA 10.2
    • To use cuDNN do: (right click on project) -> properties -> C/C++ -> Preprocessor -> Preprocessor Definitions, and add at the beginning of line: CUDNN;
  2. To use Yolo as DLL-file in your C++ console application - open the solution build\darknet\yolo_console_dll.sln, set x64 and Release, and do the: Build -> Build yolo_console_dll

    • you can run your console application from Windows Explorer build\darknet\x64\yolo_console_dll.exe use this command: yolo_console_dll.exe data/coco.names yolov4.cfg yolov4.weights test.mp4

    • after launching your console application and entering the image file name - you will see info for each object: <obj_id> <left_x> <top_y> <width> <height> <probability>

    • to use simple OpenCV-GUI you should uncomment line //#define OPENCV in yolo_console_dll.cpp-file: link

    • you can see source code of simple example for detection on the video file: link

yolo_cpp_dll.dll-API: link

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<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
        std::vector<bbox_t> 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<bbox_t> detect(cv::Mat mat, float thresh = 0.2, bool use_mean = false);
        std::shared_ptr<image_t> mat_to_image_resize(cv::Mat mat) const;
#endif
};

Citation

@misc{bochkovskiy2020yolov4,
      title={YOLOv4: Optimal Speed and Accuracy of Object Detection}, 
      author={Alexey Bochkovskiy and Chien-Yao Wang and Hong-Yuan Mark Liao},
      year={2020},
      eprint={2004.10934},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}
@InProceedings{Wang_2021_CVPR,
    author    = {Wang, Chien-Yao and Bochkovskiy, Alexey and Liao, Hong-Yuan Mark},
    title     = {{Scaled-YOLOv4}: Scaling Cross Stage Partial Network},
    booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
    month     = {June},
    year      = {2021},
    pages     = {13029-13038}
}

darknet's People

Contributors

2b-t avatar acxz avatar adujardin avatar alexeyab avatar aughey avatar avensun avatar bouncyphoton avatar cenit avatar cyyever avatar davidssmith avatar duohappy avatar enesozi avatar ilyaovodov avatar imaami avatar jaledmc avatar judwhite avatar jveitchmichaelis avatar lineofbestgit avatar marvinklemp avatar mmaaz60 avatar nuzhny007 avatar pjreddie avatar renaultfernandes avatar stephanecharette avatar tiagoshibata avatar tigerhawkvok avatar tinohager avatar tomheaven avatar vinjn avatar willbattel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

darknet's Issues

Multiclass detection?

Just a quick question about multiclass detection.
Can i make for example 3 classes where 1 class combines images of the two other classes so that i get a specialized detection ?
Like for example make a class car with photos of cars and 2 specialized classes with Lamborghini and Ferari so that my output would be something like:
90% car
75% Lamborghini
with practically nearly identical bounding boxes.
Is this possible and is this the way you qould do something like that ?

Custom training - amount of images needed for training

Hi,

Thanks for sharing your Windows build for darknet, I want to run some custom training but I am unsure as to how many samples I need, I want to train using two extra classes headphones and video cards (I do not need these classes to be generalised) I just need the detection to be done on those particular objects that I have taken pictures from.

I know this question probably doesn't just have one correct answer but thought I'd throw it out there to get an idea in regards to how much labelling I would have to do.

Kind regards,
Waj

Builds fine on Windows 10 but cannot run the executable

I'm trying to build in Windows 10. VC creates the executable for me. But I'm not able to run it. Windows complains - "The application was unable to start corectly (0xc000007b). Click OK to close the application"

Should I make any changes to the VC project before building?

fine tuning

hi
how i can fine tuning the model?
thanks

how to use Win32 compile the project?

hello ,I have compiled the project with x64 successful. but now , I want to use Win32 to compile the project , my environment is VS2013 that have update5, CUDA 8.0 . I changed the 3rdparty path to x86 as corresponded. but when I compile the project. there is some errors about CUDA. can you help me ? thank you very much.

Some questions regarding training and detection(test) images and their sizes

Hello,

  1. When we gather the training images, all of them should have the same size (resolution)? for example 800 * 600

  2. if we train the YOLO (height and width of the Net) with 416 * 416, then the test images or input camera resolution should be 416 * 416 or an integer multiplication result of 416 * 416? for example (416 * 2 = 832 * 832)?

if Yes, then we should change the 416 * 416 to the input camera or test image resolution (for example 1024 * 768)?

  1. How the batch and subdivision parameters are calculated in case of changing the height and width of the Net?

how to track objects using darknet

darknet has good performance on object detection, is it possible to track objects, e.g, with IDs for different objects in a video? thank you

Weights of YOLO 2

Hello,

The pre-trained weights which you have mentioned in the description, I mean darknet19_448.conv.23, refers to the 416 *416 resolution?

What about if we use the YOLO2 weights in its website in accompany with modified .cfg files?

2017-02-04_11-40-22

How to install Raspberry Pi 3?

Hi, I'm student studying NN with your great source.

Thanks for your project, we succeeded image recognition in window and linux inspite of having trouble with many dependency problems with GPU)

Now we are plan to make a RCcar able to real time detection.

Does It can be possible installing darknet on RaspberryPi 3?
(we are seriously worried about gpu's spec. Your darkent is using CUDA but Rasp doesn't have NVIDIA GPU...........it uses VIDEO CORE IV 3D Graphics core)
or we consider to approach another way indirectly.

I really*3 look forward to your reply :-D

Train Yolo2 with custom data, yolo-obj.cfg file

Hello,

In the description you have mentioned:

  • change line filters=425 to filters=(classes + 5)*5

inside yolo-voc.cfg , I could not find the filters=425 phrase. Several filters= ... exist inside this file, which one should be modified?
or I have to modify them all?

I think you meant the last convolution layer

How can we compile a Debug version of YOLO v2?

I have tried to change the setting of Visual Studio to Debug, the compilation is successful. But the break point I set didn't work at all. Would it be possible to debug this program? Thanks.

Differntiating the detected objects ...

Hi,

Consider that we have a video stream that each frame may include no, one or several detection. for example pedestrian detection. How can we hold the information of each object detection till I don't want or the detection is destroyed?

For example consider we have an image of 10 detected pedestrian. all detected objects belong to one class as pedestrian class, but each person is different and I want to label them in the software as person1, person2 ... person10.

of course this list may be increased or decreased in each frame when new objects come in or old objects get out, but what I want is that each detected object hold its own label even if they belong to a same class.

How can I do this in the code?

How to add new files (header and source to project)

Hi, sorry if my question is trivial, but I am new to windows and visual C.

I wanted to add some additional functions. Therefore, when I added below two Files and then compile, VS is not compiling.

temp_header.h

#pragma once
void some_function();

and
temp_source.cpp


#include <iostream>
#include "temp_header.h"
void some_function() {
	printf("hey I am a definition of the function in temp_header");
}

After adding this, it is not building and giving me a lot of errors.

So I was thinking, maybe I need to perform some extra step when I add new source.

Could you guyz help me out, Alex?

Thanks!

Missing runtime dependencies

After successfully compiling darknet following the README, trying to detect with tiny-yolo fails because opencv_core249.lib isn't on the PATH (because the link in the readme just extracts the files to a particular location and doesn't add anything to the path). Adding the OpenCV lib path to PATH fixes this problem, but then cublas64_80.dll can't be found. Adding the CUDA path to PATH mysteriously does not fix this problem (see screenshot). What is the proper way to make sure darknet knows where to find its dependencies at runtime?
missingruntime

traing problem:can't load image in linux

@AlexeyAB
Hello
27 route 26 24
28 conv 1024 3 x 3 / 1 13 x 13 x3072 -> 13 x 13 x1024
29 conv 30 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 30
30 detection
Loading weights from darknet19_448.conv.23...Done!
/home/mars/yolo/darknet/data/voc-person/000050.jpg
/home/mars/yolo/darknet/data/voc-person/000089.jpg
/home/mars/yolo/darknet/data/voc-person/000030.jpg
/home/mars/yolo/darknet/data/voc-person/000041.jpg
/home/mars/yolo/darknet/data/voc-person/000104.jpg
/home/mars/yolo/darknet/data/voc-person/000035.jpg
/home/mars/yolo/darknet/data/voc-person/000073.jpg
/home/mars/yolo/darknet/data/voc-person/000017.jpg
Couldn't open file: /home/mars/yolo/darknet/data/voc-person/000050.txt
Couldn't open file: /home/mars/yolo/darknet/data/voc-person/000104.txt
段错误 (核心已转储)
mars@harzone:~/yolo/darknet$ ./darknet imtest /home/mars/yolo/darknet/data/voc-person/000050.jpg
/home/mars/yolo/darknet/data/voc-person/000050.jpg
L2 Norm: 347.581116

Linux
when i train my new class ,why it cannot load images? but i can imtest it????
thanks.

Train Yolo-2 on a remote server

Hello

My laptop does not have a high end GPU, therefore training a model could take ages with nogpu

DO you know is there anyway to train this on a remote server? most of them run Linux and they say if you want to run a custom task (job), you gonna use Docker. Do you know how?

Continue training or train from begining, with modified/increased training/val images ...

Hello,

I've heard if we gather those images which a model finds false positive objects inside, then annotate and add them inside existing images dataset, then we can increase the accuracy of the model dramatically.

in this case, assume that we have trained the model for 2000 iterations and we have a weight file of this. Then we add these new images into the dataset.

Should we start training from the beginning (from 1) or we can continue training by 2001?

Using a trained weight in an standalone application

Hello,

How can I use the trained weight in an standalone software?

As I see we have to use Darknet.exe, with some command-line parameters, but is there anyway to have a DLL/module or something like that to be able to load the weight inside another VS project, detect/classify objects and get their coordinates, detection percentage ... and so on?

bbox annotations will be loaded automatically if txt file has the same name as image file?

The step 5 in the section How to train (to detect your custom objects) written as:

Create .txt-file for each .jpg-image-file - in the same directory and with the same name, but with .txt-extension,

When training, the detector can find the images from train.txt. If I understand correctly, as long as one create the bbox txt file as the same name as the image file, for example,

  • image file name: car_001.jpg
  • bbox txt file name: car_001.txt

Then the detector can find the corresponding bbox txt file automatically, is it?

Graphics Card

Hi guys!

I am going to buy an Nvidia GTX just to use this awsome build of darknet on windows. What would you reccomend? I am thinkig about 1060/1070/(1080). Budget is lower than the 1080's price, I am leaning towards the GTX 1070 but would be happy if the cheaper 1060 would be still okay. Is there anybody who has experience with said type of cards? What are you guys using? I will mostly do test (recognition), not so much traing. What kind of fps results can I expect with the COCO dataset? Do I have to be careful selecting a brand or card? Are there any issues with drivers, or Cuda8? As you can see, I am a bit lost here, so if you know a guide or a wiki, I would be glad for a link.

Thx.

RE: Average Loss accelerates to infinity

I don't know why but the training doesn't seem to be working well.

It is gradually descending in the loss function but approaching a meager value of 1.4 then accelerates up to very large numbers 100,000-1,000,000. And mind you I am only at 400 counts, no where close to the suggested approx. 5000 for training 5 classes.

Thank you so much for any advice.

PS. I also turn random=1 and same result

data.h #includes non-Windows pthread.h

After installing Visual Studio 2015 Community 14.0.25431.01 Update 3, CUDA 8.0, and OpenCV 2.4.9 as linked, attempting to build build\darknet\darknet.sln results in "Cannot open include file: 'pthread.h'", and therefore "Identifier "pthread_t" is undefined" later in data.h. Does this project have an undocumented dependency on some Linux-compatibility package? Like, for instance: https://technet.microsoft.com/en-us/library/bb463209.aspx If so, which pthread library is working for you to build under Windows?

Greater IoU than Recall?

Hi,
I'm training YOLO over VOC 2007 & 2012. While I want to get the curve of IoU and Recall, I validated every weight in /backup, but I noticed immediately after validating on 2007_test with yolo-voc_100.weights, that the average IoU is 44.04% and Recall 29.57%.
As I see it, IoU is Area of Overlap/Area of Union, and Recall is Area of Overlap/Area of Object, and since Area of Object is no larger than Area of Union, Recall should always be greater than (or equal to) IoU , yet my data shows something different.
Please tell me which part did I get it wrong.

demo on video stream

If i try the demo on an rtmp video stream it works but the framerate is not synced.
So the detection works too fast ( eg. stream is 25fps and detection around 40) and video feed freezes until the next chunk.

What do i have to change in the demo.c to make it synced ?

Assertion `l.outputs == params.inputs' failed

I made changes according to the steps mentioned in 'How to make train for custom objects' but I am getting this error:

darknet: ./src/parser.c:242: parse_region: Assertion `l.outputs == params.inputs' failed.
Aborted (core dumped)

What does this mean and how do i solve it?

Darknet can't detect object from train images with threshold = 0.8

I just noticed that I trained Yolo V2 on VOC2007 dataset,and I tested on the training images,find that yolo v2 can't fit the train images ,in other words,i set threshold = 0.8 no bounding box was detected.
I followed your instructions to train ,and checked it for several times,the result didn't change a lot.
I was wondering whether is the lose function of Yolo causing this error?By the way,I did the same test on mxnet-ssd,faster RCNN on caffe,everything was ok,the bounding boxes were detected with probability 1.0.

Problem with tiny models

Hi guys,

The larger models work perfectly well and produce good results. However, when I run it with the tiny models it produces no output, I use the -c flag and it just shows the raw image with no detections. I have tried reducing the -thresh to a very low number but it still produces no output, when -thresh is set to zero it only shows "person", so I am guessing the model has only been trained using people?

Kind regards,
Waj

Segmentation fault when training yolo v2 with VOC dataset

Hi,

Currently I got problem when trying to train the darknet with original voc 2007-2012 following the guide in this repo.

My error is always segmentation fault like below:

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
yolo-voc
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32
   ....
   30 detection
Loading weights from darknet19_448.conv.20...mj = 0, mn = 1, *(net->seen) = 0
load_convolutional_weights: l.n*l.c*l.size*l.size = 864
...
load_convolutional_weights: l.n*l.c*l.size*l.size = 128000
Done!
Learning Rate: 0.0001, Momentum: 0.9, Decay: 0.0005
Segmentation fault (core dumped)

In more detail, gdb shows this related error:

Core was generated by `./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  ipl_to_image (src=0xffffffffa0007dc0) at ./src/image.c:461

any hint to resolve this issue?

-nogpu not work

if i call
darknet_no_gpu.exe detector test data/coco.data tiny-yolo-voc.cfg tiny-yolo-voc.weights data/person.jpg -i 10.0

predictions

The result is good, however,since my gpu can work in training but alway out of memory when detection, I build the darknet in gpu. If I call the nogpu function in normal darknet:

darknet.exe -nogpu detector test data/coco.data tiny-yolo-voc.cfg tiny-yolo-voc.weights data/person.jpg -i 10.0
it would be all miserable
predictions2

Yolo training

Hello,

is there anyway to pause the Yolo training at some stages (to turn off the computer or something like that) and then re-train it some time later from where it has paused?

A bug with multi-threading? Caffe trains with no problem while Darknet quits during training

Hi @AlexeyAB ,

I am still having training problem darknet.
I posted it in detail at google groups.

However, since problem is occuring on windows port,
I thought you might be the right person to ask for help.

The gpu training is going smooth on caffe, but not Darknet.
So I have been thinking maybe there is some issue with the software and not the hardware.
The copies I produced the error occcured with the YOLOv2 from this repo, nothing I added.

Below is my content that I pasted on
https://groups.google.com/forum/#!topic/darknet/ZCWS6RGMuCM


So I have been using darknet for last 2 months, everything was just perfect.

However, last week program quits during training saying "darknet.exe is accessing the memory location that does not exist", immediately GPU power, temperature goes down.
Error persists even when I set subdivisions=batch=1, so I do not think it is because of the memory. Error occurs after training 1K or 2K or 3K iterations.

A) My first doubt is that it might have something to do with core clocks.
1.darknet is setting core clock=1923/1989 MHz, when training with subdivisions=batch=1 while using 1.3GB of GPU memory

  1. While caffe is setting core clock = 1885 at maximum. while taking 4GB memory for VOC12 classification training on Alexnet (I am just doing this to test GPUs).

B) My second doubt is that maybe it has something to do with my power Supply (it is not related to darknet, but I think you could be help)

power supply 850 Wt
SSD 512GB
HDD 1 TB
CPU Core i7-6800K CPU 3.4GHz(12 CPUs), ~3.4GHz
RAM 16 GB, DDR4

The basis for my doubt is outervision.com power supply calculator recommends me 1200 W PSU even when I excluding GPUs from calculation.
Does that mean I have to buy bigger power supply, but if that is the case why problem does not occur when I train on caffe and occur when I train with darknet?

I also tested my GPU with FUR test and I got above ~7200 score for both of my MSI GTX 1080 Armor GPUs, which seems to be the normal score for 1080.

Any help or suggestions would be appreciated!

Update I:
It is not a temprature issue because when darknet quit, GPU2(darknet was using) did not even hit the 67%.
While at the same time caffe was training on GPU1 with 76% temperature.

Now I am also starting to think maybe it is not even a power issue, because when darknet quit, caffe was working fine.

Update II:
I performed the experiment A) by reversing the GPUs as well.
Meaning I trained caffe on GPU2 and darknet on GPU1/
Stil, darknet quits after some time, caffe does not.

How to train YOLOv2 544x544 ?

thanks alexeyab!
I want more higher mAP, so YOLOv2 544x544 is best choice ,but there is not have train script and cfg file in darknet, Do you have train this resolution?

Training trick ...

Hello,

is it good that we stop straining after 1000 iterations and continue training with yolo-obj_1000.weights?

or is it good that we go from the beginning to end with darknet19_448.conv.23?

My personal assumption is the first one, I mean interruption at 1000 (or maybe sooner) and continue with the new weights, which I believe it will deliver higher accuracy/mAP, but you please confirm the best.

I asked this in a new topic because it was different and it could be helpful for others as well. Thanks.

Problem with multi-threading in detector.c

Hi @AlexeyAB ,
I am trying to validate face detector that I trained on WIDER dataset
The problem is validation set contains 3226 images, but when I call validate_detector function, it processes sometimes all the 3226 images, sometimes 1044 and sometimes 1956.
For example, in this screenshoot it is 1956 images
image


Could you help me to figure out the problem? I think it has something to do with threading, but I am not sure since I myself never had experience with multi-threading.

When I process 3226 with single thread (nthreads = 1), it is only processing first 1044 images.

only modification I did is in the for block as below, plus adding print_wider_detections function.

for(i = nthreads; i < m+nthreads; i += nthreads){
        fprintf(stderr, "%d\n", i);
        for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
            pthread_join(thr[t], 0);
            val[t] = buf[t];
            val_resized[t] = buf_resized[t];
        }
        for(t = 0; t < nthreads && i+t < m; ++t){		
	    args.path = paths[i+t];
            args.im = &buf[t];
            args.resized = &buf_resized[t];
            thr[t] = load_data_in_thread(args);
        }
        for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
            char *path = paths[i+t-nthreads];
	    printf("m = %d,\ti = %d \titer = %d\n\n",m,i, i + t - nthreads);
            char *id = basecfg(path);
            float *X = val_resized[t].data;
            network_predict(net, X);
            int w = val[t].w;
            int h = val[t].h;
            get_region_boxes(l, w, h, thresh, probs, boxes, 0, map);
            if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms);
			
	    if (coco){
                print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h);
            } else if (imagenet){
                print_imagenet_detections(fp, i+t-nthreads+1, boxes, probs, l.w*l.h*l.n, classes, w, h);
	    }
	    else if (wider) {
	        print_wider_detections(id, boxes, probs, l.w*l.h*l.n, classes, w, h);
	    }
	    else {
                print_detector_detections(fps, id, boxes, probs, l.w*l.h*l.n, classes, w, h);
            }
            free(id);
            free_image(val[t]);
            free_image(val_resized[t]);
        }
    }

Image size

@AlexeyAB if I use 416x416 in my config file, do I have to resize all my images to 416x416? If not, does darknet take in images of varying sizes or aren't square?

Problem ---> Cuda Error: invalid device function

Hi,
i got a CUDA error and can't solve it.
When i use the darknet_coco or voc.cmd i get the following problem:

CUDA error: invalid device function
CUDA error: invalid device function: No error

darknet_cmd_problem

The darknet_no_gpu.exe works fine. The samples of CUDA are also working.
I use VS2015 Community, CUDA 8.0, OpenCV 2.4.9 and CuDnn 5.1

I hope you can help me!
Thanks in advance

Greetings
Vitali

Training images terms and conditions, [net] layer parameters

Hello,

I changed the weight and height of the [net] layers to 544, but this led the model to an strange behavior and as it was iterating more, an un-detection behavior became more powerful and finally it goes to no detection even on Training images!. Do you know why? Strange.

Besides when I look at YOLOv2 544x544 in the Darket website, its cfg files wrote the height and width as 416, why?!

Also I realize that input images' sizes do not affect the consumed GPU memory. This is unique for YOLO because big training images (in size or resolution) would easily lead to out of memory on other models.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.