2020年6月1日月曜日

M5StickVでSemantic Segmentationやってみた(1)



インターンの日程と授業日程がことごとく合わない中の人です.
今回はやるやる詐欺で延期していたM5StickV(K210)でSemantic Segmentationの話です.
メモリサイズとか、ネットワークが実行できないとか色々あったのでその辺の話もしていけたらと思います.



1.Semantic Segmenationとは


こんな感じのヤツ.https://mc.ai/semantic-segmentation-for-dummies/より

Semantic Segmentationはピクセル単位でクラス分類を行うタスクで,自動運転などの例でよく出てくるあれです.普通のクラス分類と比べ出力のサイズが大きくなりやすい傾向があります.Instance Segmentationはこれの親戚にあたる.

2.モデルの構築


Semantic Segmentationのモデルはいろいろ提案されています.速度重視のものだとENet,ICNet,ESPNetなどがあります。とはいえ論文中だと速度計測用のデバイスがRTX2080やTitanといった普通のGPUになっていることが多く,そのままでは到底K210では使えません。
そこで今回は泣く泣く独自にモデルを設計することから始めます。

3.KPUのメモリとモデルの制約


K210のKPUを使う場合,メモリの制約を気にする必要があります.

参考:kmodel v4 tips

特に入出力用のメモリは2MBなので、画像サイズを気にしないとサイズオーバーで動かなくなります。(NNCaseでのコンパイルはサイズオーバーでも通ってしまい、実機に突っ込んで初めて気がつくなんてことがありました)
今回は32x32x3の入力で32x32x5の出力にしました。もう少し大きくても動きそうな
印象です。
パラメータの方はまだ余裕がありそうなので、もう少し深いモデルでも動きそうです.(今回の場合では50%程度しか使っていない)

4.NNCaseが対応するレイヤ


NNCaseで使えるTFLiteのレイヤには制限があり,kerasで作ったモデルが使えないなんてこともあります.

参考:tflite_ops.md

netronなどで,TFLiteに変換したモデルを確認するといいでしょう.
実はTFLite以外にもONNXとCaffeにも対応しています.こちらも対応表があるので,使う場合には参考にしましょう.

5.自作したモデル


モデル全体図.サイズ違いの同じ画像の入力を渡すようにしている.

今回作成したモデルはサイズ違いの入力を持つ構成にしました.各ブロックの中身はこんな感じ.

ブロック部分.フィルタサイズを変えている.

MixConvもどきです.高速化の観点からだとKPUがダイレクトに走らせられるようにカーネルサイズを3x3にしたいのですが,無理やり3x3を2回走らせるよりはマシってことで5x5カーネルを使用しています.
元の入力が32x32の時点でここまで小さくする必要はないのですが,何となくやってます.実は,KPUの仕様的にはあと1回ぐらいはサイズを落とせる(4x4)ようなのですが,そこまで落としても意味が無さそうなのでやっていません.

6.次回予告


次回もモデルの解説をうだうだやりつつ,NNCase v0.2.0 Beta4を使った実装の方もやっていきたいと思います.



©2020 shts All Right Reserved.

0 件のコメント:

コメントを投稿