STM32マイコンでニューラル･ネットワークを実行！ STの組込みAIソリューションで画像分類

# 1. STの組込みAIソリューション
  
STは、多種多様な電子機器に半導体を提供する世界的半導体メーカーとして、急成長中の組込みAI分野に積極的に取り組んでいます。コスト効率の高い低消費電力マイクロコントローラ（マイコン）での機械学習や、ディープ･ニューラル･ネットワークの使用を加速させるため、包括的なエッジAIエコシステムを開発しています。これにより、組込み開発者がAIを利用するための新機能や堅牢なソリューションを幅広いSTM32マイコン･ポートフォリオに簡単に追加できるようにしました。STのAIソリューションは、STM32ファミリの製品ポートフォリオ全体に対応しているため、学習済みのニューラル･ネットワークがある場合、Arm® Cortex®-M4 / M33 / M7ベースの任意のSTM32マイコンに移植して、最適化・検証することができます。

マイコンの初期化コード自動生成ツール「STM32CubeMX」のAI拡張パッケージとして提供されている組込みAI開発ツール「STM32Cube.AI」は、AI製品のより効率的な開発を可能にします。
これにより、ディープ･ラーニングを活用してSTM32を使用したアプリケーションの信号処理性能を強化し、生産性を高めることができます。

この記事では、コンピュータ・ビジョン・アプリケーション開発向けのソフトウェア・パッケージ「FP-AI-VISION1」について解説します。FP-AI-VISION1には、STM32H7マイコンで実行されるビジョン･アプリケーションのサンプル･コードが含まれています。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/bbe7a907-8479-3f8a-bf0a-efe4c2dfd363.png)

図1. 機械学習 / ディープ･ラーニング･アルゴリズムを実行できるSTM32製品のポートフォリオ

  
# 2. FP-AI-VISION1 

## 2.1 概要
FP-AI-VISION1は、STM32Cubeのファンクション･パック（FP）で、畳み込みニューラル･ネットワーク（CNN）に基づくコンピュータ･ビジョン･アプリケーションのサンプル・コードが含まれています。STM32Cube.AIで生成されたソフトウェア･コンポーネントと、AIベースのコンピュータ･ビジョン･アプリケーション専用のアプリケーション･ソフトウェア･コンポーネントで構成されており、以下のサンプル･アプリケーションが含まれています。 
  

•	食品認識： 18の一般的な食品クラスを認識
•	人物検出機能： 画像内に人がいるかどうかを識別
•	人数カウント： 物体検出モデルに基づくシーン内の人数カウント
  

## 2.2 主な機能

　FP-AI-VISION1は、STM32H747I-DISCOボードで動作し、STM32F4DIS-CAMカメラ･ドーターボードまたはB-CAMS-OMVカメラ･モジュール･バンドルと接続されます。カメラ･キャプチャ、フレーム画像前処理、推論実行、出力後処理のための完全なアプリケーション･ファームウェアが含まれています。
また、浮動小数点および8bit量子化Cモデルの統合サンプルを提供し、アプリケーション要件に対応できるように、さまざまなデータ･メモリの配置設定をサポートしています。 
FP-AI-VISION1の最も大きなメリットの1つは、さまざまなタイプのデータを内蔵メモリと外部メモリに効率的に配置する方法を示したサンプルが提供されていることです。これにより、ユーザはアプリケーション要件に対し、どのメモリ割り当てが最適であるか簡単に把握することができるため、STM32製品（特にSTM32H747-DISCOボード）でカスタマイズしたニューラル･ネットワーク･モデルを構築しやすくなります。
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/f4288f78-6099-b1a3-69f8-1c8828ff8fc4.png)
図2. FP-AI-VISION1のサンプル評価用開発キット


  FP-AI-VISION1には、CNNベースの画像分類サンプル･アプリケーションが3つ含まれています。
•	カラー（RGB 24bit）フレーム画像を対象とした食品認識アプリケーション
•	カラー（RGB 24bit）フレーム画像を対象とした人物検出アプリケーション
•	グレースケール（8bit）フレーム画像を対象とした人物検出アプリケーション

この記事では、食品認識と人物検出の2つを紹介します。

では、食品認識アプリケーションから始めましょう。
食品認識CNNは、MobileNetモデルの派生モデルです。MobileNetは、モバイルおよび組込みのビジョン･アプリケーションに適した効率的なモデル･アーキテクチャで、Google®社が提供しています[1]。 
MobileNetモデル･アーキテクチャには、2つのシンプルなグローバル･ハイパーパラメータが含まれ、遅延と精度の効率的なトレードオフを実現します。これらのハイパーパラメータにより、原理上、モデル開発者は、問題の制約に基づいてアプリケーションに適したサイズのモデルを決定できます。このファンクション･パックで使用されている食品認識モデルは、STM32H747マイコンのターゲット制約を考慮し、これらのハイパーパラメータを調整することで精度、演算コスト、メモリ容量の最適なトレードオフを実現するように構築されています。
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/45e5d190-0333-6468-dafe-b78258d54324.png)
図3. 食品認識モデルの実行フロー

図3に、食品認識モデルのシンプルな実行フローを示します。STM32H747マイコンで実行すると、推論が終了するまでに約150msを要します。


次に、人物検出アプリケーションです。FP-AI-VISION1は、以下2つの人物検出サンプル･アプリケーションを提供しています。

•	複雑度の低いCNNモデル（Googleモデル）に基づき、解像度96 x 96ピクセルのグレースケール画像（1ピクセルあたり8bit）を処理するアプリケーション（storage.googleapis.comからダウンロード）

•	複雑度の高いCNNモデル（MobileNetv2モデル）に基づき、解像度128 x 128ピクセルのカラー画像（1ピクセルあたり24bit）を処理するアプリケーション

人物検出機能を活用すれば、低消費電力モードで待機していた状態からシステムを起動させることができます。照明をつける、ドアを開けるといったユースケースが想定されます。代表的な実装では通常、パッシブ赤外線（PIR）センサを使用して、動きを検知したタイミングと場所でイベントをトリガします。このようなPIRシステムにおける問題は、誤検知が生じる可能性があることで、通り過ぎた動物や風に舞った木の葉によりシステムがトリガされてしまう場合があります。一方で、人物検出アプリケーションは人間だけを検知するため、よりスマートな検知システムを簡単に開発できるようになります。
  
## 2.3 システム・アーキテクチャ
  
図4に、FP-AI-VISION1の最上位アーキテクチャを示します。
   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/4c77ec43-24af-2d15-b33d-536610fdf218.png)


図4. FP-AI-VISION1のアーキテクチャ


## 2.4 アプリケーション構築フロー
 
  ユーザは、浮動小数点のCNNモデル（Kerasなどのフレームワークを使用して設計 / 学習したもの）から、STM32Cube.AIを使用して最適化されたCコードを生成し、これをFP-AI-VISION1の一部として提供されたコンピュータ･ビジョン･フレームワークに統合して、STM32H7マイコン上にビジョン･アプリケーションを構築します。
   Cコードの生成には、以下2つの方法から選択可能です。

• 浮動小数点CNNモデルから浮動小数点Cコードを直接生成
• 浮動小数点CNNモデルを量子化して8bitモデルを取得し、対応する量子化Cコードを生成

2つ目の方法では、ほとんどのCNNモデルでメモリ容量（Flash / RAM）と推論時間を削減できます。最終的な出力精度への影響は、CNNモデルと量子化プロセス（主にテスト･データセットと量子化アルゴリズム）によって異なります。

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/fb01895c-6330-0164-bed4-4e640e1c427f.png)

図5. FP-AI-VISION1のアーキテクチャ

## 2.5 アプリケーション実行フロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/ade68855-8dd9-a411-f673-fba032abac4c.png)

図6. 実行フローでのデータ･バッファ

コンピュータ･ビジョン･アプリケーションでは、統合にいくつかのデータ･バッファが必要です（図6）。 

アプリケーションは以下の順序で処理を実行します。 
1.	DCMIデータ･レジスタからDMAエンジン経由でカメラ･フレームを取得し、camera_captureバッファに格納 
2.	この時点で、選択されたメモリ割り当て設定に応じて、camera_captureバッファの内容をcamera_frameバッファにコピーし、後続フレームの取得を開始
3.	camera_frameバッファに格納された画像のサイズを変更してResize_Dst_Imgバッファに入れ、予想されるCNN入力テンソル次元に合わせる（たとえば、食品認識のNNモデルでは、高さ x 幅 = 224 x 224ピクセルの入力テンソルが要求されます。）
4.	Resize_Dst_ImgバッファからPfc_Dst_Imgバッファへと、ピクセル･カラー･フォーマット変換を実行
5.	Pfc_Dst_Imバッファに格納された各ピクセルのフォーマットを適合させてnn_inputバッファに格納
6.	NNモデルの推論を実行。nn_inputバッファに加えてアクティベーション･バッファがNNへの入力として使用されます。分類結果をnn_outputバッファに格納 
7.	nn_outputバッファの内容を後処理し、結果をLCDディスプレイに表示

表1に、量子化Cモデルまたは浮動小数点Cモデルを統合する場合に、食品認識アプリケーションで必要になるデータRAMサイズの詳細を示します。

表1.食品認識アプリケーションのSRAMメモリ･バッファ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124278/b67b40f2-689c-0129-50b9-fe2eade036de.png)


# 3. 関連情報

FP-AI-VISION1は無償で提供中です。
以下のリンクからダウンロードしてください。
https://www.st.com/en/embedded-software/fp-ai-vision1.html

STM32マイコン用AIソリューションの詳細については、STのウェブサイトをご覧ください。。

UM2611：FP-AI-VISION1のユーザ･マニュアル
https://www.st.com/resource/en/user_manual/dm00630755-artificial-intelligence-ai-and-computer-vision-function-pack-for-stm32h7-microcontrollers-stmicroelectronics.pdf

UM2526：STM32Cube.AIのユーザ･マニュアル
https://www.st.com/resource/en/user_manual/dm00570145-getting-started-with-xcubeai-expansion-package-for-artificial-intelligence-ai-stmicroelectronics.pdf

FP-AI-VISION1のアプリケーション･ノートを解説した動画（YouTube）
https://www.youtube.com/watch?v=VkFTrc5KSgg&t=130s
https://www.youtube.com/watch?v=8AX9uC2Oi1g&t=178s

# 4. 参考文献

[1] 食品認識CNNは、MobileNetモデルの派生モデルです。
『MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications』：https://arxiv.org/pdf/1704.04861.pdf