組み込みAI入門ブログ(5) 「ニューラルネットワークモデルの構成を見てみた」 ~低消費電力・小型FPGAで人検出AIを実装~

前回の記事で、Lattice社の人検出のリファレンスデザイン(Object Counting)で用いている学習データの中身を調べてみました。

 

今回はニューラルネットワークモデルの中身がどうなっているのか?を調べていきたいと思います。
とはいえ、そもそもニューラルネットワークモデルって何?という感じですが…。

ニューラルネットワークモデルって?

最近AIがよく話題となり、それにつれてニューラルネットワークモデルという言葉も良く耳にするようになりました。インターネットで調べてみると私なんかよりももっと正確に詳しく説明してくれているサイトがたくさんありますので、詳細についてはそちらを見ていただくのがイイと思いますが、大雑把に言うと以下のようなもののようです。

 

  • 人の脳の神経細胞(ニューロン)がつながって構成される神経回路網の構造を数式的にモデル化したもの
  • レイヤー(層)と呼ばれるものがいくつもつながって1つのニューラルネットワークモデルを構成している(Deep Neural NetworkとかDeep Learningといわれる由縁)
  • レイヤー(層)はそれぞれ重みと呼ばれるパラメーターを持っている
  • ニューラルネットワークモデルにはあるデータが入力として与えられ、各層で重みの値と掛け合わせながら計算を行い、与えられた入力データの特徴量を算出する
  • 入力データとセットになる答え(ラベル)があり、モデルの学習時は、モデルが算出した値と実際の答えとの差が近くなるようにネットワークモデルを逆に遡る形で重みの調整をおこなう(誤差逆伝搬)

 

また、ニューラルネットワークにはいくつかの種類があります。ポピュラーなものとしては以下のようなものがあげられます。

  • CNN(Convolutional Neural Network:畳み込みニューラルネットワーク)
  • RNN (Recurrent Neural Network:再帰型ニューラルネットワーク。時系列データを使った予測などの用途で利用)
  • LSTM(Long short-term memory:長・短期記憶。RNNでは難しかった長期の連続データも取り扱えるようにしたもの)
  • GAN(Generative Adversarial Network:敵対的生成ネットワーク。GeneratorとDiscriminatorの2つのネットワークから構成されGeneratorが生成したものの成否をDiscriminatorが判別する)

CNN(畳み込みニューラルネットワーク)って?

Lattice社は上記の中のCNNに対応しています。CNNではカーネルと呼ばれる重み情報が入ったフィルタがあり、基本的には縦3x横3とか縦5x横5のような形で構成されるデータになっています。このカーネルを入力データに対してあてがって掛け算および足し算を行い、特徴量を抽出していくというようなことをおこなっていきます。この処理のことを畳み込み(Convolution)というため、畳み込みを利用したニューラルネットワークのことをCNNと呼んでいます。

よく画像処理で行うノイズ除去などの処理と非常に似ていますね。

上記のような仕組みのため、CNNは画像認識の分野で非常によく使用されています。

また、Convolutionのほかにも、CNNにはPoolingと呼ばれる処理もあり、データを間引くことにより対象物が画像のどこに存在しても特徴量を抽出しやすくする仕組みも持っています。下図はカーネルサイズが2x2でStride(カーネルをずらす量)が2の場合のMax Pooling(カーネル範囲内の値で最大値を採用するPooling手法)を行った時の例になります。元の入力データから、出力データが1/4に削減されながら、近傍の特徴が受け継がれていることが分かります。

ConvolutionやPoolingなどの機能はレイヤーと呼ばれ、これらをつなぎ合わせていくことによりニューラルネットワークモデルを構成していく形になります。今回の人検出のリファレンスデザインの例を見ると、以下のような形でニューラルネットワークモデルが構成されているようです。

RD-02207 CrossLink-NX Human Counting Using MobileNet v1/v2 Reference Design User Guide
Fig4.2 Human Counting MobileNet v2 Training Topology より引用

実際このようなニューラルネットワークモデルの構成はPythonコード上では以下のように記載されているようです。
(第2回の際にダウンロードした"mobilenetV2_crosslink_nx_vnv_training.zip (ニューラルネットワークモデルのトレーニング環境)"の中の
\\src\nets\squeezeDet.py _add_forward_graph()内に記載)

急激に学術的になってきましたので、頭がかなりお花畑になってきました。

Pythonコードとドキュメントとにらめっこしながら、ニューラルネットワークモデルがどういう形で構成されるのかは何となく理解はできました。まだあくまで何となくですが・・・。
ただ、今回のリファレンスデザインの場合、人が検出されたのかどうか?という点と、検出できた場合のその人の座標情報を推論することになると思いますが、ニューラルネットワークモデルからはどういう形で結果が出力されるのでしょうか?

次回はもう少しその辺りを調べてみたいと思います。

お問い合わせ

評価ボードやサンプルデザインに関する不明点や、本ブログで扱ってほしい内容などありましたらお気軽にお問い合わせください!

AI関連情報