はじめに
以前M5stack社製マイコンのUnitV AI Camera(OV7740版)を使用したプログラミングをブログで紹介しました。UnitV AI Cameraのプログラミングをやってきましたが、現場で複数使用するには少々高い(楽天金額6,847円)と感じていました。そこで似たようなマイコンを探しているうちにSipeed社のマイコンに目をつけ、挑戦しようと思いました。
今回は序盤の環境構築で苦戦したので今後忘れないように環境構築から顔認識プログラム実行までをブログにまとめようと思います。
Sipeed Maix M1 Dock
今回使用したマイコンはSipeed Maix M1 Dockというものです。Sipeed社というのは以前私がUnitV AI Cameraのプログラミングをする際に使用した統合開発環境Maixpy ideを提供している企業です。ソフトもマイコンも同じ企業ですので互換性に問題なく、もとからMaixpy ideをダウンロードしていた私にとってはちょうどよかったです。私はyahoo shoppingで購入し、3,300円でした。
下写真が届いた内容物です。左のプラケースにマイコンボード、カメラ、ディスプレイ、ピンヘッダーがついてきました。写真の状態はすでにカメラとディスプレイはマイコンボードに接続しています。
環境構築
0. 付属品の注意
Sipeed Maix M1 DockにはMicro-USBをUSB-type Cに変換するコネクタが付属しています。マイコンボード側はtype Cコネクタです。なのでMicro-USBケーブルを用意しコネクタを使用してマイコンと接続する・・・ように見えますがこれが地雷でした。付属のコネクタが仕様上問題があるのか、たまたま不良品だったのか、原因は不明ですがMicro-USBケーブル+付属のコネクタの組み合わせではマイコンと通信できませんでした(私が持っているMicro-USBケーブルに問題があるだけかもしれません)。USB-type Cケーブルを持っていたので、これを使用して通信を行いました。Sipeed社のHPにも”通信にはUSB-type Cケーブルを使ってください”との記述がありますし、よくわかんないです・・・。
1. CH341 USB-シリアル変換ドライバのインストール
以下のリンク先よりパソコンにCH341 USB-シリアル変換ドライバをダウンロードします。
https://www.wch.cn/downloads/CH341SER_EXE.html
ダウンロードしたドライバを開いて”INSTALL”をクリックすれば完了です。
2. firmwareのダウンロード
今回顔認証プログラム実行まで行うため、Maixpyのfirmwareと顔認証モデルのダウンロードを行います。
それぞれ以下のリンク先からダウンロードします。
・Maixpyのfirmware(maixpy_v0.6.3_2_gd8901fd22.bin)
https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master/maixpy_v0.6.3_2_gd8901fd22
“maixpy_v0.6.3_2_gd8901fd22.bin”をダウンロードします。あとで備忘録ポイントに記載しますが、もし私の記事を見るのがだいぶ後の場合maixpyのfirmwareはSipeed社HPにある最新のものを推奨します。
・顔認証モデル(face_model_at_0x300000.kfpkg)
https://github.com/sipeed/MaixPy-v1/releases
上記リンク先のv0.3.2のAssetsを展開してください。
その中に含まれている”face_model_at_0x300000.kfpkg”をダウンロードします。もしかするとサイトが変更されて見つからない可能性があります。
その場合は”face_model_at_0x300000.kfpkg”と直接検索したほうが早いです。
ダウンロードしたfirmwareをマイコンに書き込みます。ここでは2つの方法を紹介しますがどちらで行ってもかまいません。
- kflash_guiを使用する方法
私はもともとUnitV AI Cameraを始める際にkflash_guiをダウンロードしていたのでこれを使用していました。
その時のリンク先は以下の通りです。
https://docs.m5stack.com/en/guide/ai_camera/unitv/maixpy
①Select Fileでさっきダウンロードしたmaixpy_v0.6.3_2_gd8901fd22.binを選択
②Board SettingsのBoardで”Sipeed Maix Dock”を、Burn Toで”Flash”を選択
③Serial SettingsのPortでマイコンをつなげているUSBポートを選択、Baudrateは2000000、Speed modeは”Slow mode”を選択
④Downloadを押す。
⑤顔認証モデルも①~④と同様の手順で実行します。①でファイルを
選択する際にface_model_at_0x300000.kfpkgを選択するくらいの違いです。
- k-flashを使用する方法
次にk-flashを使用する方法を説明します。
以下のリンク先より最新のバージョンをダウンロードします。
https://github.com/kendryte/kendryte-flash-windows/releases
①DeviceでマイコンをつなげているUSBポートを選択
②Baud rateは初期設定の2000000、ChipはIn-Chipを選択
③Firmwareでさっきダウンロードしたmaixpy_v0.6.3_2_gd8901fd22.binを選択
④”Open terminal after flash”のチェックマークを外す
⑤マイコンのRSTとBOOTボタンを同時押しする。その後RSTボタンだけ離しBOOTボタンは押したまま、k-flashのFlashをクリックする。RSTボタンはマイコンをリセットさせる目的です。BOOTボタンを押したままでfirmwareの書き込みを行わないとエラーが発生して失敗します。
⑥顔認証モデルも①~⑤と同様の手順で実行します。③でファイルを
選択する際にface_model_at_0x300000.kfpkgを選択するくらいの違いです。
顔認証プログラムの実行
以下のプログラムをMaixpy ideに書き込みます。
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
def lcd_show_except(e):
import uio
err_str = uio.StringIO()
sys.print_exception(e, err_str)
err_str = err_str.getvalue()
img = image.Image(size=(224,224))
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main(model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
try:
sensor.reset()
except Exception as e:
raise Exception("sensor reset fail, please check hardware connection, or hardware damaged! err: {}".format(e))
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.run(1)
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
anchors = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
try:
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
img.draw_rectangle(obj.rect())
img.draw_string(0, 200, "t:%dms" %(t), scale=2)
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is None:
kpu.deinit(task)
if __name__ == "__main__":
try:
main( model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False)
# main(model_addr="/sd/m.kmodel")
except Exception as e:
sys.print_exception(e)
lcd_show_except(e)
finally:
gc.collect()
その後左下のチェーンマークをクリックしてマイコンと接続状態にして、その下の緑の▶をクリックすると、カメラからの映像がMaixpy ide右上の画面とSipeed Maix M1 Dockに接続したディスプレイに表示されます。
ディスプレイに映った画像
Maixpy ideでの画像
顔認証プログラムの動作確認として使用した顔写真はAIが作成した実在しない人物の写真です。顔を認識すると白い枠で囲むように表示されます。
ディスプレイに映った画像は上下が逆転してますね。Maixpy ideではそうでないので私のプログラムかディスプレイの設定に問題がありそうです。
備忘録ポイント
今回私がつまづいたポイントを記録します。
firmwareは最新のものを使用する
私は当初kflash_guiを用いてmaixpyのfirmwareを書き込む際に顔認証モデルface_model_at_0x300000.kfpkgがあったサイトと同じ場所にあったmaixpy_v0.3.2_full.binを使用しました。書き込み自体は滞りなく済んだのですが、いざMaixpy ideと接続する際いつまでたっても接続されないエラーが発生しました。k-flashのほうで書き込んでも結果は同じで途方に暮れていました。ふとMaixpy ideのバージョンが古いのでは?と思いSipeed社のHPにアクセスしたところ以下のページが目につきました。
https://dl.sipeed.com/shareURL/MAIX/MaixPy/ide/v0.2.5
このページに「Firmware MUST >= 0.4.0_44!!!!!」と記載があり、書き込もうとしていたmaixpyのfirmwareが最新でないことに気付きました。この時パソコンにインストールされているMaixpy ideは最新でしたが、それゆえに書き込もうとしていたmaixpyのfirmwareは古すぎて認識できない、ということです。そこでHPから最新のものを探して入れたところMaixpy ideとの接続が解決しプログラムも無事実行できるようになったということです。
もしかすると私や皆さんがこの記事を見るころにはMaixpy ideもfirmwareも新しいものにアップデートされているかもしれませんので、書き込もうとするfirmwareが最新のものか確認することをお勧めします。
k-flash使用の際はマイコン側のRSTとBOOTボタンの操作が必要
前述の問題の解決を模索している最中、kflash_guiでのfirmware書き込みを諦め、k-flashでも行いました。本当は新しくソフトをインストールするのが嫌ですでにインストール済みだったkflash_guiを使用したかったのですが、他のサイトではk-flashを用いているところが多かったため書き込みソフトに問題があると思って試しました。ですが「ISPモードで書き込めません」とのエラーが表示され書き込めない問題が発生しました。いろいろ調べたところどうやらマイコン側でRSTとBOOTボタンの操作が必要なことがわかり、実施したところk-flashで書き込むことができました。ソフトが書き込んでいる最中もBOOTボタンを押したままにしないといけないのは正直予想外でした。ただし本当の原因は前述の通りだったため、これは無駄骨になってしまいました。なおkflash_guiのほうはボタン操作は不要です。
Sipeed社のHPが接続悪すぎ問題
これは時期的や私の接続環境の問題かもしれません。当初からインストールするfirmwareを調べる際にgithubだけでなくSipeed社のHPにもアクセスしていましたが、HPに入るとほぼ接続エラーが発生しました。しかしそのページのまま更新を行うと問題なく表示されることがほとんどです。はじめはページが消されているもしくは壊れていると思ってすぐ戻ってしまっていました。結果Sipeed社のHPから最新のfirmwareをインストールするという考えに気付くまで時間がかかってしまいました(言い訳かもしれません)。
まとめ
今回は予想外のトラブルにあい、環境構築だけで時間がかかってしまいました。でも何とか使えるようにはなったので、次以降からUnitV AI CameraでやったプログラムをSipeed Maix M1 Dockでも実現するなどに挑戦していきます。