やりたいこと
以前の記事リアルタイム物体検出システムdarknetをpythonでサーバ化でご紹介したdarknetをpythonでいじってみよう第二段です。
-
前回
- 画像をPOSTすると、「オブジェクト名、スコア」が返ってくるAPIを作成
-
今回
- 前回作成したAPIのレスポンスに位置情報を返すよう修正する
- 検出結果が埋め込まれた画像を返すAPIを追加する
なお、darknetやpythonのバージョンは前回の記事と同様のため、省略します。
動作方法
ソースはgithubに置いております。
起動については、前回記事リアルタイム物体検出システムdarknetをpythonでサーバ化 を参考にしてください!
確認方法
検出結果のJSON取得
curl
で以下のように画像ファイルをアップロードしてください
$ curl -XPOST -F file=@./data/person.jpg http://localhost:8080/detect`
jsonで下記のように結果が返ってこればOKです!
{
"result": [
{
"bounding_box": {
"height": 86.09929656982422,
"width": 137.61703491210938,
"x_min": 61.68614196777344,
"y_min": 264.98239517211914
},
"obj_name": "dog",
"score": 0.8622361421585083
},
{
"bounding_box": {
"height": 285.868408203125,
"width": 84.6079330444336,
"x_min": 187.8837776184082,
"y_min": 96.93341064453125
},
"obj_name": "person",
"score": 0.8603283762931824
},
{
"bounding_box": {
"height": 220.17135620117188,
"width": 191.89932250976562,
"x_min": 399.44847106933594,
"y_min": 131.2899169921875
},
"obj_name": "horse",
"score": 0.8156660199165344
}
],
"status": "200"
}
検出結果の画像取得
こちらもcurl
にて確認できます。
$ curl -XPOST -F file=@/home/omori/darknet/data/person.jpg http://localhost:8080/get_predict_image > predictions.jpg
少し時間がかかりますが、成功すると該当フォルダにpredictions.jpg
が出力されているはずです。
(チュートリアルをやっている場合は、同じ画像名で出力されるので、predictions.jpg
の名前を変更してcurl
をするか、あるいは、ls -all
で更新時刻を確認してみてください)
この画像が下記のように表示されれば成功です
$ eog predictions.jpg
線の太さとか色とか文字の大きさとかフォントとかもろもろはもっとかっこよくできるので、
お好みでスクリプト編集してください(笑)
その他
はじめyolo
の結果が、(x_min, y_min, x_max, y_max)とかかと思って書き込んでみたら、下記のようになってしまった(笑)
これを見て、x,yの中心と幅および高さが出てることに気づけたので、よかった、よかった。
2017/11/01 APIの仕様修正
yolo本家では、確信度はdetectionを行う際に指定していたので、
APIでも指定できるように変更しました。
なお、デフォルト値は、(本家と同様なはずの)0.25にしてます。
$ curl -XPOST -F thresh=0.1 -F file=@/home/omori/darknet/data/person.jpg http://localhost:8080/get_predict_image > predictions.jpg
と、-Fオプションで指定可能で、値を小さくするとより多くの物体検出結果が返ってきますが、その分ご認識も多くなるので、ご注意ください。
参考
-
darknet
-
OPENCVについて
-
Flaskの画像処理関連