忘れそうな内容をメモしています

忘れっぽいのでメモ帳がわりに色々書いてます

aXeleRateで作ったセマンティックセグメンテーションのモデルをM5StickVで動かしてみる(失敗編)

前回はMobilenetを転移学習させたモデルをM5StickVで動かしてみました。 shintarof.hatenablog.com

Detection、Segmentationも試したくなり調べていると、エッジ向けAIのaXeleRateというフレームワークを見つけました。

www.youtube.com github.com

Colab上で簡単にClassification、Detection、Segmentationのモデル(しかもkmodel形式)が作れるようです。

ということで早速、Readme.mdの「PASCAL-VOC 2012 Semantic Segmentation MobileNet7_5 backend + Segnet-Basic」を試してみました。

https://colab.research.google.com/github/AIWintermuteAI/aXeleRate/blob/master/resources/aXeleRate_test_segnet.ipynb

1.モデルのビルド&実行

ノートブックに沿って動かしていくと./segment/YYYY-MM-DD_hh-mm-ss/Segnet_best_val_loss.kmodelが生成されます。サイズは2.1MBでした。

これをそのままM5StickV上で動かして見ましたが、下記のエラーが発生しました。

ValueError: [MAIXPY]kpu: load error:2006, ERR_NO_MEM: memory not enough

エラーメッセージでググって以下ページを参考にさせていただきました。どうやらヒープメモリの空きが足りないようです。

qiita.com

実際に見てみるとこんな感じでした。

import sensor,lcd,image
import KPU as kpu
task = kpu.load("/sd/Segnet_best_val_loss.kmodel") 
print(kpu.memtest())

実行結果

###free gc heap memory : 486 KB
###free sys heap memory: 2188 KB

ヒープメモリの空きを増やすためにファームウェアの軽量化を行いました。手順は↑の記事を参考にさせていただきました。

2.ファームウェアの軽量化&書き換え

最初、手元のMacOS(Catalina 10.15.3)で最新版をビルドしたところ失敗したのでMintLinux 19.3で試したところうまく行きました。以下はその時の手順です。

kendryte-gnu-toolchainをダウンロード、展開
$wget https://github.com/kendryte/kendryte-gnu-toolchain/releases/download/v8.2.0-20190213/kendryte-toolchain-ubuntu-amd64-8.2.0-20190213.tar.gz
#tar -zxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190213.tar.gz -C /opt

maixpyのダウンロード、必要ライブラリのインストール
$git clone https://github.com/sipeed/MaixPy.git
$cd MaixPy/
$git submodule update --recursive --init
$pip install -r requirements.txt
$cd projects/maixpy_m5stickv/
ファーウェアの設定
$python project.py menuconfig  
以下を選択
  Conponent Configration
   →MicroPython Configration
     → Module Configration

必要最低限と思われる項目だけ選んでみた f:id:shintarof:20200520204413p:plain

ビルド
$python project.py build
M5StickVへ書き込み
$kflash build/maix.bin

これで軽量版のファームウエアの書き込みができたので、作ったモデルを動かしてみます。

3.再び実行してみる

MaixIDE上で動かしたコード

import sensor,lcd,image
import KPU as kpu
print(kpu.memtest())
task = kpu.load('/sd/Segnet_best_val_loss.kmodel')
print(kpu.memtest())

実行結果

>>> ###free gc heap memory : 500 KB
###free sys heap memory: 4216 KB
None

ヒープメモリの空きは増えましたがkpu.loadの処理で固まってMaixpyIDEとM5StickVの接続が切れます。特にエラーメッセージは出ません。うーむ。なんでだろう。

20200521追記

問い合わせてみたところ、まだ開発中とのことでした。 en.bbs.sipeed.com