『オコゲ』でぐーちょきぱーを機械学習

2022年5月16日
This post thumbnail

Raspberry Pi 専用デスクトップアプリ『オコゲ』は、Raspberry Pi の GPIO に直接アクセス1することができます。また、特定のモジュールに対応した専用ブロック2も用意されています。
ここでは、デスクトップ版『オコゲ』の目玉機能のひとつ、GPIO と TensorFlow.js3 を使った「機械学習体験」をご紹介いたします。

タマちー

機械学習?目玉焼きの?

ミミィ

目玉機能ね!目玉といえるかどうかは保証できないけど、機械学習はコンピュータ界隈で今もっともホットな話題のひとつではあるわね!

機械学習による画像分類(ぐーちょきぱー)

一言で機械学習といっても、その内容は多岐に渡ります。『オコゲ』が実装するのは「画像の分類」です。
今回は赤外線アレイセンサ(サーマルカメラ)でとらえたじゃんけんのハンドポーズ(ぐー・ちょき・ぱー)を Raspberry Pi で学習してみることにしましょう。

ぐーちょきぱーがわかるタマちー

なんかゲームとか作れそうですね。Raspberry Pi とあっちむいてほいとか勝てそうにないですね!

機械学習とは

機械学習とは、データを分析する方法の1つで、データから、「機械」(コンピューター)が自動で「学習し、データの背景にあるルールやパターンを発見する方法。近年では、学習した成果に基づいて「予測・判断」することが重視されるようになった。機械学習 | 用語解説 | 野村総合研究所(NRI)

Google で「機械学習」を検索してトップに表示される野村総研の文章を引用してみました。 機械学習は「人工知能(AI)」を実現するためのデータ分析技術の1つで、人間や動物が経験を通して自然に学習するのと同様のことをコンピュータでもやろうというものです。 本来コンピュータは高速で正確な演算が得意な半面、あまり融通が利きません。例えば、従来のコンピュータに「四角」という図形を教えるとすると

これは四角

うん

これも四角

うん

これは?

四角

じゃあこれは?

…?
見たことない形だヨ

すでに覚えたものと全く同じ「正方形」は認識できても、教わっていない「長方形」は理解できません。
機械学習の仕組みを組み込んだシステムでは同じように教える(学習させる)と

これは?

たぶん四角

この「たぶん」が重要で、この場合、コンピュータは正方形と平行四辺形から「四角」という図形の特徴を 自分で勝手に 見つけ出し、長方形がその特徴を持っていると判定して「90%の確率で四角」などと答えます。このように学習したデータを使用して新しいデータに対して予測や判断を行うことを「推論」といいます。

AMG8833 8×8 赤外線アレイセンサ (Grid-EYE)

クリックで拡大

Grid-EYE(AMG8833) は、Panasonic が開発した縦横8ピクセル(64 画素)の赤外線センサ(サーマルカメラ)です。I2C 接続で利用することができ、記事トップのカバー写真のような簡単な回路で温度データを取得できます。温度データは 64 画素それぞれの温度で、次のようなものです。

13.25,13.25,18,16.75,16.5,15.75,14.25,12.25,12.75,14,20,20,19.25,17.25,15.25,13.25,14,15.25,21,22,21.25,19.75,15.25,13.25,15,19.25,22,22.5,21.75,19.25,14.25,13,14.75,20.75,23.25,23.25,22.5,17,13.75,13,14.5,18,23,23.5,21.75,15.25,13.25,12.5,14.5,15.75,21.25,23.5,20,15,13.5,13.25,18.25,17.75,21.75,24,20.75,15.25,14.5,14

これを温度によって色付けして描画することで次のような画像を得ることができます。

見えないし

20 倍に拡大してみました。これでも何が映っているのかなんとなくわかりますが、スムージングをかけることで少し見やすくなります。

手と言われれば、手。ちなみに左下のちょっとだけ赤い部分は、筆者の頭が写り込んだものです。最初、天井に温度が高い部分があるのかと思って上を見たりしていました w

ところで、こんな感じの映像をどこかで見たことがありませんか?
そう、これ です。まさか Joy-Con にサーマルカメラが内蔵されていようとは。テレビ CM を見て「おおお…」などと一人で盛り上がっていたのは内緒です。そのほか距離センサなどが同時に使用できるようになっている様子。ジャイロも入っているしホンマどえらいコントローラーやでぇ…

やってみる

プログラムは以下のようなものです。

※ボタンの作成など、本質に関係のない一部のブロックは折り畳み/省略しています。

センサで取得した画像はキャンバスに表示されるのようになっているので、これを「なし(手がかざされていない状態)」「ぐー」「ちょき」「ぱ」の4つのボタンを使って分類します。
キャンバス上の画像に対する推論は常時実行されていて、結果はマスコットキャラクターの横の吹き出しに表示されます。

学習を行う様子は動画をご覧ください。

  1. 何も学習していない状態では「undefined」が表示される。センサーに手をかざしてじゃんけんの形を作っても反応なし
  2. 手をかざさない状態を「なし」ボタンをクリックして学習させる(このとき画面には「じゃんけん…」と表示)
  3. 同様にして「ぐー」「ちょき」「ぱ」を学習。いずれも2回クリックで正しい推論をするようになった。念のため3回クリック
  4. その後はハンドポーズを正しく答えることができるようになる

なんということでしょう。たった 3×4=12 回のクリックでぐーちょきぱー判別の機械学習ができてしまいました。上のプログラムでは使われていませんが、学習したデータを保存・復元するブロックもありますので、育てた学習データを他のプログラムから呼び出して利用することができます。

ちょっと詳しく

『オコゲ』では機械学習ライブラリとして、Google が開発した TensorFlow (テンサーフロー)を利用しています。Google がこれをオープンソースとして公開したことで、機械学習を誰もがすぐに利用できるようになりました。Google 側もわかりやすいチュートリアルを用意したりして普及に余念がありません。

しかし、機械学習を一からやろうとすると、大量(画像何千枚とかのレベル)のサンプルデータとそれを学習するための高い処理能力を持つコンピュータ、そして膨大な学習時間が必要です。Raspberry Pi のような非力な子はお呼びではありません。理論も難解で(テンソル って何さ?)、「ばあさんや、なんか流行りらしいからちょっと齧ってみようかね」というわけにはなかなかいきません。先人が作った機械学習のデータ(モデルと呼びます)を利用するという手もありますが、応用がききません。犬種を分類する学習済みモデルを猫に使うことはできないからです。

そこで考案されたのが「転移学習 (Transfer Learning)」です。ある分野ですでに学習済みのモデルを別の分野での推論に転用して、少ないサンプルデータと学習時間で成果を出そうという手法です。『オコゲ』の機械学習ブロックは、この転移学習を利用して簡単お手軽に機械学習を行うことができるようになっています。

今回のような「手のポーズの認識」であれば、そのまま使える学習済みモデルとして、Web カメラを使った MediaPipe Handpose (またはこっち )も利用できるだろうと思いますが、当たり前だけど手にしか反応しない(前述の「応用がきかない」)のと、Web カメラなので Raspberry Pi である必要がない、なにより「学習をさせる」という面白みがないのでここでは扱うのをやめました。サーマルカメラを使ったここで紹介したやり方なら、ちょっと離れたところから上半身が映るようにして例えば 「ヤングマン」のポーズ の認識などもできるかもしれません。

ポーズをとるのが恥ずかしくて試してないんですって!

誰も見てやしないのにね…

注釈

1. pigpio デーモンを利用するので厳密には直接ではないが...
2. 2022 年5月現在、センサー専用ブロックは次の通り。
● 赤外線アレイセンサ(サーマルカメラ)AMG8833
● ジェスチャーセンサー PAJ7620
● 温湿度気圧センサー BME280
● 有機 EL ディスプレイ SSD1306

3. TensorFlow.js は、JavaScript 上で利用できる TensorFlow 実装。
TensorFlow といえばプログラム言語は Python が定番だが、Raspberry Pi では最新の TensorFlow を使おうと思うと、できないこともないようではあるものの、環境構築やインストールなど、少々敷居が高い。ありていに言うと、面倒くさい。TensorFlow.js は、それ自体が JavaScript で書かれているため、ブラウザ上の JavaScript から簡単に扱うことができ、導入の手間もほとんどかからない。スクリプト言語で書かれているが故の速度的な問題も WebAssembly バックエンド (wasm) でほぼ解決。そのまま使えるいくつもの有用な学習済みモデル があらかじめ用意されているうえ、AI に触れたことのない Web フロントエンジニアを意識しているようで、初学者向けの平易なドキュメントも充実している。「画像の転移学習」にはステップバイステップの丁寧なチュートリアル まで存在する。『オコゲ』を Blockly + Electron で開発してきたのは、もしかしたらこのためだったんじゃないかと思うほどの、あつらえたかのような環境であった。正味の話、前述の転移学習チュートリアルがなかったら機械学習ブロックの導入は諦めてたかもしれない。サンキューグーグル。