docomoの画像認識APIを用いたカテゴリ推定

#やりたいこと
docomoが公開している画像認識APIを利用して画像のカテゴリを推定します。

画像認識APIでは、Deep Learningで学習したモデルを基にカテゴリの推定を行っています。
Deep Learningによる画像認識するプログラムを一から実装したくないけど、画像認識をやってみたいという方向けです。

### **今回実装したコードは[こちら](https://github.com/ichiroex/imageRecognition)にアップしています。**

### 文字認識を行いたい方はこちら

 - [docomoの文字認識APIを使って画像から文字を抽出](http://qiita.com/ichiroex/items/30ffaf53c504d7473bb4)

#事前準備
- docomo Developer supportに登録してAPI keyを取得する。
 - [docomo Developer support](https://dev.smt.docomo.ne.jp/?p=index)
- 認識したい画像ファイルを用意 (JPEG, PNG, GIF, BMP, TIFF形式)
- 詳しくはリファレンスを参照
 - [リファレンス](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=image_recognition&p_name=category_classify#category-list)

#認識する画像ファイル (rose.jpg)
![rose.jpg](https://qiita-image-store.s3.amazonaws.com/0/92685/0c46dd70-959b-649a-cc35-9c08fc2eb0dc.jpeg)

#開発環境
 - Python 2.7系

#プログラム

コード中の(APIKEY)には、docomo developer supportから取得したAPIキーを代入して下さい。

```lang:imageRecognition.py
# -*- coding: utf-8 -*-
# implemented by ichiroex
# other codes are also available on GitHub (https://github.com/ichiroex)

from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2
import json
import time 
import urllib
import re
import sys
import argparse

#画像データを投げて、カテゴリの候補上位5つを取得 (カテゴリ認識)
def getImageCategory(fname, modelName):

    register_openers()
    
    APIKEY = "(APIKEY)"
    url = 'https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/concept/classify/?APIKEY=' + APIKEY
    
    f = open(fname, 'r')

    datagen, headers = multipart_encode({"image": f, 'modelName': modelName})
    request = urllib2.Request(url,datagen, headers)
    response = urllib2.urlopen(request)
    
    res_dat = response.read()
   
    #return candidate list
    return json.loads(res_dat)['candidates']


if __name__ == '__main__':
    
    # 引数 (オプション設定)
    parser = argparse.ArgumentParser()
    parser.add_argument('--image'    , dest='image', type=str, default='rose.jpg', help='name of input image')
    parser.add_argument('--model'    , dest='model', type=str, default='scene', help='modelName = {scene, fashion_pattern, fashion_type, fashion_style, fashion_color, food, flower, kinoko}')

    args = parser.parse_args()
    
    # 画像ファイル名, modelName の設定
    fname = args.image
    model_name = args.model
    
    # カテゴリ候補の取得 (カテゴリ認識を利用)
    candidate_list = getImageCategory(fname, model_name)
    
    # カテゴリのタグとスコアを表示
    for can in candidate_list:
        print can['tag'], can['score']
```

#実行結果
--imageオプションで画像ファイルを指定することができます。
デフォルトでは、rose.jpgとなっています。

また、--modelオプションを使うと、推定する時に使用するモデルを指定することができます。
例えば、「--model scene」と指定すると、"結婚式"、"水族館"、"花"、"動物"などのシーンを推定するモデルを利用できます。（デフォルトでは、sceneとしています。）

以下にrose.jpgのシーンのカテゴリを推定した結果を示します。
カテゴリと確からしさを表すスコアを表示しています。

```
$ python imageRecognition.py --image rose.jpg
花 0.999078631401
アウトドア 0.000487390527269
ゴルフ 0.000105955921754
サッカー 0.000101881953015
絵・工作 3.79223347409e-05
```

以下のように、「--model flower」をオプションで追加すると、花のカテゴリを推定できます。

```
$ python imageRecognition.py --image rose.jpg --model flower
バラ 0.992434620857
ミニバラ 0.00756544619799
サザンカ 3.99395894135e-09
カランコエ 2.60835908428e-09
ゼラニウム 1.24757426612e-09
```

#あとがき
Deep Learningで学習したモデルを利用して簡単に画像のカテゴリを推定することができました。
developer登録さえ済ませれば気軽に利用することができるので、何かアプリなどを作りたい方には便利です。

画像認識以外にも、様々なAPIが公開されているので活用してみたいと思います。