M5UnitVでV-Trainingを試してみた
- 2020/06/20
- 17:41
M5UnitVでV-Trainingを試してみた
こんにちはRoboTakaoです
先日よりトライアルしているM5UnitVでいよいよディープラーニングのテストです。

流れは基本的にはクイックスタートによります。
M5UnitVのクイックスタートよりM5StickVのクイックスタートの方が細かく書かれているので
両方参照すると良いと思います。
大きな流れは下の図のようになっています。

まずはbootプログラムをダウンロードします

MicroSDをM5UnitVに挿入します。(相性がだいぶあるようなのでクイックスタートを参照してください)
MaixPy IDEでBootプラグラムを起動します。
ここでBootプログラムを起動してみるとエラーが出ました。

画面が大きすぎるようです。一行追加しました。
sensor.set_windowing((192, 192)) # Set 192x192 window.

これでエラーなく動きました。
ボタンAで1クラス35枚以上の写真を撮ります。
後述しますが、35枚よりも多く撮っておいた方が良いでしょう。
ボタンBでクラスを変更します。
クラスとは要は識別したい対象の種類です。
10クラスまで処理できるようです。
写真をパシャパシャと撮ります
(音はしません。ボタンはめっちゃ押しにくいです)
1クラス35枚以上撮って、2クラス以上撮影します。
あとで分かったのですが3クラス以上ないと正しく識別してくれないようです。
今回は3つのクラスでライオンとキューピーとパイロットとしました。
これも後で分かったのですが、背景だけのクラスを作るとより識別してくれるようです。




枚数はシリアルターミナル(画面下)に出ます。

撮影が終わったらM5UnitVからMicroSDを抜いて、USBアダプタを使ってPCに刺します。
中にはtrainとvaildというホルダが出来上がっているのでそれを一緒にZip形式で圧縮して名前をupload.zipにします。
次にhttp://v-training.m5stack.comにアクセスします。

ここでEメールアドレスを入れて、Click here tp upload fileから先ほど作ったupload.zipを選択します。

選択すると自動的にアップロードされます。
処理状況がTaskに表示されます。
自分のタスクが無くなれば処理が完了して、記入したアドレスにメールが来ます。
問題なければ、下記のようなメールが来て、URLのリンク先をクリックすると
Zipファイルがダウンロードされます。


でもエラーになることもあります。
私の場合、下記のようなエラーが出ました。
一つは2つ以上のクラスがないとエラーになる。(実際には3つのクラスがないと正しく識別してくれない)
二つ目は写真が似ているから削除したというエラー。つまり写真が足りない。35枚でなくある程度多い方が良いと思います。


メールは多少時間をおいてから来ますので待ちましょう。
ダウンロードしたZipファイルの中身はこのようになっています。

この中で*******.kmodelとstartup.jpgをMicroSDに書き込みます。
boot.pyはMaixPy IDEで開きたいので書き込みません。
M5UnitVではstartup.jpgは不要と思いますが、一応入れています。
boot.pyは以下を変更しました。
sensor.reset()
の後に以下を入れて画面の反転を変更
sensor.set_hmirror(1)
sensor.set_vflip(1)
ラベルは初期値は["1","2","3"]のようになっていますが、変更すると固有の名称を使えます。
labels=["Lion","Kewpie","Pilot"] #You can check the numbers here to real names.
lcd.draw_string(40, 60, "Accu:%.2f Type:%s"%(pmax, labels[max_index].strip()))
の後に以下を挿入してシリアルターミナルで識別結果を確認できるようにしました。
print(labels[max_index]) #Print the identified object name through the serial port.
print(pmax)
これでboot.pyをRunします。

それぞれのおもちゃにM5UnitVを向けるとシリアルターミナルで識別結果を表示してくれました。
めでたしめでたし
しかしながらここまで来るのにだいぶ試行錯誤しました。
M5UnitVのMaixPyコード
import image
import lcd
import sensor
import sys
import time
import KPU as kpu
from fpioa_manager import *
import KPU as kpu
lcd.init()
lcd.rotation(2)
try:
from pmu import axp192
pmu = axp192()
pmu.enablePMICSleepMode(True)
except:
pass
try:
img = image.Image("/sd/startup.jpg")
lcd.display(img)
except:
lcd.draw_string(lcd.width()//2-100,lcd.height()//2-4, "Error: Cannot find start.jpg", lcd.WHITE, lcd.RED)
task = kpu.load("/sd/XXXXXXXXXXXXXXXX_mbnet10_quant.kmodel")
labels=["Lion","Kewpie","Pilot","Back"] #You can check the numbers here to real names.
sensor.reset()
sensor.set_hmirror(1)
sensor.set_vflip(1)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
sensor.run(1)
lcd.clear()
while(True):
img = sensor.snapshot()
fmap = kpu.forward(task, img)
plist=fmap[:]
pmax=max(plist)
max_index=plist.index(pmax)
a = lcd.display(img)
if pmax > 0.95:
lcd.draw_string(40, 60, "Accu:%.2f Type:%s"%(pmax, labels[max_index].strip()))
print(labels[max_index]) #Print the identified object name through the serial port.
print(pmax)
a = kpu.deinit(task)
スポンサードリンク