やりたいこと
darknet yoloにpython IFがありますが、
公開されているpython/darknet.py
はデフォルトではpython2でしか動作しなかったので、
python3(.5.2)で動作するようにする
実行環境
- Ubuntu 16.04.4
- python 3.5.2
python3(.5.2)で実行した場合のエラー
ひとまず、必要最低限の下記3点を変更し実行
-
libdarknet.so
のパス - config, weightファイルのパス
- print関数(
print r
->print(r)
)
が、あえなくエラー...
Traceback (most recent call last):
File "python/darknet_org.py", line 151, in <module>
net = load_net("cfg/yolov3.cfg", "yolov3.weights", 0)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
修正のための調査
どうやらload_network
のタイプが違うと言われているので調査
...
85 load_net = lib.load_network
86 load_net.argtypes = [c_char_p, c_char_p, c_int]
87 load_net.restype = c_void_p
...
151 net = load_net("cfg/yolov3.cfg", "yolov3.weights", 0)
...
c_char_p
に対してstr型の"cfg/yolov3.cfg"
や"yolov3.weights"
をインプットしているところが怪しい
で、python3のリファレンス16.16. ctypes — Pythonのための外部関数ライブラリ¶(原文)で確認してみると...
16.16.1.4. 基本データ型にc_char_p
はバイト列 or Noneと記載されている
ということは、"cfg/yolov3.cfg"
-> b"cfg/yolov3.cfg"
というようにバイト文字で引数指定すればよいのでは!?
修正 & 実験
c_char_p
で指定されている部分の引数をすべてb"..."にして、実行してみる
...
151 net = load_net(b"cfg/yolov3.cfg", b"yolov3.weights", 0)
152 meta = load_meta(b"cfg/coco.data")
153 r = detect(net, meta, b"data/dog.jpg")
...
$ cd ~/work/darknet
$ python3 python/darknet.py
...
Loading weights from yolov3.weights...Done!
[(b'bicycle', 0.9941979646682739, (363.7811279296875, 278.96038818359375, 397.52166748046875, 331.17120361328125)), (b'dog', 0.9904678463935852, (221.56198120117188, 380.4324645996094, 186.3259735107422, 312.14471435546875)), (b'truck', 0.9110047221183777, (581.7490234375, 127.70638275146484, 215.17813110351562, 86.2370376586914))]
おお、動いた!めでたし、めでたし
結果もbytes型で返ってくるんや。