Watson Visual Recognitionで手軽に画像認識してみよう！

#導入準備
IBM Watsonの「Visual Recognition」では、比較的簡単な手続きで機械学習による画像認識を利用することが可能です。

##１）サービスのサイトにアクセス
[IBM - Visual Recognition | IBM Watson Developer Cloud - Japan](https://www.ibm.com/watson/jp-ja/developercloud/visual-recognition.html)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/50cf42d1-d3ae-5171-bd61-83719328ab9c.png)
「IBM Cloud のライト・アカウントを登録」をクリック

##２）「Visual Recognition」で検索し、サービスを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/9788fd29-6375-7e91-cb76-801d8de884a2.png)

##３）右下の青い「登録して作成」をクリック。またはアカウントがある場合はログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/a72dd4e0-c7de-fcaa-0391-5a4e1e38c53d.png)

##４）ライト・プランを選択し、右下の青い「作成」ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/6fcc9d23-1dc6-cf71-c9be-803c297df543.png)

###ライト・プラン
**1カ月あたり1,000件のイベント:**

- トレーニング済みのモデル分類（一般、顔、食品、不適切）（イメージ）
- カスタム・モデル分類（イメージ）
- カスタム・モデル・トレーニング（イメージ）
- 2つのカスタム・モデル
- IBM Cloud組織あたり1つのライト・プラン・インスタンス
- Core MLへの無制限エクスポート

Visual Recognitionは既に学習済みの画像認識（一般分類器：default）を利用できますが、独自のカスタム・モデルを作り、新たな画像を学習させることも可能です。

> ライト・プランでは、1カ月あたり1,000個のイベント（イメージ）から開始し、2つのカスタム・モデルをトレーニングできます。

ライト・プランでは2つのカスタム・モデルのみ使うことが出来ます。新しくテストしたい場合は2つのうちいずれかを削除する必要があります。

> ライト・プラン・サービスは、非アクティブで30日経過すると削除されます。

ライト・プランだと、30日間使われないと学習させた設定が削除されてしまうようですね。

##５）「資格情報を表示」をクリックし、API 鍵をコピーしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/b1a08df5-1864-bf79-ea79-269b1b478e19.png)

#試してみる

下記の公式チュートリアルがあるので、これを元に試してみましょう（とは言えAPIの呼び出し方やエンドポイントなどの情報が2017年時点のものと古いため、解説箇所のみ参考にすると良いかと思います）。

入門チュートリアル
https://console.bluemix.net/docs/services/visual-recognition/getting-started.html#-

##イメージの分類

公式DEMOの[fruitbowl.jpg（果物の写真）](https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg)を画像認識にかけてみましょう。
※ curlは導入済みとします

```terminal
curl -X POST -u "apikey:{YOUR API KEY}" -F "images_file=@fruitbowl.jpg" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classify?version=2016-05-20"
```

```json
{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "banana",
                            "score": 0.562,
                            "type_hierarchy": "/fruit/banana"
                        },
                        {
                            "class": "fruit",
                            "score": 0.788
                        },
...（略）...
                    ]
                }
            ],
            "image": "fruitbowl.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}

```
一般分類器（default）にかけると上記のようになります。
信頼性スコア（score）は0～1の範囲で、**高いほど相関性が高い**ことを示します。
※ 一般分類器では0.5より低い場合は表示されないようです

次に、公式DEMOの[prez.jpg](https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/prez.jpg)を顔認識にかけてみましょう。今度はPOST /v3/detect_facesメソッドに変更します。

```terminal
curl -X POST -u "apikey:{YOUR API KEY}" -F "images_file=@prez.jpg" "https://gateway.watsonplatform.net/visual-recognition/api/v3/detect_faces?version=2016-05-20"
```

```json
{
    "images": [
        {
            "faces": [
                {
                    "age": {
                        "min": 44,
                        "max": 48,
                        "score": 0.64800006
                    },
                    "face_location": {
                        "height": 74,
                        "width": 67,
                        "left": 255,
                        "top": 100
                    },
                    "gender": {
                        "gender": "MALE",
                        "score": 0.99927264
                    }
                }
            ],
            "image": "prez.jpg"
        }
    ],
    "images_processed": 1
}
```
実行結果から、顔認識してその範囲や性別・年齢などを推測していることが分かります。

##カスタム分類器について

次に、独自のカスタム・モデルを作り、新たな画像を学習させてみます。
写真から猫を判別できるよう、猫の写真をポジティブパターンとして学習させ、ネガティブパターンとして犬の写真を学習させてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/8c041967-3e12-cafa-2b6b-5b0f4999abfb.png)
複数の写真をzip圧縮するのですが、学習させるためには最低で10枚の画像を必要とするようです。
なお、下記参考のDEMO用素材を見ると、51枚の画像が含まれていました。
色んなアングルで多いほど学習に有利になるのでしょうか。

カスタム分類器の作成
https://console.bluemix.net/docs/services/visual-recognition/tutorial-custom-classifier.html#-

###カスタム分類器の作成

```terminal
curl -X POST -u "apikey:{YOUR API KEY}" -F "cat_positive_examples=@cat.zip" -F "negative_examples=@dog.zip" --F "name=cat" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classifiers?version=2018-09-16"
```

```json
{
    "classifier_id": "cat_XXXXXXXXXX",
    "name": "cat",
    "status": "training",
    "owner": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX",
    "created": "2018-09-16T05:03:12.779Z",
    "updated": "2018-09-16T05:03:12.779Z",
    "classes": [
        {
            "class": "cat"
        }
    ],
    "core_ml_enabled": true
}
```

「status」が「training」となるとトレーニング開始となります。
表示された「classifier_id」の値をコピーしておきます。

###カスタム分類器の確認

先ほどコピーした「classifier_id」の値を使い、学習状況を問い合わせます。

```terminal
curl -X GET -u "apikey:{YOUR API KEY}" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classifiers/cat_XXXXXXXXXX?version=2018-09-16"
```
```json
{
    "classifier_id": "cat_XXXXXXXXXX",
    "name": "cat",
    "status": "ready",
...（略）...
}
```
「status」が「ready」に変わると、学習済みとなり、利用を開始できるようになります。

実際に猫の写真をカスタム分類器にかけてみると…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/1fcee880-399e-db14-8969-7e0a918e71f1.png)

```terminal
curl -X POST -u "apikey:{YOUR API KEY}" -F "images_file=@test.jpg" -F "classifier_ids=cat_XXXXXXXXXX" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classify?version=2018-09-18"
```
下記のように学習した上で画像認識していることを確認できました。

```json
{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "cat_XXXXXXXXXX",
                    "name": "cat",
                    "classes": [
                        {
                            "class": "cat",
                            "score": 0.911
                        }
                    ]
                }
            ],
            "image": "test.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 1
}
```

###カスタム分類器の更新
既に学習させたカスタム分類器に、再度学習させることが可能です。
画像を追加して学習させたい場合に使います。

```terminal
curl -X POST -u "apikey:{YOUR API KEY}" -F "cat_positive_examples=@cat.zip" -F "negative_examples=@dog.zip" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classifiers/cat_XXXXXXXXXX?version=2018-09-16"
```

今度は「status」が「retraining」に変わります。

```json
{
    "classifier_id": "cat_XXXXXXXXXX",
    "name": "cat",
    "status": "retraining",
...（略）...
}
```

###カスタム分類器の削除
最後に、学習させたカスタム分類器の削除です。

```terminal
curl -X DELETE -u "apikey:{YOUR API KEY}" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classifiers/cat_XXXXXXXXXX?version=2018-09-16"
```

実行すると、これだけが返って来ます。

```json
{}
```

#参考

[誰でもできる機械学習 Watson Visual Recognition（画像認識）の使い方 | あぱーブログ]
(https://blog.apar.jp/web/9425/)

[Visual Recognition - API reference | IBM Watson Developer Cloud](https://www.ibm.com/watson/developercloud/visual-recognition/api/v3/curl.html)

[Visual Recognition + Kotlin で撮影した画像で商品検索が出来る Android アプリを作ろう]
(https://www.ibm.com/developerworks/jp/cloud/library/kotlin/)

[Watson を利用するコツ: Watson Visual Recognition 内でカスタム分類子を使用するためのベスト・プラクティス](https://www.ibm.com/developerworks/jp/cognitive/library/cc-build-with-watson-tips-best-practices-custom-classifiers-visual-recognition/index.html)