ダークネットオブジェクト検出フレームワークとYOLO
Darknet は、C、C++、CUDA で書かれたオープンソースのニューラル ネットワーク フレームワークです。
YOLO (You Only Look Once) は、Darknet フレームワークで実行される、最先端のリアルタイムの物体検出システムです。
Hank.ai がダークネット/YOLO コミュニティをどのように支援しているかを読む
ダークネット V3「ジャズ」を発表
ダークネット/YOLO Web サイトを参照してください。
ダークネット/YOLO FAQ をよく読んでください。
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 を使用する場合、LEGO データセット ビデオを最大 1000 FPS で正確に実行できます。つまり、各ビデオ フレームは Darknet/YOLO によって 1 ミリ秒以内に読み取られ、サイズ変更され、処理されます。少ない。
サポートが必要な場合、または Darknet/YOLO について議論したい場合は、Darknet/YOLO Discord サーバーに参加してください: https://discord.gg/zSq8rtW
Darknet/YOLO の CPU バージョンは、Raspberry Pi、クラウドおよびコラボ サーバー、デスクトップ、ラップトップ、ハイエンド トレーニング リグなどのシンプルなデバイス上で実行できます。 Darknet/YOLO の GPU バージョンには、NVIDIA の CUDA 対応 GPU が必要です。
Darknet/YOLO は、Linux、Windows、および Mac で動作することが知られています。以下の組み立て説明書を参照してください。
ダークネットバージョン
2013 年から 2017 年に Joseph Redmon によって作成されたオリジナルの Darknet ツールにはバージョン番号がありませんでした。このバージョンは 0.x であると考えます。
Alexey Bochkovskiy が 2017 年から 2021 年にかけて管理していた次に人気のある Darknet リポジトリにもバージョン番号がありませんでした。これをバージョン 1.x とみなします。
Hank.ai が後援し、2023 年から 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 月にリリースされました。version コマンドは 3.x "JAZZ" を返すようになりました。
これらのコマンドのいずれかを実行する必要がある場合は、いつでも以前の 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 などのより単純なデータセットと事前トレーニングされた重みが他にもいくつかあります。詳細については、ダークネット/YOLO FAQ を参照してください。
MSCOCO の事前トレーニングされた重みは、いくつかの異なる場所からダウンロードできます。また、このリポジトリからもダウンロードできます。
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-フル
MSCOCO の事前トレーニングされた重みは、デモの目的でのみ提供されています。 MSCOCO に対応する .cfg および .names ファイルは、cfg ディレクトリにあります。コマンドの例:
「バッシュ」
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 を使用して必要なプロジェクト ファイルを生成します。
車を運転するのに整備士である必要がないのと同じように、Darknet/YOLO を構築、インストール、実行するために C++ の知識は必要ありません。
より複雑なビルド ステップを含む古いチュートリアルに従っている場合、またはこの Readme の内容と一致しないビルド ステップを実行している場合は注意してください。以下で説明する新しいビルド手順は 2023 年 8 月に開始されました。
ソフトウェア開発者は、https://darknetcv.ai/ にアクセスして、Darknet/YOLO オブジェクト検出フレームワークの内部に関する情報を入手することをお勧めします。
Googleコラボ
Google Colab の手順は Linux の手順と同じです。新しいネットワークのトレーニングなど、特定のタスクの実行方法を示すいくつかの Jupyter ノートブックが利用可能です。
colab サブディレクトリ内のノートブックを参照するか、以下の Linux の手順に従ってください。
Linux CMake メソッド
1. 必要なパッケージをインストールします。
「バッシュ」
sudo apt-get install build-essential git libopencv-dev cmake
`
2. ダークネット リポジトリのクローンを作成します。
「バッシュ」
mkdir ~/srccd ~/src
git clone https://github.com/hank-ai/darknetcd ダークネット
`
3. ビルド ディレクトリを作成し、CMake を実行します。
「バッシュ」
mkdir ビルドcd ビルド
cmake -DCMAKEBUILDTYPE=リリース ..
`
4. ダークネットを構築する:
「バッシュ」
make -j4
`
5. Darknet をパッケージ化してインストールします。
「バッシュ」
パッケージ
sudo dpkg -i darknet-VERSION.deb
`
6. インストールを確認します。
「バッシュ」
ダークネットバージョン
`
Windows CMake メソッド
1. 必要なパッケージをインストールします。
「バッシュ」
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 の開発者コマンド プロンプトを選択します。これらの手順では PowerShell を使用しないでください。
4. Microsoft VCPKG をインストールします。
「バッシュ」
cd c:mkdir c:srccd c:src git clone https://github.com/microsoft/vcpkgcd vcpkg
ブートストラップ-vcpkg.bat
.vcpkg.exe 統合
.vcpkg.exe をインストール powershell.vcpkg.exe を統合 opencv をインストール [contrib,dnn,freetype,jpeg,openmp,png,webp,world]:x64-windows
`
5. ダークネット リポジトリのクローンを作成します。
「バッシュ」
cd c:src
git clone https://github.com/hank-ai/darknet.gitcd ダークネット
`
6. ビルド ディレクトリを作成し、CMake を実行します。
「バッシュ」
mkdir ビルドcd ビルド
cmake -DCMAKEBUILDTYPE=リリース -DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
`
7. ダークネットを構築する:
「バッシュ」
msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedsummary darknet.sln
`
8. NSIS インストール パッケージを生成します。
「バッシュ」
msbuild.exe /property:Platform=x64;Configuration=Release PACKAGE.vcxproj
`
9. NSIS インストール ウィザードを実行します。
- ビルド ディレクトリ内のファイル darknet-VERSION.exe を開きます。例: darknet-2.0.31-win64.exe。
10. インストールを確認します。
「バッシュ」
C:Program FilesDarknetbindarknet.exe のバージョン
`
ダークネットの使用
CLI
以下は、Darknet でサポートされるすべてのコマンドの完全なリストではありません。
Darknet CLI に加えて、Darknet/YOLO の代替 CLI を提供する DarkHelp プロジェクト CLI にも注目してください。 DarkHelp CLI には、Darknet では直接利用できないいくつかの高度な機能もあります。 Darknet CLI と DarkHelp CLI は両方とも一緒に使用できますが、相互に排他的ではありません。
以下に示すほとんどのコマンドでは、対応する .names および .cfg ファイルを含む .weights ファイルが必要です。独自のネットワークをトレーニングすることも (強くお勧めします!)、誰かがすでにトレーニングしてインターネット上で無料で利用できるようにしたニューラル ネットワークをダウンロードすることもできます。事前トレーニングされたデータセットの例は次のとおりです。
1. LEGO Gears (画像内のオブジェクトを見つける)
2. Rolodex (画像内のテキストの検索)
3. MSCOCO (標準 80 クラスの物体検出)
実行するコマンドには次のものがあります。
1. 実行可能なコマンドとオプションをいくつかリストします。
「バッシュ」
ダークネットのヘルプ
`
2. バージョンを確認します。
「バッシュ」
ダークネットバージョン
`
3. 画像を使用して予測します。
- V2:
「バッシュ」
ダークネット ディテクタ テストcars.datacars.cfgcars_best.weights image1.jpg
`
- V3:
「バッシュ」
darknet02displayannotatedimagescars.cfg image1.jpg
`
- ダークヘルプ:
「バッシュ」
DarkHelp 車.cfg 車.cfg 車_ベスト.重み image1.jpg
`
4. 出力座標:
- V2:
「バッシュ」
ダークネット ディテクタ テスト Animals.data Animals.cfg Animalsbest.weights -extoutput Dog.jpg
`
- V3:
「バッシュ」
darknet01inference_images 動物 犬.jpg
`
- ダークヘルプ:
「バッシュ」
DarkHelp --json 動物.cfg 動物.名前 動物ベスト.重み 犬.jpg
`
5. ビデオの操作:
- V2:
「バッシュ」
ダークネット ディテクタ デモ Animals.data Animals.cfg Animalsbest.weights -extoutput test.mp4
`
- V3:
「バッシュ」
darknet03display_videos 動物.cfg test.mp4
`
- ダークヘルプ:
「バッシュ」
DarkHelp 動物.cfg 動物.名前 動物ベスト.重みテスト.mp4
`
6. Web カメラからの読み取り:
- V2:
「バッシュ」
ダークネット検出器のデモ Animals.data Animals.cfg Animals_best.weights -c 0
`
- V3:
「バッシュ」
darknet08display_webカメラの動物
`
7. 結果をビデオに保存します。
- V2:
「バッシュ」
ダークネット ディテクタ デモ Animals.data Animals.cfg Animalsbest.weights test.mp4 -outfilename res.avi
`
- V3:
「バッシュ」
darknet05processvideosマルチスレッド動物.cfg動物.名前動物_ベスト.重みテスト.mp4
`
- ダークヘルプ:
「バッシュ」
DarkHelp 動物.cfg 動物.名前 動物ベスト.重みテスト.mp4
`
8.JSON:
- V2:
「バッシュ」
ダークネット ディテクタ デモ Animals.data Animals.cfg Animalbest.weights test50.mp4 -jsonport 8070 -mjpegport 8090 -extoutput
`
- V3:
「バッシュ」
darknet06imagestojson 動物 image1.jpg
`
- ダークヘルプ:
「バッシュ」
DarkHelp --json 動物.名前 動物.cfg 動物ベスト.重み image1.jpg
`
9. 特定の GPU で実行:
「バッシュ」
ダークネット検出器のデモ Animals.data Animals.cfg Animals_best.weights -i 1 test.mp4
`
10. ニューラル ネットワークの精度を確認するには、次の手順を実行します。
「バッシュ」
ダークネット検出器マップ Driving.data Driving.cfg Driving_best.weights ...
`
出力:
`
ID 名 AvgPrecision TP FN FP TN Accuracy ErrorRate Precision Recall Specificity 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 の精度を確認するには:
「バッシュ」
ダークネット検出器マップ Animals.data Animals.cfg Animalsbest.weights -iouthresh 0.75
`
12. アンカーの再計算:
- DarkMark で最もよく実行されます。
- ダークネットでは、以下を使用します。
「バッシュ」
ダークネット検出器 calcanchors 動物.データ -numof_clusters 6 -幅 320 -高さ 256
`
13. 新しいネットワークをトレーニングします。
「バッシュ」
cd ~/nn/動物/
ダークネット ディテクタ -map -dont_show train Animals.data Animals.cfg
`
トレーニング
ダークネット/YOLO FAQ の関連セクションへのクイック リンク:
1. ファイルとディレクトリはどのように設定すればよいですか?
2. どの設定ファイルを使用すればよいですか?
3. 独自のネットワークをトレーニングする場合はどのコマンドを使用する必要がありますか?
注釈を付けてトレーニングする最も簡単な方法は、DarkMark を使用して必要な Darknet ファイルをすべて作成することです。これは間違いなく、新しいニューラル ネットワークをトレーニングする場合に推奨される方法です。
カスタム ネットワークをトレーニングするためにさまざまなファイルを手動でセットアップしたい場合は、次のようにします。
1. プロジェクト用に新しいフォルダーを作成します。
- この例では、動物を検出するためにニューラル ネットワークが作成されるため、次のディレクトリが作成されます: ~/nn/animals/。
2. ダークネット設定ファイルをテンプレートとしてコピーします。
- たとえば、cfg/yolov4-tiny.cfg をプロジェクト フォルダーにコピーします。 ~/nn/animals/animals.cfg が作成されます。
3. Animals.names テキスト ファイルを作成します。
- このファイルには、検出するクラスのリストが 1 行に 1 つずつ含まれます。例えば:
`
犬
猫
鳥
馬
`
4. 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 または他の同様のソフトウェアを参照してください。 YOLO アノテーション形式については、Darknet/YOLO FAQ で説明されています。
6. 「train」テキスト ファイルと「valid」テキスト ファイルを作成します。
- これら 2 つのテキスト ファイルは、ダークネットが mAP% を計算する際のトレーニングと検証に使用する必要があるすべての画像を個別にリストする必要があります。 1 行に 1 つの画像が表示されます。パスとファイル名は相対的または絶対的です。
7. .cfg ファイルを変更します。
- バッチ: 64 に設定します。
- サブディビジョン: 1 から開始します。メモリの可用性に基づいてこれを調整する必要がある場合は、Darknet/YOLO FAQ を参照してください。
- maxbatches: 適切な開始値は 2000numberof_classes です。この例では、動物が 4 匹なので、4 2000 = 8000 となります。
- ステップ: 最大バッチの 80% および 90% に設定します。この例では、maxbatches が 8000 に設定されているため、steps=6400,7200 を使用します。
- 幅と高さ: これらはネットワークの寸法です。 Darknet/YOLO FAQ では、使用する最適なサイズを計算する方法が説明されています。
-classes: .names ファイル内のクラスの数を使用してこの行を変更します。この例では、classes=4 を使用します。
- filters: 各 [yolo] セクションの前の [convolutional] セクションで、filters=... を値 (numberofclasses + 5) * 3 で変更します。この例では、filters=27 を使用します。
8. トレーニングを開始します。
「バッシュ」
cd ~/nn/動物/
ダークネット ディテクタ -map -dont_show train Animals.data Animals.cfg
`
我慢して。最適な重みは、animals_best.weights として保存されます。トレーニングの進行状況は、chart.png ファイルを表示することで確認できます。新しいネットワークをトレーニングするときに使用する追加パラメータについては、Darknet/YOLO FAQ を参照してください。
トレーニング中に詳細を確認したい場合は、--verbose パラメーターを追加します。例えば:
「バッシュ」
ダークネット ディテクタ -map -dont_show --verbose train Animals.data Animals.cfg
`
その他のツールとリンク
1. DarkMark: Darknet/YOLO プロジェクトを管理するには、画像に注釈を付け、注釈を検証し、Darknet でトレーニングするために必要なファイルを生成します。
2. DarkHelp: Darknet に代わる堅牢な CLI、画像タイリングの使用、ビデオ内のオブジェクト追跡、または商用アプリケーションで簡単に使用できる堅牢な C++ API 用。
3. ダークネット/YOLO FAQ: 質問への回答を支援します。
4. Stéphane の YouTube チャンネル: チュートリアルとサンプルビデオ。
5. Darknet/YOLO discord サーバー: 他の Darknet/YOLO ユーザーとチャットし、サポートを求めるため。
ロードマップ
最終更新日: 2024 年 10 月 30 日:
完了しました
1. トレーニング中に使用される qsort() を std::sort() に置き換えます。
2. check_missing、getchar()、および system() を削除します。
3. C++ コンパイラを使用するように 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. 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. 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. セグメンテーション。