Microsoft COCO が提供するデータとAPIを使用すると画像解析が簡単に出来た


#Microsoft COCOとは

<img width="316" alt="Screen Shot 2016-02-16 at 08.37.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/10496/b80c5dff-0c9b-e096-92c0-78a5eea533df.png">

引用：http://mscoco.org/


画像の認識、セグメンテーション、キャプショニングがされているデータセットです。

画像処理をしたいと思っても最初に衝突する問題がデータセットの問題ですが、Microsoft COCOには必要なデータセットが用意されており、pythonとMatlabのAPIも提供されているため、使用するのが簡単なのが特徴です。

まずは下記からデータセットをダウンロードしてください。

http://mscoco.org/dataset/#download

<img width="763" alt="Screen Shot 2016-02-16 at 08.39.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/10496/a4192f8c-bc7f-a255-a9cf-91f064952432.png">

上記のような画面が出てきます。
画像データはサイズが大きいので、どのような分析ができるか試したいだけでしたらValidation Dataをダウンロードして試すと良いと思います。

#MS COCO API 

上記のデータを分析するためのAPIです。
データをダウンロードさえすればこれで自由に分析できます。
私はpythonをよく使うのでpythonで環境構築して動作を試してみました。

https://github.com/pdollar/coco

```
# API Download
git clone https://github.com/pdollar/coco
# API install
cd coco/PythonAPI
python setup.py install
```

##フォルダ構成と準備

cocoのフォルダに下記のデレィクトリを作成し、画像とアノテーションのデータを置いておきます。

annotations
images

```
MatlabAPI	README.txt	images		results
PythonAPI	annotations	license.txt
```

PythonAPIのフォルダは下記のようになっており、ipython notebookを使用すると解析できます。

```
Makefile		pycocoDemo.ipynb	pycocotools
build			pycocoEvalDemo.ipynb	setup.py
```

ipython notebookの導入は下記を参考にしてください

http://qiita.com/icoxfog417/items/175f69d06f4e590face9

##画像の解析

ではいよいよ解析に入ります。

重要そうなところだけピックアップして説明していきます。

###画像の読み込みと準備

dataTypeのところにtrain2014,val2014,test2014の３種類から選択します。

```py
dataDir ='..'
dataType='val2014'
annFile='%s/annotations/instances_%s.json'%(dataDir,dataType)
```

下記のコードでデータのカテゴリとスーパーカテゴリが分かります。
スーパーカテゴリはカテゴリの上位概念みたいなものです。
例：
カテゴリ：犬、猫・・
スーパーカテゴリ：動物

```py
# initialize COCO api for instance annotations
coco=COCO(annFile)
# display COCO categories and supercategories
cats = coco.loadCats(coco.getCatIds())
nms=[cat['name'] for cat in cats]
print 'COCO categories: \n\n', ' '.join(nms)

nms = set([cat['supercategory'] for cat in cats])
print 'COCO supercategories: \n', ' '.join(nms)
```

下記のコードでどのカテゴリのデータを選択するかを選びます。
今回は"dog"を選択しています。
"dog"のカテゴリのデータからランダムに選択して読み込んでいます。

```py
# get all images containing given categories, select one at random
catIds = coco.getCatIds(catNms=['dog']);
imgIds = coco.getImgIds(catIds=catIds );
img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
```

画像の読み込みと表示は下記で行います。

```py
# load and display image
I = io.imread('%s/%s/%s'%(dataDirImage,dataType,img['file_name']))
plt.figure()
plt.imshow(I)
```

表示される画像です。
すごく癒されますね。笑

<img width="400" alt="Screen Shot 2016-02-16 at 09.04.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/10496/7b9b125a-c240-f7aa-0665-560691ffaf55.png">

###画像のフィルター

癒しの画像を解析してみます。

```py
# load and display instance annotations
plt.imshow(I)
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
coco.showAnns(anns)
```

画像の犬のデータが緑になっていることが確認できます。
`coco.getAnnIds`の部分でフィルターをかけています。
この関数の説明を見てみると下記のようになっています。
今回は読み込んだ画像のidを`imgIds=img['id']`で処理を行い、`catIds=catIds`で画像のフィルタリングを行っています。

```
        """
        Get ann ids that satisfy given filter conditions. default skips that filter
        :param imgIds  (int array)     : get anns for given imgs
               catIds  (int array)     : get anns for given cats
               areaRng (float array)   : get anns for given area range (e.g. [0 inf])
               iscrowd (boolean)       : get anns for given crowd label (False or True)
        :return: ids (int array)       : integer array of ann ids
        """
```

<img width="400" alt="Screen Shot 2016-02-16 at 09.06.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/10496/cf1e06f5-a73f-264a-9690-00f45e86577b.png">

###画像のキャプション

次に画像のキャプションをみてみましょう。
画像のキャプションとは画像の説明文です。

`caps.getAnnIds`で画像を指定してキャプションを取得しています。
他のコードで取得したキャプションを用いて画像とキャプションを生成しています。

```
# load and display caption annotations
annIds = caps.getAnnIds(imgIds=img['id']);
anns = caps.loadAnns(annIds)
caps.showAnns(anns)
plt.imshow(I)
plt.show()
```

<img width="400" alt="Screen Shot 2016-02-16 at 09.23.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/10496/69bf9886-e6df-b1cb-f0c7-8cf14a75341f.png">

キャプションの候補が複数確認できました。
キャプションは人によって解釈が異なるので複数候補がある方が助かりますね。

#最後に

画像解析したくてもデータがない問題には直面しやすいと思います。
このように解析まで簡単にできるものを提供してくれているMicrosoftはさすがと言えます。
Visual Studio Codeなどオープン化が進んでいるMicrosoftの今後の活動にも注目です。

# Error対応

```
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are Working with Matplotlib in a virtual enviroment see 'Working with Matplotlib in Virtual environments' in the Matplotlib FAQ

```

上記のエラーの場合は~/.matplotlib/matplotlibrc に次の一行を追加する


```
backend : TkAgg
```