寿司の見分け方

この記事はオールアバウトアドベントカレンダー 4日目の記事になります。
~~ちなみにこの記事は予約投稿で投稿しています。~~

~~執筆者は寝ているか遊びに行っているかでしょう。~~
うまく予約投稿できずに結局手動投稿するという


-----

今回はみんな大好きな:sushi:が各画像認識APIで正しく判別できるか実験してみたのでその報告になります。

なお対象画像は弊社サービスの
AllAboutまとめで実際に使われた画像を使用しています。
(https://allabout.co.jp/matome/cl000000004095/)
の左上画像を使用しています。

今回は以下の4種類+αの画像認識APIを使いました。

α:

- Amazon Rekognition

使用API

- imagga API
- google cloud vision API
- Docomo 画像認識API
- IBM Watson Visual Recognition API

# Amazon Rekognition
Amazon Rekognitionは12/1に発表したAWSのディープラーニングによる画像検出と認識が可能なAPIです。  
詳しい説明は以下記事にまかせてみるとして、実際に触ってみました。
http://dev.classmethod.jp/cloud/aws/reinvent2016-new-service-amazon-rekognition/
https://aws.amazon.com/jp/blogs/news/amazon-rekognition-image-detection-and-recognition-powered-by-deep-learning/

ConsoleにログインするとDemo画面が有り、画像をUploadするだけで試すことが可能です。
今回の寿司画像では以下の結果が得られました。

```
{ 
	"Labels": [
		{ 
			"Confidence": 99.31476593017578, "Name": "Food" 
		}, { 
			"Confidence": 99.31476593017578, "Name": "Sushi" 
		} 
	] 
}
```

ちゃんと寿司と判断できてるみたいです。
今回はプログラムからは叩いていないのですがドキュメントを軽く見た感じS3に上げた画像を取得してきて
それを解析するような感じになるのかなーと思います。  
今回一画像のみの解析のため精度はどうかわからないので今後使ってみたいですね。

## 料金
https://aws.amazon.com/jp/rekognition/pricing/
無料枠として新規アカウントだと月間5000画像の解析と1000枚の顔メタデータの保存が可能です。
また、最初の百万枚に関しては1000枚あたり1$で使えるみたいですね。



# imagga API
[imagga](https://imagga.com/) は Imagga Technologis Ltd.が開発運用している画像認識や画像のカテゴライズを行うPaasです。
imaggaでは画像にタグ付けを行うAPIを提供しています。

## 料金プラン
HACKERというプランでは無料で月間2000画像まで叩くことが可能です。
Developerでは$14で月間12000画像分叩くことができます。

## APIの使用方法
登録/ログインすると
API KEY/API Secret / Authorizationの情報が手に入ります。
以下サンプルプログラムでAPIを叩くことができます。
ソース:
https://gist.github.com/ytakky2014/0aa98f461d98cc284dd0828b89e100c1


$fileにはurlでもローカルの画像をfile_get_contentsしたものでも使用可能
$tag->confidenceに信頼度（いわゆるスコア)が Max 100で取得できる。
また、$tag->tagに分類した tagが取得できる。
imagga APIでは languageを指定すると翻訳された状態で取得ができる。
(一部日本語として怪しい部分はある)

## 結果
```
confidence : 100 tag : 寿司
confidence : 100 tag : 料理
confidence : 66.981958928571 tag : 栄養成分
confidence : 57.15441570294 tag : 食品
confidence : 35.536451473871 tag : おいしい
```

```
confidence : 100 tag : sushi
confidence : 97.689211881122 tag : dish
confidence : 66.981958928571 tag : nutriment
confidence : 57.154415715557 tag : food
confidence : 30.808774506567 tag : gourmet
```

ちゃんと寿司と出ましたね。
単純にgetでAPIを叩けばいいだけなので、使い勝手はかなりいいです。


# google cloud vision API
[google cloud vision API](https://cloud.google.com/vision/) は、googleが提供している画像認識のAPIである。
google cloud vision APIでは物体の判別の他にOCRや表情検知、画像が有害かどうかの検知が可能である。

## 料金プラン
物体検知やOCR,顔検知など機能毎に 1000回/月　無料で使える。
それ以降は1000ユニットごとに各機能ごとに料金プランが変わる。
https://cloud.google.com/vision/

## APIの使用方法
API Manager -> 認証情報を作成でAPIキーを選択するとKEYが発行される。
ENDPOINT:
https://vision.googleapis.com/v1/images:annotate?key={KEY}

に対して、画像を含め必要な情報をRequest bodyに含めてPOSTするとその画像の判別が可能である。

https://gist.github.com/ytakky2014/447c3e0caf636d5680e18425a3699937

注意するところは画像はbase64でenocdeする必要があるとこである。
また、featuresに使いたい機能を追加することで1度のリクエストで複数機能で解析が可能である。

## 結果

```
"mid": "/m/02q08p0", "description": "dish", "score": 0.94878483
"mid": "/m/02wbm", "description": "food", "score": 0.94398296
"mid": "/m/0krfg", "description": "meal", "score": 0.87667847
"mid": "/m/04scj", "description": "meat", "score": 0.87649405
"mid": "/m/0hz4q", "description": "breakfast", "score": 0.78169477
```

google cloud vision APIでは寿司と認識することができなかった。
他にもサンプル画像何枚か与えてみましたが、cloud vision apiでは食べ物の認識率はあまり良くないように思えました。
ただ、cloud vision apiは画像の認識（カテゴライズ)だけでなく、OCRやランドマーク認識、顔認識など様々な機能が1つの実装で可能です。
また、Google Cloud PlatformだけあってGCS上の画像処理をするのも容易にできるため、サービスで組み込む、などもすぐできそうです。

# Docomo画像認識API
[Docomo画像認識API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=image_recognition&p_name=api_usage_scenario)はDocomoが提供している画像認識のAPIです。
物体検知（物体のカテゴリ認識)や顔認識を提供している。

## 料金プラン
個人利用でかつ非商用利用であれば1APIエンドポイントに対して2000リクエスト/月使用が可能。
商用利用には申請が必要でかつ使用するアプリケーションの申請などが必要です。

## APIの使用方法
会員登録後 https://dev.smt.docomo.ne.jp/?p=mypage.api.index&ref=applybutton からアプリケーション登録することでclientid,client secret, API keyが取得可能。

ENDPOINT
https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/concept/classify/?APIKEY={API_key}

に対して RequestBodyに modelNameと imageを与えてPOSTすることで情報が取得できる。
modelNameにはfoodやfashion_typeなどを指定することが出来る。
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=image_recognition&p_name=category_classify#category-list

マニュアルよりAPIコンソールを見たほうがわかりやすいです。
https://dev.smt.docomo.ne.jp/?p=common_page&p_name=apiconsole_image_recognition_category_classify&api=imageRecognition&scope=category_classify

ソース:
https://gist.github.com/ytakky2014/d2220aa767391f0955771f908b260952

画像ファイル自体をPOSTする必要があります。
このプログラムを組むまで使う機会がなかったのではまっていたのですが、
curlでFileをPOSTする際には[CURLFile](http://php.net/manual/ja/class.curlfile.php)を使う必要があるので注意しましょう。

## 結果

```
["tag"]=> string(12) "握り寿司" ["score"]=> float(0.99999403953552)
["tag"]=> string(15) "おせち料理" ["score"]=> float(5.6730123105808E-6)
["tag"]=> string(9) "煮つけ" ["score"]=> float(1.3081398719805E-7)
["tag"]=> string(12) "おにぎり" ["score"]=> float(7.2794783534391E-8)
["tag"]=> string(12) "ベーコン" ["score"]=> float(5.8088418519731E-9)
```

日本語で返却される点や食べ物に限ればほぼ正確に分析してくれるところが素晴らしいです。
他のAPIに比べて寿司のなかでも、握り寿司やちらしずしのレベルまで分析してくれるのがすごいです。
その反面他のAPIと組み合わせて使おうとすると、握り寿司といなり寿司とちらし寿司と巻き寿司は寿司である。という実装が必要なのが若干マイナス点です。


# IBM Watson  Visual Recognition API
[IBM Watson Visual Recognition API ] (http://www.ibm.com/watson/developercloud/doc/visual-recognition/) はIBM製の画像分類 APIです。
Watsonと名前がつく通り、あの有名なWatsonがベースにある。

## 料金プラン
1日あたり250画像、と1000画像までを利用したカスタム分類器のトレーニングが可能。
カスタム分類機は1ヶ月間保持される

## APIの使用方法
https://console.ng.bluemix.net/ からIBMのIDを登録する。
登録するとメールが送られてくるのでConfirmする。

その後ウィザードにしたかって組織の作成/スペースの作成を行う。
個人で使用するさいにはあまり使わないので適当で良いかなと思います。
作った後Watsonを選択しVisual Recognitionを選択して価格プラン等を確認して作成する。
作成後サービス資格情報の中にキー名/アクション資格情報の表示があるので資格情報を表示して、 url(API ENDPOINT)とapi_keyをメモっておく。

https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify/
に対してgetでgetパラメータとして、以下を与えて叩けば良い。

```
'url' => 対象画像パス,
'classifier_ids' => 'default',
'api_key' => API_KEY,
'owners' => 'me',
'threshold' => 0.25,
'version' => '2016-05-20'
```

実装例
ソース:
https://gist.github.com/ytakky2014/eb0c5b473cee0e8e63bd51c2ebf827d7

## 結果
```
"classes": [
            {
              "class": "food",
              "score": 0.916827
            },
            {
              "class": "salad",
              "score": 0.524979,
              "type_hierarchy": "/recipes/dishes/salad"
            },
            {
              "class": "sushi",
              "score": 0.331812,
              "type_hierarchy": "/products/dishes/sushi"
            }
          ],
```

寿司と一応分析されたのですが、食べ物であるというスコアの方が高いのでデフォルトの分類器のままでは
弱いかなと思います。

Watsonが特徴的なのはAPI経由で自分で分類器を作成できるという点であるので
カスタマイズするのであれば有効に使えると思います。

# まとめ
今回は寿司の画像のみ分類してみました。
テストではステーキの画像も分類してみましたが、そちらはちゃんと分析できていました。

現時点では食べ物の画像のみしか分析を行っていませんでしたが、今後は他の画像の分析もしてみたいと思います。