適用於Windows和Linux的Yolo-v4 使用方法(中文版使用手冊)

 

適用於Windows和Linux的Yolo-v4和Yolo-v3 / v2 ---- (用於對象檢測的神經網絡)-Tensor Core可以在LinuxWindows上使用

Paper Yolo v4:https://arxiv.org/abs/2004.10934

更多詳細信息:http://pjreddie.com/darknet/yolo/

關於pytorch,可加羣857449786 註明(pytorch)

Tensorflow 深度學習實戰羣 755860371 共同學習,謝謝

 

  1. 該存儲庫中的改進
  2. 如何使用
  3. 如何在Linux上編譯
  4. 如何在Windows上編譯
  5. 對MS COCO進行速度和準確性的培訓和評估
  6. 如何使用多GPU進行訓練:
  7. 如何訓練(檢測您的自定義對象)
  8. 如何訓練tiny-yolo(檢測您的自定義對象)
  9. 我什麼時候應該停止訓練
  10. 如何改善物體檢測
  11. 如何標記對象的有界框並創建註釋文件
  12. 如何將Yolo用作DLL和SO庫

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 taks and replace the paths with yours: https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/testdev2017.txt
  3. Download yolov4.weights file: https://drive.google.com/open?id=1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT
  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 (or use the same settings with Cmake)
  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):

單擊我 -Yolo v3型號

單擊我 -Yolo v2型號

放到編譯後:darknet.exe

您可以通過以下路徑獲取cfg文件: darknet/cfg/

要求

其他框架中的Yolo v3

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

結果示例

Yolo v3

其他: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_HALFMakefiledarknet.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 0darknet.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.avidarknet.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

  1. 下載Android手機mjpeg-stream soft:IP網絡攝像頭/ Smart WebCam

  2. 通過WiFi(通過WiFi路由器)或USB將Android手機連接到計算機

  3. 在手機上啓動Smart WebCam

  4. 替換下面的地址,在電話應用程序(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來加速Yolo
  • LIBSO=1生成一個庫darknet.souselib使用該庫的二進制可運行文件。或者,您也可以嘗試運行,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

  1. 配置
  2. 發電機的可選平臺(設置:x64)
  3. 生成
  4. 公開項目
  5. 設置:x64和發行版
  6. 建立
  7. 建立解決方案

如何在Windows上進行編譯(使用vcpkg

如果您已經安裝了Visual Studio 2015/2017/2019,CUDA> 10.0,cuDNN> 7.0,OpenCV> 2.4,則要編譯Darknet,建議使用 CMake-GUI

否則,請按照下列步驟操作:

  1. 將Visual Studio安裝或更新到至少2017版,並確保已對其進行全面修補(如果不確定是否自動更新到最新版本,請再次運行安裝程序)。如果需要從頭開始安裝,請從此處下載VS:Visual Studio社區

  2. 安裝CUDA和cuDNN

  3. 安裝gitcmake。確保它們至少在當前帳戶的路徑上

  4. 安裝vcpkg並嘗試安裝測試庫以確保一切正常,例如vcpkg install opengl

  5. 定義環境變量,VCPKG_ROOT指向的安裝路徑vcpkg

  6. 用名稱VCPKG_DEFAULT_TRIPLET和值定義另一個環境變量x64-windows

  7. 打開Powershell並鍵入以下命令:

PS \ >                   cd $ env: VCPKG_ROOT 
PS代碼\ vcpkg >          。\ vcpkg install pthreads opencv [ ffmpeg ] 如果您要使用cuda加速的openCV,請替換爲opencv [cuda,ffmpeg]
  1. 打開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代替1000steps=如果policy=steps設置相同。

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

如何訓練(檢測您的自定義對象):

(培養老YOLO V2 yolov2-voc.cfgyolov2-tiny-voc.cfgyolo-voc.cfgyolo-voc.2.0.cfg,... 通過鏈接點擊

培訓Yolo v4(和v3):

因此,如果classes=1應該filters=18。如果classes=2再寫filters=21

(不要寫在cfg文件中:filters =(classs + 5)x3)

(通常filters取決於classescoords和的數量mask,即filters = (classes + coords + 1)*<number of mask>,其中mask是錨的索引。如果mask不存在,則filters = (classes + coords + 1)*num

因此,例如,對於2個對象,您的文件yolo-obj.cfg應該yolov4-custom.cfg3個 [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.txttrain.txtobj.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=1632或64:鏈接

如何訓練tiny-yolo(檢測您的自定義對象):

執行與上述完整yolo模型相同的所有步驟。除了:

  1. 如果您具有CUDA 10.0,cuDNN 7.4和OpenCV 3.x(路徑:C:\opencv_3.0\opencv\build\includeC:\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

  2. 添加CUDNN具有CUDNN路徑的Windows系統變量:https://devblogs.nvidia.com/parallelforall/wp-content/uploads/ 2015/01 / VS2013-R-5.jpg

  3. 添加到項目:
    • 所有.c檔案
    • 所有.cu檔案
    • 文件http_stream.cpp\src目錄
    • 文件darknet.h\include目錄
  4. (右鍵單擊項目)->屬性->鏈接器->常規->其他庫目錄,放在這裏:
    • (右鍵單擊項目)->屬性->鏈接器->輸入->其他依賴項,放在這裏:
    • (右鍵單擊項目)->屬性-> 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.dllopencv_ffmpeg320_64.dllC:\opencv_3.0\opencv\build\x64\vc14\bin

      • 對於OpenCV的2.4.13: opencv_core2413.dllopencv_highgui2413.dllopencv_ffmpeg2413_64.dll從 C:\opencv_2.4.13\opencv\build\x64\vc14\bin

    1. 首先在1個GPU上進行約1000次迭代的訓練: darknet.exe detector train cfg/coco.data cfg/yolov4.cfg yolov4.conv.137

    2. 然後停止並通過使用部分訓練的模型/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

    1. 要進行培訓,請cfg/yolov4-custom.cfg下載預訓練的權重文件(162 MB):yolov4.conv.137(Google驅動器鏡像yolov4.conv.137

    2. 創建yolo-obj.cfg內容與中相同的文件yolov4-custom.cfg(或複製yolov4-custom.cfgyolo-obj.cfg)和:

    1. obj.names在目錄中創建文件build\darknet\x64\data\,並帶有對象名稱-每個都在新行中

    2. obj.data在目錄中創建文件build\darknet\x64\data\,其中包含(其中class =對象數):

    1. 將對象的圖像文件(.jpg)放在目錄中 build\darknet\x64\data\obj\

    2. 您應該在數據集中的圖像上標記每個對象。使用此可視化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>-矩形的中心(不是左上角)
    1. train.txt在directory中創建文件build\darknet\x64\data\,其中包含圖像的文件名,每個文件名都換行,並具有相對於的路徑darknet.exe,例如,包含:
    1. 下載卷積層的預訓練權重並放置到目錄中 build\darknet\x64

    2. 使用命令行開始培訓: 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 )
    1. 訓練完成後- 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次迭代。但是對於何時停止訓練的更精確定義,請使用以下手冊:

      1. 在訓練期間,您會看到各種錯誤指示,並且當不再減少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(對於大模型和困難數據集)。

      1. 訓練停止後,您應該.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-fe max_batches=6000

      loss_chart_map_chart

      自定義對象檢測的示例: 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 始終具有相同的含義

      precision_recall_iou

      自定義對象檢測:

      自定義對象檢測的示例: darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights

      如何改善物體檢測:

      1. 訓練前:
      • random=1.cfg-file文件中設置標誌-通過訓練Yolo不同的分辨率,它將提高精度:鏈接

      • 提高您的網絡分辨率.cfg-file( height=608width=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 = 23https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L895 設置stride=4https:// /github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L892 並設置stride=4https://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文件widthheight從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]層之前更改。如果許多計算出的錨不適合在適當的圖層下-則只需嘗試使用所有默認錨即可。

        1. 訓練後-用於檢測:
        • 通過在.cfg-file(height=608width=608)或(height=832width=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.txtobj.namesobj.datayolo-obj.cfgair1-6 .txtbird1-4 .txt爲2類的對象(空氣,鳥)和train_obj.cmd與實施例如何培養這個圖像組具有YOLO V2 - V4

        在圖像中標記對象的不同工具:

        1. 在C ++中:https://github.com/AlexeyAB/Yolo_mark
        2. 在Python中:https://github.com/tzutalin/labelImg
        3. 在Python中:https://github.com/Cartucho/OpenLabeling
        4. 在C ++中:https://www.ccoderun.ca/darkmark/
        5. 在JavaScript中:https://github.com/opencv/cvat

        使用Yolo9000

        同時檢測和分類9000個對象: darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights data/dog.jpg


        1. 要將Yolo編譯爲C ++ DLL文件yolo_cpp_dll.dll-打開解決方案build\darknet\yolo_cpp_dll.sln,設置x64Release,然後執行以下操作:Build-> Build yolo_cpp_dll

          • 您應該已經安裝了CUDA 10.0
          • 要使用cuDNN,請執行以下操作:(右鍵單擊項目)->屬性-> C / C ++->預處理程序->預處理程序定義,然後在行的開頭添加: CUDNN;
        2. 要將Yolo用作C ++控制檯應用程序中的DLL文件,請打開解決方案build\darknet\yolo_console_dll.sln,設置x64Release,然後執行以下操作:構建->構建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 OPENCVyolo_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
        }; 

關於pytorch,可加羣857449786 註明(pytorch)

Tensorflow 深度學習實戰羣 755860371 共同學習,謝謝

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章