pythonでdarknet(yolov2)の検出結果を画像に埋め込む

# やりたいこと
以前の記事[リアルタイム物体検出システムdarknetをpythonでサーバ化](https://qiita.com/komorin0521/items/08ba4469d8ba2346ed35)でご紹介したdarknetをpythonでいじってみよう第二段です。


- 前回
    * 画像をPOSTすると、「オブジェクト名、スコア」が返ってくるAPIを作成

- 今回
    * 前回作成したAPIのレスポンスに位置情報を返すよう修正する
    * 検出結果が埋め込まれた画像を返すAPIを追加する


なお、darknetやpythonのバージョンは前回の記事と同様のため、省略します。

# 動作方法
ソースはgithubに置いております。

- https://github.com/komorin0521/darknet_server

起動については、前回記事[リアルタイム物体検出システムdarknetをpythonでサーバ化](https://qiita.com/komorin0521/items/08ba4469d8ba2346ed35) を参考にしてください！

## 確認方法
### 検出結果のJSON取得
`curl`で以下のように画像ファイルをアップロードしてください

```bash
$ 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`にて確認できます。

```bash
$ 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`

![predictions.jpg](https://qiita-image-store.s3.amazonaws.com/0/114699/93c03869-2a5d-4ac4-b1d5-d491b6e9f751.jpeg)

線の太さとか色とか文字の大きさとかフォントとかもろもろはもっとかっこよくできるので、
お好みでスクリプト編集してください（笑）

# その他
はじめ`yolo`の結果が、(x_min, y_min, x_max, y_max)とかかと思って書き込んでみたら、下記のようになってしまった（笑）

![person_ver1.jpg](https://qiita-image-store.s3.amazonaws.com/0/114699/744dc8aa-125d-72bc-bae5-eb8715570a14.jpeg)

これを見て、x,yの中心と幅および高さが出てることに気づけたので、よかった、よかった。

# 2017/11/01 APIの仕様修正
yolo本家では、確信度はdetectionを行う際に指定していたので、
APIでも指定できるように変更しました。
なお、デフォルト値は、（本家と同様なはずの）0.25にしてます。

```bash
$ curl -XPOST -F thresh=0.1 -F file=@/home/omori/darknet/data/person.jpg http://localhost:8080/get_predict_image > predictions.jpg
```

と、-Fオプションで指定可能で、値を小さくするとより多くの物体検出結果が返ってきますが、その分ご認識も多くなるので、ご注意ください。

# 参考
- darknet
    * https://pjreddie.com/darknet/
    * https://github.com/pjreddie/darknet
  
- OPENCVについて
    * [PythonとOpenCVで画像処理③【描画処理】](http://rasp.hateblo.jp/entry/2016/01/24/135417)
    * [opencv2 documentation](http://opencv.jp/opencv-2svn/cpp/drawing_functions.html)
    * [opencv python チュートリアル](http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_gui/py_drawing_functions/py_drawing_functions.html#id8)


- Flaskの画像処理関連
    * https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwiGuPm_4vzWAhVKmZQKHSjtBhgQFggyMAE&url=https%3A%2F%2Fgist.github.com%2FMiserlou%2Ffcf0e9410364d98a853cb7ff42efd35a&usg=AOvVaw2-Cec1uS31GMYTPUTeAkSd