Custom Vision ServiceのObject Detectionを使ってみた

以前、[Custom Vision Serviceを使ってみた](https://qiita.com/07JP27/items/55331da311544af1bb95)という記事を書きました。そのCustom Vision ServiceがUpdateされて写真のタグ付けだけでなく、写真の中のObject Detection(物体検出)もできるようになったのでまたまた使ってみました。
注：Object Detectionは2018/09/28時点でプレビュー

#Custom Vision Serviceとは
Custom Vision Serviceの概要については以下の記事に書いています。
[Custom Vision Serviceを使ってみた](https://qiita.com/07JP27/items/55331da311544af1bb95)

#実際にやってみる
前回は写真に写っている犬の犬種を当てるというようなモデルを作成したので、今回も同じテーマでモデルを作って見たいと思います。
[NEW PROJECT]から新しいプロジェクトを作成します。
<img width="640" alt="Custom Vision - Projects 2018-09-27 17-44-11.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/a6c4524e-ec6b-16d1-84d4-416641122666.png">
必要な情報を入れて[Project Types]は[Object Detection]を選択します。
<img width="363" alt="Custom Vision - Projects 2018-09-27 17-45-45.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/34052c40-97e4-bbd9-6d25-a05e919d8348.png">
空のプロジェクトができるのでトレーニング用の写真を登録します。[Add images]を選択します。
<img width="640" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-46-29.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/055ecbb6-de0a-b4ca-d2ef-33ad55ada862.png">
訓練データを選択して[Upload XX files]を選択。
<img width="324" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-48-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/f4711e43-772b-d10e-83c8-d932bd9d526b.png">
アップロードが完了したら[Done]
<img width="312" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-48-13.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/8e3d0abd-ac27-e50c-7b67-48af14f280ca.png">
左ペインの[Tags]の[Untagged]の中にアップロードした画像は入ります。
表示されている画像のどれかを選択します。
<img width="640" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-48-32.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/fe9cecee-9973-8c16-5d50-5497119bec57.png">
写真をタグで分けるのであればまとめてタグ付けなどができるのですが、Object Detectionは画像内での物体の位置の情報が必要になるのでここからは１枚１枚の操作になります。
画像を選択するとプレビューが表示されるので、対象が写っているエリアをマウスドラッグで選択しタグを入力します。
<img width="530" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-49-05.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/c82df733-7803-fd25-4f9a-7668d0a3631f.png">
アップロードした写真に対してどんどん同じ操作をします。
画面右にある[>]を選択することで次の訓練データを表示することができます。
<img width="536" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-50-14.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/f99ba030-96f6-d891-a169-da4452d4c4cc.png">
同じようにビーグルもタグ付け
<img width="534" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-52-27.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/7fc0a8ee-207b-8ec6-ea90-f6588f0dc766.png">
ミニチュアシュナウザーもタグ付け
<img width="524" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-55-30.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/bcbf5e37-5d47-2934-6554-06da547ae9b1.png">
２頭写っている写真もそれぞれタグ付けします。
<img width="516" alt="Custom Vision: dog-detection - Training Images 2018-09-27 18-03-03.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/015d2a3e-815b-f1c0-e6ce-cae81178e931.png">

全てのデータのラベリングをしたら先ほどの左ペインの[Tags]の[Tagged]の中に全ての訓練データが入ります。
**ここではまだ学習は終了していません。画面右上の[Train]を選択して学習を開始します。**
<img width="640" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-56-28.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/0a8cb2e6-5aea-f08c-3855-032c09448f55.png">
【備考】タグあたりの写真の枚数が15枚未満だと学習を行うことができません。
[公式ドキュメント](https://docs.microsoft.com/en-us/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier)の前提条件には
>A series of images to train your classifier (with a minimum of 30 images per tag).

とあるのですが、なぜここに差があるのかは不明です。
<img width="239" alt="Custom Vision: dog-detection - Training Images 2018-09-27 17-57-22.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/36d42292-c662-1f6a-95d9-3a47637acabc.png">

正常に学習が完了すると以下のような画面に遷移します。
とりあえずモデルをテストしたいので画面右の[Quick Test]を選択します。
<img width="640" alt="Custom Vision: dog-detection - Performance 2018-09-27 18-07-54.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/b7eed558-8613-0ec7-9993-26c13b3fd465.png">
評価データは画像のURLまたはローカルから選択することができます。
<img width="534" alt="Custom Vision: dog-detection - Performance 2018-09-27 18-09-15.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/1dbcb4a3-b7d3-b5d7-e970-8324c5b70614.png">
まずはビーグル１頭の写真を評価してみます。
![ビーグル.jpg](https://qiita-image-store.s3.amazonaws.com/0/149212/7d4826f4-74a8-5238-0a2e-61e78545d49b.jpeg)
結果は98.6%の確率で赤枠の部分がビーグルであると判定されました。
<img width="522" alt="Custom Vision: dog-detection - Performance 2018-09-27 18-10-37.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/7721f584-bdb1-7cd5-7b89-201e80a5686c.png">
では次にビーグルとミニチュアシュナウザーそれぞれ１頭ずつの画像ではどうでしょうか。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/149212/319ef804-425a-5f01-c49b-396ed818142f.jpeg)

Well done!!
それぞれの位置がとタグ付けがほぼ完璧にできていますね。
しかも複数の犬種が混ざった写真は学習させていないのに１枚の写真に写った複数の犬種を検出することができました。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.amazonaws.com/0/149212/81381711-9983-46b5-7e43-c80b67a477da.gif)

作成したモデルは今までのCustom Vision Serviceと同じようにWeb API経由で使用することができます。
[Performance]から[Prediction URL]を選択して接続情報を入手できます。
<img width="640" alt="Custom Vision: dog-detection - Performance 2018-09-27 18-15-23.png" src="https://qiita-image-store.s3.amazonaws.com/0/149212/c94108d1-ab6f-d937-d366-477eaa4da039.png">

#モデルのExportはまだできない
Classificationのプロジェクトタイプで可能なTensor Flow, CoreML, ONNXファイルへのExport機能は2018/09/28時点ではまだ使用できないようです。

#さいごに
この機能のリリースが2017年後半だったと記憶しているのでだいぶ時間が経ってしまいましたがCustom Vision Serviceの進化を実感しました！