その1 AIチップ K210について
2019年にRISC-VコアとKPUを組み合わせたK210というAIチップが開発されSipeed社からMaixシリーズとしてリリースされました。画像AIや音声AI応用に利用されています。画像分類など学習済の軽量モデルは提供されていましたが、自前で学習する場合は外部環境で行う必要がありました。https://twinkletec.org/2024/01/01/k210-ai-chip/
その後、1000分類の既学習済モデルを利用した簡易学習が本体だけでできるようになり、簡単にカスタム分類ができるようになりました。可能なのは、Maixシリーズではなく、HuskeylensとM5StickVというAIビジュンセンサーです。私は勝手に第1世代AIビジョンセンサーと呼ぶことにしました。再度、K210とは?を振り返ります。
K210の評価ボードは秋月電子で手に入ります。SiPEED社のMaixシリーズです。
Maixシリーズの評価ボードのプログラムには、MaixPyという専用のIDEを使用します。MicroPythonでプログラムしますが、専用のライブラリが準備されています。メモリ容量は少なく本体Flashメモリに大きな学習モデルを書き込むとプログラム領域がなくなることがあります。SDカードも使えますが制約が色々あります。
Maixボードを使って、いろいろと応用を考えてみましたが、画像AIに関しては既存モデルの入手がキーになりますが、MaixPyのバージョンアップと同時にDL先がすぐに閉鎖され苦労しました。M5StickVのV-training(WEBサービス)のようなカスタムモデルを作るまともなツールは提供されていませんでした。
その2 画像の簡易分類ができるAIビジョンセンサー
画像のカスタム分類が、比較的簡単に行えるK210を搭載したモジュールを2つ紹介します。M5Stack社のM5StickVとDFRobot社のHuskyLensです。2019年M5StickVは本体にカメラ、モニター、スピーカーなどを内蔵させて、カメラ撮影した画像を集めラベリングしてファイルに纏めたものをM5Sack社のクラウドサービス「V-learning」のドロップボックスに投げるとメールで学習済モデルが送られてくるというサービスがあったようです。2021年にはクラウドサービスは停止されたようです。
ただし、Ksasasoさんが2019年にM5StickVを使って独自にQRコードを使った簡易学習でカスタム分類ができる「Brownie」というソフトを公開してくれました。その後、M5Stack社がM5StickVのファームウェアを変えたため初期の台湾バージョンのBrownieが使えなくなりましたが、2020年版でファームウェアを変更したM5Stickに対応できる筑波バージョンBrownieをリリースしてくれました。その後DFRobot社が、おそらく同じ簡易分類手法で完全プログラムレスでデジカメのような操作でカスタム分類ができるHuskyLensをリリースしたものと思います。間違っていたらごめんなさい。どちらも本体内で学習処理を完結してくれます。HuskyLensはMicrobitとの接続が容易でMakeCodeでブロックプログラム用のライブラリを提供してくれています。一方で、M5StickV+Brownieは分類したものの名前を内蔵スピーカーで読み上げてくれます。どちらも画像分類した結果をモニタ画面のバウンディングBOXとIDを表示しますが、モニタが小さく見ずらいため音声で知らせるインパクトは大きいです。このほかにもYahboom社のAIビジョンセンサがありますが簡易分類モデルには対応していません。私はカスタム画像分類が本体内で行えるものを第1世代AIビジョンセンサーと呼ぶことにしています。実はLinuxで動く第2世代製品、Maix社からMaixCAM、M5Stack社からUnitV2カメラとして発売されています。これらが第2世代なのかと思っています。お値段も第2世代は高価になりました。
KsasaoさんのQiitaへの投稿を紹介します。簡易分類の説明です。画像1000分類のモデルをベースに転移学習したと書かれています。
実際に、5人分の顔写真を学習させたのちに、Brownieのフォルダに生成されたcsvを見てみました。各画像は1枚ですが、768次元の特徴値(距離的なもの)が格納されています。ラベルA,B,C,D,Eについて各1枚ですが枚数を増やしていけば分類精度は上がりそうです。1枚の画像で学習した顔認識でも驚くほど精度が出ています。ただしカメラからの撮影距離の影響が意外と大きいため、距離を変えた複数画像が必要かもしれません。
M5StickVにBrownieをインストールする手順を示します。Ksasaoさんの筑波バージョンの説明です。
2020年の筑波ミニメーカーフェアでのBrownieのインストール作業と簡易学習方法を説明しています。本体内での自己学習には、M5StickV用のQRコードリーダー機能を使います。撮影を指示するQRコードは自分で準備します。また、音声でIDを知らせるwavファイルも自分で準備する必要があります。QRコードは予めサンプル用のものがあるので、プリントして台紙に張りカメラの前にかざし試すことができます。QRコードとデモ用音声はDLしたフォルダに入れておいてくれています。すごく親切ですね。
早速、試してみました。犬も含めた顔画像を6枚、QRコードは「A」「B」…「F」の6枚その他のQRコードは、提供されている「学習をリセット」「対象をカメラにかざせ」の計8枚を用意しました。音声はOpenJTalkで「A」「B」…「F」に対応する音声をファイル(wav形式)を準備しました。音声はSDカード直下のvoiceフォルダに入れておきます。なお写真は、プライバシー保護のため犬以外はマスクをしています。見え難いと思いますがご理解ください。
分類の試験は、PCノモニター画像を使って行いました。学習と同じ写真を使っています。なので、分類は成功し「ジジちゃんです」とか発話してくれています。
カメラとモニターの距離について調べてみました。カメラで捉える画像が大きすぎても小さすぎても反応しません。サイズには注意が必要です。サイズ別に複数画像を学習させたらどうなるかはやっていません。また、犬はだめですね。
その3 UnitV AIカメラへの学習モデルの移植
M5Stack社の製品でK210を搭載したものは「M5StickV」と「UnitV AIカメラ 」の2品種があります。「UnitV AI カメラ」は「M5StickV」からモニターやスピーカーなどを取り除いたものです。前回、M5StickVで簡易分類に使った学習済モデルをUnitVカメラに移植することを試みました。まず、UnitVカメラのファームウェアをBrownie筑波バージョンがリリースされた2020年以降のものにしておく必要がありますKflash_gui.exeを使って「M5StickV_Firmware_v5.1.2.kfpkg」を本体に書き込みます。
UnitVカメラに挿入するSDカードにもM5StickVと同じBrownieフォルダを入れます。modelフォルダには、学習で利用した「mbnet751_feture.kmodel」を入れます。UnitVカメラには発話機能が無いため、プログラムから音声関係のコードを消す必要があります。またモニタもないため、分類結果をシリアル経由でホストに出力する必要があります。超めんどくさいです。
基本的には、M5StickVのSDカード内容をコピーしたSDカードをUnitVカメラに刺しますが、SDカードの内容を再度明確にしておきます。
移植できたことを確認するため、MaixPy(Maixシリーズ用SiPEED社IDE)を使用します。なんと、Maixシリーズ以外の評価ボードとしてM5StickVも指定できます。
メインプログラムである「boot.py」をコンソールにコピーし動作確認しました。MaixPyは、USBを経由してカメラ画像を右上のエリアに出力することができます。モニタを持たないUnitVカメラに何が映っているのかが判り、分類できているのかを知ることができます。移植できていることが判りました。なお、UnitVカメラの向きですが、USBコネクタ側が上です。
ここまでくると、M5StickVと同じように音声も出力したくなってきました。まずシリアル通信を確認します。デフォルトでシリアルには、分類情報等が出力されています。ArduinoIDEで中身を確認しました。初期画面の後に、検出したIDと音声対応できかったというエラーコードが吐き出されていることが判ります。
初期情報を無視したり、エラー出力を無視したり、へんてこな文字列で返されるIDを処理し、Windowsの音声出力に繋げるためにpythonでインタフェースプログラムを作ることにしました。まずシリアルデータの確認です。
壁に当たりました。へんてこな文字列で返される「A」~「F」文字の抽出で、苦戦しました。更に上手く抽出しても、decode()でバイナリ出力を文字出力に変換しないと、分類文字だけの抽出は上手くいっても、抽出した文字では、条件文が動作しません。出力の最初だけ(data[0])を使うとなぜか条件文が動作した。というようなトライアンドエラーを繰り返し修正を行いました。
修正したプログラムコードを示します。まずカメラ側のboot.pyの修正です。エラーコードを吐き出さないように修正しました。
Windows側の修正です。Windowsに内在するayumiさんの音声を使用して分類結果を音声出力しています。
以上で、M5StickVで簡易学習させたモデルをUnitVカメラに移植し、シリアル出力を
介して接続したPCから分類した結果を音声出力させることができました。疲れました。
その4 HuskyLensによる簡易画像分類
本体で簡易画像分類機能を持つ製品としてはHuskyLensが秀逸です。操作は本体上にあるジョグダイアル+SWですべての操作ができます。ジョグダイヤルと反対側にあるボタンは学習時のみ使用します。簡易画像分類を利用する応用としては、物体分類と顔認識です。複数の分類が可能でそれぞれのモードでmulti-learnを指定します。詳しくはWEBマニュアルを参照してください。
microUSBから5Vを供給するとすぐに動作します。SDカードドライブもありますが、監視カメラ用途で画像を保存するとかの用途のようで、基本的には本体に増量されたFlashメモリで賄えます。また、各種アプリは事前に本体Fl;ashに書き込まれており、
M5StickVのようにアプリごとにboot.pyやモデルをsdカードに書き込む必要はありません。
早速、顔認識を行いました。ID1とID2を黄色と青色のバインディングBOXで表示しています。IDは20個くらいまで行けるようです。すっごく簡単です。
ただ残念なのは、HuskyLensはしゃべらないことです。
HuskyLensにしゃべらせたいと思い、通信仕様を確認しました。I2Cとシリアルのどちらでもいけるようです。まずは、シリアルを使ってArduinoとの通信を行いました。
Arduino用のライブラリ「HUSKYLENS.h」が準備されていましたので、これを使いました。
WEBマニュアルにあった、汎用プログラムを使って、シリアル出力をArduinoIDEで確認してみました。
顔認識モードで、ID1~ID4を学習させ、HuskyLensからの出力を確認しました。先ほどはシリアル通信を使いましたがI2C通信に変更しました。理由は後ほど説明します。M5StickVでも「A」~「F」の出力取り出しで苦労しました。HuskyLensは「1」~「4」ですが同じように苦労しました。
やたらと不必要な文字情報が吐き出されます。センサーとしては定時間隔で、認識できない場合は「0」認識した場合は、「1」~「4」といったシンプルな出力が欲しいです。
Arduinoからの出力フォーマットを書き替えました。約0.3秒に一回5つの情報をコンマ区切りで出力するようにしました。識別番号の他に、バウンディングBOXの幅と高さ、中心座標X、Yの5つです。‘0,0,0,0,0’の場合は未認識です。こうすることでサーボモータを使った応用もできると思います。ArduinoIDEのシリアルモニターとシリアルプロッタで主主力の状態を示しました。やっとビジュアルセンサとして使えるレベルになりました。
ここまでくれば、UnitVカメラと同じように、HuskyLensをI2CでArduinoに繋ぎ、ArduinoをUSBでWindowsPCに接続するとayumiちゃんに顔認識結果をしゃべってもらえると思います。しかし超ダルイ作業になります。その点から考えると、M5StickV+Brownieは本体だけで完結するので素晴らしいと思えてきます。他に簡単な方法は無いか考えました。HuskyLens+Microbitです。
その5 HuskyLens+Microbitによる簡易画像分類
Microbitは、子供のプログラム教育用に開発されたマイコンボードです。MakeCodeというブロックプログラムが使えます。機能拡張でDFRobot社が提供しているブロックを探すと「HuskyLens」と以前、Microbit工作で登場した「DFPlayer_mini」が見つかると思います。この2つのライブラリを組み合わせて、顔認識で音声出力をします。Microbit(v2)本体でも音声合成はできるようですが推奨されていませんし、音声と言えるようなものではないようです。世の中的にはAPT3012という音声合成ICをMicrobitに接続する方法があるようですが、APT3012は秋月電子でも\1000と調子に乗っています。そこで1個\500程度で購入できるプログラマブルMP3Playerの
DFPlayer_miniを使いました。HuskyLensとMicrobitのI2C接続は以下の文献を参考にしました。MicrobitのシリアルはDFPlayer_mini用に開けておく必要があります。
試作した実験モジュールを示します。Microbit拡張ボードにHuskyLensとDFPlayerを接続しました。
Microbitのブロックコードを示します。今回はID3までにしていますが、ループブロックが汚くなりますが、増やすことはできます。識別IDの文字表示と併せてMP3プレーヤに保存した音声を再生します。
動作している写真を示します。ここまでを振り返ると無駄な時間を多く費やしたと反省しています。反省ついでに、M5StickVはwav形式ですが、DFPlayerは、mp3形式のみです。なので、OpenJTalkでまずwavファイルを作って、午後のコーダを使ってmp3形式に変換しました。