概要
Zybo Z7-20 にて、LUT-Network で構成したCNNが1000fpsの高速度カメラ入力にてリアルタイムで動き始めたので、結果を纏めておきます。
システムの構成とか、カメラやOLEDの高速駆動とかは過去記事をご参照ください。
システムの構成とか、カメラやOLEDの高速駆動とかは過去記事をご参照ください。
RTLの生成に利用したコードは、githubに置いております。
畳み込み(CNN)が動き出したことによって、実際に組めるネットワークの幅が一気に広がりますので、実用性という点では一気に現実味をおびてきたかと思います。
動画
見た目は今までのフラットなネットと大きな差は無いと思います。
結果を抵抗などで使われる 0:黒 1:茶 2:赤 3:橙 4:黄 5:緑 6:青 7:紫 8:灰 9:白 のカラーコードで表示しています。
結果を抵抗などで使われる 0:黒 1:茶 2:赤 3:橙 4:黄 5:緑 6:青 7:紫 8:灰 9:白 のカラーコードで表示しています。
ネットワーク構成
ネットワークの構成は下記のとおりです。今回はCNNをRTL化して合成するまでの一連のパスを通すことを重視したので、学習が短時間で出来る範囲の軽量な構成に留めています。

学習ログ
以下、学習ログです。さらに流すともう少し認識率上がるのですが、今回は認識率上げるのがメインではないので16epochで打ち切っています。それでもCNNによって少ないリソースでまあまあの認識率(testデータに対して92.8%)です。
システム構成
システムの構成は以下のような感じです。今回はCNNの実験がメインだったので、結果の反映は1frame遅れでOSD掛けています(カメラ画像はダイレクトにOLEDに送っています)。
CNNだけだと、U-Net の前半だけとも言えるので、後半部分をダイレクトのパスに入れ込んでリアルタイム映像処理ができるようなアーキテクチャに持ち込めればと考えております。
シミュレーション結果
以下SIMの結果です。2×2のMaxPolを2回通っているので、4×4単位での結果になります。今回出力を各クラス8本用意しており、カウンティングで6以上のときに色付けしています。 また、回路がまだ十分デバッグできておらず(というか一部手抜きで)、数字と結果箇所が少しずれていますが、ご容赦ください。
MNISTのデータ自体がこのような使い方をする想定ではないので、数字が中央に来た時以外はあまり結果が期待できません。それでも数字と対応する箇所はそれっぽい結果のようです。
ちゃんとやるにはMNIST画像をもっと、拡大/縮小/回転/移動など行ったデータも作って(Data Augmentation)学習が必要と思います。
合成結果
以下、合成結果です。XC7Z020という小さなFPGAに対して、非常にコンパクトに収まっております。
今回CNNなので、畳み込みのブロック溜め込むためにブロックRAMを利用しています。たとえば3×3の畳込みであれば 2ライン分のラインバッファが必要となります。
今回CNNなので、畳み込みのブロック溜め込むためにブロックRAMを利用しています。たとえば3×3の畳込みであれば 2ライン分のラインバッファが必要となります。
[DNN部のみ]

[システム全体]

全体として、カメラやOLEDの駆動を入れても余裕綽々といったところでして、リアルタイムにDNNによる画像処理の可能性が見えてきたように思います。
電脳メガネ計画の実現にはまだまだ長い道のりがありますが、身近に手に入るデバイスだけでもテクノロジーとしては結構揃うんじゃないかと思い始めています。
電脳メガネ計画の実現にはまだまだ長い道のりがありますが、身近に手に入るデバイスだけでもテクノロジーとしては結構揃うんじゃないかと思い始めています。
コメント