アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

darknetをWindowsでビルドしてYOLOv3をPythonで使用する。

CUDAは10.0、cuDNNは7.0、OpenCVは3.4.9を使用。既にOpenCVはビルドが終わっていて、CUDAとcuDNNの設定も終わっているものとする。
VS2017も入れておく。2019だとOpenCVのビルドで躓く可能性がある。

OpenCVビルドした時の記事
https://matsudamper.hatenablog.com/entry/2019/04/09/212629

darknet
https://github.com/AlexeyAB/darknet

Cmake

Configure

f:id:matsudamper:20200203041326p:plain

OpenCV_DIRとCUDA_SDK_ROOT_DIRがNOTFOUNDと言われるので設定。
f:id:matsudamper:20200203041515p:plain

もう一度Configure。エラーはもう出ていないはず。
f:id:matsudamper:20200203041808p:plain

Generate-Open Project

特に問題はないはず。

Visual Studio

Build

Releaseにする。
f:id:matsudamper:20200203042137p:plain

ソリューションのビルド
f:id:matsudamper:20200203042209p:plain

失敗する。

2>プロジェクト "dark.vcxproj" のビルドが終了しました -- 失敗。
5>プロジェクト "uselib_track.vcxproj" のビルドが終了しました -- 失敗。
4>プロジェクト "uselib.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 3 正常終了、3 失敗、0 更新不要、1 スキップ ==========

failed

失敗しているのでとりあえずdarkだけビルドしてみる。
f:id:matsudamper:20200203042544p:plain

エラー詳細が出た。コード1で終了。要するにエラー。
f:id:matsudamper:20200203042718p:plain

nvcc.exeの実行に失敗しているようなので、該当のコマンドをdarknetのディレクトリで実行してエラーの詳細を得る。

nvcc fatal   : Unknown option 'pthread'

"-pthread"のオプションが要らないっぽい。外でも問題になっている。
https://github.com/arbor-sim/arbor/pull/649

"-pthread"オプションに該当するものを削除。

cl.exeが無いとエラーが出たので、PATHに追加。自分の場合は以下のPath。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64

Build

もう一度全体をビルド。成功。

========== ビルド: 3 正常終了、0 失敗、3 更新不要、1 スキップ ==========

darknet/darknet.exeが出力されているはず。
f:id:matsudamper:20200131055552p:plain

実行

エラー

pthreadVC2.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。 

f:id:matsudamper:20200203044544p:plain

検索すると見つかるのでPATHを通す。
f:id:matsudamper:20200203044650p:plain

問題なさそう。

D:\documents\darknet>Release\darknet.exe
usage: Release\darknet.exe <function>

重みをダウンロードし、実際に引数を入れて使用する。
https://pjreddie.com/darknet/yolo/

darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25 test/test.jpg

検出結果が出て、ファイルも生成されるはず。

python

yolo_cpp_dll.dllの作成

darknet\build\darknet\yolo_cpp_dll.slnを開いてReleaseに設定し、ビルドをする。
darknet\build\darknet\x64にyolo_cpp_dll.dllが出力されている。

darknet.py

この状態だとdllを読み込んでくれないようなのでcwdにdllがあるパスを設定しました。

if os.name == "nt":
    cwd = os.path.dirname(__file__)
    cwd = r"D:\documents\darknet\build\darknet\x64"
    os.environ['PATH'] = cwd + ';' + os.environ['PATH']
    winGPUdll = os.path.join(cwd, "yolo_cpp_dll.dll")
    winNoGPUdll = os.path.join(cwd, "yolo_cpp_dll_nogpu.dll")
    envKeys = list()

これでPythonから使用できる。

おわり

Windowsで使用するってなかなか普通でないから面倒くさかった。PythonのDLLの読み込みでも躓いたりして面倒だった。でもまぁWindows好きだから良しとする。
Pythonはよくわからん。