Teachable Machine の学習やモデルに関する技術情報についてざっくり調べてみた【2021年4月版】

以前からちょこちょこ使っていた [Teachable Machine](https://teachablemachine.withgoogle.com/)。
その技術情報をいろいろ調べてみようと思い、その過程を自分用メモを兼ねてこの記事に書きました。
（そして、調査を進めていたら TensorFlow.js についても調べる形となりました）

## 公式の Teachable Machine関連の情報を見てみる
### 概要
Teachable Machine の学習の仕組みについて、公式の FAQ に[「これはどのような仕組みになっていますか？」という部分](https://teachablemachine.withgoogle.com/faq#%E9%AB%98%E5%BA%A6%E3%81%AA%E8%B3%AA%E5%95%8F)があります。
![Teachable_Machineの仕組み.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/79989084-045c-9607-4d53-8dfb44762525.jpeg)
その情報によると「画像モデルとポーズモデルの 2つは MobileNet を使った転移学習」で、「音声モデルは [Speech Command Recognizer](https://github.com/tensorflow/tfjs-models/tree/master/speech-commands) に基づいた転移学習」と書かれています。

「MobileNet は V1・V2・V3 とかあったけど、どれだろう？」とか、「Speech Command Recognizer って何だろう？」とか思いつつ、先へ進んでいきます。

### 画像モデル関連（MobileNet関連）
画像モデル・ポーズモデルのほうで利用されている MobileNet に関する情報をさらに調べてみます。

GitHub を見ていたら[「googlecreativelab/teachablemachine-community」の「libraries/image」](https://github.com/googlecreativelab/teachablemachine-community/tree/master/libraries/image)というものがあったので、そこを見てみることにしました。

さらに、その中を見ていくと「[src/custom-mobilenet.ts](https://github.com/googlecreativelab/teachablemachine-community/blob/master/libraries/image/src/custom-mobilenet.ts)」という部分があったので、見てみます。
![画像関連のソースコードの一部.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2cf21bfd-4f81-0076-aab3-aee8fc7da193.jpeg)
上記を見てみると、「デフォルトは MobileNetV1 で、MobileNetV2 も扱えそうな感じ」に見えます。

### 音声モデル関連
音声モデルについては、[Speech Command Recognizer](https://github.com/tensorflow/tfjs-models/tree/master/speech-commands) の話が出ていたので、そのページを見てみます。

いろいろ見ていくと「[transfer-learning](https://github.com/tensorflow/tfjs-models/tree/master/speech-commands#transfer-learning)」という部分がありました。
![音の転移学習.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/69447e9c-772b-6216-1483-8435db1a4489.jpeg)
ざっくり内容を見てみると、1つ目の段落は転移学習に関する説明が書かれているだけのようでした。
そして、2つ目の段落に Speech Command Recognizer の説明が出てきていました。

説明によると「speech-command model」は転移学習に適したモデルで、オリジナルは巨大なデータセットによる（数値的には「~50k examples from 20 classes」の部分）と書かれていました。

### ポーズモデル関連
さらにポーズモデルについても見てみます。
上で出てきた GitHubの [「googlecreativelab/teachablemachine-community/libraries」](https://github.com/googlecreativelab/teachablemachine-community/tree/master/libraries/)の中に「[pose](https://github.com/googlecreativelab/teachablemachine-community/tree/master/libraries/pose)」というものがあるので、そのページを見てみます。

上記の画像モデルの時と同じ流れで「[src/custom-posenet.ts](https://github.com/googlecreativelab/teachablemachine-community/blob/master/libraries/pose/src/custom-posenet.ts)」を見てみます。ソースを見ていると、画像モデルの時のような V1・V2 を指定するような記載もなく、MobileNet というキーワードが登場しているのは以下の画像内の 2箇所のみでした。
![ポーズモデル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1ab92e00-a265-db16-ddfc-5831219c83db.jpeg)
これを見た感じだと、V1 のみを利用する形に見えます。

## 画像関連の部分について TensorFlow.js公式の情報も見てみる
### 画像を対象にしたモデル
さらにググったりなどしていると TensorFlow.js のモデル関連のページも出てきたので、そちらも見てみます。
　●tensorflow/tfjs-models: Pretrained models for TensorFlow.js
　　https://github.com/tensorflow/tfjs-models

まずは画像に関わる部分を見てみると、画像分類用のモデルで MobileNet の記載がありました。そして姿勢推定については、PoseNet の記載があります。
![画像用のモデル（TensorFlow.js）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bc94d0af-c316-dbb3-1666-5c9e63cd5f7c.jpeg)
上記の流れでは、Teachable Machine では姿勢推定のほうも MobileNet がキーワードとして出てきていましたが、ここでの記載も考慮すると姿勢推定については PoseNet の中に情報がありそうです。

### TensorFlow.js の MobileNet
まずは、「[MobileNet](https://github.com/tensorflow/tfjs-models/tree/master/mobilenet)」と書かれた部分のリンク先を見ていきます。

上記の画像モデルに関する部分で「[custom-mobilenet.ts](https://github.com/googlecreativelab/teachablemachine-community/blob/master/libraries/image/src/custom-mobilenet.ts)」というものが出てきましたが、そこに書かれていた V1・V2 の話に関する記載がありました。
「[Loading the model](https://github.com/tensorflow/tfjs-models/tree/master/mobilenet#loading-the-model)」という項目の中で、以下の記載がありました。
![引数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b4b4fb1b-4192-5182-ac1d-c26e59f33013.jpeg)
「version: The MobileNet version number. Use 1 for MobileNetV1, and 2 for MobileNetV2. Defaults to 1.」とあるように、TensorFlow.js で扱えるのが V1・V2 のみで、デフォルトでは V1 を使うという設定のようでした。

### TensorFlow.js の PoseNet
[PoseNet のリンク](https://github.com/tensorflow/tfjs-models/tree/master/posenet)のほうも情報を見てみます。

「[Loading a pre-trained PoseNet Model](https://github.com/tensorflow/tfjs-models/tree/master/posenet#loading-a-pre-trained-posenet-model)」という部分を見ると、「In the first step of pose estimation, an image is fed through a pre-trained model. PoseNet comes with a few different versions of the model, corresponding to variances of MobileNet V1 architecture and ResNet50 architecture.」という記載がありました。
PoseNet の事前トレーニング済みモデルについて、TensorFlow.js で利用できるのは「MobileNetV1」のみで、他に「ResNet50」が利用できるようです。

#### Teachable Machine のポーズモデルを再度見てみる
上で 1度見ていた [Teachable Machine のポーズモデルに関するページ](https://github.com/googlecreativelab/teachablemachine-community/tree/master/libraries/pose)に戻って情報を見返してみます。

試しに「ResNet」でリポジトリ内を検索してみましたが、以下のとおりヒットする検索結果はありませんでした。
![ResNetで検索.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/538f1789-9645-3766-c881-158455317dba.jpeg)
Teachable Machine のポーズモデルで使える事前トレーニング済みモデルは MobileNetV1 のみっぽいです。

## まとめ
表題のとおり、技術情報をざっくりと調べてみました。

ここが違っている、などという部分がありましたら、コメントでお知らせいただけると嬉しいです。