本プロジェクトは2017/7/28に開催されたCQ出版社主催のARMマイコン・ワークショップ2017にてセッション A-05 組み込みでディープラーニングの発表で用いたサンプルプログラムです。
Keras MNIST CNN example (François Chollet)をベースにネットワークサイズ削減のため畳み込み層のフィルターサイズとチャンネル数を調整しています。 https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py
ニューラルネットワークのトレーニングを行いパラメータ(重み、バイアス)のArrayをjsonでファイルに保存します。
ニューラルネットワークの各層の出力Arrayの構成を理解するためにArrayをprintで表示します。行列の演算では要素の並びが異なると計算結果が一致しません。
- ホストPC : Windows 64bit
- Anaconda
- Tensorflow
- numpy, scipy
- Keras
- matplotlib
- pillow
- h5py
ds5_keras_mnist/jupyter/CQseminar_MNIST_CNN.ipynb
で出力した学習済みニューラルネットワークのパラメータファイルをARM Cortex-A9ベアメタルターゲットに読み込みMNISTの推論を行います。
学習済みニューラルネットワークと推論処理はTrustZoneのSecure worldに配置されるため、コストをかけて学習したニューラルネットワークを保護することができます。
- ホストPC : Windows 64bit
- DS-5 Version 5.27.1
https://developer.arm.com/products/software-development-tools/ds-5-development-studio/downloads
本プロジェクトファイルはDS-5のExampleであるTrustZone Example for Cortex-A9 and ARM Compiler 5 - ARM®DS-5™
をベースにMNIST CNNの処理を追加したものです。その他の変更点としてARM Compilerによるループの自動並列化のためにデバイス初期化コードでNEONの有効化を行っています。
Kerasから出力されたパラメータファイルはサイズが大きいため組み込みデバイスで利用するにはストレージなどの大容量メモリが必要になります。本サンプルではニューラルネットワークの処理に集中するためDS-5のJythonデバッガスクリプトを利用したスタブを構築しています。
- Kerasから出力したパラメータファイル
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/mnist_cnn_train121_params_layer0.json
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/mnist_cnn_train121_params_layer2.json
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/mnist_cnn_train121_params_layer6.json
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/mnist_cnn_train121_params_layer8.json
- デバイスのメモリへ展開するスクリプト
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/cnn_import.py
- デバイスのメモリへ展開後にバイナリ保存したファイル
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/ds5_params.bin
デバッガ接続時に下記コマンドで一括展開されます。
restore "${workspace_loc:/TrustZone_with_NEON/scripts/ds5_params.bin}" binary S:0x80300000
推論対象となる手書き数字の画像を組み込みデバイスに入力するには一般的にタッチパネル付きLCDなどのペリフェラルが必要になります。本サンプルではニューラルネットワークの処理に集中するためDS-5のJythonデバッガスクリプトを利用したスタブを構築しています。
- JPEGファイル
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/test.jpg
- JPEGファイルをメモリに展開するスクリプト
デバッガ接続時に呼び出されます。
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/image_import.py
- JPEGファイルをメモリに展開し推論処理関数を呼び出すスクリプト
ds5_keras_mnist/ds5/TrustZone_with_NEON/scripts/demo.ds
- 本プロジェクトは組み込みデバイスで畳み込みニューラルネットワーク実装の実験を目的としています。十分な検証、例外処理は行われていません。また、処理速度、メモリサイズ共にソースコードレベルの最適化は行われていません。
- 本プロジェクトに何らかの不具合が発生したとしても修正の義務を負いません。
- 本プロジェクトの利用により何らかの損害が発生したとしても一切の責任を負いません。