記事一覧

M5UnitVでV-Trainingを試してみた

M5UnitVでV-Trainingを試してみた



こんにちはRoboTakaoです

先日よりトライアルしているM5UnitVでいよいよディープラーニングのテストです。

M5UnitV31.jpg

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


大きな流れは下の図のようになっています。

M5UnitV35.png

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

M5UnitV20.png

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


ここでBootプログラムを起動してみるとエラーが出ました。

M5UnitV36.png

画面が大きすぎるようです。一行追加しました。

sensor.set_windowing((192, 192)) # Set 192x192 window.

M5UnitV18.png

これでエラーなく動きました。

ボタンAで1クラス35枚以上の写真を撮ります。
後述しますが、35枚よりも多く撮っておいた方が良いでしょう。


ボタンBでクラスを変更します。
クラスとは要は識別したい対象の種類です。
10クラスまで処理できるようです。


写真をパシャパシャと撮ります
(音はしません。ボタンはめっちゃ押しにくいです)


1クラス35枚以上撮って、2クラス以上撮影します。
あとで分かったのですが3クラス以上ないと正しく識別してくれないようです。


今回は3つのクラスでライオンとキューピーとパイロットとしました。
これも後で分かったのですが、背景だけのクラスを作るとより識別してくれるようです。


M5UnitV31.jpg
M5UnitV32.jpg
M5UnitV33.jpg
M5UnitV34.jpg

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

M5UnitV19.png

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


次にhttp://v-training.m5stack.comにアクセスします。

M5UnitV21.png

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

M5UnitV22.png

選択すると自動的にアップロードされます。

処理状況がTaskに表示されます。

自分のタスクが無くなれば処理が完了して、記入したアドレスにメールが来ます。

問題なければ、下記のようなメールが来て、URLのリンク先をクリックすると
Zipファイルがダウンロードされます。


M5UnitV25.png
M5UnitV26.png

でもエラーになることもあります。
私の場合、下記のようなエラーが出ました。


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


M5UnitV24.png
M5UnitV23.png

メールは多少時間をおいてから来ますので待ちましょう。

ダウンロードしたZipファイルの中身はこのようになっています。

M5UnitV29.png

この中で*******.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します。

M5UnitV27.png



それぞれのおもちゃに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)



コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/