久しぶりに研究室に顔を出しに行ったら,次の日筋肉痛になった中の人です.前回に引き続き,M5StickV(K210)にSemantic Segmentationを入れる話です.
1.使えそうで使えないレイヤ
前回示したように,使えるレイヤを守ればKeras->TFLite->NNCaseの変換は可能です.しかし,Softmaxレイヤ(Activation("softmax")も同様)に関しては動作しませんでした.
公式がBBS等で配布しているデータだと,Softmaxを使っているモデルもあるのでそこから類推するに,画像のような2D(実際はチャンネル方向があるので3D)データは動かず,全結合層の出力のように1Dのデータのみ動くようになっていると考えられます.この問題はBeta3, Beta4で確認したのですが,そのうちだれかがIssue上げてくれないかなって思っています(そこまで手が回らない).2.Softmaxを回避する
こうなるとSoftmaxを使わずにモデルを構築したいわけですが,トレーニング時にはこのレイヤがないと正しく収束しないことがほとんどだったので,結局必要になります.
回避方法としてはいくつか存在して,
- tensorflowの損失関数でSoftmaxが含まれているものを使う
- Softmaxありで学習したモデルからSoftmaxを取り除く
あたりが主な方法になりそうです.1のやり方は,Tensorflow 1.x系だと存在したのですが,2.x系で廃止されたようです(tf.compat.v1には残されているので,厳密には存在している).
2.xの書き方になるべくしたいと考えているので,今回は2のやり方で回避しました.
モデル分割のやり方はここを見てほしいです.元のモデルをロードして,分割したものを新しいモデルとして生成しなおす方式をとっています.
3.モデルのトレーニング
今回はVOC2012をベースに,人,椅子+ソファー,テーブル,人,TVの5分類としました.画像サイズも入力が32x32x3,出力が32x32x5となるように変更し,データ生成時には左右を反転した画像も追加するようにしました(実際はじょうげ反転も入れたほうが良い).
誤差関数はCategorogicalCrossentropyの結果にピクセルの出現回数に合わせた係数を掛け合わせています.
4.トレーニング結果
こんな感じになりました(この入力画像はトレーニングに使用していない).
枝刈りをやってみたのですが,ファイルサイズなどはそこまで変わった気がしていません.クラス分類でArgmaxを取って結果を出すので,Softmaxは取り除いても影響は全くありません.
そこそこ動きそうだったのでNNCaseでコンパイルしました.NNCaseでのコンパイルの際はtfliteの量子化されていない版を使用しましょう.量子化はNNCaseで勝手にやります.
そこそこ動きそうだったのでNNCaseでコンパイルしました.NNCaseでのコンパイルの際はtfliteの量子化されていない版を使用しましょう.量子化はNNCaseで勝手にやります.
5.NNCase
NNCaseではここを参考にしてコンパイルをしました.オプション等が変わっているので,注意が必要です.
.\ncc.exe compile Model_V0_1.tflite Model_V0_1.kmodel -i tflite -o kmodel --dataset ./data/JPEGImages_Sample/ --dataset-format image --inference-type uint8 --input-mean 0 --input-std 1 --dump-ir --input-type uint8 --max-allocator-solve-secs 120 --calibrate-method l2 --dump-weights-range --weights-quantize-threshold 128 --output-quantize-threshold 256
パラメータの量子化のためにデータセットのサンプルを準備することや,quantizeのためのオプションの値の設定があります.この辺はモデルと出力結果を眺めつつ変えていけばいいと思います.
このコンパイル作業は非常に長いので(3-40min, XPS 9360 i5モデル),気長に待ちます.この時の出力結果にモデルのサイズが出るので,KPUのメモリに載るかを確認しておきましょう.大きい場合は,元モデルの構造を変えることなどで修正しましょう.
このコンパイル作業は非常に長いので(3-40min, XPS 9360 i5モデル),気長に待ちます.この時の出力結果にモデルのサイズが出るので,KPUのメモリに載るかを確認しておきましょう.大きい場合は,元モデルの構造を変えることなどで修正しましょう.
6.次回予告
NNCaseでのコンパイルが終わったので,実機確認編です.
©2020 shts All Right Reserved.