ダークネットオブジェクト検出フレームワークと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. Paper Scaled-YOLOv4: 用紙へのリンク
3. 論文 YOLOv4: 論文へのリンク
4. 論文 YOLOv3: 論文へのリンク
一般情報
Darknet/YOLO フレームワークは、速度と精度の両方で他のフレームワークや YOLO バージョンよりも常に優れています。
このフレームワークは完全に無料でオープンソースです。 Darknet/YOLO を、ライセンス料なしで既存のプロジェクトや製品 (商用製品を含む) にシームレスに統合できます。
2024 年 10 月にリリースされた Darknet V3 (「Jazz」) は、NVIDIA RTX 3090 GPU で最大 1000 FPS で LEGO データセット ビデオを実行するという驚異的なパフォーマンスを達成しました。これは、Darknet/YOLO がサイズ変更や処理を含めて各ビデオ フレームを 1 ミリ秒未満で処理することになります。
サポートとディスカッションのために 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 と呼びます。
その後、2017 年から 2021 年まで Alexey Bochkovskiy によって管理され、人気のあった Darknet リポジトリにもバージョン番号がありませんでした。これをバージョン 1.x とみなします。
Hank.ai が後援し、Stéphane Charette が管理する Darknet リポジトリは、2023 年から初めて version コマンドを導入しました。 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" のリリースで最高潮に達しました。version コマンドは 3.x を返すようになりました。
そのバージョンの特定のコマンドを実行する必要がある場合は、いつでも以前の 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 に加えて、LEGO Gears や Rolodex など、Darknet/YOLO のテストにさまざまな単純なデータセットと事前トレーニングされた重みが利用できます。詳細については、Darknet/YOLO FAQ を参照してください。
MSCOCO の事前トレーニング済み重みは、次のリポジトリを含むさまざまなソースからダウンロードできます。
YOLOv2 (2016 年 11 月)
yolov2-tiny.weights
yolov2-full.weights
YOLOv3 (2018 年 5 月)
yolov3-tiny.weights
yolov3-full.weights
YOLOv4 (2020 年 5 月)
yolov4-tiny.weights
yolov4-full.weights
YOLOv7 (2022 年 8 月)
yolov7-tiny.weights
yolov7-full.weights
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++ の知識は必要ありません。これは、整備士でなくても車を運転するのと似ています。
Googleコラボ
Google Colab の手順は Linux の手順を反映しています。新しいネットワークのトレーニングなど、特定のタスクをデモンストレーションするために、いくつかの Jupyter ノートブックが利用可能です。
colab サブディレクトリ内のノートブックを探索するか、以下の Linux の手順に従ってください。
Linux CMake メソッド
Linux 用の Darknet ビルド チュートリアル
1. 前提条件: 次のパッケージがインストールされていることを確認してください。
「バッシュ」
sudo apt-get install build-essential git libopencv-dev cmake
`
2. ダークネットのクローン作成: ダークネット リポジトリのクローンを作成します。
「バッシュ」
mkdir ~/srccd ~/src
git clone https://github.com/hank-ai/darknet
CDダークネット
`
3. ビルド ディレクトリの作成: ビルド ディレクトリを作成します。
「バッシュ」
mkdir ビルド
CD ビルド
`
4. CMake で構成する: CMake を実行してビルドを構成します。
「バッシュ」
cmake -DCMAKEBUILDTYPE=リリース ..
`
5. ビルド: プロジェクトをビルドします。
「バッシュ」
make -j4
`
6. パッケージ: Debian パッケージを作成します。
「バッシュ」
パッケージを作る
`
7. インストール: パッケージをインストールします。
「バッシュ」
sudo dpkg -i darknet-VERSION.deb
`
オプション: GPU アクセラレーションのための CUDA/cuDNN
1. CUDA をインストールします。最新の NVIDIA GPU を使用している場合は、GPU アクセラレーションのために CUDA をインストールできます。 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 パッケージ: DEB ファイルの代わりに RPM インストール ファイルをビルドするには、CM_package.cmake 内の次の行を変更します。
`cmake
# SET (CPACK_GENERATOR "DEB")
SET (CPACK_GENERATOR "RPM")
`
Centos や OpenSUSE などのディストリビューション: Centos や OpenSUSE などのディストリビューションの場合は、CM_package.cmake の行を次のように変更します。
`cmake
# SET (CPACK_GENERATOR "DEB")
SET (CPACK_GENERATOR "RPM")
`
インストール パッケージ: ビルド後にパッケージをインストールするには、ディストリビューションのパッケージ マネージャーを使用します。たとえば、Ubuntu などの Debian ベースのシステムでは、sudo dpkg -i darknet-2.0.1-Linux.deb を使用します。
インストールされている主要なファイル:
/usr/bin/darknet: メインの Darknet 実行可能ファイル。 CLI でダークネット バージョンを実行して、インストールを確認します。
/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 を使用して必要なコンポーネントをインストールします。
「バッシュ」
winget インストール Git.Git
winget インストール Kitware.CMake
winget インストール nsis.nsis
winget インストール Microsoft.VisualStudio.2022.Community
`
2. Visual Studio C++ サポートをインストールします: C++ サポートを含むように Visual Studio インストールを変更します。
※「Windows スタート」メニューを開き、「Visual Studio インストーラー」を実行します。
※「変更」をクリックします。
※「C++によるデスクトップ開発」を選択します。
※右下の「変更」をクリックし、「はい」をクリックします。
3. 開発者コマンド プロンプト: 「Windows スタート」メニューから「開発者コマンド プロンプト for VS 2022」を起動します。これらの手順では PowerShell を使用しないでください。
4. Microsoft VCPKG をインストールします: VCPKG をインストールして OpenCV をビルドします:
「バッシュ」
CDC:
mkdir c:src
cd c:src
git clone https://github.com/microsoft/vcpkg
cd vcpkg
ブートストラップ-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. ダークネットのクローン作成: ダークネット リポジトリのクローンを作成します。
「バッシュ」
cd c:src
git clone https://github.com/hank-ai/darknet.git
CDダークネット
mkdir ビルド
CD ビルド
`
7. CMake で構成する: CMake を使用してビルドを構成します。
「バッシュ」
cmake -DCMAKEBUILDTYPE=リリース -DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
`
8. msbuild を使用してビルドする: msbuild を使用してプロジェクトをビルドします。
「バッシュ」
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 DLL が見つからない
CUDA または cuDNN DLL (例: cublas64_12.dll) の欠落に関するエラーが発生した場合は、CUDA .dll ファイルを darknet.exe と同じ出力ディレクトリに手動でコピーします。例えば:
「バッシュ」
「C:Program FilesNVIDIA GPU Computing ToolkitCUDAv12.2bin*.dll」をコピー src-cliRelease
`
* CUDA のバージョンに基づいてコマンドを調整してください。
DLL をコピーした後、msbuild.exe コマンドを再実行します。
上級ユーザー
Visual Studio ソリューション: CMake は Visual Studio ソリューション ファイル (Darknet.sln) を生成します。 Visual Studio GUI の使用を好むソフトウェア開発者は、コマンド ラインを使用する代わりに、Visual Studio 内で Darknet プロジェクトをロードできます。
検証とインストール
検証: 次のコマンドを実行して、Darknet が正しく構築されているかどうかを確認します。
「バッシュ」
C:srcDarknetbuildsrc-cliリリースされたarknet.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 ファイルが含まれます。
ダークネットの使用
CLI
次のリストは、Darknet でサポートされているすべてのコマンドを網羅しているわけではありません。
Darknet CLI に加えて、DarkHelp プロジェクト CLI を検討してください。これは、Darknet では直接利用できないいくつかの高度な機能を備えた代替 CLI を提供します。両方の CLI を同時に使用できます。
必須の前提条件:
ほとんどのコマンドでは、.weights ファイルと、対応する .names ファイルおよび .cfg ファイルが必要です。
独自のネットワークをトレーニングするか (強く推奨!)、事前にトレーニングされたネットワークをインターネットからダウンロードします。
事前トレーニングされたデータセットの例:
LEGO Gears: 画像内のオブジェクト検出。
Rolodex: 画像内のテキスト検出。
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. ウェブカメラの処理:
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:
V2:
「バッシュ」
ダークネット検出器のデモ Animals.data Animals.cfg Animals_best.weights -i 1 test.mp4
`
10. 精度評価:
地図:
「バッシュ」
ダークネット検出器マップ Driving.data Driving.cfg Driving_best.weights ...
`
mAP@IoU=75:
「バッシュ」
ダークネット検出器マップ Animals.data Animals.cfg Animalsbest.weights -iouthresh 0.75
`
11. アンカーの計算:
DarkMark: DarkMark を使用してアンカーを再計算し、最適なパフォーマンスを実現します。
ダークネット (古い方法):
「バッシュ」
ダークネット検出器 calcanchors 動物.データ -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% に設定します。
* ネットワークの寸法に基づいて幅と高さを調整します。
* class=... を .names ファイル内のクラスの数に設定します。
各 [yolo] セクションの前の [convolutional] セクションの filters=... を (numberofclasses + 5) 3 に調整します。
9. トレーニング: トレーニングを開始します:
「バッシュ」
cd ~/nn/動物/
ダークネット ディテクタ -map -dont_show train Animals.data Animals.cfg
`
* 最適な重みは、animals_best.weights として保存されます。
* chart.png ファイルを表示して、トレーニングの進行状況を監視します。
その他のツールとリンク
主要なリソース:
DarkMark: Darknet/YOLO プロジェクトの管理、画像の注釈付け、注釈の検証、トレーニング ファイルの生成用。
DarkHelp: Darknet に代わる堅牢な CLI で、画像のタイリング、ビデオ内のオブジェクト追跡、商用アプリケーションに適した堅牢な C++ API などの機能を備えています。
ダークネット/YOLO FAQ: よくある質問と解決策への回答を見つけます。
Stéphane の YouTube チャンネル: チュートリアルとサンプルビデオをご覧ください。
Darknet/YOLO Discord サーバー: サポートやディスカッションのために他の Darknet/YOLO ユーザーとつながります。
ロードマップ
最終更新日 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. 古い「アルファベット」コードを削除し、データ/ラベル内の画像を削除しました。
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. 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. セグメンテーション。