2020年3月18日水曜日

tf.kerasの自作モデルをNNCase v0.2.0 (kmodel V4)に対応させ、M5StickV(K210)上で動かす(3)



 この前研究室に行ったら、学位記って書かれた紙を受け取った中の人です。概略(0)モデル構築(1)kmodelの生成(2)に引き続きkmodel v4をM5StickVで動かす話です。


3-1.MaixPyのファームウェア

 M5StickV向けのプログラミングにはいくつかの方法がありますが、今回はkmodel v4(NNCase v0.2.0)対応のMaixPyを使います。MaixPyを使う場合は、Sipeedが配布しているファームウェアを焼く必要があります。最新版はv0.5.0_31のようです(2020/3/18現在)。M5StickV向けのファームウェアは、maixpy_v0.5.0_31_gd3e71c0_m5stickv.bin です。


3-2.ファームウェアを焼く

ファームウェアの書き込み。中の人は独自ビルドのファームウェアを使用するため、
ファイル名が異なっている
 先ほど紹介したファームウェアと、前回生成したkmodelをKflash GUIを用いて焼きました。ファームウェアは0x00000番地(デフォルト)、kmodelは0x500000番地を先頭に設定しました。

3-3.KPUライブラリ

 MaixPyはMicroPythonをベースにK210向けにライブラリを追加・改変したもので、Python-likeな書き方ができます。K210に搭載されているKPU向けのライブラリも追加されており、比較的容易に扱うことができます、

3-4.関数解説

 Kmodel V4からマルチアウトプットに対応した関係で、V3(NNCase v0.1.0)のころとは書き方が変わっています。

3-4-1. KPU.load(addr)

引数
  • addr : kmodelの先頭アドレス
戻り値
  • task : kpu_netオブジェクト
 最初に実行するのが KPU.load(addr) です。addrはkmodelを焼いた際に指定した先頭アドレス(今回なら0x500000)を指定します。task = KPU.load(0x500000) のようにし、kpu_netオブジェクトを保持しておきましょう。

3-4-2. KPU.set_outputs(task, index, width, height, depth)

引数
  • task : kpu_netオブジェクト
  • index : 何番目のモデル出力かを指定
  • width、height、depth : 出力の横、縦、深さ形状
戻り値
 いまいちわかっていません。どなたか情報をください。
 2020/3/26追記:ただのboolでした。確保できればTrueが返ってきます。

 Kmodel V4になってから必要になった関数です。V4からは複数出力に対応したので、このようなものが必要になったようです。タプル等を使って複数同時指定皆体なことはできないので、各モデル出力に対して実行する必要があるようです。

3-4-3.  KPU.forward(task, data, [layer)

引数
  • task : kpu_netオブジェクト
  • data : モデル入力。imageオブジェクトのみかも。
  • layer : 実行するレイヤ番号。
戻り値
  • fmap : フィーチャーマップ 
 KPUで実際にモデルを実行する関数です。layerは省略すると、モデル全体の計算を行います。fmapはNCHWフォーマットで、単一出力の場合は、1次元化されたタプルが返ってきます。

3-4-4. KPU.memtest()

 メモリの確保状況を取得します。

3-4-5. KPU.deinit(task)

引数
  • task : kpu_netオブジェクト
 メモリの開放などを行います。

3-5.動作

動作の様子。もっさりしている。


とりあえず動作しました。画面描画を含め3FPSを少し超える程度ですが、動いているのでよしとしましょう(KPU単体なら7FPS程度)。より高速に動作させる場合は、モデルのレイヤ数の低減や入出力サイズの縮小を行うべきです。

 ソースコードはこちら:https://github.com/shtsno24/DAE_for_M5StickV/blob/master/M5StickV/KPU_Test.py

3-6. まとめ

 全4回でM5StickV上でKmodel V4を動かす話をしてきました。日本語情報がほぼない中で完全手探りでしたが、簡易的に動かすことができました。まだ試していない関数があるので、今後の課題にしておきます。
 今後はセマンティックセグメンテーションなどの応用にチャレンジしていきたいと思います。

参考:KPU - MaixPy DOC https://maixpy.sipeed.com/en/libs/Maix/kpu.html
   MaixPy support new nncase & Kmodel V4 Now~ - MAIX - Sipeed bbs
   https://en.bbs.sipeed.com/t/topic/1790


©2020 shts All Right Reserved.

0 件のコメント:

コメントを投稿