darknetをpythonから叩けるようにしたスクリプトを書いた

darknetが公式referenceではコマンドラインから実行する方法しか記載されていなかったので、pythonから叩けるようにしたスクリプトを書いたのと、それまでにいろいろソースコードを読んだのでそれのまとめ。 このスクリプトを使用すると、動画のストリーミングで物体の検出をして、座標値もpythonの値として扱えるようになります。

いまいち正確に理解していないが、ディレクトリ構成とか探し方とかの話

.
├── cfg
├── data
├── examples
│   ├── detector-scipy-opencv.py # darknet.pyをimportしてfilename,scipy,opencvそれぞれの形式でデータを投げるコードのサンプル
│   ├── detectmp4.py # darknet.pyをimportして処理している、シンプルなサンプル用のファイル
│   └── *.c
├── include
├── python
│   ├── darknet.py    # pythonのプログラムが呼び出してるclassが書かれている
│   └── proverbot.py  
├── scripts
├── src
└── Makefile

構造は以下のリポジトリ

GitHub - sakakendo0321/darknet: Convolutional Neural Networks

以下かいたスクリプト

libdarknet.soが生成されていれば実行できるはず。main.pyDARKNET_DIRにcloneしたgithub repositoryのディレクトリ、VIDEO_NAMEopencv からみれるVideoCaptureのdevice番号で書き換えるか、xxxxx.mp4を対象のmp4ファイルの名前で書き換えると画像だけでなくストリーミング形式で実行できて、検出した画像を72行目のrから取得することができる。

同様のライブラリについて

GitHub - madhawav/YOLO3-4-Py: A Python wrapper on Darknet. Compatible with YOLO V3.

僕がやりたいことほとんどやってた。これを使うのがいいと思う。

所感・今後の予定

LICENSE.fuckというのがあって、この開発者なんかようわからんめちゃすごい人なんやなぁという感じがした。 若気の至りで開発してしまったんだろうか。すごすぎる。 opencv形式で取得したframeをそのままdarknetに渡そうとしたが、ctypesを使ってpythonからc++に変換する時に画像データよりファイル名で渡したほうが単純だと思って、現在は一度ファイルに保存して、ファイル名をc++に渡すようにしている。影響を調査し、改善するかもしれない。 もうすこしpython-c++間のつなぎをYOLO3-4-Py辺りを読みたい