micro:bitで全自動マウスシールドを作ってみた

第3回

AIで全自動マウスシールドを制御!飲み物を検知して自動開閉するプログラム

100円ショップの材料とmicro:bitをプログラミングして、全自動で開閉するマウスシールドを作る本連載も最終回です。今回はAIを使って、目の前に飲み物や食べ物が来た時に自動開閉するようにインテリジェンス(?)なマウスシールドにしてみましょう。

飲み物が目の前に来るとマウスシールドが開くように、AIを使ったプログラムを組みます
【新型コロナウイルス感染症対策について】
マウスシールドは、あくまでもコロナウイルス感染症対策の補助的な防御手段です。会食の際は新型コロナウイルス感染症対策推進室(内閣官房)が示す「会食時に注意したいポイント」を守ってください。

まずはAIが画像を認識するための「目」となる、USBカメラを用意します。USBカメラはAmazonなどのネットショップで3,000円~7,000円程度で購入できます。カメラの解像度は500万画素もあれば十分ですが、お使いのパソコンのOSに対応しているUSB接続のカメラを購入してください。もしくは、ノートパソコンに内蔵のWebカメラで代用してもいいでしょう。その場合はマスクに取り付けられないため、ノートパソコンのWebカメラを自分に向けて物体を認識させます。

まず、USBカメラを両面テープでマスクの前面に付け、カメラのUSB端子をパソコンに接続します。またmicro:bitもUSBカメラと同じパソコンに接続しておきましょう。

マウスシールドに取り付けたUSBカメラで飲み物を認識させます
USBカメラとmicro:bitを、パソコンにUSBケーブルで接続します

今回は、MakeCodeではなくmicro:bitを使えるようにする拡張機能「micro:bit more」を組み込んだ、専用のScratchを起動します。

「micro:bit more」というアイコンが表示されたScratchの画面が開きます

micro:bit moreを使うには、あらかじめmicro:bitにmicro:bit more用のプログラムをダウンロードしておく必要があります。詳しくはmicro:bit moreの解説ページ「micro:bitを準備する」を参照して、設定を済ませてください。

次に、TensorFlowを使った機械学習をScratchから利用するための拡張機能「ML2Scratch」を読み込みます。画面左下にある「拡張機能」をクリックし、「拡張機能を読み込む」をダブルクリックします。「拡張機能のURLを入力」に、「https://champierre.github.io/ml2scratch/ml2scratch.mjs」と入力して「OK」をクリックしましょう。

画面右下の「拡張機能」をクリックし、「拡張機能を読み込む」をダブルクリックします
URLに「https://champierre.github.io/ml2scratch/ml2scratch.mjs」と入力します

すると、Scratchの画面左側に「ML2Scratch」のアイコンが追加されます。また、USBカメラが正しく認識されていれば、Scratchのステージの背景にはUSBカメラの映像が表示されます。

「ML2Scratch」のアイコンが表示され、USBカメラの映像が映し出されました。スクラッチキャットは不要なのでスプライトを選択して非表示にしておくとよいでしょう

ここまで準備ができたら、AIに画像を認識させるための学習をさせてみましょう。まずは、何枚の画像を学習したかを確認するために、「ML2Scratch」の「ラベル1の枚数」と「ラベル2の枚数」にチェックを入れます。すると、ステージの背景にラベル1とラベル2のカウント数が表示されるようになります。

学習した画像の枚数を確認するために、ラベル1とラベル2の枚数を表示します

次に、AIに学習させるためのスクリプトを組みましょう。「イベント」の「スペースキーが押されたとき」に、「ML2Scratch」の「ラベル1を学習する」を組み合わせて、「スペースキー」をここでは「1」キーに変更します。同様に「2」キーが押されたときに「ラベル2を学習する」というスクリプトも用意します。

「1」キーと「2」キーを押して、それぞれ学習させるスクリプトを組みます

そうしたら、カメラにコップが映っていない状態でキーボードの「1」のキーを20回ほど押して、「コップの映っていない画像」を学習させます。この時、多少カメラを動かしながら、様々な画像を学習させるのがコツです。

ラベル1にはこのようなコップが映っていない画像を、カメラを多少動かしながら20枚ほど学習させます

次にコップが映った状態で20枚程学習させます。今度はキーボードの「2」のキーを20回程押して、同様に「コップのある画像」を20枚程学習させてください。これも、さまざまな位置や角度のコップを学習させましょう。

ラベル2にはコップの映った画像を同様に20枚ほど学習させます

学習が終わったら、いよいよ学習結果を使って画像認識するスクリプトを組んでみましょう。「ML2Scratch」の「ラベルのどれかを受け取ったとき」を「ラベル1」に変え、「micro:bit more」の「ピンP0をサーボ180度にする」を組み合わせます。同様に「ラベル2を受け取ったとき」に「ピンP0をサーボ0度にする」を組み合わせてください。

学習したラベル1とラベル2に対応するサーボの動きを設定します
カメラの前にコップを出したり、ひっこめたりすると動画の様に自動的に開閉します。

もしも認識の精度が悪い場合には、再び「1」キーを押してコップのない画像を、「2」キーを押してコップのある画像をそれぞれ追加で学習させましょう。

最後に、第2回で作った顔の角度を変えると自動開閉するプログラムをScratchに移植して、今回のAI判定を組み込んでみます。

第2回のMakeCodeで組んだプログラムをScratchに移植して、AI判定を組み込むとこのようになります

「変数」の「かたむき」と、「ML2Scratch」の「ラベル」にチェックを入れておくと、micro:bitの角度や画像認識による値の変化の様子も分かるようになります。旗印をクリックしてプログラムを実行してみましょう。顔を前に傾けた時とマスクの正面でコップを認識したとき開くようになります。正面からコップを外した時はマスクが閉じます。

数値を確認して、学習の精度や傾きの角度を調整していきましょう

機械学習をさせると、人間では場合分けできない状況でも判断してくれます。前回と比べても、非常に簡単なプログラムでマスクの開閉処理ができるのも特徴です。今回は最終的に、ラベル1(飲み物のコップが映っていない状態)を106回、ラベル2(コップが映っている状態)を120回学習させましたが、学習をさせればさせるほどAIは高い精度で判断しますので、色々と試してみてください。

【第3回の記事の解説動画はこちら】
【STEAM教育】100円ショップとmicro:bitで作る自動フェイスマスクPART04