Custom Vision Serviceを使ってみた

## Custom Vision Serviceの発表
現地時間5/10にシアトルで行われたBuild 2017キーノートにてCognitive Servicesの一つとしてCustom Vision Serviceが発表されました。
![build-2-640x376.png](https://qiita-image-store.s3.amazonaws.com/0/149212/caaffee9-2477-fc7f-521a-1dddc01450dd.png)


## Custom Vision Serviceとは
今までのCognitive Serviceは基本的にはモデルをMicrosoftが準備しており、顔写真から年齢、性別などを推測するなどができました。

今回発表されたCustom Vision Serviceはモデルを自分で作ることができます(**しかもGUIで**)。

Buildのデモでは様々な種類の植物の写真をアップロード、学習させた後に種類のわからない植物の写真から種類を判定していました。
**つまり前に話題になった[きゅうり選別機](http://gigazine.net/news/20160901-deep-learning-cucumber-sorter/)のような判定機構をコーディングレスで作成できるのです!!**

## 実際に使ってみる
**MSのりんなも犬種の判別をしてくれることで話題になりましたが、今回はそれにならって、犬の写真から犬種を判別するモデルを作成したいと思います。**
[Custom Vision Service](https://azure.microsoft.com/ja-jp/services/cognitive-services/custom-vision-service/)のサイトに行きます。[Try Custom Vision Service]をクリック
![2017-05-11_14h32_42.png](https://qiita-image-store.s3.amazonaws.com/0/149212/2dc8d0bb-35a3-d0b2-02eb-78857f27b28d.png)
[New Project]をクリック
![2017-05-11_14h32_47.png](https://qiita-image-store.s3.amazonaws.com/0/149212/30836096-93e6-a72d-8ed1-ca43349b34de.png)
自分がわかるように入れて[Create Project]をクリック
![2017-05-11_14h33_06.png](https://qiita-image-store.s3.amazonaws.com/0/149212/ce5aa514-4526-789c-19f2-f81d319df0c3.png)
まだ何も学習させていないので中身は空っぽです。では学習データとなる画像をアップロードしましょう。[Add Images]をクリック
![2017-05-11_14h33_20.png](https://qiita-image-store.s3.amazonaws.com/0/149212/b55baff1-bc39-1a68-037d-f87d86cde008.png)
1種目はビーグルの写真を学習させます。適当にネットから拾ってきたビーグルの写真を**複数枚(※)**アップロードし、[Add some tags to this batch of images...]のところに「ビーグル」とダクを入力後[+]をクリックして[Upload n file]をクリックするとアップロード完了です。

【2018/09/27 Update】
※複数枚と書いていますが、[MSのドキュメント](https://docs.microsoft.com/en-us/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier)を見ていたら
>with a minimum of 30 images per tag
>(概訳：タグ毎に最低30枚の画像が必要です）

という記述がありました。また画像のサイズについては
>We recommend that images be 256 pixels on the shortest edge. Any images shorter than 256 pixels on the shortest edge are scaled up by Custom Vision Service.
(概訳：画像の短辺は256ピクセルにすることをお勧めします。256ピクセルより短い画像は、自動的に拡大されます。)

というような記述もありました。

![2017-05-11_14h38_11.png](https://qiita-image-store.s3.amazonaws.com/0/149212/6ea69f90-f144-ca16-c9c1-54d1a87c5fdf.png)
同じようにゴールデンレトリーバーとミニチュアシュナウザーをアップロードしました。
![2017-05-11_14h40_23.png](https://qiita-image-store.s3.amazonaws.com/0/149212/a1ee5a9d-72ab-0b45-54e2-060836396b37.png)
![2017-05-11_14h42_23.png](https://qiita-image-store.s3.amazonaws.com/0/149212/604d1c02-1b67-ade7-4065-8359e2572192.png)
**ここで注意しなければならないのはアップロードしただけでは学習は完了していません。**
アップロード一覧の上部メニューバーにある[Train]をクリックして学習を開始させましょう。
![2017-05-11_14h42_42.png](https://qiita-image-store.s3.amazonaws.com/0/149212/f532f6dc-864e-2acf-594a-8f5bcab5774a.png)
学習が完了すると結果が表示されます。
![2017-05-11_14h43_18.png](https://qiita-image-store.s3.amazonaws.com/0/149212/fbd867b5-6845-ecf5-57c3-49dd57168dfc.png)
とりあえず、結果の分析はおいておいてテストをしてみます。メニューバーの[Quick Test]をクリック。
![2017-05-11_14h43_18.png](https://qiita-image-store.s3.amazonaws.com/0/149212/b7d5e84b-5d4f-873e-0d64-e43e2e9ae887.png)
今回は学習データにない以下のようなビーグルの写真を使ってテストしてみます。
![2017-05-11_14h44_42.png](https://qiita-image-store.s3.amazonaws.com/0/149212/b8ebf34a-e54a-e112-3641-70b2b182da0b.png)
テストしたい画像を選択して[→]をクリック
![2017-05-11_14h44_48.png](https://qiita-image-store.s3.amazonaws.com/0/149212/6206bb04-ebbe-3116-c25c-a9505b644c1f.png)

結果が表示されました。ビーグルが98.7%、他が10%以下つまりビーグルの可能性が高いと出ました。
![2017-05-11_14h44_56.png](https://qiita-image-store.s3.amazonaws.com/0/149212/984d1771-3f50-13be-14de-3dce655e3d63.png)
続いて、学習させていない柴犬の画像をテストしてみます。
![2017-05-11_14h45_38.png](https://qiita-image-store.s3.amazonaws.com/0/149212/b026e081-0e1e-aa4b-43ca-05327cb7ac5c.png)
結果的にはビーグルの確率が一番高いですが、それでも25%程度とあまり高くありません。
![2017-05-11_14h45_40.png](https://qiita-image-store.s3.amazonaws.com/0/149212/f0708768-858a-223d-c7e4-691bc843ee2c.png)

## テスト画像を学習データにする
Custom Vision Serviceは判定に使用されたデータも学習データとしてActive learningを行うことができます。これを使うと精度の向上が期待できますね。上部メニューの[PREDICTIONS]をクリックすると、先ほどテストした画像が出てくるので学習データにしたい画像をクリック。
![2017-05-11_14h46_05.png](https://qiita-image-store.s3.amazonaws.com/0/149212/f02b69bd-b6b7-1b29-5ece-6542f16d694f.png)
[My tag]に「ビーグル」と入力してこれがビーグルの画像であると教えましょう。**下の画像では見えませんが画面をスクロールすると[Save and close]というボタンが出てきますので、クリックして保存します。教えた後は[Train]ボタンを押すことも忘れずに。**
![2017-05-11_14h46_15.png](https://qiita-image-store.s3.amazonaws.com/0/149212/44ca2296-5961-7ff5-8c6b-9032ea299ae5.png)


## APIで使用する。
今回はQuick Testしかやりませんでしたが作成したモデルをAPIにすることも可能です。上部メニューの[PERFORMANCE]を選択し、[Prediction URL]をクリックします。
![2017-05-11_16h59_00.png](https://qiita-image-store.s3.amazonaws.com/0/149212/52aeb298-a229-f028-f57c-6795b0b2681f.png)
API呼び出しに必要なエンドポイント等の情報が表示されます。
![2017-05-11_14h47_04.png](https://qiita-image-store.s3.amazonaws.com/0/149212/0319d6bd-44ff-93b0-0ac3-6af805c62f80.png)


## 最後に
今回はリリースニュースを聞いてさらっと触ってみましたが、体感精度は高いと感じました。
またプレビュー版ということでわざと日本語を使ってみましたが、普通に使えますね。
今後もCognitive Serviceの進化に期待です！！

【2018/09/28Update】
2017年末に追加されたObject Detection(物体検出)も使ってみました！
[Custom Vision ServiceのObject Detectionを使ってみた](https://qiita.com/07JP27/items/17d4e444223e024d7991)