暗網目標偵測框架與 YOLO
Darknet 是一個用 C、C++ 和 CUDA 寫的開源神經網路框架。
YOLO(You Only Look Once)是一種在 Darknet 框架內運作的最先進的即時物件偵測系統。
了解 Hank.ai 如何為 Darknet/YOLO 社群提供支援!
宣布暗網 V3“爵士樂”
造訪暗網/YOLO 網站
探索暗網/YOLO 常見問題解答
加入 Darknet/YOLO Discord 伺服器
文件
1.論文YOLOv7:論文鏈接
2. Paper Scaled-YOLOv4:論文鏈接
3.論文YOLOv4:論文鏈接
4.論文YOLOv3:論文鏈接
一般資訊
Darknet/YOLO 框架在速度和準確性方面始終優於其他框架和 YOLO 版本。
該框架是完全免費且開源的。您可以將 Darknet/YOLO 無縫整合到您現有的專案和產品中,包括商業專案和產品,而無需任何授權費用。
Darknet V3(「Jazz」)於 2024 年 10 月發布,實現了卓越的效能,在 NVIDIA RTX 3090 GPU 上以高達 1000 FPS 的速度運行樂高資料集影片。這意味著 Darknet/YOLO 在不到 1 毫秒的時間內處理每個視訊幀,包括調整大小和處理。
加入 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。
由 Hank.ai 贊助並由 Stéphane Charette 維護的 Darknet 儲存庫從 2023 年開始首次引入版本命令。從 2023 年到 2024 年底,它返回了版本 2.x「OAK」。
開發團隊專注於最大限度地減少對現有功能的干擾,同時熟悉程式碼庫。
在此期間實施的主要變更包括:
1. 統一建置流程:重寫建置步驟,以簡化 Windows 和 Linux 上使用 CMake 的流程。
2. C++ 轉換:程式碼庫已轉換為使用 C++ 編譯器。
3. 圖表增強:在訓練過程中,chart.png 視覺化得到增強。
4. 錯誤修復和最佳化:實施了許多錯誤修復和與效能相關的最佳化,主要集中在減少訓練時間。
該程式碼庫的最後一個分支是版本 2.1,位於 v2 分支中。
下一個開發階段於 2024 年中期開始,並最終於 2024 年 10 月發布了版本 3.x“JAZZ”。
如果您需要執行該版本的特定命令,您可以隨時還原到先前的 v2 分支。如果您遇到任何丟失的命令,請告知開發團隊,他們將調查將其添加回來。
版本 3.x“JAZZ”中引入的重大變更:
1.命令刪除:刪除了許多過時且不受支援的命令。
2. 效能最佳化:對訓練和推理進行了大量效能最佳化。
3. API 修改:舊版 C API 進行了修改。使用原始 Darknet API 的應用程式可能需要進行細微調整。 https://darknetcv.ai/api/api.html
4.新的C/C++ API: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 文字檔案中。
除了 MSCOCO 之外,還可以使用各種更簡單的資料集和預訓練權重來測試 Darknet/YOLO,例如 LEGO Gears 和 Rolodex。有關更多詳細信息,請參閱 Darknet/YOLO 常見問題解答。
MSCOCO 預訓練權重可從各種來源下載,包括此儲存庫:
YOLOv2(2016 年 11 月)
yolov2-tiny.weights
yolov2-full.weights
YOLOv3(2018 年 5 月)
yolov3-tiny.weights
yolov3-full.權重
YOLOv4(2020 年 5 月)
yolov4-tiny.weights
yolov4-full.weights
YOLOv7(2022 年 8 月)
yolov7-tiny.weights
yolov7-full.權重
MSCOCO 預訓練權重僅用於演示目的。 MSCOCO 對應的 .cfg 和 .names 檔案位於 cfg 目錄中。
以下是一些範例命令:
`bash
wget --no-clobber https://github.com/hank-ai/darknet/releases/download/v2.0/yolov4-tiny.weights darknet02displayannotatedatedimages 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 產生所需的專案檔。
建置 Darknet/YOLO 不需要 C++ 知識。這類似於無需成為機械師即可駕駛汽車。
Google合作實驗室
Google Colab 說明反映了 Linux 的說明。多個 Jupyter 筆記本可用於示範特定任務,例如訓練新網路。
瀏覽 colab 子目錄中的筆記本或按照下面的 Linux 說明進行操作。
Linux CMake方法
Linux 暗網建置教學課程
1. 先修條件:確保您已安裝以下軟體包:
`bash
sudo apt-get install build-essential git libopencv-dev cmake
`
2.克隆Darknet:克隆Darknet儲存庫:
`bash
mkdir ~/srccd ~/src
git 克隆 https://github.com/hank-ai/darknet
CD暗網
`
3.建立建置目錄:建立建置目錄:
`bash
mkdir 構建
光碟建構
`
4. 使用 CMake 配置:執行 CMake 來配置建置:
`bash
cmake -DCMAKEBUILDTYPE=發布 ..
`
5. 建置:建置專案:
`bash
使-j4
`
6. 打包:建立Debian套件:
`bash
製作包包
`
7.安裝:安裝包:
`bash
sudo dpkg -i darknet-VERSION.deb
`
可選:用於 GPU 加速的 CUDA/cuDNN
1. 安裝 CUDA:如果您有現代 NVIDIA GPU,則可以安裝 CUDA 進行 GPU 加速。從 https://developer.nvidia.com/cuda-downloads 下載並安裝 CUDA。
2. 安裝 cuDNN:從 https://developer.nvidia.com/rdp/cudnn-download 或 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#cudnn- 下載並安裝 cuDNN套件管理器安裝概述。
3. 驗證 CUDA 安裝:確保安裝 CUDA 後可以執行 nvcc 和 nvidia-smi。您可能需要調整 PATH 變數。
4. CMake 設定(如果在 CMake 之後安裝了 CUDA):如果在設定 CMake 後安裝了 CUDA 或 CUDA+cuDNN,則需要刪除 Darknet 建置目錄中的 CMakeCache.txt 文件,以強制 CMake 重新尋找必要的檔案。然後,重新運行 CMake 並重建 Darknet。
進階用戶
RPM 套件:要建置 RPM 安裝檔案而不是 DEB 文件,請修改 CM_package.cmake 中的以下行:
`cmake
# 設定(CPACK_GENERATOR“DEB”)
設定(CPACK_GENERATOR“RPM”)
`
Centos 和 OpenSUSE 等發行版:對於 Centos 和 OpenSUSE 等發行版,請將 CM_package.cmake 中的行更改為:
`cmake
# 設定(CPACK_GENERATOR“DEB”)
設定(CPACK_GENERATOR“RPM”)
`
安裝套件:要在建置後安裝套件,請使用您的發行版的套件管理器。例如,在基於 Debian 的系統(如 Ubuntu)上,使用 sudo dpkg -i darknet-2.0.1-Linux.deb。
安裝的關鍵檔案:
/usr/bin/darknet:主要的 Darknet 執行檔。透過在 CLI 中執行 darknet 版本來確認安裝。
/usr/include/darknet.h: C、C++ 和 Python 開發人員的 Darknet API。
/usr/include/darknet_version.h:包含開發人員的版本資訊。
/usr/lib/libdarknet.so:C、C++ 和 Python 開發人員連結的函式庫。
/opt/darknet/cfg/...:儲存所有.cfg 範本。
Windows CMake方法
Windows 建置教學課程(假設全新安裝 Windows 11 22H2)
1.安裝先決條件:使用winget安裝必要的元件:
`bash
winget 安裝 Git.Git
winget 安裝 Kitware.CMake
winget安裝nsis.nsis
winget安裝Microsoft.VisualStudio.2022.社區
`
2. 安裝 Visual Studio C++ 支援:修改 Visual Studio 安裝以包含 C++ 支援:
* 開啟「Windows 開始」功能表並執行「Visual Studio 安裝程式」。
* 點選「修改」。
* 選擇“使用C++進行桌面開發”。
* 按一下右下角的“修改”,然後按一下“是”。
3. 開發人員命令提示字元:從「Windows 開始」功能表啟動「VS 2022 開發人員命令提示字元」。請勿使用 PowerShell 執行這些步驟!
4.安裝Microsoft VCPKG:安裝VCPKG建構OpenCV:
`bash
疾病管制署:
mkdir c:src
cd c:src
git 克隆 https://github.com/microsoft/vcpkg
cd vcpkg
bootstrap-vcpkg.bat
.vcpkg.exe整合安裝
.vcpkg.exe 整合 powershell
.vcpkg.exe 安裝 opencv[contrib,dnn,freetype,jpeg,openmp,png,webp,world]:x64-windows
`
* 請耐心等待,此步驟可能需要大量時間,因為它需要下載和建立大量元件。
5. 選用:用於 GPU 加速的 CUDA/cuDNN:遵循 Linux 部分中概述的相同步驟。
6. 克隆 Darknet:克隆 Darknet 儲存庫:
`bash
cd c:src
git 克隆 https://github.com/hank-ai/darknet.git
CD暗網
mkdir 構建
光碟建構
`
7. 使用 CMake 配置:使用 CMake 配置建置:
`bash
cmake -DCMAKEBUILDTYPE=發布-DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
`
8. 使用 msbuild 建置:使用 msbuild 建置專案:
`bash
msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedSummary darknet.sln
msbuild.exe /property:平台=x64;設定=發布 PACKAGE.vcxproj
`
故障排除:缺少 CUDA/cuDNN DLL
如果您遇到有關缺少 CUDA 或 cuDNN DLL(例如 cublas64_12.dll)的錯誤,請手動將 CUDA .dll 檔案複製到 darknet.exe 所在的輸出目錄中。例如:
`bash
複製“C:Program FilesNVIDIA GPU計算工具包CUDAv12.2bin * .dll”src-cliRelease
`
* 請記得根據您的 CUDA 版本調整命令。
複製 DLL 後重新執行 msbuild.exe 命令。
進階用戶
Visual Studio 解決方案:CMake 產生 Visual Studio 解決方案檔案 (Darknet.sln)。喜歡使用 Visual Studio GUI 的軟體開發人員可以在 Visual Studio 中載入 Darknet 項目,而不是使用命令列。
驗證和安裝
驗證:執行以下命令檢查Darknet是否正確建置:
`bash
C:srcDarknetbuildsrc-cliReleasedarknet.exe 版本
`
安裝:執行上一步驟產生的NSIS安裝精靈,正確安裝Darknet、函式庫、包含檔案和必要的DLL。在建置目錄中找到 darknet-VERSION.exe 檔案。例如:darknet-2.0.31-win64.exe。
安裝的關鍵檔案:
C:Program FilesDarknetbin/darknet.exe:Darknet CLI 應用程式。
C:Program FilesDarknet/bin:包含其他範例應用程式。
C:Program FilesDarknet:包含所需的第三方 .dll 檔案 (OpenCV)、Darknet .dll、.lib 和 .h 檔案以及範本 .cfg 檔案。
使用暗網
命令列介面
以下列表並未詳盡列出 Darknet 支援的所有指令。
除了 Darknet CLI 之外,還可以考慮 DarkHelp 專案 CLI,它提供了替代 CLI,其中包含 Darknet 中不直接提供的一些高級功能。您可以同時使用這兩個 CLI。
基本先決條件:
對於大多數命令,您需要一個 .weights 檔案以及相應的 .names 和 .cfg 檔案。
訓練您自己的網路(強烈建議!)或從網路下載預先訓練的網路。
預訓練資料集範例:
LEGO Gears:影像中的物件偵測。
Rolodex:影像中的文字偵測。
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:
V2:
`bash
暗網探測器示範 Animals.data Animals.cfg Animals_best.weights -i 1 test.mp4
`
10. 準確度評估:
地圖:
`bash
暗網探測器地圖 Driving.data Driving.cfg moving_best.weights ...
`
映射@IoU=75:
`bash
暗網探測器地圖animals.dataanimals.cfganimalsbest.weights-iothresh 0.75
`
11. 錨點計算:
DarkMark:使用 DarkMark 重新計算錨點以獲得最佳效能。
暗網(舊方法):
`bash
暗網探測器 calcanchors Animals.data -numof_clusters 6 -寬度 320 -高度 256
`
12. 訓練新網路:
DarkMark(推薦):使用DarkMark進行註解和訓練。
手動設定:
1. 建立目錄:為您的專案建立一個資料夾(例如~/nn/animals/)。
2.設定檔:複製Darknet設定檔作為範本(例如cfg/yolov4-tiny.cfg)。
3. .names 文件:建立一個 .names 文字文件,列出您的類別(例如 ~/nn/animals/animals.names)。
4. .data 檔案:在與設定檔相同的資料夾中建立.data 文字檔案(例如~/nn/animals/animals.data)。
5. 資料集資料夾:為圖像和註解建立一個資料夾(例如~/nn/animals/dataset)。
6. .txt註解:為每個影像產生.txt文件,包含註解座標。使用 DarkMark 或其他註釋工具。
7. train/valid 檔案:建立列出訓練和驗證影像的animalstrain.txt 和animalsvalid.txt 檔案。
8. 修改.cfg 檔案:根據您的資料集調整設定檔。
* 設定批次=64。
* 根據您的 GPU 記憶體調整細分。
將 max_batches 設定為 2000 個類別。
* 將步長設定為 max_batches 的 80% 和 90%。
* 依網路尺寸調整寬度和高度。
* 將classes=... 設定為.names 檔案中的類別數。
將每個[yolo]部分之前的[卷積]部分中的filters=...調整為(numberofclasses + 5) 3。
9. 培訓:開始培訓:
`bash
cd ~/nn/動物/
暗網探測器-map-dont_show火車animals.dataanimals.cfg
`
* 最佳權重將儲存為animals_best.weights。
* 查看chart.png檔案以監控訓練進度。
其他工具和鏈接
關鍵資源:
DarkMark:用於管理 Darknet/YOLO 專案、註釋影像、驗證註釋以及產生訓練檔案。
DarkHelp:Darknet 的強大替代 CLI,具有影像平鋪、影片中的物件追蹤等功能,以及適合商業應用程式的強大 C++ API。
Darknet/YOLO 常見問題:尋找常見問題的答案和解決方案。
Stéphane 的 YouTube 頻道:探索教學和範例影片。
Darknet/YOLO Discord 伺服器:與其他 Darknet/YOLO 使用者聯繫以獲得支援和討論。
路線圖
最後更新於 2024 年 10 月 30 日:
已完成的任務:
1. 在相關訓練部分將 qsort() 替換為 std::sort()。
2. 刪除了 check_mistakes、getchar() 和 system()。
3. 將 Darknet 轉換為使用 C++ 編譯器(Linux 上為 g++,Windows 上為 VisualStudio)。
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.刪除了舊的“字母”代碼並刪除了資料/標籤中的圖像。
20.啟用外源建置。
21.增強版本號輸出。
22. 與培訓相關的性能優化(正在進行中)。
23. 與推理相關的性能最佳化(正在進行中)。
24. 在適用的情況下實施了引用傳遞。
25. 清理.hpp 檔案。
26.重寫darknet.h。
27. 消除了 cv::Mat 到 void* 的轉換,將其用作正確的 C++ 物件。
28. 提高了內部影像結構使用方式的一致性。
29. 修正了基於 ARM 的 Jetson 裝置的建置。
30.修復了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. 細分。