機械学習・AI【物体検出】vol.1 :Windowsでディープラーニング!Darknet YOLOv3(AlexeyAB Darknet)

【物体検出】vol.1 :Windowsでディープラーニング!Darknet YOLOv3(AlexeyAB Darknet)

最速の物体検知手法:YOLOv3

ディープラーニングの物体検出において、大きなインパクトをもって登場したdarknet YOLO(ヨロ)。
2018年3月にJoseph Chet Redmonの本家darknet(https://pjreddie.com/)で、最新のYOLOv3が公開されました。

既存の物体認識、検出系の仕組みのトップレベルの認識率を維持したままで、既存の仕組みと比較して3倍から5倍の認識速度を実現しました。

 

map50blue

引用:https://pjreddie.com/media/image/map50blue.png

 

これにより、開発者がTEDで語っているように「物体を即座に認識」できるようになりました。

 

ジョセフ・レドモン(プログラマー)氏について
アメリカ、ワシントン大学大学院に在籍中。オープンソースの物体検出システム YOLO (You Only Look Once)に取り組んでいる。 物体検出システムの分野はここ数年、様々な分野でニーズが広がっており、彼の技術も大きな注目を集めている。

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

darknet

 

YOLOv3が他の実装と異なる点

これまで当社でも使っていたSSDの実装では、Tensorflow、Keras、Pytorch、Chainerなどのディープラーニングのフレームワークを入れて、Pythonのプログラムを実行していました。

すぐにソースコードを修正して実行し、結果を即座に確認できるなど、大変分かりやすい実行環境でした。

しかし、近年、悩ませられていたのは、短期間でバージョンアップが行われるCUDA、cuDNN、OpenCVとTensorflowのバージョン依存問題。Anaconda、Condaなどで環境を切り分けようとしても、YOLOv3のための環境を作ったら、以前のSSDの環境を壊してしまった...など。
環境構築ではまると、1日中、酷い時には数日を費やすこともあり、大きな損失(損失感)を伴っていました。

これらに対して、YOLOはCで書かれたバイナリとして構成されます。
CのMake環境、Makeファイルの修正、場合によってはソースコードの修正などを伴いますが、detectorというバイナリと、起動引数、設定ファイルで動作するので、コマンドラインから繰り返し起動したり、コマンドを組み合わせて動かします。

 

本家から派生したAlexey氏のdarknet

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

 

Make、ビルドが成功するまでに苦労した部分

泣き所を、手順に沿って記述します。

 

CUDA、cuDNNの導入

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のインストール

OpenCVは2.4以上のバージョンとされていますが、今入手するなら3.4.6あたりでしょうか。(2019/06/03時点)

OpenCVでもGPUを活用するため、ソースコードからインストールするのが良いようですが、Windowsバイナリを入手して、PATHを通すだけでもOKです。(AlexyAB DarknetのMake、Buildは出来る)。
また、当初は3.4.6で動作確認をしましたが、後に4.1.0でも動作することを確認しました。

 

dllのpath、Anaconda環境との関連

PC全体とAnacondaの仮想環境のPATHのどちらを参照しているのか?で結構ハマりました。

最終的には、AnacondaのPATHを無効にしてしまってから、インストールを行いました。

Tensorflow、KerasでOpenCVやCUDAの環境依存するのとまったく同じで、OpenCVのdllやバイナリ、CUDA関連のdllへのパス(参照先)の部分で、トライアンドエラーがありました。エラーを丹念に読み、参照先を確認し、PATHを通してはCmakeの起動を繰り返しながら、Makeが成功しました。

 

Windowsのコンパイル手順

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の直下にコピーしておくのが良いと思います。

 

いよいよWindowsでYOLOv3

まずは、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と同じ場所にダウンロードしておきます。

 

 ▼この記事を書いたひと

001@2x.png

R&Dセンター
松井 良行

R&Dセンター 室長。コンピュータと共に35年。そしてこれからも!

 

おすすめの関連記事

機械学習・AIの最新記事


お問い合わせ

ご意見・ご質問などお気軽にお問い合わせ下さい。
ナカシャクリエイテブ株式会社

●富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337
〒460-0014 愛知県名古屋市中区富士見町13−22 ファミール富士見711  地図
交通部 R&Dセンター

Email:メールでのお問い合わせ