LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション
はじめに
従来のパーセプトロンモデルを使った学習ではなく、回路そのものを微分してFPGAを直接学習してしまおうという当サイトオリジナルのディープラーニングLUT-Networkですが、ここのところ深いネットを学習させるために蒸留(Knowledge Distillation)に取り組んでいました。
その一つの成果として、MNISTデータを使ったセマンティックセグメンテーション(もどき)を試してみたのでブログに記録しておきます。
まずは先に結果
まず先に最新の結果を記載いたします。MNISTベースの画像を入力して、それぞれの数字領域を色塗りするセマンティックセグメンテーション(もどき)を学習させてみました。
出力画像
上記の入力画像をもとに Verilog のRTLシミュレーションで得た結果画像が以下です。
FPGAリソース
下記が実際にRTLを合成した場合のリソース量です。DNN部のみですが、畳み込みの為のラインバッファなどの制御回路のLUTも含んでいます。
以上のように、ZYBO Z7-20 のリソースを半分も使うことなく、また外部メモリを使うこともなく、上に記載のリソースのみでスループット1のDNN回路が出来上がりました。MobileNet風の接続の導入で配線がスリムになったことで合成時のルーティングなどでの問題もまったく発生していません。
一応、学習済みのソースをここに置いておきます。
本回路はビデオ伝送路にラインバッファ分の遅延のみで、ビデオ信号の経路にフィルタとして挿入可能です。またLUT-NetはLUT1段で1層ですので非常に高クロックで合成可能で、例えば300MHz程度で合成も可能です。ピクセルクロック300MHzといえば4k画像30fpsに相当しますといえば想像しやすいのではないかと思います。
細かい部分はまだいろいろチューニング余地がありますが、まずはフレーム単位でメモリに溜めないと演算できないGPUに対してリソース量もリアルタイム性も非常に高いFPGAでのAIの可能性が少しだけ広がったのではないかと思います。
ネットワーク構成
ちなみにFPGAリソースこそ少ないですが、depthwise CNV と pointwise CNV で合わせて57層という結構深いネットになっています。
一応、出力させたネット構造のみテキストファイルで置いておきます。
ベースモデル:ダウンロード - training_model.txt
蒸留後のモデル:ダウンロード - lutnet_model.txt
MobileNet風の構成と蒸留(Distillation)の小規模実験
今回の進展にあたり、大きな変化となったのが MobileNet v1 風の考え方の取り込みと、蒸留(Distillation)という考え方です。
まず、セマンティックセグメンテーション風の色塗りをやる前に行った、普通のMNITのクラス分類で適用したネットワークの構成が以下です。
MobileNet v1 を参考に depthwise/pointwiseの畳み込み層を準備しています。その際にLUT-Net特有の改善としてdepthwise層の出力チャネルを入力チャネルより多くし、同じチャネルを処理するノードを複数割り当てています(今回は各4個づつ)。
全結線のノードと違い、深さ方向に各1個だと1チャネルの属性を十分捉えらてないため、異なる成分をとらえることが可能になるように多様性を持たせています。なお、多様化した結果、結局使われなかったノードは後の蒸留時に消滅しますのでここは安心して増やすことが可能です。
ちなみにこのMobileNet風の構成は蒸留することなくランダム結線のままでも比較的効率よく学習してくれる模様で、以下がその学習時のログです。
63epoch目で 99.08% の認識率まで確認しています。
特徴的なのが、train と test でほとんど挙動に差がなく、LUT-Net の汎化性能に関してはパーセプトロン型のDNN同等以上の可能性も感じています。
蒸留の効果確認
ちなみに先の例では蒸留の有無にかかわらず99%超えてしまい、効果がよくわからないのでもう少し回路を小さくして実験しました。
その際の回路構成が下記です。
LUT 3k個程度の小さな回路ですが、飽和するまで回したところ
蒸留した場合:98.42%
ランダム結線:97.06%
となり、蒸留によって結線の最適化をした方で若干の改善が見られました。
まとめ
LUT-Netの開発もしばらく停滞していた感もありましたが、MobileNet構成の実験と、蒸留の可能性が見えてきたことで適用可能性が一気に増えてきたように思います。
特に全結線層を使えばバイナリネットであっても、比較的深い層も通常のDNN同様に学習できることが見え初めてきましたのでそこからLUT-Netに持ち込めるというのは大きな成果に思います。
またその際もすべて全結線層にするのではなく、depthwise層は初めからLUT-Netにしていますので比較的相性良く組み合わせる手が見えてきたと思っております。
引き続き、もっといろいろな応用ができればと思う次第です。
今回のセグメンテーションは、Pooling層無しで行っており、すべてのノードが100%演算している反面、フィルタの段数分(ラインバッファの範囲)でしか判別ができません。よって小さな範囲を見て判定できるアプリにしか使えませんが、それでも小さい範囲で認識が完結する欠陥検知や異物検知系の見分け補助とか、線画やモノクロ写真の色付けとか、がリアルタイムでできないものか、とか、いろいろとワクワクする応用例は思いつくわけです(実用になるかは別として)。
広い領域を見るにはU-Net的なことをする必要が出てきますが、その場合は一度中間結果をメモリに入れないといけないのと、PoolingするとLUT-Netの場合演算器の利用効率が下がるので、やるなら並列して1frame前の画像を通常型の演算器でやって、最新フレームの入力に追加チャネルとして入れるのがいいのかなと思っていたりもします。まだまだ先が長いですのでのんびり取り組んで行ければと思います。
追記(2020/03/13)
セマンティックセグメンテーションについて動画を作りましたので置いておきます。
全体の合成でも配線混雑やタイミング収束などで苦しむことは全くなく、あっさり合成出来きました。MobileNetの効果は大きいです。
1msの遅延で1000fpsがAI処理付きでカメラからOLEDに通り抜けており、OLEDが画面がまるでガラスのように向こう側が遅延なくAI重畳されて映し出されています。
AI眼鏡の可能性の提示と、電脳コイルの世界への入り口となること祈りつつ。
« LUT-Networkの蒸留(Distillation)について | トップページ | Deep Learning の開発フロー »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
「Deep Learning」カテゴリの記事
- Deep Learning の開発フロー(2020.03.23)
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
この記事へのコメントは終了しました。
コメント