11月18日(土)に開催される「とやま未来キッズカンファレンス2023」(https://zsjk.jp/toyama/)で展示するロボットが毎回ロボットおみくじとゴミ箱ロボットなので、レパートリーを増やしたいと考えてずっと温めてきた機械学習に取り組んでみました。

矢印の付いたハンドルを握って、カメラに写し、その角度によって曲がる角度を調節するイメージです。ハンドルを写せばいいと考えたのは、背景が変わると誤作動が大きくなるのではないかと予想したからです。

画面のほとんどを矢印で埋めてしまえばどこにもっていっても楽勝!
と、考えましたが、はてさて、そんなにうまく行くものか?顛末をお楽しみください!

最初にML2Scratchを検索します。(https://champierre.github.io/ml2scratch/
通常版のScratchからは見つからないのでご注意ください。左下の拡張機能からML2Scratchをインストールします。

EV3を接続して使うので、ScratchとEV3をBluetooth接続するためのScratch Linkもインストールしておきます。(https://apps.microsoft.com/detail/9N48XLLCZH0X?hl=ja-jp&gl=JP

最初に作ったのはこんなハンドル。

学習させる素材ができたので、早速プログラミングです。
まずは使用する数のラベルにチェックを入れて、学習の準備をします。
Scratchはカメラに映ったものが学習したラベルのどれに近いかを判断し、プログラムに渡すことができます。

カメラにラベル1で判断してほしいものを写しながら、「ラベル1を学習する」ボタンをポチポチ押すと学習します。大抵は10回ほどで十分です。

ハンドルを傾けて写しながら、ポチポチと学習を進めていきました。

上記プログラムの場合は、ラベル1…直進、ラベル2…やや右折、ラベル3…大きく右折、ラベル4…停止、ラベル5…大きく左折、ラベル6…やや左折としました。

最初はそれで動かしていたのですが、ひたすら動き続けるので、ラベル7を追加し、カメラを遮ったときを停止とし、ちょっと幸せになりました。

しか~し!20回学習しても80回学習しても左右や上下を理解してくれません。
悪戦苦闘の結果、ピコーンとひらめいたのは、
「機械学習は映っている物体を判別するのであって、向きは関係ないのでは?」
という悲しい現実でした。

それを確かめるために、ハンドルを改良しました。

りんご…直進、みかん…やや右折、レモン…大きく右折、スイカ…停止、キウイ…大きく左折、ブドウ…やや左折です。

そうするとバッチリほぼ正しく動作するではありませんか!
いやぁ!やってみるもんですね。
ついでにラベルを受け取るたびにギクシャク動くのをやめさせるため、プログラムを分岐方式に書き変えました。

実際の動きはこんな感じです。

みなさんもいろいろ試してみてくださいね!