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

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

M5StickV用のmnist分類モデルを作成してみた②

M5StickVでmnistのcnnモデルを動かしてみたい思いGW中試行錯誤していましたが、
以下のコードに沿って作成したkmodelをM5StickVに書き込み動かすことができました。 https://colab.research.google.com/github/ashitani/jupyter_examples/blob/master/mnist_keras_maixpy_colab.ipynb

試行錯誤の中身は以下をご覧ください。 shintarof.hatenablog.com

ただ、正直あまり中身を理解できていないので、何をしているのか自分なりに整理してみました。
*間違っているところなどあればご指摘いただけると嬉しいです。


1.CNNモデル作成

kerasのmnist_cnnのサンプルコードでモデルを生成しています。
ただ、nncaseというツールでM5StickV向けのモデルに変換するのですが変換可能なレイヤに制約があるため、Conv2Dのpaddingパラメータをsameに設定したり、Denseのユニット数を小さく設定しています。
この辺りの調整がオリジナルのモデルを作る時に工夫が必要そうです。

nncaseとは?

Kendryte K210向けのディープラーニングモデル変換ツールです。

Open deep learning compiler stack for Kendryte K210 AI accelerator(https://github.com/kendryte/nncaseより抜粋)

変換可能なレイヤーには以下のような制約があるようです。

  • Feature map shape: Input feature maps smaller than or equal to 320x240(WxH) and output features map larger than or equal to 4x4(WxH) and channels are between 1 to 1024 are supported.
  • Same symmetric paddings (TensorFlow use asymmetric paddings when stride=2 and size is even).
  • Normal Conv2D and DepthwiseConv2D of 1x1 or 3x3 filters and stride is 1 or 2.
  • MaxPool(2x2 or 4x4) and AveragePool(2x2 or 4x4).
  • Any elementwise activations (ReLU, ReLU6, LeakyRelu, Sigmoid...), PReLU is not supported by KPU. (https://github.com/kendryte/nncase/blob/master/docs/FAQ_EN.mdより抜粋)
Kendryte K210とは?

M5StickVに搭載されているcanaan社が生産しているRISC-VベースのエッジAIチップです。

canaan released the RISC-V-based edge AI chip Kendryte K210, now widely used in access control, smart door locks.(https://kendryte.com/#about抜粋)

詳細は以下が大変わかりやすかったです。ありがとうございます。
jhalfmoon.com


2.CNNモデルの変換1(.h5形式→.tflite形式)

tensorflowのtflite_convertコマンドで作成した.h5形式のモデルを.tflite形式に変換しています。


3.CNNモデルの変換2(.tflite形式→.kmodel形式)

nncaseのnccコマンドで.tflite形式のモデルを.kmodel形式に変換しています。 この時に--datasetオプションで画像が入っているディレクトリを指定する必要がありますが、これはパラメータの量子化の際に使用しているようです。

--dataset calibration dataset, used in post quantization (https://github.com/kendryte/nncase/blob/master/docs/USAGE_EN.mdより抜粋)


4.分類モデルのパッケージ化(.kmodel形式→.kfpkg形式)

M5StickVにモデルを書き込む際は.kfpkg形式にして書き込むか、モデル自体を転送する必要がありますが、.kfpkg形式にするためには.kmodel形式のモデルとその情報(書き込み先アドレスとモデル名)を書いたjsonをzip圧縮すれば良いそうです。 github.com


一連の流れを理解できたので、この方法に沿ってfashion-mnistのデータセットで作ったcnnモデルをM5StickVに載せてみました。
「Tシャツ」でググって出てきた画像をTシャツとを認識してくれています。

f:id:shintarof:20200513221728g:plain