カレーライスとハヤシライス
子供の頃、夕ご飯はカレーと思って一口食べたら実はハヤシライスで大ショック、という経験は誰にでもあるはずだ。今をときめくWatsonで、世界の子ども達の悲しみを止めることができるか確認してみる。
Watson画像認識API(Visual Recognition)
IBM Bluemix上には様々なWatsonのAPIがあり、その中には無料で利用できる画像認識のためのAPIがある。ただし、自分の望む分類を可能にするためにはWatsonに学習させる必要がある。
カスタム分類器の作成
アップデートによりAPIは変わっていくのだが、利用のための基本的な流れはここのチュートリアルを読むとわかりやすい。ちなみに、現時点での最新APIの情報はここを参照。
実行まではわずか3ステップ!
1.Bluemixでサービスを追加
2.分類させたい画像をzipにして学習
3.判別したい画像を確認
正直、画像を集めるのが一番大変だと思う。
ステップ1:Bluemixでサービス追加
そのうち書く:API_KEYを取得
ステップ2:画像をzipにして学習
分類機を作成するためには、判別したいモノの画像と、そうでないモノの画像をzipで固めてWatsonに送信する必要がある。今回はGoogle様にお願いして、カレーの画像を60枚、ハヤシライスを30枚、勢い余ってビーフシチューを30枚ほど用意した。なお、どれにも分類されないnegativeな例も必要なので、適当にカツ丼の画像を利用した。
実行方法と結果は以下の通り。
> 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を実行。
> 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 が分類機の名前であり、以後の問い合わせにはこれを利用する。
ステップ3:判別したい画像で確認
自分で作成した分類器を使った分類の実行や、実行時のしきい値の指定はjsonファイルを作る必要がある。例えば、自分の作成した分類器を使って、結果表示のしきい値を 0.2 にするには以下のようなjsonファイルを作成する。
> cat params.json
{"classifier_ids": ["food_887927262"],"threshold": 0.2 }
このjson(条件ファイル)を使って実行した結果は以下の通り。
この画像の場合、カレーである確率を表すscoreは 0.73471 であり、ハヤシライスやビーフシチューのscoreは 0.2 を下回っているため出力されていないことがわかる。
> 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の結果 |
---|---|---|
カレー | カレー=0.73 | |
カレー | カレー=0.43、ハヤシ=0.49 | |
ハヤシライス | ビーフシチュー=0.52、ハヤシ=0.54 | |
ハヤシライス | ハヤシ=0.91 | |
ビーフシチュー | ビーフシチュー=0.91 | |
ビーフシチュー | ビーフシチュー=0.53 | |
カレーうどん | すべて反応せず |
まとめ
少数の画像ファイルで作った分類機にもかかわらず、意外にもなかなか検討しているように感じる。
。。。でもまぁ、お母さんに「晩御飯はなに?」と聞くのが一番近道だよ、ということで今回はおわり。