暗網目標偵測框架與 YOLO
Darknet 是一個用 C、C++ 和 CUDA 寫的開源神經網路框架。
YOLO(You Only Look Once)是一個最先進的即時目標偵測系統,運行在 Darknet 框架中。
了解 Hank.ai 如何幫助 Darknet/YOLO 社區
宣布暗網 V3“爵士樂”
請參閱 Darknet/YOLO 網站
請仔細閱讀 Darknet/YOLO 常見問題解答
加入 Darknet/YOLO Discord 伺服器
文件
1.論文YOLOv7
2. 紙尺度-YOLOv4
3.論文YOLOv4
4.論文YOLOv3
一般資訊
Darknet/YOLO 框架仍然比其他框架和 YOLO 版本更快、更準確。
該框架是完全免費且開源的。您可以將 Darknet/YOLO 整合到現有的項目和產品中 - 包括商業項目和產品 - 無需許可證或支付費用。
2024 年10 月發布的Darknet V3(“Jazz”)在使用NVIDIA RTX 3090 GPU 時可以以高達1000 FPS 的速度準確運行樂高數據集視頻,這意味著每個視頻幀都可以由Darknet/YOLO 在1 毫秒或1 毫秒內讀取、調整大小和處理。
如果您需要協助或想討論 Darknet/YOLO,請加入 Darknet/YOLO Discord 伺服器:https://discord.gg/zSq8rtW
Darknet/YOLO 的 CPU 版本可在簡單的裝置上運行,例如 Raspberry Pi、雲端和 Colab 伺服器、桌上型電腦、筆記型電腦和高階訓練設備。 Darknet/YOLO 的 GPU 版本需要 NVIDIA 提供的支援 CUDA 的 GPU。
眾所周知,Darknet/YOLO 可在 Linux、Windows 和 Mac 上運作。請參閱下面的建置說明。
暗網版本
Joseph Redmon 在 2013-2017 年所寫的原始暗網工具沒有版本號。我們認為這個版本是 0.x。
Alexey Bochkovskiy 在 2017 年至 2021 年間維護的下一個流行的暗網儲存庫也沒有版本號。我們認為這個版本是 1.x。
從 2023 年開始,由 Hank.ai 贊助並由 Stéphane Charette 維護的 Darknet 儲存庫是第一個帶有版本命令的儲存庫。從 2023 年到 2024 年底,它返回了版本 2.x「OAK」。
目標是在熟悉程式碼庫的同時嘗試盡可能少地破壞現有功能。
此版本的主要變更包括:
1. 重寫了建置步驟,以在 Windows 和 Linux 上使用 CMake 提供 1 種統一的建置方式。
2. 轉換程式碼庫以使用 C++ 編譯器。
3. 訓練時增強chart.png。
4. 錯誤修復和與效能相關的最佳化,主要與減少訓練網路所需的時間有關。
該程式碼庫的最後一個分支是 v2 分支中的版本 2.1。
下一階段的開發於 2024 年中期開始,並於 2024 年 10 月發布。
如果您需要執行這些命令之一,您始終可以簽出先前的 v2 分支。請告訴我們,以便我們研究添加回所有丟失的命令。
此版本的主要變更包括:
1.刪除了許多舊的和未維護的命令。
2. 在訓練和推理過程中進行許多效能最佳化。
3. 修改了舊版C API;使用原始 Darknet API 的應用程式需要少量修改:https://darknetcv.ai/api/api.html
4. 新的 Darknet V3 C 和 C++ API:https://darknetcv.ai/api/api.html
5. src-examples 中的新應用程式和範例程式碼:https://darknetcv.ai/api/files.html
MSCOCO 預訓練權重
為了方便起見,YOLO 的幾個流行版本在 MSCOCO 資料集上進行了預訓練。該資料集有 80 個類,可以在文字檔案 cfg/coco.names 中看到。
還有其他幾個更簡單的資料集和預訓練權重可用於測試 Darknet/YOLO,例如 LEGO Gears 和 Rolodex。有關詳細信息,請參閱 Darknet/YOLO 常見問題解答。
MSCOCO 預訓練權重可以從幾個不同的位置下載,也可以從此儲存庫下載:
1.YOLOv2,2016 年 11 月
- YOLOv2-微小
- YOLOv2-full
2.YOLOv3,2018 年 5 月
- YOLOv3-微小
- YOLOv3-full
3.YOLOv4,2020 年 5 月
- YOLOv4-小
- YOLOv4-full
4.YOLOv7,2022 年 8 月
- YOLOv7-小
- YOLOv7-full
MSCOCO 預訓練權重僅用於演示目的。 MSCOCO 對應的 .cfg 和 .names 檔案位於 cfg 目錄中。命令範例:
`bash
wget --no-clobber https://github.com/hank-ai/darknet/releases/download/v2.0/yolov4-tiny.weights
darknet02displayannotatedimages coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
darknet03display_videos coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
`
請注意,人們應該訓練自己的網路。 MSCOCO 通常用於確認一切正常運作。
大樓
過去(2023 年之前)可用的各種建置方法已合併為一個統一的解決方案。 Darknet 需要 C++17 或更高版本、OpenCV,並使用 CMake 產生必要的專案檔案。
您不需要了解 C++ 來建造、安裝或運行 Darknet/YOLO,就像您不需要成為機械師來駕駛汽車一樣。
如果您遵循具有更複雜建置步驟的舊教學課程,或建置步驟與本自述文件中的內容不匹配,請注意。如下所述的新建步驟於 2023 年 8 月開始。
我們鼓勵軟體開發人員造訪 https://darknetcv.ai/ 以取得有關 Darknet/YOLO 物件偵測框架內部的資訊。
Google合作實驗室
Google Colab 指令與 Linux 指令相同。有多個 Jupyter 筆記本可以展示如何執行某些任務,例如訓練新網路。
請參閱 colab 子目錄中的筆記本,和/或按照下面的 Linux 說明進行操作。
Linux CMake方法
1.安裝必要的套件:
`bash
sudo apt-get install build-essential git libopencv-dev cmake
`
2.克隆暗網儲存庫:
`bash
mkdir ~/srccd ~/src
git 克隆 https://github.com/hank-ai/darknetcd darknet
`
3. 建立建置目錄並執行 CMake:
`bash
mkdir buildcd build
cmake -DCMAKEBUILDTYPE=發布 ..
`
4. 建構暗網:
`bash
使-j4
`
5.打包安裝Darknet:
`bash
包裹
sudo dpkg -i darknet-VERSION.deb
`
6. 驗證安裝:
`bash
暗網版本
`
Windows CMake方法
1.安裝必要的套件:
`bash
winget安裝Git.Git winget安裝Kitware.CMake winget安裝nsis.nsis winget安裝Microsoft.VisualStudio.2022.Community
`
2.修改Visual Studio安裝:
- 按一下「Windows 開始」功能表並執行「Visual Studio 安裝程式」。
- 按一下「修改」。
- 選擇使用 C++ 進行桌面開發。
- 點擊右下角的“修改”,然後按一下“是”。
3. 開啟 VS 2022 的開發人員命令提示字元:
- 按一下「Windows 開始」功能表並選擇 VS 2022 的開發人員命令提示字元。
4.安裝微軟VCPKG:
`bash
cd c:mkdir c:srccd c:src git clone https://github.com/microsoft/vcpkgcd vcpkg
bootstrap-vcpkg.bat
.vcpkg.exe 集成
安裝.vcpkg.exe 整合 powershell.vcpkg.exe 安裝 opencv[contrib,dnn,freetype,jpeg,openmp,png,webp,world]:x64-windows
`
5.克隆暗網儲存庫:
`bash
cd c:src
git 克隆 https://github.com/hank-ai/darknet.gitcd darknet
`
6. 建立建置目錄並執行 CMake:
`bash
mkdir buildcd build
cmake -DCMAKEBUILDTYPE=發布-DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
`
7. 建構暗網:
`bash
msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedSummary darknet.sln
`
8.產生NSIS安裝包:
`bash
msbuild.exe /property:平台=x64;設定=發布 PACKAGE.vcxproj
`
9. 執行 NSIS 安裝精靈:
- 在建置目錄中開啟檔案 darknet-VERSION.exe。例如:darknet-2.0.31-win64.exe。
10. 驗證安裝:
`bash
C:Program FilesDarknetbindarknet.exe 版本
`
使用暗網
命令列介面
以下不是 Darknet 支援的所有命令的完整列表。
除了 Darknet CLI 之外,請注意 DarkHelp 專案 CLI,它提供了 Darknet/YOLO 的替代 CLI。 DarkHelp CLI 還具有一些在 Darknet 中無法直接使用的進階功能。您可以同時使用 Darknet CLI 和 DarkHelp CLI,它們並不互相排斥。
對於下面顯示的大多數命令,您需要 .weights 檔案以及相應的 .names 和 .cfg 檔案。您可以訓練自己的網路(強烈建議!),也可以下載某人已經訓練過並在網路上免費提供的神經網路。預訓練資料集的範例包括:
1. LEGO Gears(在影像中尋找物件)
2. Rolodex(在圖像中尋找文字)
3.MSCOCO(標準80級物體偵測)
要運行的命令包括:
1. 列出一些可能會運行的命令和選項:
`bash
暗網幫助
`
2、檢查版本:
`bash
暗網版本
`
3. 使用影像進行預測:
- V2:
`bash
暗網探測器測試 cars.data cars.cfg cars_best.weights image1.jpg
`
- V3:
`bash
darknet02displayannotatedimages cars.cfg image1.jpg
`
- 黑暗幫助:
`bash
DarkHelp cars.cfg cars.cfg cars_best.weights image1.jpg
`
4、輸出座標:
- V2:
`bash
暗網探測器測試animals.dataanimals.cfganimalsbest.weights-extoutputdog.jpg
`
- V3:
`bash
darknet01inference_images 動物 狗.jpg
`
- 黑暗幫助:
`bash
DarkHelp --json Animals.cfg Animals.names Animals_best.weights Dog.jpg
`
5. 處理影片:
- V2:
`bash
暗網探測器示範 Animals.data Animals.cfg Animalbest.weights -extoutput test.mp4
`
- V3:
`bash
darknet03display_videos Animals.cfg test.mp4
`
- 黑暗幫助:
`bash
DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4
`
6. 從網路攝影機讀取資料:
- V2:
`bash
暗網探測器示範 Animals.data Animals.cfg Animals_best.weights -c 0
`
- V3:
`bash
darknet08display_網路攝影機動物
`
7. 將結果儲存到影片中:
- V2:
`bash
暗網探測器示範 Animals.data Animals.cfg Animalbest.weights test.mp4 -outfilename res.avi
`
- V3:
`bash
darknet05processvideos多線程animals.cfganimals.namesanimals_best.weightstest.mp4
`
- 黑暗幫助:
`bash
DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4
`
8.JSON:
- V2:
`bash
暗網探測器示範 Animals.data Animals.cfg Animalbest.weights test50.mp4 -jsonport 8070 -mjpegport 8090 -extoutput
`
- V3:
`bash
darknet06imagestojson 動物 image1.jpg
`
- 黑暗幫助:
`bash
DarkHelp --json Animals.names Animals.cfg Animals_best.weights image1.jpg
`
9. 在特定GPU上運作:
`bash
暗網探測器示範 Animals.data Animals.cfg Animals_best.weights -i 1 test.mp4
`
10. 檢查神經網路的準確性:
`bash
暗網探測器地圖 Driving.data Driving.cfg moving_best.weights ...
`
輸出:
`
ID 名稱 AvgPrecision TP FN FP TN 準確率 錯誤率 精確率 召回率 特異度 FalsePosRate
------ ------------ ------ ------ ------ ------ -------- --------- --------- ------ ----------- ------------
0 輛 91.2495 32648 3903 5826 65129 0.9095 0.0905 0.8486 0.8932 0.9179 0.0821
1 摩托車 80.4499 2936 513 569 5393 0.8850 0.1150 0.8377 0.8513 0.9046 0.0954
2 自行車 89.0912 570 124 104 3548 0.9475 0.0525 0.8457 0.8213 0.9715 0.0285
3人 76.7937 7072 1727 2574 27523 0.8894 0.1106 0.7332 0.8037 0.9145 0.0855
4多輛車 64.3089 1068 509 733 11288 0.9087 0.0913 0.5930 0.6772 0.9390 0.0610
5 綠光 86.8118 1969 239 510 4116 0.8904 0.1096 0.7943 0.8918 0.8898 0.1102
6 黃光 82.0390 126 38 30 1239 0.9525 0.0475 0.8077 0.7683 0.9764 0.0236
7 紅光 94.1033 3449 217 451 4643 0.9237 0.0763 0.8844 0.9408 0.9115 0.0885
`
11. 檢查精度 mAP@IoU=75:
`bash
暗網探測器地圖animals.dataanimals.cfganimalsbest.weights-iothresh 0.75
`
12. 重新計算錨點:
- 最好在 DarkMark 中完成。
- 在暗網中,使用:
`bash
暗網探測器 calcanchors Animals.data -numof_clusters 6 -寬度 320 -高度 256
`
13. 訓練新網路:
`bash
cd ~/nn/動物/
暗網探測器-map-dont_show火車animals.dataanimals.cfg
`
訓練
暗網/YOLO 常見問題相關部分的快速連結:
1. 我應該如何設定我的文件和目錄?
2. 我應該使用哪個設定檔?
3. 訓練自己的網路時應該使用什麼指令?
最簡單的註解和訓練方法是使用 DarkMark 建立所有必要的 Darknet 檔案。這絕對是訓練新神經網路的推薦方法。
如果您想手動設定各種文件來訓練自訂網路:
1. 為您的專案建立一個新資料夾:
- 對於本例,將建立一個神經網路來偵測動物,因此建立以下目錄:~/nn/animals/。
2.複製Darknet設定檔作為範本:
- 例如,將cfg/yolov4-tiny.cfg複製到專案資料夾中。您現在將擁有 ~/nn/animals/animals.cfg。
3. 建立animals.names文字檔:
- 該文件將包含您要檢測的類別的列表,每行一個。例如:
`
狗
貓
鳥
馬
`
4. 建立animals.data文字檔:
- 此檔案指定訓練和驗證資料的路徑,以及名稱和備份目錄。例如:
`
班級=4
train=/home/使用者名稱/nn/animals/animals_train.txt
valid=/home/使用者名稱/nn/animals/animals_valid.txt
名稱=/home/使用者名稱/nn/animals/animals.names
備份=/home/用戶名/nn/animals
`
5. 為圖像和註釋建立一個資料夾:
- 例如,這可能是 ~/nn/animals/dataset。每個圖像都需要一個相應的 .txt 檔案來描述該圖像的註釋。 .txt 註解文件的格式非常具體。您無法手動建立這些文件,因為每個註釋都需要包含註釋的精確座標。請參閱 DarkMark 或其他類似軟體來註釋您的影像。 YOLO 註釋格式在 Darknet/YOLO FAQ 中有描述。
6. 建立「train」和「valid」文字檔:
- 這兩個文字檔案需要單獨列出 Darknet 在計算 mAP% 時必須用於訓練和驗證的所有圖像。每行只有一張圖像。路徑和檔案名稱可以是相對的或絕對的。
7. 修改您的.cfg 檔案:
- 批次:設定為 64。
- 細分:從 1 開始。
- maxbatches:一個好的起始值為 2000 numberof_classes。對於本例,我們有 4 隻動物,因此 4 2000 = 8000。
- 步驟:設定為最大批次的 80% 和 90%。對於此範例,我們將使用steps=6400,7200,因為 maxbatches 設定為 8000。
- 寬度和高度:這些是網路尺寸。 Darknet/YOLO 常見問題解答說明如何計算最佳使用大小。
- 類別:使用 .names 檔案中的類別數修改此行。對於本例,我們將使用classes=4。
- 過濾器:在每個[yolo]部分之前的[卷積]部分中,將filters=...修改為值(numberofclasses + 5) * 3。
8. 開始訓練:
`bash
cd ~/nn/動物/
暗網探測器-map-dont_show火車animals.dataanimals.cfg
`
要有耐心。最佳權重將儲存為animals_best.weights。透過查看chart.png檔案可以觀察訓練進度。請參閱 Darknet/YOLO 常見問題解答,以了解訓練新網路時可能需要使用的其他參數。
如果您想在訓練過程中查看更多詳細信息,請添加 --verbose 參數。例如:
`bash
暗網探測器-map-dont_show--verbose火車animals.dataanimals.cfg
`
其他工具和鏈接
1. DarkMark:管理您的 Darknet/YOLO 專案、註釋圖像、驗證註釋並產生使用 Darknet 進行訓練所需的檔案。
2. DarkHelp:用於 Darknet 的強大替代 CLI,使用圖像平鋪,用於視訊中的物件跟踪,或用於可輕鬆在商業應用程式中使用的強大 C++ API。
3. Darknet/YOLO FAQ:幫助解答您的問題。
4. Stéphane 的 YouTube 頻道:提供教學和範例影片。
5. Darknet/YOLO 不和諧伺服器:與其他 Darknet/YOLO 使用者聊天並尋求支援。
路線圖
最後更新於 2024 年 10 月 30 日:
完全的
1. 將訓練期間使用的 qsort() 替換為 std::sort()。
2. 擺脫 check_mistakes、getchar() 和 system()。
3. 將 Darknet 轉換為使用 C++ 編譯器。
4.修復Windows建置。
5.修復Python支援。
6. 建置暗網庫。
7. 重新啟用預測標籤(「字母」代碼)。
8. 重新啟用 CUDA/GPU 代碼。
9. 重新啟用 CUDNN。
10. 重新啟用 CUDNN 一半。
11.不要對CUDA架構進行硬編碼。
12.更好的CUDA版本資訊。
13. 重新啟用 AVX。
14. 刪除舊的解決方案和 Makefile。
15. 使 OpenCV 成為非可選。
16. 刪除對舊 pthread 函式庫的依賴。
17. 卸下機上盒。
18. 重寫 CMakeLists.txt 以使用新的 CUDA 偵測。
19. 刪除舊的「字母」代碼,並刪除資料/標籤中的 700 多個圖像。
20. 外源建構。
21.有更好的版本號輸出。
22. 與培訓相關的性能優化(正在進行的任務)。
23. 與推理相關的效能最佳化(正在進行的任務)。
24. 盡可能透過引用傳遞。
25. 清理.hpp 檔案。
26.重寫darknet.h。
27. 不要將 cv::Mat 轉換為 void*,而是將其用作正確的 C++ 物件。
28. 修復或保持內部影像結構的使用方式一致。
29. 修復基於 ARM 的 Jetson 裝置的建置。
30. 新的 Jetson Orin 設備正在運作。
31.修復V3中的Python API。
短期目標
1. 將 printf() 替換為 std::cout。
2. 查看舊版 zed 相機支援。
3.更好、更一致的命令列解析。
中期目標
1. 刪除所有 char* 程式碼並取代為 std::string。
2.不要隱藏警告並清理編譯器警告。
3. 更好地使用cv::Mat代替C中的自訂影像結構。
4. 用 std::vector 或 std::list 取代舊的清單功能。
5. 修復對 1 通道灰階影像的支援。
6. 增加對 N 通道影像的支持,其中 N > 3。
7. 持續的程式碼清理。
長期目標
1. 修正所有 GPU 的 CUDA/CUDNN 問題。
2. 重寫CUDA+cuDNN程式碼。
3. 研究增加對非 NVIDIA GPU 的支援。
4. 旋轉邊界框,或某種「角度」支持。
5. 關鍵點/骨架。
6. 熱圖。
7. 細分。