2018年6月17日日曜日

YOLOv3をFedora28+CUDAで動かしてみる

YOLOv3

YOLOとは、state-of-the-artsなリアルタイム一般物体認識。
詳細の説明は割愛。
今回は、Fedora28でYOLOv3を試そうとしたときにつまずいたポイントを紹介。

Fedora28でつまずいたポイント

darknetのビルドで、OPENCV、CUDAを有効とすると、ビルドエラーが発生。
環境は以下
  • CPU AMD Ryzen 7 1700
  • GPU NVIDIA GeForce GTX 1070
  • OS Fedora 28 
  • GCC 8.1.1
  • CUDA 9.1
  • OpenCV 3.4.1(ソースビルド)
ビルドエラーの内容と解決した方法について解説。
解決方法は公式の手順ではないので注意。

OpenCV

MakefileのOPENCVを有効にしてビルドすると、ビルドエラーが発生。
$ make
gcc -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv`  -DGPU -I/usr/local/cuda/include/ -DCUDNN  -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU -DCUDNN -c ./src/gemm.c -o obj/gemm.o
In file included from /usr/local/include/opencv2/core/types_c.h:59,
                 from /usr/local/include/opencv2/core/core_c.h:48,
                 from /usr/local/include/opencv2/highgui/highgui_c.h:45,
                 from include/darknet.h:25,
                 from ./src/utils.h:5,
                 from ./src/gemm.c:2:
/usr/local/include/opencv2/core/cvdef.h:485:1: エラー: 不明な型名 ‘namespace’ です
 namespace cv {
 ^~~~~~~~~
-Wfatal-errors によりコンパイルを停止しました。
make: *** [Makefile:85: obj/gemm.o] エラー 1

原因は、darknetはOpenCVのC言語IFを呼び出しているが、OpenCV3系はC言語IFはサポートしなくなったためらしい。。。(ほんと?)
みんな、コンパイルできなくて困っている。。。
https://github.com/pjreddie/darknet/issues/485
https://github.com/opencv/opencv/issues/10963

解決方法

OpenCV2系をビルド・インストール
以下から2.4.13.6のソースをダウンロードしていつもどおりビルド。
https://github.com/opencv/opencv/releases/tag/2.4.13.6

ビルドする際の注意
あとは、darknetのMakefileでpkg-configでopencvを指定している箇所をopencv2に変更してビルドすればOK。


CUDA

CUDAのhost compilerはGCC 6以下がサポートしており、Fedora 28のGCC 8はサポートしていない。このため、CUDAを有効としてビルドするとビルドエラーが発生する。
In file included from /usr/local/cuda/include/host_config.h:50,
                 from /usr/local/cuda/include/cuda_runtime.h:78,
                 from <コマンドライン>:
/usr/local/cuda/include/crt/host_config.h:121:2: エラー: #error -- unsupported GNU version! gcc versions later than 6 are not supported!
 #error -- unsupported GNU version! gcc versions later than 6 are not supported!
  ^~~~~

解決方法

host compilerにGCC 6以下を指定する。
MakefileのNVCC=nvccに-ccbinオプションでコンパイラを指定。
gccは5.5をソースビルドしたものを使用。

結果

darknetのサンプルファイル"data/kite.jpg"で確認


Model
Build option
Prediction time
(seconds)
Prediction time
(milliseconds)
FPS
GPUCUDAOPENMP
YOLOv31100.03365633.729.7
YOLOv3-tiny 1100.0062996.3158.8
YOLOv30007.9802647980.30.1
YOLOv3-tiny 0000.729358729.41.4
YOLOv30012.3087572308.80.4
YOLOv3-tiny 0010.286995287.03.5
GPUありのYOLOv3で約30fps。早い!

0 件のコメント:

コメントを投稿