概要
YOLOモデルを評価したかったので、Darknetをインストールした。
- 実施時期:2019年12月
 - OS: Ubuntu18.04LTS
 - cmake: 3.10.2
 - CUDA: 10.2 ←cuDNNともに前にインストール済み
 - cuDNN: 7.6.5
 - CC (Compute capability GTX1070): 6.1
 - OPENCV: 3.4.8 ←前にインストール済み
 
インストール
試行錯誤の結果、最終的に下記のDarknetに行き着き、これをインストールする。
https://github.com/AlexeyAB/darknet
Darknetは上記以外に次の2つも試したが、このAlexeyABの解説がとても丁寧でよかった。Q&Aも豊富。
- YOLOオフィシャル
 - GPUを使わないNNPACK
 
ちなみに、NNPACKはNinjaのインストールやコンパイルが必要で、AWSの手順も見ながらコンパイルできた。GPU+CUDAがインストールできればNNPACKは必要ない。
要は、cloneしたninjaフォルダ内のbuild.ninjaファイルへ次の2行の追加編集が必要。
cflags = -std=gnu99 -g -pthread -fPIC
cxxflags = -std=gnu++11 -g -pthread -fPIC
おいらの場合、最終的にGPUがないエッジ端末に再教育したYOLOを置くときはOPEN VINOを使うつもりなので、やはりNNPACKは不要。
コンパイル
まず、クローンする。
$ git clone https://github.com/AlexeyAB/darknet.git
home直下にdarknetのフォルダができるので、そこで作業する。
実際cloneするとdarkentのフォルダに鍵マークが付いた。
rootとhomeのユーザに権限制限はないそうだがchmod 777してもマークが取れず、気持ちが悪かったのでこれは削除(rm -r)した。
クローンではなく"Download ZIP"ボタンをポチって、解凍してできたdarknetフォルダをhome直下にコピー(cp -r)した。
make条件が書かれているMakefileを編集する。
$ cd darknet
$ sudo vim Makefile
Makefile中でEnable(=1)にするのは、GPU, CUDNN, OPENCV
GPU=1
CUDNN=1
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=0
ZED_CAMERA=0
また、いま生きている"ARCH="をコメントアウトして、環境に合わせてその下行にあるコメントアウトされている"#ARCH="を生かす。
#GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030, Titan Xp, Tesla P40, Tesla P4
ARCH= -gencode arch=compute_61,code=sm_61 -gencode arch=compute_61,code=compute_61
上書き保存(:wq!)してmakeする。
元々の"ARCH="でmakeしてもその後の動作に問題はなかったが、環境に合わせた"ARCH="に変更すると、make時間が短くなった気がする。
$ sudo make
Makefile:171: recipe for target 'obj/convolutional_kernels.o' failed
make: *** [obj/convolutional_kernels.o] Error 127
会社の環境だとすんなりmakeできたが、家ではエラーが出た。pjreddieのdarknetでも同じエラーが出る。
試しに、GPU, CUDNNを0にすると問題なし。
GithubでCloseしたケースがあり、下記のようにMakefileを編集するとエラーは出なくなりmakeは成功した。
# NVCC=nvcc
NVCC=/usr/local/cuda/bin/nvcc
CUDAのインストールが正しくなかったのだろうか。
確認
ここではdarknet/dataフォルダに入っていた犬のjpgファイルで動作確認を行う。
Yolov3モデルで事前に教育済みのウェイトが必要だが、AlexeyABのdarknetには入っていなかったので、pjreddieのdarknetに入っていたyolov3.weightsをdarknetフォルダ直下にコピーしておく。
そして前段でmakeした実行ファイルで犬を検出させる。
$./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
 CUDA-version: 10020 (10020), cuDNN: 7.6.5, GPU count: 1  
 OpenCV version: 3.4.8
net.optimized_memory = 0 
batch = 1, time_steps = 1, train = 0 
   layer   filters  size/strd(dil)      input                output
   0 conv     32       3 x 3/ 1    416 x 416 x   3 ->  416 x 416 x  32 0.299 BF
   1 conv     64       3 x 3/ 2    416 x 416 x  32 ->  208 x 208 x  64 1.595 BF
   2 conv     32       1 x 1/ 1    208 x 208 x  64 ->  208 x 208 x  32 0.177 BF
   3 conv     64       3 x 3/ 1    208 x 208 x  32 ->  208 x 208 x  64 1.595 BF
   4 Shortcut Layer: 1,  wt = 0, wn = 0, outputs: 208 x 208 x  64 0.003 BF
/***  中略  ***/
 104 conv    256       3 x 3/ 1     52 x  52 x 128 ->   52 x  52 x 256 1.595 BF
 105 conv    255       1 x 1/ 1     52 x  52 x 256 ->   52 x  52 x 255 0.353 BF
 106 yolo
[yolo] params: iou loss: mse (2), iou_norm: 0.75, cls_norm: 1.00, scale_x_y: 1.00
Total BFLOPS 65.879 
avg_outputs = 532444 
 Allocate additional workspace_size = 52.43 MB 
Loading weights from yolov3.weights...
 seen 64, trained: 32013 K-images (500 Kilo-batches_64) 
Done! Loaded 107 layers from weights-file 
data/dog.jpg: Predicted in 25.815000 milli-seconds.
bicycle: 99%
dog: 100%
truck: 94%
結果のjpgが表示され、predictions.jpgとしてdarknetフォルダにできていれば成功
次回はいよいよモデル再教育とリアルタイムの検出に挑戦
以上
