IBM Watsonはカレーライスとハヤシライスを見分けられるのか？ (書きかけ)

# カレーライスとハヤシライス
子供の頃、夕ご飯はカレーと思って一口食べたら実はハヤシライスで大ショック、という経験は誰にでもあるはずだ。今をときめくWatsonで、世界の子ども達の悲しみを止めることができるか確認してみる。

# Watson画像認識API(Visual Recognition)
IBM Bluemix上には様々なWatsonのAPIがあり、その中には無料で利用できる画像認識のためのAPIがある。ただし、自分の望む分類を可能にするためにはWatsonに学習させる必要がある。

## カスタム分類器の作成
アップデートによりAPIは変わっていくのだが、利用のための基本的な流れは[ここ](https://www.ibm.com/watson/developercloud/doc/visual-recognition/basic-tutorials.shtml)のチュートリアルを読むとわかりやすい。ちなみに、現時点での最新APIの情報は[ここ](https://watson-api-explorer.mybluemix.net/apis/visual-recognition-v3#/)を参照。

実行まではわずか3ステップ！
　1.Bluemixでサービスを追加 
　2.分類させたい画像をzipにして学習
　3.判別したい画像を確認
正直、画像を集めるのが一番大変だと思う。

## ステップ1:Bluemixでサービス追加
***そのうち書く：API_KEYを取得***


## ステップ2:画像をzipにして学習
分類機を作成するためには、判別したいモノの画像と、そうでないモノの画像をzipで固めてWatsonに送信する必要がある。今回はGoogle様にお願いして、カレーの画像を60枚、ハヤシライスを30枚、勢い余ってビーフシチューを３0枚ほど用意した。なお、どれにも分類されないnegativeな例も必要なので、適当にカツ丼の画像を利用した。
実行方法と結果は以下の通り。

```console
> curl -X POST 
   -F "curry_positive_examples=@curry.zip" 
   -F "hayashi_positive_examples=@hayashi.zip" 
   -F "beefstew_positive_examples=@beefstew.zip" 
   -F "negative_examples=@katsu.zip" 
   -F "name=food”   
   "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classifiers?api_key=e975c36e9f57b22bf8abb80b8a07c8946934ec62&version=2016-05-20"

{
    "classifier_id": "food_887927262",
    "name": "food",
    "owner": "1e47904a-82ad-4605-a939-b55280bf0438",
    "status": "training",
    "created": "2016-09-21T15:48:39.549Z",
    "classes": [
        {"class": "hayashi"},
        {"class": "curry"},
        {"class": "beefstew"}
    ]
}
```
オプション ”-F 名前_positive_examples” により、分類する種類を指定している。
今回のように複数の positive_examples (カレー、ハヤシライス、ビーフシチュー) を並べることも可能で、判別時にはそれぞれに確からしさを出力する。

学習の進行状況確認は以下のRESTを実行。

```console
> curl -X GET "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classifiers/food_887927262?api_key=e975c36e9f57b22bf8abb80b8a07c8946934ec62&version=2016-05-20"

{
    "classifier_id": "food_887927262",
    "name": "food",
    "owner": "1e47904a-82ad-4605-a939-b55280bf0438",
    "status": "ready",
    "created": "2016-09-21T15:48:39.549Z",
    "classes": [
        {"class": "hayashi"},
        {"class": "curry"},
        {"class": "beefstew"}
    ]
}
```
status が ready となると実際に判別を実行できる状態であり、この分類機で検出できるのは class にある hayashi、curry、beefstew であることがわかる。
今回の場合、学習は数十秒で終了した。画像ファイルの数が多い場合には、もっと時間がかかるのかもしれない。
なお、結果の classifier_id が分類機の名前であり、以後の問い合わせにはこれを利用する。

## ステップ３:判別したい画像で確認
自分で作成した分類器を使った分類の実行や、実行時のしきい値の指定はjsonファイルを作る必要がある。例えば、自分の作成した分類器を使って、結果表示のしきい値を 0.2 にするには以下のようなjsonファイルを作成する。

```console
> cat params.json

{"classifier_ids": ["food_887927262"],"threshold": 0.2 }
```

このjson(条件ファイル)を使って実行した結果は以下の通り。
この画像の場合、カレーである確率を表すscoreは 0.73471 であり、ハヤシライスやビーフシチューのscoreは 0.2 を下回っているため出力されていないことがわかる。

```console
> curl -X POST
   -F "images_file=@分類したい画像.jpg" 
   -F "parameters=@params.json" 
   'https://watson-api-explorer.mybluemix.net/visual-recognition/api/v3/classify?api_key=e975c36e9f57b22bf8abb80b8a07c8946934ec62&version=2016-05-20'

{
    "custom_classes": 3,
    "images": [
        {
            "classifiers": [
                {
                    "classes": [
                        {
                            "class": "curry",
                            "score": 0.73471
                        }
                    ],
                    "classifier_id": "food_887927262",
                    "name": "food"
                }
            ],
            "image": "curry1.jpg"
        }
    ],
    "images_processed": 1
}
```

確認に使った画像ファイルと結果は以下の通り。


| 画像 | 正解 | Watsonの結果 |
|:-:|:-:|:-:|
| ![curry1](https://cl.ly/1I2O3a3p1F0y/curry1.jpg)      |     カレー     | カレー=0.73　　   |
| ![curry３](https://cl.ly/2R3N3H011x3c/download/curry3.jpg)     |     カレー     | カレー=0.43、ハヤシ=0.49                               |
| ![hayashi1](https://cl.ly/0J2W1O0t2O03/hayashi1.jpg)     | ハヤシライス   | ビーフシチュー=0.52、ハヤシ=0.54                               |
| ![hayashi3](https://cl.ly/3G0k2w2C0C2f/hayashi3.jpg)     | ハヤシライス   | ハヤシ=0.91                               |
| ![beef1](https://cl.ly/1T342b1d3Y3C/beef1.jpg)     | ビーフシチュー | ビーフシチュー=0.91                               |
| ![beef2](https://cl.ly/311T0q473h0Y/beef2.jpg)     | ビーフシチュー | ビーフシチュー=0.53                               |
| ![curryN](https://cl.ly/3l1R0y2B2a11/curry_N.jpg)     | カレーうどん   | すべて反応せず                               |


# まとめ
少数の画像ファイルで作った分類機にもかかわらず、意外にもなかなか検討しているように感じる。
。。。でもまぁ、お母さんに「晩御飯はなに？」と聞くのが一番近道だよ、ということで今回はおわり。