AutoML VisionでFIFAのプレイ画像を識別する

# やってることを３行で

- **AutoML Vision**を使えば自分が持つラベルつき画像を学習させて、個別の画像認識問題を解けるようになる
- ローカルPCの画像やGCSに溜めている**FIFAのプレイ画像をAutoML Visionに食わせて**ラベルをつけた
- **極めて少ないサンプルでも**インプレイ画像とハイライトや得点シーンなどのアウトオブプレイ画像を**ちゃんと識別**してくれている(勿論、問題設定によってはサンプルが重要なこともある)

# AutoML Visionとは
[公式リファレンス](http://cloud.google.com/automl/?hl=ja)によると

> Cloud AutoML は機械学習プロダクトのスイートです。AutoML を利用すると、機械学習の専門知識があまりない開発者でも Google の最先端の転移学習とニューラル アーキテクチャ検索技術を利用して、ビジネスニーズに合った高品質のモデルをトレーニングできます。

機械学習プロダクトのスイートってなんや？:rolling_eyes:

要はこういうことかと。。

- Cloud AutoML Visionが機械学習モデルをトレーニングして、自分の定義したラベルに従って画像を分類可能
- 自分で画像認用のモデルをゴリゴリ作成する必要がないので、統計や深層学習の知識は不要（しかし、２値・多値分類の評価方法ぐらいは知っておく必要がある）
- ただし本格的に導入しようとしたらそれなりにお金が掛かるので**資金はあるが技術がない**人には最適


# AutoMLでFIFAの画像を分類する
以前に単純な機械学習のアルゴリズムでFIFAのプレイ動画のシーンを識別してプレイ部分だけを再編集した動画を生成できるか検証したが、今回はAutoML Visionを使って同じようにシチュエーションの異なるシーンを識別できるか検証する

[Qiita: 機械学習を使ってゲーム動画からプレイシーンだけを抽出出来るか検証する。ちなみにだいたい出来た。](http://qiita.com/Hyperion13fleet/items/61b81d7255a4ae52133c)


## 1.GCSにプレイ画像のキャプチャをUploadする
自分のPCから直接画像ファイルをあげることもできるが、GCS（GoogleCloudStorage）からもUploadできるので、AutoMLのデータインポート画面で提示されている`gs://{自分のPJのパス}`の配下に画像ファイルを格納しておく

![スクリーンショット 2019-04-07 14.49.392.png](https://qiita-image-store.s3.amazonaws.com/0/55225/df560f8d-f821-7b6a-191d-5ff21ecd83c2.png)


## 2.AutoMLにGCS(or ローカルPC)から画像をUploadする
AutoMLに対して画像をUploadする方法は、主に２つ

1. 自身のPCにある画像を直接Uploadする
2. Upload対象のGCSに格納してある画像ファイルを指定したCSVファイルを読み込ませてUploadする

パッと試したければ自身のPCから直接画像をあげるのでいいと思うが、APIの活用を視野に入れる場合は２の方法も検討した方が良い

しかも、２の場合には画像のPATHを指定したCSVファイルに**ラベルを事前につけておくことが出来る**ので、画面上でラベリングを後でしなくても良いため結局楽かも。。。

csvはこんな感じで用意する

```text:sample.csv

# gcsのファイルパス,ラベル
gs://{sample.csvと同一バケット}/inplay/fifa_cap_0001.png,inplay
gs://{sample.csvと同一バケット}/inplay/fifa_cap_0002.png,inplay
gs://{sample.csvと同一バケット}/inplay/fifa_cap_0003.png,outplay
gs://{sample.csvと同一バケット}/inplay/fifa_cap_0004.png,setting

```
*画像のパスを記載したCSVファイルと同じバケットに画像ファイルを置いておく必要があるので注意

そしてGCSを利用する場合は、事前にAutoMLがGCSに対してアクセスできるようにAPIを有効にしておく必要がある


*詳しくは[クイックスタートのページ](http://cloud.google.com/vision/automl/docs/quickstart?hl=ja#add_permissions_for_the_automl_vision_service_account)を参照

## 3.インプレイ画像とアウトオブプレイ画像をラベル付けする
画像をUploadし終えると、画面上でラベルを付与できる

ローカルPCからUploadする場合には、事前にラベルごとにフォルダーを分けておいて
全選択->ラベルの一括付与
でラベリングしていった方が手っ取り早い

勿論、GCSでCSVに事前にラベルを付与しておけばこの工程は完全に省ける

ラベルの付与を終えるとこんな感じになる

![スクリーンショット 2019-04-07 15.23.47.png](https://qiita-image-store.s3.amazonaws.com/0/55225/e9210123-1588-a491-524d-e5e70452fcdf.png)

以前Qiitaに書いた記事で定義したシチュエーションを継承し、

1. inplay  -> 実際に操作している時の画像
2. outplay -> 交代やハイライトのように操作してない時の画像
3. setting -> 選手交代の設定やハーフタイム画面のような設定画面の画像

の３種類のラベルを付与

## 4.画像を学習させる
画面上から学習を実施するのは、極めて単純で[TRAIN]タブに移動して、Train、Validation、Testの設定をしてTrainボタンを押すだけ

今回はたった８０サンプル程度しか用意してないため（推奨は１０００枚、各ラベル最低１０−５０枚は必要）厳密な識別は難しいと思うが、inplayと他の２つは未知画像に対しても完全に識別して欲しいところ

## 5.学習結果を確認する
学習ボタンを押してから１０分ほどするとモデルが出来上がっていた。。。

が、８０サンプルしかないので早いだけで恐らく１０００枚程度用意したらもっと時間が掛かると思われる

こんな感じでそれぞれのラベルの識別精度を確認できるようになっている
サンプルが少なすぎて、Precision/Recallの数値があまり参考にならないが、１０００件くらいデータを用意できれば十分意味のある考察が可能なはず

![スクリーンショット 2019-04-07 15.51.25.png](https://qiita-image-store.s3.amazonaws.com/0/55225/f58c6564-8b35-c7fe-681b-f3bfca4a7a60.png)



## 6.未知データに対して適用する
では作成された学習済みモデルに対して**TrainにもValidationにも含まれない未知の画像**を適用してどの程度精度が出るか確認していく

今回は、4つの画像を例にスコア結果を確認する

### 1. 別の試合のインプレイ画像
まずは、学習に使った試合とは別の試合のインプレイ画像を識別させた結果を見ると
↓
![スクリーンショット 2019-04-07 15.44.13.png](https://qiita-image-store.s3.amazonaws.com/0/55225/4fdee4be-638b-5b24-d4e8-2beadf14a940.png)

**完全に正解ラベルに識別されてる！！**

議論の余地がないぐらい完全に識別されてる。。。

まぁ、これくらいは楽勝と言うことか。。。

### 2.学習に含まれないGKのハイライトシーン
次に、学習には存在していないGKが点を入れられて悔しがっている様子がどのように識別されるか確認すると
↓
![スクリーンショット 2019-04-07 15.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/55225/013535e0-4408-04b0-34df-b0b5d718cea1.png)

おぉーーー！！！

**ちゃんとoutplayと識別してるじゃないのぉ！！**

やるやん！！

１０件くらいしかoutplay画像用意せんかったのに！！

### 3.試合後のスタッツ画面
試合終了後のsettingに該当する画像は、どの程度ちゃんと識別するかも確認
ちなみに下の画像と完全同じ場面に該当する画像は学習には含まれていないので、outplayと識別できない可能性もあるあが。。。

↓
![スクリーンショット 2019-04-07 15.46.28.png](https://qiita-image-store.s3.amazonaws.com/0/55225/462f8f9c-05d1-3572-be59-717f876aa830.png)

むしろ、inplayの方が可能性あると見てるんかい！！

まぁ、settingが一番スコア高いんでいいけど。。。

多分、画面に占める緑の割合（と位置）が重要視されてる気がする

### 4.ゴール後のセレブレーションシーン
inplayのように引きの絵ではないものの画面に占める緑の割合が比較的多い画像の結果を最後に適用してみる

↓
![スクリーンショット 2019-04-07 15.41.38.png](https://qiita-image-store.s3.amazonaws.com/0/55225/9cc40033-a007-31fa-b315-76a84c53c61f.png)
setting:0.719

残念。。

これはoutplayと認識して欲しかったんだよなぁ。。。

ほとんどセレブレーションシーンを学習に入れてないからかなぁ。。。

# まとめ
確かにAutoML Visionを使うと前提知識なく画像を食わせてラベルをつけたら個別の画像認識問題を解けるようになることを確認した

しかも、画像を用意してから予測結果を得るまで1.5時間くらい（多分、画像のラベルづけに手間取らなければもっと早い）でできるのはすごく良い気がする

小さなデータセットでやったのでsettingとoutplayで一部ちゃんと識別できていなかったが、十分なデータ量を与えれば完全に識別してくれる気がする

本格的に導入するとなるとそれなりにお金がかかるので（月１０モデルまで学習時間１時間は無料だけど）そこが問題なければ画像認識の課題解決のファーストチョイスになるかも。。。

おしまい

# 参考リンク
[Cloud AutoML Vision が本当にノンプログラミングで使えるのか試してみた](http://www.apps-gcp.com/cloud-automl-vision/)

[AutoMLの公式ページ](http://cloud.google.com/automl/)

[Qiita: AutoML Visionをためしてみた](http://qiita.com/iss-f/items/c93bd07b2413cb7f3507)