ディープラーニングの物体検出において、大きなインパクトをもって登場したdarknet YOLO(ヨロ)。
2018年3月にJoseph Chet Redmonの本家darknet(https://pjreddie.com/)で、最新のYOLOv3が公開されました。
既存の物体認識、検出系の仕組みのトップレベルの認識率を維持したままで、既存の仕組みと比較して3倍から5倍の認識速度を実現しました。
引用:https://pjreddie.com/media/image/map50blue.png
これにより、開発者がTEDで語っているように「物体を即座に認識」できるようになりました。
TED2017 How computers learn to recognize objects instantly
「コンピュータはいかに物体を即座に認識できるようになったのか」
YOLOv3の論文(原文PDF)
https://pjreddie.com/media/files/papers/YOLOv3.pdf
YOLOの論文(和訳)
https://qiita.com/mdo4nt6n/items/7cd5f106adc775e5d92b
これまで当社でも使っていたSSDの実装では、Tensorflow、Keras、Pytorch、Chainerなどのディープラーニングのフレームワークを入れて、Pythonのプログラムを実行していました。
すぐにソースコードを修正して実行し、結果を即座に確認できるなど、大変分かりやすい実行環境でした。
しかし、近年、悩ませられていたのは、短期間でバージョンアップが行われるCUDA、cuDNN、OpenCVとTensorflowのバージョン依存問題。Anaconda、Condaなどで環境を切り分けようとしても、YOLOv3のための環境を作ったら、以前のSSDの環境を壊してしまった...など。
環境構築ではまると、1日中、酷い時には数日を費やすこともあり、大きな損失(損失感)を伴っていました。
これらに対して、YOLOはCで書かれたバイナリとして構成されます。
CのMake環境、Makeファイルの修正、場合によってはソースコードの修正などを伴いますが、detectorというバイナリと、起動引数、設定ファイルで動作するので、コマンドラインから繰り返し起動したり、コマンドを組み合わせて動かします。
Windowsで動作させるための手順一式を、ロシアのエンジニアAlexey(アレクセイ)氏が公開・提供しています。
cmake-guiというツールを使ってVisualStudio形式のプロジェクトファイルの生成→VisualStudioによるビルド→Windowsバイナリとしてdarknet.exeが出来上がります。
Windows版バイナリの提供だけではなく、機能的にも改良が加えられています。本家バージョンと異なり、学習実行時にグラフを描画してくれます。
(学習をどこで終わったら良いのかをグラフで可視化された"Loss"、"mAP"などの指標を参考にしながら判断できるので大変便利です。)
また、生成された最新のモデルを使って、即座に画像や動画を使ってテストできるのも素晴らしいところです。
(trainを実行しながら、testが出来る)
※ただし、GPUメモリの上限の範囲で。
下記のサイトを参考に、環境を構築しました。
Alexey氏のサイト https://github.com/AlexeyAB/darknet
gitクライアントを導入済であれば、下記コマンドでuserディレクトリ配下に、alexeyab_darknetを作成し、配置されます。
git clone https://github.com/AlexeyAB/darknet alexeyab_darknet
サイトからzipダウンロードして、userディレクトリ配下に配置してもOKです。
以下、Users\username\alexeyab_darknetにカレントディレクトリを移して作業します。
※コマンドプロンプトは、必ず、"管理者として実行"で起動してください。
Windows or Linux
CMake >= 3.8 for modern CUDA support: https://cmake.org/download/
CUDA 10.0: https://developer.nvidia.com/cuda-toolkit-archive (on Linux do Post-installation Actions)
OpenCV >= 2.4: use your preferred package manager (brew, apt), build from source using vcpkg or download from OpenCV official site
(on Windows set system variable OpenCV_DIR = C:\opencv\build - where are the include and x64 folders image)
cuDNN >= 7.0 for CUDA 10.0 https://developer.nvidia.com/rdp/cudnn-archive
(on Linux copy cudnn.h,libcudnn.so... as desribed here https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installlinux-tar ,
on Windows copy cudnn.h,cudnn64_7.dll, cudnn64_7.lib as desribed here https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installwindows )
GPU with CC >= 3.0: https://en.wikipedia.org/wiki/CUDA#GPUs_supported
on Linux GCC or Clang, on Windows MSVC 2015/2017/2019 https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community
HP OMEN 880-000jp Desktop
i7 7700 3.6GHz*8、メモリ32GB
NVidia GeForce GTX1070 8GB
Windows10Professional 64bit
OpenCV 3.4(ソースからビルド、GPU対応)
CUDA 10.1.05
cuDNN 7.5.1
VisualStudio Community 2017
泣き所を、手順に沿って記述します。
CUDAとcuDNNは対応したバージョンにする必要があります。(これまで動作していたものが動作しなくなるリスクがありますので要注意)
CUDAをインストールする前に、VisualStudio2017でC++デスクトップ開発をインストールしておきます。CUDAがVisualStudio連携をインストールするからです。
ディスプレイドライバーも最新版にしておきます。(後のConfigure時にCUDAのオプションにチェックが入らない場合は、この段階の影響)
Alexey氏のGitHubサイトでは下記の条件が掲載されています。
CUDA 10.0:
OpenCV >= 2.4:
cuDNN >= 7.0 for CUDA 10.0
今入っているCUDAを確認するためにはコマンドプロンプトで
nvcc -Vと打ちます。
C:\Users\username>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Fri_Feb__8_19:08:26_Pacific_Standard_Time_2019
Cuda compilation tools, release 10.1, V10.1.105
今、有効になっているcuDNNを確認するにはcudnn.hを見ます。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 5
#define CUDNN_PATCHLEVEL 1
どうやら7.5.1のようです
OpenCVは2.4以上のバージョンとされていますが、今入手するなら3.4.6あたりでしょうか。(2019/06/03時点)
OpenCVでもGPUを活用するため、ソースコードからインストールするのが良いようですが、Windowsバイナリを入手して、PATHを通すだけでもOKです。(AlexyAB DarknetのMake、Buildは出来る)。
また、当初は3.4.6で動作確認をしましたが、後に4.1.0でも動作することを確認しました。
PC全体とAnacondaの仮想環境のPATHのどちらを参照しているのか?で結構ハマりました。
最終的には、AnacondaのPATHを無効にしてしまってから、インストールを行いました。
Tensorflow、KerasでOpenCVやCUDAの環境依存するのとまったく同じで、OpenCVのdllやバイナリ、CUDA関連のdllへのパス(参照先)の部分で、トライアンドエラーがありました。エラーを丹念に読み、参照先を確認し、PATHを通してはCmakeの起動を繰り返しながら、Makeが成功しました。
Compiling on Windows by using Cmake-GUI as on this IMAGE: Configure -> Optional platform for generator (Set: x64) -> Finish -> Generate -> Open Project -> x64 & Release -> Build -> Build solution
cmake-guiでdarknetソースコードのパスと、バイナリを配置するパスを指定。
"Configure"をクリックして、VisualStudioのバージョンや生成するバイナリとしてx64を指定する、GPU(CUDA)が使えるかとかOpenCVは使えるかを参照しにいって、Makeファイルを構成してくれます。
GenerateでVisualStudioのプロジェクトと生成、OpenProjectをクリックすると、VisualStudioで今生成したプロジェクトが開かれます。
VisualStudio上で、ソリューションのビルド、ALL_BUILDのビルドなどを実行すると、コンパイルが実行されます。
C:\Users\username\alexeyad_darknet\build\darknet\x64辺りに今出来上がったばかりのexeやdllが置かれています。
C:\Users\username\alexeyad_darknetの直下にコピーしておくのが良いと思います。
まずは、darknet.exeを管理者権限のコマンドプロンプトから実行してみます。
C:\Users\username\alexeyad_darknet\build\darknet\x64>darknet
usage: darknet
こんな感じで応答があれば、ちゃんと動いています。
darknet.exeを実行直後に、「dllが見つからない」とエラーが出てしまう場合は、darknet.exeど同じ場所に、エラーが出ているdllをコピーしちゃいましょう。(気持ち悪いですが、一応動きます)
早速サンプルで動作確認してみます。
darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
※yolov3.weightsは予めdarknet.exeと同じ場所にダウンロードしておきます。
▼この記事を書いたひと
R&Dセンター 松井 良行
R&Dセンター 室長。コンピュータと共に35年。そしてこれからも!
●富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337
〒460-0014 愛知県名古屋市中区富士見町13−22 ファミール富士見711 地図
交通部 R&Dセンター