LUT-Networkの実機への組み込み

ひとまず実際にFPGAに組み込んで動き始めたので一旦ブログにも記載しておきます。

 なおLUT-Network学習用の環境(BinaryBrain)はgithubにて公開しながら日々開発中です。

以前やったRaspberry PI用カメラ(Raspberry Pi Camera Module V2)の 640×132@1009fps 駆動のカメラ画像をMNISTのLUT-NetworkによるMLP(Multi Layer Perceptron)を一画素づつずらしながら適用してそのまま、869fps駆動のOLEDに表示しています。

MNIST(28×28サイズ)の推定自体はカメラ側の速度で動かしていますので、推定部分自体は 1009× 640 x 132 = 85,240,320fps で動作している計算になります。

 カメラ入力からOLED出力までの間にフレームメモリは存在せず、27ライン分のラインバッファがあるのみですので、FPGA内での信号処理での遅延はほぼゼロに近く、殆どはカメラ読み出し(伝送速度律速)の1msの遅延のみでの動作となっています。

 認識の結果はカーボン抵抗などの表記に使われているカラーコード(0:黒 1:茶 2:赤 3:橙 4:黄 5:緑 6:青 7:紫 8:灰 9:白)で表示しています。

動画だと分かり難いのでシミュレーションした画像を張っておきますと

のようになります。なんとなく数字の中心付近(学習時と重なる位置)では正しい答えが出ています(ちょっとずれただけで違う色が出ているのもよく分かりますが)。
そもそも学習セットがこのような使い方を想定していないのでやや無理がある使い方ですが、ここはCNN(畳込み)を使えるようになれば、ある程度このような使い方を想定した学習も可能になると思います。

まだ畳込みの実機移行のパスは確立出来ていませんが、1ピクセルづつずらしながらMLPを適用するのは、回路的には28×28サイズの1段の畳込みをやってるのと同じでして、CNNならこれが3×3などの回路負担の少ないものに分割できるのでもっと効率よくできるはずす。ちゃんとCNNで学習したもので同じ事をやればもっと見栄えも性能も上がることが期待できるので、今後学習の方を頑張る必要がありそうです。

なお、利用しているボードは Zybo Z7-20 ( XC7Z020-1CLG400C) での全体のリリースは以下のような感じです。

ネットワーク構成は 256-256-128-128-128-128-128-30 の7段(つまり遅延も7サイクルのみ)で、LUT使用数は 1182個です。なので殆どはカメラ制御と表示制御で使っています(ネットワーク経由で X-Window から画像表示できるようにもにしてますしね)

現時点では

  • 「他の入出力回路と一緒に組み込んでちゃんと動かせた」
  • 「回路構成的には28×28の畳込みが動いたのでCNNにも耐えそう」
  • 「配線混雑とかも少し見え始めて、まだいろいろやれそう」

 といったところが成果かと思っています。

将来CNNをやる場合は、プーリング層が少し悩みどころでして、画像サイズ自体が小さくなってしまうため、そのままだと今のような判りやすい表示が出来なくなります。なので、リアルタイム表示を楽しむには、プーリング層なしで組むか、フレームメモリを使って U-Net のような構成を考える必要があります。

 なお、当サイトはリアルタイム処理が信条なので、フレームメモリを使う場合でも遅延増加させる気は毛頭無く、「遅れても結果に影響しない成分だけ過去フレームを使って、後は最新データで処理をする」と言うことを考えています。

 プーリング層=画像縮小なので、より低周波数な情報になります。一方で高速度撮影の世界ではframe間の移動は微小なので、縮小前の情報が主となります。

 なので、解像度の高い最新画像+解像度の低い1frame前画像の合成による予測はそれなりに機能するはずです。

 まだディープラーニングの層構成にハイスピードビジョンを前提としたアーキテクチャは無いと思いますので、このあたりも面白い取り組みかなと思っています。

 まだまだ先は長いですが、一歩づつは前に進んでいるのかなと。

(おまけ)
 今やZyboは秋月で買えるし、 カメラなんかAmazonでも買えてしまうし、気軽にいろんなことが出来てしまう時代ですね。

コメント

タイトルとURLをコピーしました