機械学習×Scratch　ML2Scratch使ってみた2020版

Scratchで機械学習を体験できる拡張機能を利用した記事を以前投稿したが(すでに1年以上経過)、細かくアップデートされているのでそれらを含めて記していく。

前回の記事はこちら[機械学習×Scratch!? 使ってみた](https://qiita.com/Hiroki-Fujimoto/items/221d5394dc1b4887c437)

## ML2Scratch
[ML2Scratch](https://github.com/champierre/ml2scratch)は専用のScratch環境で機械学習を体験できる拡張機能を提供してくれる。

前回ではPCに接続されたWEBカメラの画像を[Scratch](https://ja.wikipedia.org/wiki/Scratch_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))上に映し出し、画像を取得しラベル付けから学習、画像認識を行った。

今回は新たに追加されている機能で、Scratchのステージ上を画像として取得・学習することでWEBカメラを利用しない機械学習をおこなってみる。

## 前回との違い
ML2Scratchの導入は[前回の準備](https://qiita.com/Hiroki-Fujimoto/items/221d5394dc1b4887c437#%E6%BA%96%E5%82%99)を参照。

カスタマイズされたScratch上でML2Scratchのブロックを追加する。
<img width="700" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/5669ed20-9f81-685f-c613-080235dffb54.png">


すでに前回と少しブロックのデザインが変わっているのがわかる。
左が前回、右が今回利用している時点でのブロックのデザイン。
<img width="300" alt="01-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/e72ffeb9-976e-598f-07d5-4f0bd9d8cd10.png">　　　　　　　<img width="300" alt="01-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/ba05d408-452e-d487-e44a-859ddfb2b926.png">


前回と比較すると以下のブロックが追加されている。
今回の学習のキーとなる機能の一つ。`カメラ`　`ステージ`を切り替えることで学習・判定を行う対象を変更できる。特に`ステージ`に変更することでScratchで作成したゲーム画面を学習データとして用いたりすることができるようになる。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/abea8bac-6811-4ba6-33b4-ebedf8db65e7.png)

学習した結果を他のプログラムもしくは同一のプログラムで利用するために保存することができる。学習データを集めた状態でこのブロックを実行するとjsonファイルをダウンロードすることができ、再利用することができる。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/45e05573-e2a9-93d5-6371-4ea9f6787357.png)

前述のダウンロードしたjsonファイルを適用する際に実行する。実行するとファイルを選択するウィンドウが立ち上がり保存したjsonファイルをアップロードすることができる。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/eec47cf8-4872-53ba-6354-56b07088a7b6.png)

こちらも今回のキーとなるブロック。Scratchのステージ上に映っているWEBカメラのON/OFFを切り替えることができる。ビデオを切にすることで純粋なステージ上のみを学習データとして集めることができる。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/b0539411-2396-a103-3c19-20149a8b5c7a.png)

ラベル付けのON/OFFと間隔を設定することができる。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/3f50f744-94d4-df69-c468-feb50fe796d9.png)

## ステージ上の学習
今回は拡張機能の開発者である石原さんが公開している[Github](https://github.com/champierre/ml2scratch)にある手書き文字判定のサンプルプログラムを参考に行っていく。
今回は`1~3の手書き数字の判定＋何も書いていない状態`の4つのラベルを使用するので取得した画像枚数をステージ上に表示するようチェックを入れる。
<img width="300" alt="08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/62747785-845b-97f8-0100-538b9c50ab80.png">

あらかじめ配置されているネコのスプライトに以下のプログラムを作成する。
<img width="800" alt="11-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/cebba3c7-3195-880d-8dae-eea6cc0dc726.png">

次にスプライトを追加する。ここではペンのスプライトを追加しているが、非表示にするため追加するのはどれでもよい。
追加したスプライトにプログラムを作成する。ペンのブロックを利用しているが、これもML2Scratchと同じく拡張機能にあるため利用する際は拡張機能から追加する。
<img width="800" alt="11-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/79872972-5fb4-73ff-532b-8fda0691be4f.png">

プログラムの準備はできたので学習データを集めていく。
ステージ左上の旗マークをクリックすると、ステージ上にマウスで線を引けるようになる。
今回は1,2,3の手書き数字を学習しネコに判定させる。

ステージ上に1を書いたら`キーボードの1`を押して画像を集める。
<img width="800" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/a7c4b5df-a3a4-f614-eff4-36fd51b27f7c.png">
ステージ上の線を消す場合は`スペースキー`を押す。

これを1~3の数字+何も書いていない状態の4つを学習させる。
<img width="800" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/343c3f14-838f-46f5-4bc8-d4679d7e20eb.png">

何も書いていない状態は`キーボードの4`を押して画像を集める。


データをそれぞれ20枚程度集め終わったら、判定できているか確かめる。
そのままステージに手書き数字を書くことで判定結果をネコが喋ってくれる。
<img width="400" alt="14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/cddcfd24-19c3-1c15-1d57-2fd7b5ab67fc.png">
<img width="400" alt="15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/a3dd6de8-fbbb-57ba-1918-eca736024274.png">


2と3は膨らみなどが似ているようで、雑に書くと2と3の判定を行ったり来たりする場合もある。
<img width="400" alt="16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/b71ae188-589b-abaf-69ff-1e38d1e5718d.png">


前回から学習の幅が広がっているためいろいろなことに応用できそう。
また定期的にメンテナンスしていただけているため環境の変化にも柔軟に対応できそうなところは安心して使えるのでありがたい。