M5stickV初心者のための最速チュートリアル #2(コイン分類:クラウド学習とエッジAIで画像認識)
- 前提
- 今回できること
- 機械学習のイメージ図
- 0.ファームを焼き込む
- 1.SDカードにbootファイルを展開する
- 2.画像分類したい被写体を撮影する
- 3.クラウドにデータをアップロードする
- 4.モデルをダウンロードする
- 5.M5StickVで推論(物体検出)する
- 所感
前提
前回の続きです。
前回までで環境構築と最低限の動作確認は済んでいることが前提となる。
(ちなみに英語チュートリアルを読んでみるとIDEすらいらないことがわかる)
SDカードが必須です。
今回できること
詳細で柔軟な学習ができる訳ではなく、「1クラスあたり35枚ぐらい写真を撮影してくれれば、10クラスまでの画像分類が簡単にできるよ」というもの。
なのでBoundingBoxが出る訳でもないし、画角内の複数物体検出ができる訳でもない。
今回はコイン分類(1円、100円、500円)を題材にしてみる。
外形からは判断しにくいし反射するので、少し難易度は高いかなと。
下記のイメージ図をみるとわかるが学習はクラウド。
学習済みモデルをエッジで推論するような仕組み。
簡単なことで十分な人からすると、その手間が非常に少なくて小学生でもできそう。
多分、クラウド側ではM5StickVで動くサイズで転移学習をしてくれてるんじゃないかな?
機械学習のイメージ図
参考資料からの抜粋 (https://docs.m5stack.com/#/en/related_documents/v-training からの抜粋)
0.ファームを焼き込む
ここからファームをダウンロードし、ここ(windowsの場合/macの場合)からKflash_GUIをインストールしてファームを焼き込む。
すでに焼いている場合は不要らしい。
1.SDカードにbootファイルを展開する
SDカードの選定
ここでSDカードが対応しているかチェックした方が良い。
現時点では、Kingston(32Gを除く)が良さげ。
今回は手持ちに動作確認が取れたSDがなかったので、 Transcend 64G SDXC FAT32で初期化して果敢に使ってみた。
SDカードにファイル展開
- ここからZipをダウンロードし、SDカード内でUnzipする。
- M5StickV本体にSDカードを挿入する。
ポイントは、SDディレクトリ直下にboot.pyを置かないと認識されない。
OKな例
NGな例
2.画像分類したい被写体を撮影する
- 起動後、下の画像の画面が出て、待っていると撮影画面に写る。
- 写真上部のボタンでクラスを選択し、画面右ボタンで撮影する。(SDスロットは下部にあたる)
(https://docs.m5stack.com/#/en/related_documents/v-training?id=burner-firmware から抜粋)
撮影時制約は、
- 画角内に他の物体が入らないこと
- 1クラスあたり最低35枚撮影すること
- 3クラス以上ないと精度が悪い(らしい)
円コインの分類してみる
今回は、円コインの分類ができるかやって見た。
1円玉、100円玉、500円玉の表面を3カテゴリ分類してみる。
撮影した感覚では
- 1円玉は、100円玉、500円玉と比べて凹凸が浅いので白とびしやすい。
- 100円玉と500円玉は、サイズ差分を除くと1と5の違いくらいしかない。
撮影した条件は下記の通り
制約として、 - コインの表面のみ - 背景は3種類
枚数は下記の通り
コイン | 撮影枚数 |
---|---|
1円玉 | 35枚 |
100円玉 | 44枚 |
500円玉 | 38枚 |
撮影が終わったらSDを確認。
こんな感じでtrain/validフォルダが作成されている。
どうやら自動的に31枚目~35枚目がvalidフォルダに保存されている模様。
(これ入れ替えしたら精度変わるのかな?)
3.クラウドにデータをアップロードする
ここにアクセスしてSDカードのデータをアップロードする。
必要情報は、
- メールアドレス(モデルが送信されるのでお間違いなく)
- 撮影画像のZip
制約は、
- Zip形式であると
- ファイルサイズが200MB以下であること
zipアップロードで失敗するケース
今回は下記のようなフォルダ構成で、upload.zipを作成した。
これでアップロードすると、「[V-Trainer] XXXXXXXXXX Online Training Request Failed (CONTENT: Train or Valid folder not found.)」
原因はzipを展開したフォルダの直下にtrain/validフォルダがないことが予想される。
対策
対策としては、階層を落とせるように2つを直接zip化する。
4.モデルをダウンロードする
- 少し待っていると個人メールアドレスにモデルが飛んでくる(今回は8分で完了)
- モデルをダウンロードし、SDカードにUnzipして、本体に挿入する
メールには学習結果が貼ってある
Your Model Parameters | value |
---|---|
Your Model Parameters | |
Final Loss | 0.02268105202820152 |
Final Accurancy | 0.9901960492134094 |
Final Validation Loss | 0.8285562992095947 |
Final Validation Accurancy | 0.800000011920929 |
Model | Mobilenet V1 Alpha1.0 Depth: 1 |
うん。そこそこって感じですかね。
ConfusionMatrixはvalidフォルダの画像がイケてないから余計悪く見える。
validフォルダを変更したりしたら、めちゃめちゃハマったので一旦このまま進むことにする。
メールに貼られているzipリンクの中身をSDカードに移動する。
ファイル名からするに、量子化したKPUモデルである。
tensorflow-liteのモデルをnncaseで変換して動かせるんでしょうね(期待)
5.M5StickVで推論(物体検出)する
SDカードを挿入して電源を起動するだけで、SD直下のboot.pyが優先され、自動で推論が走る。
いざ、3コインを見分けられるか。
- type:1が1円玉
- type:2が100円玉
- type:3が500円玉
結果動画
Trained model for M5stickV
M5StackVのV-trainingでコイン(1円、100円、500円)判定やってみた。
— motoJapan@enjoy-CVPR2019 (@motoJapanTw) September 15, 2019
精度は各学習データ30枚程度にしては十分、速度もそこそこ出ている。
賞賛すべきはエッジAI実践の手軽さ。#m5StackV #gif pic.twitter.com/jWgbREvMxB
まぁぼちぼちって感じです。
ちなみに動画はベストケースで、遊んで見てわかったのは、100円玉が1円玉に勘違いされやすい。
所感
精度はおいておいて、3000円そこそこでエッジAIできるのはかなり楽しいし、色々とPoCが捗りそう。
次回は、認識結果をSPIで外に出すか、自作のtensorflow-liteモデルを実機で動かすか、MPU6886を動かすか、をやりたい。