適用於Windows和Linux的Yolo-v4和Yolo-v3 / v2 ---- (用於對象檢測的神經網絡)-Tensor Core可以在Linux和Windows上使用
Paper Yolo v4:https://arxiv.org/abs/2004.10934
更多詳細信息:http://pjreddie.com/darknet/yolo/
關於pytorch,可加羣857449786 註明(pytorch)
Tensorflow 深度學習實戰羣 755860371 共同學習,謝謝
- 該存儲庫中的改進
- 如何使用
- 如何在Linux上編譯
- 如何在Windows上編譯
- 對MS COCO進行速度和準確性的培訓和評估
- 如何使用多GPU進行訓練:
- 如何訓練(檢測您的自定義對象)
- 如何訓練tiny-yolo(檢測您的自定義對象)
- 我什麼時候應該停止訓練
- 如何改善物體檢測
- 如何標記對象的有界框並創建註釋文件
- 如何將Yolo用作DLL和SO庫
- Yolo v4完整比較:map_fps
- CSPNet:紙張和map_fps比較:https://github.com/WongKinYiu/CrossStagePartialNetworks
- MS COCO上的Yolo v3:速度/準確度([email protected])圖表
- MS COCO上的Yolo v3(Yolo v3 vs RetinaNet)-圖3: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
How to evaluate AP of YOLOv4 on the MS COCO evaluation server
- Download and unzip test-dev2017 dataset from MS COCO server: http://images.cocodataset.org/zips/test2017.zip
- Download list of images for Detection taks and replace the paths with yours: https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/testdev2017.txt
- Download
yolov4.weights
file: https://drive.google.com/open?id=1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT - 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
- Create
/results/
folder near with./darknet
executable file - Run validation:
./darknet detector valid cfg/coco.data cfg/yolov4.cfg yolov4.weights
- Rename the file
/results/coco_results.json
todetections_test-dev2017_yolov4_results.json
and compress it todetections_test-dev2017_yolov4_results.zip
- Submit file
detections_test-dev2017_yolov4_results.zip
to the MS COCO evaluation server for thetest-dev2019 (bbox)
How to evaluate FPS of YOLOv4 on GPU
- Compile Darknet with
GPU=1 CUDNN=1 CUDNN_HALF=1 OPENCV=1
in theMakefile
(or use the same settings with Cmake) - Download
yolov4.weights
file 245 MB: yolov4.weights (Google-drive mirror yolov4.weights ) - Get any .avi/.mp4 video file (preferably not more than 1920x1080 to avoid bottlenecks in CPU performance)
- 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):
-
yolov4.cfg - 245 MB: yolov4.weights (Google-drive mirror yolov4.weights ) paper Yolo v4 just change
width=
andheight=
parameters inyolov4.cfg
file and use the sameyolov4.weights
file for all cases:width=608 height=608
in cfg: 65.7% [email protected] (43.5% [email protected]:0.95) - 34(R) FPS / 62(V) FPS - 128.5 BFlopswidth=512 height=512
in cfg: 64.9% [email protected] (43.0% [email protected]:0.95) - 45(R) FPS / 83(V) FPS - 91.1 BFlopswidth=416 height=416
in cfg: 62.8% [email protected] (41.2% [email protected]:0.95) - 55(R) FPS / 96(V) FPS - 60.1 BFlopswidth=320 height=320
in cfg: 60% [email protected] ( 38% [email protected]:0.95) - 63(R) FPS / 123(V) FPS - 35.5 BFlops
-
yolov3-微小-prn.cfg - 33.1%[email protected] - 370(R)FPS - 3.5 BFlops - 18.8 MB:yolov3-微小-prn.weights
-
ENET-coco.cfg(EfficientNetB0-Yolov3) - 45.5%[email protected] - 55(R)FPS - 3.7 BFlops - 18.3 MB:enetb0-coco_final.weights
-
yolov3-openimages.cfg -247 MB-18(R)FPS-OpenImages數據集:yolov3-openimages.weights
單擊我 -Yolo v3型號
單擊我 -Yolo v2型號
放到編譯後:darknet.exe
您可以通過以下路徑獲取cfg文件: darknet/cfg/
要求
- Windows或Linux
- CMake> = 3.8對於現代CUDA支持:https://cmake.org/download/
- CUDA 10.0:https://developer.nvidia.com/cuda-toolkit-archive(在Linux上執行安裝後操作)
- OpenCV> = 2.4:使用您首選的軟件包管理器(棕色,apt),使用vcpkg從源代碼構建或從OpenCV官方網站下載(在Windows上,設置系統變量
OpenCV_DIR
=C:\opencv\build
-include
和x64
文件夾圖像) - CUD 10.0的cuDNN> = 7.0 https://developer.nvidia.com/rdp/cudnn-archive(在Linux副本上
cudnn.h
,libcudnn.so
...如此處所述https://docs.nvidia.com/deeplearning/sdk/cudnn-install /index.html#installlinux-tar上的Windows拷貝cudnn.h
,cudnn64_7.dll
,cudnn64_7.lib
這裏desribed https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installwindows) - CC> = 3.0的GPU:https://en.wikipedia.org/wiki/CUDA#GPUs_supported
- 在Linux GCC或Clang上,在Windows MSVC 2015/2017/2019 https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community
其他框架中的Yolo v3
- TensorFlow:轉換
yolov3.weights
/cfg
文件yolov3.ckpt
/pb/meta
:使用mystic123或jinyu121項目,TensorFlow -精簡版 - 英特爾OpenVINO 2019 R1:(Myriad X / USB神經計算棒/ Arria FPGA):閱讀本手冊
- OpenCV-dnn是CPU(x86 / ARM-Android)最快的實現,OpenCV可以使用OpenVINO後端進行編譯以在(Myriad X / USB Neural Compute Stick / Arria FPGA)上運行,與
yolov3.weights
/cfg
配合使用:C ++示例或Python示例 - PyTorch> ONNX> CoreML> iOS如何將cfg / weights-files轉換爲pt-file:ultralytics / yolov3和iOS App
- TensorRT for YOLOv3 (-70% faster inference): Yolo is natively supported in DeepStream 4.0 read PDF
- TVM - compilation of deep learning models (Keras, MXNet, PyTorch, Tensorflow, CoreML, DarkNet) into minimum deployable modules on diverse hardware backends (CPUs, GPUs, FPGA, and specialized accelerators): https://tvm.ai/about
- OpenDataCam - It detects, tracks and counts moving objects by using Yolo: https://github.com/opendatacam/opendatacam#-hardware-pre-requisite
- Netron - Visualizer for neural networks: https://github.com/lutzroeder/netron
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:
python ./scripts/voc_label.py
用於標記Train / Test / Val檢測數據集 - ILSVRC2012(ImageNet分類):使用
./scripts/get_imagenet_train.sh
(也imagenet_label.sh
用於標記有效集) - 用於檢測的德語/比利時/俄羅斯/ LISA / MASTIF交通標誌數據集-使用此解析器:https://github.com/angeligareta/Datasets2Darknet#detection-task
- 其他數據集列表:https://github.com/AlexeyAB/darknet/tree/master/scripts#datasets
結果示例
其他:https://www.youtube.com/user/pjreddie/videos
該存儲庫中的改進
- 增加了對Windows的支持
- 添加了最新模型:CSP,PRN,EfficientNet
- 添加的層:[conv_lstm],[scale_channels] SE / ASFF / BiFPN,[local_avgpool],[sam],[Gaussian_yolo],[reorg3d](固定的[reorg]),固定的[batchnorm]
- 添加了訓練循環模型(具有conv-lstm
[conv_lstm]
/ conv-rnn層[crnn]
)以精確檢測視頻的功能 - 添加了數據擴充:
[net] mixup=1 cutmix=1 mosaic=1 blur=1
。添加的激活:SWISH,MISH,NORM_CHAN,NORM_CHAN_SOFTMAX - 增加了使用CPU-RAM進行GPU處理訓練的能力,以增加mini_batch_size和準確性(而非批處理規範同步)
- 如果使用此XNOR-net模型訓練自己的權重(位1推斷),則在CPU和GPU上的二進制神經網絡性能將提高2到4倍的檢測速度:https://github.com/AlexeyAB/darknet/blob/master /cfg/yolov3-tiny_xnor.cfg
- 通過將2層融合到1個卷積+批範數中,將神經網絡性能提高了7%左右
- 改進的性能:如果在或中定義了Tensor Core,則在GPU Volta / Turing(Tesla V100,GeForce RTX等)上檢測2倍,
CUDNN_HALF
Makefile
darknet.sln
- 改進了FullHD的性能約1.2倍,4K的性能約2倍,使用
darknet detector demo
... 可以檢測視頻(文件/流) - 性能提高了3.5倍的數據增強進行訓練(使用OpenCV SSE / AVX功能而不是手寫功能)-消除了在多GPU或GPU Volta上進行訓練的瓶頸
- 使用AVX改進了對Intel CPU的檢測和訓練性能(Yolo v3?85 %)
- 在調整網絡大小時優化內存分配
random=1
- 優化的GPU初始化以進行檢測-我們最初使用batch = 1,而不是使用batch = 1重新初始化
- 使用命令添加了正確的mAP,F1,IoU,Precision-Recall計算
darknet detector map
... -map
在訓練過程中添加了平均損耗和準確度mAP(標誌)圖表./darknet detector demo ... -json_port 8070 -mjpeg_port 8090
作爲JSON和MJPEG服務器運行,以使用軟件或Web瀏覽器通過網絡在線獲取結果- 增加了訓練錨的計算
- 添加了檢測和跟蹤對象的示例:https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp
- 如果使用了不正確的cfg文件或數據集,則爲運行時提示和警告
- 許多其他代碼修復...
並添加了手冊- 如何訓練Yolo v4-v2(以檢測您的自定義對象)
另外,您可能對使用簡化的存儲庫感興趣,該存儲庫中已實現INT8量化(+ 30%的加速和-1%的mAP降低):https://github.com/AlexeyAB/yolo2_light
如何在命令行上使用
在Linux上,請使用./darknet
代替darknet.exe
,例如:./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights
在Linux上./darknet
,在根目錄中找到可執行文件,而在Windows上,在目錄中找到可執行文件。\build\darknet\x64
- Yolo v4 COCO- 圖片:
darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
- 輸出對象的座標:
darknet.exe detector test cfg/coco.data yolov4.cfg yolov4.weights -ext_output dog.jpg
- Yolo v4 COCO- 視頻:
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
- Yolo v4 COCO- WebCam 0:
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
- 用於網絡攝像機的 Yolo v4 COCO-智能網絡攝像頭:
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights http://192.168.0.80:8080/video?dummy=param.mjpg
- Yolo v4-保存結果視頻文件res.avi:
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
- Yolo v3 Tiny COCO-視頻:
darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights test.mp4
- JSON和MJPEG服務器,允許來自您的軟件瀏覽器或Web瀏覽器
ip-address:8070
和8090的多個連接:./darknet detector demo ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output
- GPU#1上的 Yolo v3 Tiny :
darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
- 替代方法Yolo v3 COCO-圖片:
darknet.exe detect cfg/yolov4.cfg yolov4.weights -i 0 -thresh 0.25
- 在Amazon EC2上進行訓練,以使用URL來查看mAP和丟失圖表,例如:
http://ec2-35-160-228-91.us-west-2.compute.amazonaws.com:8090
在Chrome / Firefox中(Darknet應該使用OpenCV進行編譯):./darknet detector train cfg/coco.data yolov4.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
- 186 MB Yolo9000-圖片:
darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights
- 如果使用cpp api構建應用程序,請記住將data / 9k.tree和data / coco9k.map放在應用程序的同一文件夾下
- 要處理圖像列表
data/train.txt
並將檢測結果保存到result.json
文件中,請使用:darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output -dont_show -out result.json < data/train.txt
- 處理圖像列表
data/train.txt
並保存檢測結果以result.txt
供使用:darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show -ext_output < data/train.txt > result.txt
- 僞標記-處理圖像列表
data/new_train.txt
並將檢測結果以Yolo訓練格式保存爲每個圖像作爲標籤<image_name>.txt
(通過這種方式,您可以增加訓練數據量)使用:darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25 -dont_show -save_labels < data/new_train.txt
- 要計算錨點:
darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
- 要檢查準確性mAP @ IoU = 50:
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
- 要檢查準確性mAP @ IoU = 75:
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights -iou_thresh 0.75
用於在任何Android智能手機上使用網絡攝像機mjpeg-stream
-
下載Android手機mjpeg-stream soft:IP網絡攝像頭/ Smart WebCam
-
通過WiFi(通過WiFi路由器)或USB將Android手機連接到計算機
-
在手機上啓動Smart WebCam
-
替換下面的地址,在電話應用程序(Smart WebCam)中顯示並啓動:
- Yolo v4 COCO模型:
darknet.exe detector demo data/coco.data yolov4.cfg yolov4.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0
如何在Linux上編譯(使用cmake
)
該CMakeLists.txt
將嘗試查找已安裝的可選依賴像CUDA,cudnn,ZED與那些身材。它還將創建一個共享對象庫文件以darknet
用於代碼開發。
在克隆的存儲庫中執行以下操作:
mkdir build-release
cd build-release
cmake ..
make
make install
如何在Linux上編譯(使用make
)
只需make
在darknet目錄中即可。在製作之前,您可以在Makefile
:鏈接中設置此類選項。
GPU=1
使用CUDA進行構建以通過使用GPU加速(CUDA應該在中/usr/local/cuda
)CUDNN=1
使用cuDNN v5-v7進行構建,以通過使用GPU加速培訓(cuDNN應該在中/usr/local/cudnn
)CUDNN_HALF=1
爲Tensor Core構建(在Titan V / Tesla V100 / DGX-2及更高版本上)加速檢測3倍,訓練2倍OPENCV=1
使用OpenCV 4.x / 3.x / 2.4.x進行構建-允許檢測來自網絡攝像機或網絡攝像機的視頻文件和視頻流DEBUG=1
調試Yolo版本OPENMP=1
使用OpenMP支持進行構建以通過使用多核CPU來加速YoloLIBSO=1
生成一個庫darknet.so
和uselib
使用該庫的二進制可運行文件。或者,您也可以嘗試運行,LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4
如何從自己的代碼中使用此SO庫-您可以查看C ++示例:https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp 或在這樣的方式:LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights test.mp4
ZED_CAMERA=1
構建具有ZED-3D攝像機支持的庫(應安裝ZED SDK),然後運行LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights zed_camera
要在Linux上運行Darknet,請使用本文提供的示例,只需使用./darknet
代替darknet.exe
,即使用以下命令:./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights
如何在Windows上進行編譯(使用CMake-GUI
)
如果您已經安裝了Visual Studio 2015/2017/2019,CUDA> 10.0,cuDNN> 7.0和OpenCV> 2.4,則這是在Windows上構建Darknet的推薦方法。
使用CMake-GUI
如下所示這個IMAGE:
- 配置
- 發電機的可選平臺(設置:x64)
- 完
- 生成
- 公開項目
- 設置:x64和發行版
- 建立
- 建立解決方案
如何在Windows上進行編譯(使用vcpkg
)
如果您已經安裝了Visual Studio 2015/2017/2019,CUDA> 10.0,cuDNN> 7.0,OpenCV> 2.4,則要編譯Darknet,建議使用 CMake-GUI。
否則,請按照下列步驟操作:
-
將Visual Studio安裝或更新到至少2017版,並確保已對其進行全面修補(如果不確定是否自動更新到最新版本,請再次運行安裝程序)。如果需要從頭開始安裝,請從此處下載VS:Visual Studio社區
-
安裝CUDA和cuDNN
-
安裝
git
和cmake
。確保它們至少在當前帳戶的路徑上 -
安裝vcpkg並嘗試安裝測試庫以確保一切正常,例如
vcpkg install opengl
-
定義環境變量,
VCPKG_ROOT
指向的安裝路徑vcpkg
-
用名稱
VCPKG_DEFAULT_TRIPLET
和值定義另一個環境變量x64-windows
-
打開Powershell並鍵入以下命令:
PS \ > cd $ env: VCPKG_ROOT
PS代碼\ vcpkg > 。\ vcpkg install pthreads opencv [ ffmpeg ] #如果您要使用cuda加速的openCV,請替換爲opencv [cuda,ffmpeg]
- 打開Powershell,轉到
darknet
文件夾並使用命令進行構建.\build.ps1
。如果要使用Visual Studio,將在構建後找到由CMake爲您創建的兩個自定義解決方案,一個在中build_win_debug
,另一個在中build_win_release
,其中包含系統的所有適當配置標誌。
如何在Windows上編譯(舊版方式)
C:\opencv_3.0\opencv\build\x64\vc14\lib;$(CUDA_PATH)\lib\$(PlatformName);$(CUDNN)\lib\x64;%(AdditionalLibraryDirectories)
..\..\3rdparty\lib\x64\pthreadVC2.lib;cublas.lib;curand.lib;cudart.lib;cudnn.lib;%(AdditionalDependencies)
OPENCV;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)
如何使用多GPU進行訓練:
僅對於小型數據集,有時對於4個GPU集learning_rate = 0.00025
(例如,learning_rate = 0.001 / GPU)而言,降低學習率更好。在這種情況下burn_in =
,請max_batches =
在您的cfg文件中增加4倍的時間。即使用burn_in = 4000
代替1000
。steps=
如果policy=steps
設置相同。
https://groups.google.com/d/msg/darknet/NbJqonJBTSY/Te5PfIpuCAAJ
如何訓練(檢測您的自定義對象):
(培養老YOLO V2 yolov2-voc.cfg
,yolov2-tiny-voc.cfg
,yolo-voc.cfg
,yolo-voc.2.0.cfg
,... 通過鏈接點擊)
培訓Yolo v4(和v3):
因此,如果classes=1
應該filters=18
。如果classes=2
再寫filters=21
。
(不要寫在cfg文件中:filters =(classs + 5)x3)
(通常filters
取決於classes
,coords
和的數量mask
,即filters = (classes + coords + 1)*<number of mask>
,其中mask
是錨的索引。如果mask
不存在,則filters = (classes + coords + 1)*num
)
因此,例如,對於2個對象,您的文件yolo-obj.cfg
應該yolov4-custom.cfg
在3個 [yolo]層的每一層中均不同於以下行:
[convolutional]
filters=21
[region]
classes=2
classes= 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
它將.txt
爲.jpg
同一目錄中具有相同名稱但具有.txt
-extension的每個-image-file- 創建一個-file ,並將其放置到文件中:該圖像上的對象編號和對象座標,用於新行中的每個對象:
<object-class> <x_center> <y_center> <width> <height>
哪裏:
例如,將爲img1.jpg
您創建img1.txt
包含:
1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667
data/obj/img1.jpg
data/obj/img2.jpg
data/obj/img3.jpg
8.1。對於每4個紀元(設置valid=valid.txt
或train.txt
在obj.data
文件中)使用mAP(平均平均精度)計算進行訓練並運行:darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map
注意:如果在訓練過程中看到nan
“ avg
(損失)”字段的值-則訓練有誤,但如果出現nan
在其他行中-則訓練進行得很好。
注意:如果您在cfg文件中更改了width =或height =,則新的寬度和高度必須被32整除。
注意:訓練後,請使用以下命令進行檢測:darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
注意:如果Out of memory
發生錯誤,.cfg
則應在-file中增加subdivisions=16
32或64:鏈接
如何訓練tiny-yolo(檢測您的自定義對象):
執行與上述完整yolo模型相同的所有步驟。除了:
-
如果您具有CUDA 10.0,cuDNN 7.4和OpenCV 3.x(路徑:
C:\opencv_3.0\opencv\build\include
&C:\opencv_3.0\opencv\build\x64\vc14\lib
),則打開build\darknet\darknet.sln
,設置x64並釋放 https://hsto.org/webt/uh/fk/-e/uhfk-eb0q-hwd9hsxhrikbokd6u.jpeg並執行以下操作:構建->構建darknet。還要添加Windows系統變量CUDNN
以及CUDNN的路徑:https://developer.nvidia.com/rdp/cudnn-archive -
添加
CUDNN
具有CUDNN路徑的Windows系統變量:https://devblogs.nvidia.com/parallelforall/wp-content/uploads/ 2015/01 / VS2013-R-5.jpg - 添加到項目:
- 所有
.c
檔案 - 所有
.cu
檔案 - 文件
http_stream.cpp
從\src
目錄 - 文件
darknet.h
從\include
目錄
- 所有
- (右鍵單擊項目)->屬性->鏈接器->常規->其他庫目錄,放在這裏:
- (右鍵單擊項目)->屬性->鏈接器->輸入->其他依賴項,放在這裏:
- (右鍵單擊項目)->屬性-> C / C ++->預處理程序->預處理程序定義
-
編譯爲.exe(X64&Release)並將.dll-s與.exe放在附近:https://hsto.org/webt/uh/fk/-e/uhfk-eb0q-hwd9hsxhrikbokd6u.jpeg
-
pthreadVC2.dll, pthreadGC2.dll
來自\ 3rdparty \ dll \ x64 -
cusolver64_91.dll, curand64_91.dll, cudart64_91.dll, cublas64_91.dll
-91(對於CUDA 9.1或您的版本),來自C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v9.1 \ bin -
對於OpenCV的3.2:
opencv_world320.dll
與opencv_ffmpeg320_64.dll
從C:\opencv_3.0\opencv\build\x64\vc14\bin
-
對於OpenCV的2.4.13:
opencv_core2413.dll
,opencv_highgui2413.dll
並opencv_ffmpeg2413_64.dll
從C:\opencv_2.4.13\opencv\build\x64\vc14\bin
-
-
首先在1個GPU上進行約1000次迭代的訓練:
darknet.exe detector train cfg/coco.data cfg/yolov4.cfg yolov4.conv.137
-
然後停止並通過使用部分訓練的模型
/backup/yolov4_1000.weights
運行訓練來進行multigpu(最多4個GPU):darknet.exe detector train cfg/coco.data cfg/yolov4.cfg /backup/yolov4_1000.weights -gpus 0,1,2,3
-
要進行培訓,請
cfg/yolov4-custom.cfg
下載預訓練的權重文件(162 MB):yolov4.conv.137(Google驅動器鏡像yolov4.conv.137) -
創建
yolo-obj.cfg
內容與中相同的文件yolov4-custom.cfg
(或複製yolov4-custom.cfg
到yolo-obj.cfg)
和:
- 將行批次更改爲
batch=64
- 將線路細分更改爲
subdivisions=16
- 將max_batches線更改爲(
classes*2000
但不小於4000
),max_batches=6000
如果您訓練3節課,則更改爲fe - 將線路步長更改爲max_batches,fe的80%和90%
steps=4800,5400
- 設置網絡大小
width=416 height=416
或任何32的值的倍數:https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L8-L9 - 將行更改
classes=80
爲3[yolo]
層中每層的對象數:- 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
- 將[
filters=255
] 更改爲[convolutional]
每層前3箇中的filter =(classs + 5)x3[yolo]
,請記住,它只需是[convolutional]
每個[yolo]
層之前的最後一個。- 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
- 當使用
[Gaussian_yolo]
層,改變[filters=57
]過濾器=(類+ 9)X3在3[convolutional]
每個前[Gaussian_yolo]
層- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L604
- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L696
- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L789
-
obj.names
在目錄中創建文件build\darknet\x64\data\
,並帶有對象名稱-每個都在新行中 -
obj.data
在目錄中創建文件build\darknet\x64\data\
,其中包含(其中class =對象數):
-
將對象的圖像文件(.jpg)放在目錄中
build\darknet\x64\data\obj\
-
您應該在數據集中的圖像上標記每個對象。使用此可視化GUI軟件來標記對象的邊界框併爲Yolo v2和v3生成註釋文件:https://github.com/AlexeyAB/Yolo_mark
<object-class>
-從0
到的整數對象編號(classes-1)
<x_center> <y_center> <width> <height>
-浮動值相對於圖片的寬度和高度,可以等於(0.0 to 1.0]
- 例如:
<x> = <absolute_x> / <image_width>
或<height> = <absolute_height> / <image_height>
- 注意:
<x_center> <y_center>
-矩形的中心(不是左上角)
train.txt
在directory中創建文件build\darknet\x64\data\
,其中包含圖像的文件名,每個文件名都換行,並具有相對於的路徑darknet.exe
,例如,包含:
-
下載卷積層的預訓練權重並放置到目錄中
build\darknet\x64
- 爲
yolov4.cfg
,yolov4-custom.cfg
(162 MB):yolov4.conv.137(谷歌驅動鏡yolov4.conv.137) - for
csresnext50-panet-spp.cfg
(133 MB):csresnext50-panet-spp.conv.112 - 對於
yolov3.cfg, yolov3-spp.cfg
(154 MB):darknet53.conv.74 - for
yolov3-tiny-prn.cfg , yolov3-tiny.cfg
(6 MB):yolov3-tiny.conv.11 - 對於
enet-coco.cfg (EfficientNetB0-Yolov3)
(14 MB):enetb0-coco.conv.132
- 爲
-
使用命令行開始培訓:
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137
要在Linux上訓練,請使用以下命令:(
./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137
僅使用./darknet
代替darknet.exe
)- (文件每100次迭代
yolo-obj_last.weights
將保存到中build\darknet\x64\backup\
) - (文件每1000次迭代
yolo-obj_xxxx.weights
將保存到中build\darknet\x64\backup\
) - (
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show
如果您在沒有監視器的計算機(如雲Amazon EC2)上進行訓練,則可以禁用Loss-Window的使用) - (要在沒有GUI的遠程服務器上進行培訓時查看mAP和失誤表,請使用命令,
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
然後http://ip-address:8090
在Chrome / Firefox瀏覽器中打開URL )
- (文件每100次迭代
- 訓練完成後-
yolo-obj_final.weights
從路徑中獲取結果build\darknet\x64\backup\
-
每進行100次迭代後,您可以停止,然後從這一點開始訓練。例如,經過2000次迭代後,您可以停止訓練,之後再開始使用以下方法開始訓練:
darknet.exe detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights
(在原始存儲庫https://github.com/pjreddie/darknet中,權重文件每1萬次迭代僅保存一次
if(iterations > 1000)
) -
同樣,您可以比所有45000次迭代更早地獲得結果。
- 下載yolov3-tiny的默認權重文件:https://github.com/AlexeyAB/darknet/blob/master/build/ darknet / x64 / partial.cmd 如果您創建的定製模型不基於其他模型,則可以在不預先訓練權重的情況下對其進行訓練,然後將使用隨機初始權重。
我什麼時候應該停止訓練:
通常,每個類(對象)需要進行2000次迭代,但總計不少於4000次迭代。但是對於何時停止訓練的更精確定義,請使用以下手冊:
- 在訓練期間,您會看到各種錯誤指示,並且當不再減少0.XXXXXXX avg時,您應該停止操作:
區域平均IOU:0.798363,類:0.893232,對象:0.700808,無對象:0.004567,平均調用率:1.000000,計數:8區域平均IOU:0.800677,類:0.892181,對象:0.701590,無對象:0.004574,平均調用率:1.000000 ,數:8
9002:0.211667,0.60730 平均,0.001000速率,3.868000秒,576128圖像加載:0.000000秒
- 9002-迭代編號(批處理數量)
- 0.60730平均 -平均損失(錯誤)- 越低越好
當您發現平均損失0.xxxxxx平均不再在許多次迭代中減少時,您應該停止訓練。最終平均損失可能從
0.05
(對於小模型和簡單數據集)到3.0
(對於大模型和困難數據集)。- 訓練停止後,您應該
.weights
從中提取一些最後的文件,darknet\build\darknet\x64\backup
並從中選擇最好的文件:
例如,您在9000次迭代後停止了訓練,但最佳結果可以給出以前的權重之一(7000、8000、9000)。可能由於過度擬合而發生。過度擬合 -這種情況是您可以從訓練數據集中檢測圖像上的對象,但無法檢測其他圖像上的對象。您應該從Early Stopping Point獲得權重:
要從早期停止點獲取權重:
2.1。首先,
obj.data
您必須在文件中指定驗證數據集的路徑valid = valid.txt
(格式valid.txt
爲中的train.txt
),如果您沒有驗證圖片,則只需複製data\train.txt
到即可data\valid.txt
。2.2如果在9000次迭代後停止訓練,要驗證以前的權重,請使用以下命令:
(如果您使用另一個GitHub存儲庫,請使用
darknet.exe detector recall
...而不是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
每個權重(7000、8000、9000)的comapre最後輸出線:
選擇具有最高mAP(平均平均精度)或IoU(與聯合相交)的權重文件
例如,較大的mAP會賦予權重
yolo-obj_8000.weights
-然後使用此權重進行檢測。或者只是用
-map
國旗訓練:darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map
因此,您將在“損失圖”窗口中看到“ mAP圖”(紅線)。將使用
valid=valid.txt
文件中指定的obj.data
文件(1 Epoch = images_in_train_txt / batch
迭代)爲每個4個時期計算mAP(將3類的最大x軸值更改
max_batches=
爲2000*classes
-femax_batches=6000
)自定義對象檢測的示例:
darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
-
IoU(聯合上方的相交)-物體聯合上方的平均insectect和檢測到的某個閾值= 0.24
-
mAP(平均平均精度)-
average precisions
每個類別的average precision
平均值,其中是同一類別的每個可能閾值(每個檢測概率)的PR曲線上11點的平均值(以PascalVOC表示的Precision-Recall,其中Precision = TP /(TP + FP)和Recall = TP /(TP + FN)),第11頁:http://homepages.inf.ed.ac.uk/ckiw/postscript/ijcv_voc09.pdf
mAP是PascalVOC競賽中默認的精度指標,與MS COCO競賽中的AP50指標相同。在Wiki方面,指標Precision和Recall的含義與PascalVOC競賽中的含義略有不同,但是IoU 始終具有相同的含義。
自定義對象檢測:
自定義對象檢測的示例:
darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
如何改善物體檢測:
- 訓練前:
-
random=1
在.cfg
-file文件中設置標誌-通過訓練Yolo不同的分辨率,它將提高精度:鏈接 -
提高您的網絡分辨率
.cfg
-file(height=608
,width=608
或32任何價值倍數) -它會增加精度 -
檢查您要檢測的每個對象是否在數據集中被強制標記-數據集中的任何對象都不應沒有標籤。在大多數培訓問題中-數據集中有錯誤的標籤(通過使用某些轉換腳本,使用第三方工具標記的標籤來獲得標籤,...)。始終使用以下方法檢查數據集:https://github.com/AlexeyAB/Yolo_mark
-
我的損失非常高,而mAP卻很低,訓練錯了嗎?
-show_imgs
在training命令的末尾運行帶有flag的訓練,您是否看到正確的有界對象框(在Windows或文件中aug_...jpg
)?如果否-您的訓練數據集有誤。 -
對於您要檢測的每個對象-訓練數據集中必須至少有一個相似的對象,且它們具有大致相同的形狀:形狀,對象的側面,相對大小,旋轉角度,傾斜度,照明度。希望訓練數據集包含不同對象的圖像:比例,旋轉,照明,不同側面,不同背景的圖像-每個班級或以上,您最好擁有2000張不同的圖像,並且您應訓練
2000*classes
迭代或更多次 -
希望您的訓練數據集包含帶有您不想檢測的未標記對象的圖像-無邊界框的負樣本(空
.txt
文件)-使用與帶有對象的圖像一樣多的負樣本圖像 -
標記對象的最佳方法是:僅標記對象的可見部分,或標記對象的可見和重疊部分,或標記比整個對象多一點(有一點間隙)?隨心所欲標記-您希望如何檢測它。
-
要在每個圖像中使用大量對象進行訓練,請在cfg文件
max=200
的最後[yolo]
一層或最後一層中添加參數或更高的值[region]
(YoloV3可以檢測到的全局最大對象數0,0615234375*(width*height)
是寬度和高度是[net]
cfg文件中部分的參數) -
用於訓練小對象(將圖像調整爲416x416後小於16x16)-設置
layers = 23
爲https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L895 設置stride=4
爲https:// /github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L892 並設置stride=4
爲https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4。 -
對於小型和大型對象的訓練,請使用修改後的模型:
- 完整模型:5個yolo層:https://github.com /AlexeyAB/darknet/blob/3d2d0a7c98dbc8923d9ff705b81ff4f7940ea6ff/cfg/yolov3.cfg#L17
-
一般規則-您的訓練數據集應包括一組要檢測的相對大小的對象:
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
即,對於Test數據集中的每個對象,Training數據集中必須至少有1個對象具有相同的class_id和大約相同的相對大小:
object width in percent from Training dataset
?=object width in percent from Test dataset
也就是說,如果訓練集中僅存在佔圖像80-90%的對象,則受訓練的網絡將無法檢測到佔圖像1-10%的對象。
-
加快訓練速度(降低檢測精度)
stopbackward=1
在cfg文件中爲第136層設置參數 -
每個:
model of object, side, illimination, scale, each 30 grad
轉角和傾斜角- 從神經網絡的內部角度來看,它們是不同的對象。因此,要檢測的對象越不同,應使用越複雜的網絡模型。 -
爲了使檢測到的邊界框更準確,您可以
ignore_thresh = .9 iou_normalizer=0.5 iou_loss=giou
在每個[yolo]
圖層上添加3個參數並進行訓練,它將增加[email protected],但減少[email protected]。 -
僅當您是神經檢測網絡專家時-才爲cfg文件
width
和height
從cfg文件重新計算數據集的錨點:darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
然後在cfg文件anchors
的3[yolo]
層中的每一箇中設置相同的9 。但是,您應該masks=
爲每個[yolo]層更改錨點的索引,以使第一[yolo]層的錨點大於60x60,第二個層大於30x30,剩下的第三個層。同樣,您應該filters=(classes + 5)*<number of mask>
在每個[yolo]層之前更改。如果許多計算出的錨不適合在適當的圖層下-則只需嘗試使用所有默認錨即可。
- 訓練後-用於檢測:
-
通過在
.cfg
-file(height=608
和width=608
)或(height=832
和width=832
)或(32的任何值)中設置來提高網絡分辨率-這可以提高精度並可以檢測小對象:link- 無需再次訓練網絡,只需使用
.weights
已針對416x416分辨率進行訓練的-file - 但是要獲得更高的精度,您應該使用更高分辨率的608x608或832x832進行訓練,請注意:如果
Out of memory
發生錯誤,.cfg
則應在-file文件中增加subdivisions=16
,32或64:鏈接
- 無需再次訓練網絡,只需使用
如何標記對象的邊界框並創建註釋文件:
在這裏,您可以找到帶有GUI軟件的存儲庫,用於標記對象的有界框併爲Yolo v2-v4生成註釋文件:https://github.com/AlexeyAB/Yolo_mark
與示例的:
train.txt
,obj.names
,obj.data
,yolo-obj.cfg
,air
1-6.txt
,bird
1-4.txt
爲2類的對象(空氣,鳥)和train_obj.cmd
與實施例如何培養這個圖像組具有YOLO V2 - V4在圖像中標記對象的不同工具:
- 在C ++中:https://github.com/AlexeyAB/Yolo_mark
- 在Python中:https://github.com/tzutalin/labelImg
- 在Python中:https://github.com/Cartucho/OpenLabeling
- 在C ++中:https://www.ccoderun.ca/darkmark/
- 在JavaScript中:https://github.com/opencv/cvat
使用Yolo9000
同時檢測和分類9000個對象:
darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights data/dog.jpg
-
yolo9000.weights
-(186 MB Yolo9000型號)需要4 GB GPU-RAM:http://github.com/AlexeyAB/darknet/blob/master/include/darknet.h -
C ++ API:https://github.com/AlexeyAB/darknet/blob/master/include/yolo_v2_class.hpp
- 使用C ++ API的C ++示例:https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp
-
要將Yolo編譯爲C ++ DLL文件
yolo_cpp_dll.dll
-打開解決方案build\darknet\yolo_cpp_dll.sln
,設置x64和Release,然後執行以下操作:Build-> Build yolo_cpp_dll- 您應該已經安裝了CUDA 10.0
- 要使用cuDNN,請執行以下操作:(右鍵單擊項目)->屬性-> C / C ++->預處理程序->預處理程序定義,然後在行的開頭添加:
CUDNN;
-
要將Yolo用作C ++控制檯應用程序中的DLL文件,請打開解決方案
build\darknet\yolo_console_dll.sln
,設置x64和Release,然後執行以下操作:構建->構建yolo_console_dll-
您可以
build\darknet\x64\yolo_console_dll.exe
使用以下命令從Windows資源管理器運行控制檯應用程序:yolo_console_dll.exe data/coco.names yolov4.cfg yolov4.weights test.mp4
-
啓動控制檯應用程序並輸入圖像文件名後,您將看到每個對象的信息:
<obj_id> <left_x> <top_y> <width> <height> <probability>
-
要使用簡單的OpenCV-GUI,您應該
//#define OPENCV
在yolo_console_dll.cpp
-file:鏈接中取消註釋行 -
您可以在視頻文件上看到用於檢測的簡單示例的源代碼:鏈接
-
yolo_cpp_dll.dll
-API:鏈接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 };
- 完整模型:5個yolo層:https://github.com /AlexeyAB/darknet/blob/3d2d0a7c98dbc8923d9ff705b81ff4f7940ea6ff/cfg/yolov3.cfg#L17
關於pytorch,可加羣857449786 註明(pytorch)
Tensorflow 深度學習實戰羣 755860371 共同學習,謝謝