MotoJapan's Tech-Memo

技術めも

M5stickV初心者のための最速チュートリアル #2(コイン分類:クラウド学習とエッジAIで画像認識)

前提

前回の続きです。

motojapan.hateblo.jp

前回までで環境構築と最低限の動作確認は済んでいることが前提となる。

(ちなみに英語チュートリアルを読んでみるとIDEすらいらないことがわかる)

SDカードが必須です。

今回できること

詳細で柔軟な学習ができる訳ではなく、「1クラスあたり35枚ぐらい写真を撮影してくれれば、10クラスまでの画像分類が簡単にできるよ」というもの。

なのでBoundingBoxが出る訳でもないし、画角内の複数物体検出ができる訳でもない。

今回はコイン分類(1円、100円、500円)を題材にしてみる。

外形からは判断しにくいし反射するので、少し難易度は高いかなと。

f:id:motojapan:20190917004221p:plain

下記のイメージ図をみるとわかるが学習はクラウド

学習済みモデルをエッジで推論するような仕組み。

簡単なことで十分な人からすると、その手間が非常に少なくて小学生でもできそう。

多分、クラウド側ではM5StickVで動くサイズで転移学習をしてくれてるんじゃないかな?

機械学習のイメージ図

参考資料からの抜粋 f:id:motojapan:20190917003519p:plainhttps://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カードにファイル展開

  1. ここからZipをダウンロードし、SDカード内でUnzipする。
  2. M5StickV本体にSDカードを挿入する。

ポイントは、SDディレクトリ直下にboot.pyを置かないと認識されない。

OKな例

f:id:motojapan:20190917003311p:plain

NGな例

f:id:motojapan:20190917003419p:plain

2.画像分類したい被写体を撮影する

  1. 起動後、下の画像の画面が出て、待っていると撮影画面に写る。
  2. 写真上部のボタンでクラスを選択し、画面右ボタンで撮影する。(SDスロットは下部にあたる)

f:id:motojapan:20190917003450p:plain (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フォルダに保存されている模様。

(これ入れ替えしたら精度変わるのかな?)

f:id:motojapan:20190917003557p:plain

3.クラウドにデータをアップロードする

ここにアクセスしてSDカードのデータをアップロードする。

必要情報は、

  • メールアドレス(モデルが送信されるのでお間違いなく)
  • 撮影画像のZip

制約は、

  • Zip形式であると
  • ファイルサイズが200MB以下であること

zipアップロードで失敗するケース

今回は下記のようなフォルダ構成で、upload.zipを作成した。

f:id:motojapan:20190917003640p:plain

これでアップロードすると、「[V-Trainer] XXXXXXXXXX Online Training Request Failed (CONTENT: Train or Valid folder not found.)」

原因はzipを展開したフォルダの直下にtrain/validフォルダがないことが予想される。

対策

対策としては、階層を落とせるように2つを直接zip化する。

4.モデルをダウンロードする

  1. 少し待っていると個人メールアドレスにモデルが飛んでくる(今回は8分で完了)
  2. モデルをダウンロードし、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

f:id:motojapan:20190917003801p:plain

f:id:motojapan:20190917003830p:plain

f:id:motojapan:20190917003902p:plain

うん。そこそこって感じですかね。

ConfusionMatrixはvalidフォルダの画像がイケてないから余計悪く見える。

validフォルダを変更したりしたら、めちゃめちゃハマったので一旦このまま進むことにする。

メールに貼られているzipリンクの中身をSDカードに移動する。

f:id:motojapan:20190917004149p:plain

ファイル名からするに、量子化したKPUモデルである。

tensorflow-liteのモデルをnncaseで変換して動かせるんでしょうね(期待)

5.M5StickVで推論(物体検出)する

SDカードを挿入して電源を起動するだけで、SD直下のboot.pyが優先され、自動で推論が走る。

いざ、3コインを見分けられるか。

f:id:motojapan:20190917004221p:plain

  • type:1が1円玉
  • type:2が100円玉
  • type:3が500円玉

結果動画

Trained model for M5stickV

まぁぼちぼちって感じです。

ちなみに動画はベストケースで、遊んで見てわかったのは、100円玉が1円玉に勘違いされやすい。

所感

精度はおいておいて、3000円そこそこでエッジAIできるのはかなり楽しいし、色々とPoCが捗りそう。

次回は、認識結果をSPIで外に出すか、自作のtensorflow-liteモデルを実機で動かすか、MPU6886を動かすか、をやりたい。