前回はCNN(畳み込みニューラルネットワーク)がどういう形で構成されるものなのか?をざっくり見てきました。
今回はLattice社の人検出のリファレンスデザイン使用されているニューラルネットワークモデルではどのように結果が出力されるのかを見ていきたいと思います。
物体検出アルゴリズム "SqueezeDet"
Lattice社の人検出のリファレンスデザインでは"SqueezeDet"という物体検出のアルゴリズムが使われているようです。
以下Cornell Univercityのサイトに掲載されており、サイト内に論文pdfへのリンクがあります。論文を読んでもなかなか理解が難しかったのですが、何となく理解できたのは以下の通りです。
- "精度"、"速度"、"モデルサイズの大きさ"、"エネルギー効率"のバランスを考慮し、GPUのような強力なデバイスだけではなく、組み込みシステムにも実装可能なモデルにしている。
- 物体検出アルゴリズムの1つである"YOLO"の影響を受けており、物体の"場所"と"分類"の両方の推論を同時に実現することができる。
- 以下の3つの機能が1つの流れ(Pipeline)になっている
- 低解像度・高次元の特徴マップを抽出する畳み込みニューラルネットワーク
- ConvDetと呼ばれる検出対象物のバウンディングボックスと確信度を算出するための畳み込み層
- 複数出力されたバウンディングボックスのうち高い確信度のもの抽出したり重複を除去するフィルター

https://arxiv.org/pdf/1612.01051.pdf
論文 "SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real-Time Object Detection for Autonomous Driving" から引用
Pipelineの最初の畳み込みニューラルネットワークの部分はいろいろなCNNアーキテクチャーが利用可能とのことで、VGGやResNetなども適用できるようです。Lattice社のHuman CountのリファレンスデザインにもMobilenetV1とかV2とかResNetとかいろいろと種類があるのは、この最初の畳み込みニューラルネットワークの部分のアーキテクチャーのバリエーションを示しているということなのだと思います。
リファレンスデザインのドキュメントを見ると、最後の"高い確信度のもの抽出したり重複を除去するフィルタ"の部分はどうやらFPGAの回路で実施しているようです。ConvDetの部分までをニューラルネットワークモデルで実施しているようですね。
前回のモデルの構造の図で言うと、このような内訳になるようです。

推論結果の構造は?
ConvDetの部分からどういう形で推論結果が出力されるのかが重要なので、これも調べてみました。
Lattice社の人検出のリファレンスデザインで使用しているニューラルネットワークモデルでは解像度224x224の画像を使用して推論処理をおこなっていますが、以下の図のように224x224のサイズの画面を縦方向および横方向にそれぞれ14ずつ、合計196個の領域に分け、それぞれの領域について検出をおこなうような形で処理しているようです。この領域1つずつをそれぞれGridと呼びます。

1つのGridには7つのAnchorと呼ばれるバウンディングボックスが属しており、Anchorごとに物体の検出結果が出力されるようになっているようです。7つのAnchorのそれぞれのバウンディングボックスサイズは以下の通りです。
Anchor1 : 184x184, Anchor2 : 138x138, Anchor3 : 92x92, Anchor4 : 69x69, Anchor5 : 46x46, Anchor6 : 34x34, Anchor7 : 23x23
各Anchorごとに以下の6つの要素が結果として出力されます。

よってニューラルネットワークモデルからの出力データ個数は
196 x 7 x 6=8232個 となります。
上記の表のように、ニューラルネットワークモデルからは推論結果としてDeltaX, DeltaY, DeltaW, DeltaHが出力されますが、これらの値と、各GridのCenter座標や、各Anchorのサイズなどを利用して、最終的な検出物の座標とサイズ(X’, Y’, W’, H’)が以下の計算式で算出できます。

8232個分の推論結果は以下のような順番で出力されることになるようです。

上記の出力内容は今回のニューラルネットワークモデルの最終層であるConvDetの内容になりますが、Pythonコードで言うと以下の部分(self.preds)になります。
(第2回の際にダウンロードした"mobilenetV2_crosslink_nx_vnv_training.zip (ニューラルネットワークモデルのトレーニング環境)"の中の \\src\nets\squeezeDet.py 77行目あたりを参照)

このself.predsの内容の解釈は以下の関数内で実施されているようです。
_add_interpretation_graph() (同じく"mobilenetV2_crosslink_nx_vnv_training.zip (ニューラルネットワークモデルのトレーニング環境)"の中の \\src\nn_skelton.py 167行目あたりにて定義)

Deep Learningの仕組みを使うと、こんな複雑なことがFPGAに実装できてしまうんですね。凄いです…。でも、このニューラルネットワークモデルの動作を確認するには次にFPGAの設計を行わないといけないってことですね。
ニューラルネットワークモデルのことを理解するのも結構大変だったのに、さらにFPGA設計も考えないといけないとなると結構電池切れ状態ですね…。
FPGA設計しなくても動作確認できたらいいのに…。
そんなところへ超スーパーベテランエンジニアの先輩からあるツールが届きました。
そのツールの名前は、"smAILE Express"。
「それを使えば簡単に動作確認できるよ~♪使ってみて~♪」
超スーパーな人なのにかなり軽い…。
しかし、ホントにそんな簡単に動作確認できるのか…。ホントにできたらめっちゃ便利だけど…。なんと先輩が自作されたとのことです。
次回は、FPGA設計せずにモデルの動作確認ができるという謎のツール"smAILE Express"について見ていきたいと思います。
お問い合わせ
評価ボードやサンプルデザインに関する不明点や、本ブログで扱ってほしい内容などありましたらお気軽にお問い合わせください!