ダークネットオブジェクト検出フレームワークとYOLO
Darknet は、主に C および C++ で開発されたオープンソースのニューラル ネットワーク フレームワークで、CUDA アクセラレーションをサポートしています。
最先端のリアルタイム物体検出システムである YOLO (You Only Look Once) は、ダークネット フレームワーク内の著名な実装です。
Hank.ai がダークネット/YOLO コミュニティにどのように貢献しているかについて詳しくは、こちらをご覧ください。
Darknet V3「Jazz」の発表: https://darknetcv.ai/blog/payment-darknet-v3-jazz
ダークネット/YOLO ウェブサイト: https://darknetcv.ai/
ダークネット/YOLO FAQ: https://darknetcv.ai/faq/
ダークネット/YOLO Discordサーバー: https://discord.gg/zSq8rtW
論文
1.YOLOv7: https://arxiv.org/abs/2207.02696
2. Scaled-YOLOv4: https://arxiv.org/abs/2102.12725
3. YOLOv4: https://arxiv.org/abs/2004.10934
4. YOLOv3: https://pjreddie.com/media/files/papers/YOLOv3.pdf
一般情報
Darknet/YOLO フレームワークは、最速かつ最も正確なオブジェクト検出システムの 1 つとしての地位を維持しています。
ダークネット/YOLO の主な利点:
無料およびオープンソース: Darknet/YOLO は完全にオープンソースであり、商用プロジェクトを含む既存のプロジェクトに自由に統合できます。
高性能: 2024 年 10 月にリリースされた Darknet V3 (「Jazz」) は、NVIDIA RTX 3090 GPU を搭載した LEGO データセットで最大 1000 FPS を達成するという、驚くべきパフォーマンスを示しています。
汎用性: Darknet/YOLO の CPU バージョンは、Raspberry Pi、クラウド サーバー、デスクトップ、ラップトップ、強力なトレーニング リグなど、さまざまなプラットフォームに導入できます。 GPU バージョンには CUDA 対応の NVIDIA GPU が必要です。
クロスプラットフォーム互換性: Darknet/YOLO は、Linux、Windows、Mac 上でシームレスに動作することが知られています。
ダークネットのバージョニング
Darknet 0.x: これは、2013 年から 2017 年にかけて Joseph Redmon によって開発されたオリジナルの Darknet ツールを指します。正式なバージョン番号がありませんでした。
Darknet 1.x: このバージョンは、2017 年から 2021 年まで Alexey Bochkovskiy によって保守されていました。また、正式なバージョン番号がありませんでした。
Darknet 2.x "OAK": このバージョンは Hank.ai によって後援され、2023 年から Stéphane Charette によって保守されました。これは、バージョン コマンドを導入した最初のリリースでした。 2024 年後半までバージョン 2.x が返されました。
Darknet 3.x "JAZZ": 2024 年 10 月にリリースされたこのバージョンは、重要な開発段階を迎え、新しい C および C++ API、強化されたパフォーマンス、および多数のバグ修正が導入されました。
MSCOCO 事前トレーニング済み重み
さまざまな人気のある YOLO バージョンが MSCOCO データセットで事前トレーニングされています。このデータセットは 80 のクラスで構成されており、cfg/coco.names ファイルにあります。
ダウンロード可能な事前トレーニング済みの重み:
1. YOLOv2 (2016 年 11 月)
* YOLOv2-tiny
* YOLOv2-フル
2. YOLOv3 (2018 年 5 月)
* YOLOv3-tiny
* YOLOv3-フル
3. YOLOv4 (2020 年 5 月)
* YOLOv4-tiny
* YOLOv4-フル
4. YOLOv7 (2022 年 8 月)
* YOLOv7-tiny
* YOLOv7-フル
使用例:
`
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 の事前トレーニングされた重みは、主にデモンストレーションの目的で提供されています。カスタム ネットワークをトレーニングすることを強くお勧めします。通常、MSCOCO はシステム機能を検証するために使用されます。
ダークネットの構築
Darknet は C++17 以降の OpenCV に依存し、CMake を利用してプロジェクト ファイルを生成します。
構築プロセス:
1. Google Colab: Google Colab の手順は Linux の手順と同じです。特定のタスクを紹介する Jupyter ノートブックについては、colab サブディレクトリを参照してください。
2. Linux CMake メソッド:
* 前提条件:
* ビルドに必須のツール: sudo apt-get install build-essential
* Git: sudo apt-get install git
* OpenCV: sudo apt-get install libopencv-dev
* CMake: sudo apt-get install cmake
* インストール:
* 作業ディレクトリを作成します: mkdir ~/srccd ~/src
* リポジトリのクローンを作成します: git clone https://github.com/hank-ai/darknet
* Darknet ディレクトリに移動します: cd darknet
* ビルドディレクトリを作成します: mkdir build
* ダークネットの構築:
* CD ビルド
* cmake -DCMAKEBUILDTYPE=リリース ..
* -j4 を作成します
* パッケージ
* パッケージをインストールします: sudo dpkg -i darknet-VERSION.deb
* オプション: CUDA/cuDNN のインストール
* https://developer.nvidia.com/cuda-downloads から CUDA をダウンロードしてインストールします。
* https://developer.nvidia.com/rdp/cudnn-download または https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#cudnn-package-manager- から cuDNN をダウンロードしてインストールします。インストールの概要
* nvcc および nvidia-smi を実行できることを確認してください。 PATH 変数の変更が必要になる場合があります。
* 後で CUDA または cuDNN をインストールする場合、または新しいバージョンにアップグレードする場合は、環境を変更した後に必ず Darknet を再構築してください。
3. Windows CMake メソッド:
* 前提条件:
* Git: winget インストール Git.Git
* CMake: WINGET インストール Kitware.CMake
* NSIS: winget インストール nsis.nsis
* Visual Studio 2022 Community Edition: winget インストール Microsoft.VisualStudio.2022.Community
* Visual Studio のインストールを変更して C++ サポートを含めます。
* Visual Studio インストーラーを開く
※「変更」をクリックします
* 「C++ によるデスクトップ開発」を選択します。
※「変更」をクリックし、「はい」をクリックします。
* インストール:
* VS 2022 の開発者コマンド プロンプトを開きます (PowerShell ではありません)。
* Microsoft VCPKG をインストールします。
* CDC:
* mkdir c:srccd c:src
* git clone 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 をインストール
* ダークネットのクローンを作成して以下を構築します。
* cd c:src
* git clone https://github.com/hank-ai/darknet.git
* CDダークネット
* mkdir ビルド
* CD ビルド
* cmake -DCMAKEBUILDTYPE=リリース -DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
* msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedsummary darknet.sln
* msbuild.exe /property:Platform=x64;Configuration=Release PACKAGE.vcxproj
* オプション: CUDA/cuDNN のインストール
* https://developer.nvidia.com/cuda-downloads から CUDA をダウンロードしてインストールします。
* https://developer.nvidia.com/rdp/cudnn-download または https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#download-windows から cuDNN をダウンロードしてインストールします。
* cuDNN を解凍し、bin、include、lib ディレクトリを C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/[バージョン] にコピーします (必要に応じて既存のファイルを上書きします)。
* nvcc.exe を実行できることを確認してください。 PATH 変数の変更が必要になる場合があります。
ダークネットの使用
CLI (コマンドラインインターフェース)
一般的な使用法: Darknet は、その機能を操作するためのコマンドライン インターフェイス (CLI) を提供します。すべてを網羅しているわけではありません。追加機能については、DarkHelp プロジェクト CLI を参照してください。
事前トレーニングされたモデル: ほとんどのコマンドでは、.weights ファイルと、対応する .names および .cfg ファイルが必要です。独自のネットワークをトレーニングするか (強く推奨)、オンラインで入手可能な事前トレーニングされたモデルを利用することができます。例としては次のものが挙げられます。
* LEGO Gears (画像内の物体検出)
* Rolodex (画像内のテキスト検出)
* MSCOCO (標準 80 クラスの物体検出)
一般的なコマンド:
ヘルプ: ダークネットのヘルプ
バージョン: ダークネットバージョン
画像による予測:
* V2: ダークネット ディテクタ テストcars.datacars.cfgcars_best.weights image1.jpg
* V3: darknet02displayannotatedimagescars.cfg image1.jpg
* DarkHelp: DarkHelp 車.cfg 車_ベスト.ウェイト 画像 1.jpg
出力座標:
* V2: ダークネット検出器テスト Animals.data Animals.cfg Animalsbest.weights -extoutput Dog.jpg
* V3: darknet01inference_images 動物 犬.jpg
* DarkHelp: DarkHelp --json Animals.cfg Animals.names Animals_best.weights Dog.jpg
ビデオ処理:
* V2:
* ダークネット検出器のデモ Animals.data Animals.cfg Animalsbest.weights -extoutput test.mp4 (ビデオ予測)
* ダークネット検出器のデモ Animals.data Animals.cfg Animals_best.weights -c 0 (ウェブカメラ入力)
* ダークネット検出器のデモ Animals.data Animals.cfg Animalbest.weights test.mp4 -outfilename res.avi (結果をビデオに保存)
* V3:
* darknet03display_videos Animals.cfg test.mp4 (ビデオ予測)
* darknet08display_webcam 動物 (ウェブカメラ入力)
* darknet05processvideosmultithreaded Animals.cfg Animals.names Animals_best.weights test.mp4 (結果をビデオに保存)
* ダークヘルプ:
* DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4 (ビデオ予測)
* DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4 (結果をビデオに保存)
JSON 出力:
* V2: ダークネット検出器デモ Animals.data Animals.cfg Animalsbest.weights test50.mp4 -jsonport 8070 -mjpegport 8090 -extoutput
* V3: darknet06imagestojson 動物 image1.jpg
* DarkHelp: DarkHelp --json Animals.names Animals.cfg Animals_best.weights image1.jpg
GPU の選択: ダークネット検出器のデモ Animals.data Animals.cfg Animals_best.weights -i 1 test.mp4
精度評価:
* ダークネット検出器マップ Driving.data Driving.cfg Driving_best.weights ... (mAP@IoU=50)
* ダークネット検出器マップ Animals.data Animals.cfg Animalsbest.weights -iouthresh 0.75 (mAP@IoU=75)
アンカー計算: (最適なアンカーの再計算には DarkMark を使用します)
* ダークネット検出器は、animals.data -numof_clusters 6 -width 320 -height 256 を計算します。
ネットワークトレーニング:
* ダークネット検出器 -map -dont_show train Animals.data Animals.cfg
新しいネットワークのトレーニング
DarkMark: アノテーションとトレーニングに推奨されるアプローチは、必要な Darknet ファイルを生成するプロセスを自動化する DarkMark を利用することです。
手動セットアップ:
1. 動物を検出するためのネットワークをトレーニングするためのプロジェクト ディレクトリを作成します。たとえば、~/nn/animals/ です。
2. 構成ファイルをコピーします。 cfg/ からテンプレート構成ファイル (cfg/yolov4-tiny.cfg など) を選択し、プロジェクト ディレクトリに配置します。
3. .names ファイルを作成します。同じディレクトリに、animals.names という名前のテキスト ファイルを作成します。検出するクラスを 1 行に 1 つずつ、空白行やコメントを含めずにリストします。例:
`
犬
猫
鳥
馬
`
4. .data ファイルを作成します。同じディレクトリに、animals.data という名前のテキスト ファイルを作成します。このファイルにはトレーニング データに関する情報が含まれています。例:
`
クラス=4
train=/home/ユーザー名/nn/animals/animals_train.txt
valid=/home/ユーザー名/nn/animals/animals_valid.txt
names=/ホーム/ユーザー名/nn/animals/animals.names
バックアップ=/ホーム/ユーザー名/nn/animals
`
5. データセット ディレクトリ: 画像と対応する注釈を保存するディレクトリを作成します (例: ~/nn/animals/dataset)。各画像には、注釈を記述した関連する .txt ファイルが必要です。これらの .txt ファイルは特定の形式に従う必要があり、DarkMark または同様のソフトウェアを使用して生成するのが最適です。
6. トレーニング ファイルと検証ファイル: .data ファイルで指定されているように、「トレーニング」テキスト ファイルと「有効」テキスト ファイルを作成します。これらのファイルには、それぞれトレーニングと検証に使用される画像がリストされています。
7. 構成ファイルを変更します。
* バッチ サイズ: バッチ = 64 に設定します。
* サブディビジョン: サブディビジョン=1 から開始します。 GPU のメモリ容量に基づいて、必要に応じて増やしてください。
最大バッチ数: maxbatches=2000 クラス数を使用します。この場合、maxbatches=8000 です。
* ステップ数: ステップ数を max_batches の 80% および 90% に設定します。例: ステップ = 6400,7200。
* 幅と高さ: ネットワークの寸法 (幅と高さ) を調整します。最適なサイズを決定するためのガイダンスについては、Darknet/YOLO FAQ を参照してください。
* クラス: .names ファイル内のクラスの数 (この場合は、classes=4) と一致するように、classes=... を更新します。
フィルター: 各 [yolo] セクションの前の [convolutional] セクションで filters=... を調整します。フィルター = (クラス数 + 5) を使用して計算します。 3. この場合、フィルター = 27。
8. トレーニングの開始: プロジェクト ディレクトリに移動し、次のコマンドを実行します。
`
ダークネット ディテクタ -map -dont_show train Animals.data Animals.cfg
`
* 詳細出力: より詳細なトレーニング情報については、--verbose を使用します。
* 進行状況: 最適な重みはanimals_best.weightsとして保存され、トレーニングの進行状況はchart.pngファイルを通じて監視できます。
その他のツールとリンク
DarkMark: Darknet/YOLO プロジェクト管理、画像注釈、注釈検証、トレーニング ファイル生成用。
DarkHelp: Darknet に代わる堅牢な CLI で、画像タイル表示、オブジェクト追跡、商用アプリケーション用の C++ API などの機能を備えています。
ダークネット/YOLO FAQ: https://darknetcv.ai/faq/
Stéphane Charette の YouTube チャンネル: チュートリアルとサンプルビデオを検索: https://www.youtube.com/channel/UCOQ-nJ8l6kG3153g09XwY8g
ダークネット/YOLO Discordサーバー: https://discord.gg/zSq8rtW
ロードマップ
最終更新日: 2024-10-30
完了:
1. トレーニング中に該当する場合は、qsort() を std::sort() に置き換えました (残りのいくつかのケース)。
2. check_missing、getchar()、および system() を削除しました。
3. C++ コンパイラ (Linux では g++、Windows では VisualStudio) を使用するように Darknet を変換しました。
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. STBを取り外しました。
18. 新しい CUDA 検出を使用するように CMakeLists.txt を書き直しました。
19. 古い「アルファベット」コードを削除し、データ/ラベル内の 700 以上の画像を削除しました。
20. アウトオブソース ビルドを実装しました。
21. バージョン番号の出力が強化されました。
22. トレーニングに関連するパフォーマンスの最適化 (継続中)。
23. 推論に関連するパフォーマンスの最適化 (進行中)。
24. 可能な場合は参照渡しを採用します。
25. .hpp ファイルをクリーンアップしました。
26. darknet.h を書き直しました。
27. void* にキャストする代わりに、適切な C++ オブジェクトとして cv::Mat を使用しました。
28. 内部イメージ構造の使用方法を修正または標準化しました。
29. ARM ベースの Jetson デバイスのビルドを修正しました (新しい Jetson Orin デバイスは動作します)。
30. V3 で Python API が改善されました。
短期的な目標:
1. printf() を std::cout (進行中) に置き換えます。
2. 古い ZED カメラのサポートを調査します。
3. コマンドライン解析を改善および標準化します (進行中)。
中期目標:
1. すべての char* コードを削除し、std::string に置き換えます。
2. コンパイラの警告を排除し、一貫した警告処理 (進行中) を保証します。
3. C のカスタム イメージ構造の代わりに cv::Mat をより効果的に利用します (進行中)。
4. 古いリスト機能を std::vector または std::list に置き換えます。
5. 1 チャンネルのグレースケール画像のサポートを修正しました。
6. N > 3 の N チャネル画像 (追加の深さまたは熱チャネルを持つ画像など) のサポートを追加します。
7. 進行中のコードのクリーンアップ (進行中)。
長期的な目標:
1. すべての GPU に関する CUDA/CUDNN の問題に対処します。
2. CUDA+cuDNN コードを書き直します。
3. 非 NVIDIA GPU のサポートの追加を検討します。
4. 回転された境界ボックスまたは「角度」属性のサポートを実装します。
5. キーポイント/スケルトンのサポートを追加します。
6. ヒートマップを実装します (進行中)。
7. セグメンテーションを実装します。