前回の初心者講座では、dnnrt_lenetサンプルアプリケーションを通して、Neural Network Consoleの使い方とSPRESENSE SDKの提供するDNNRT機能により画像をディープニューラルネットワークにより解析する方法を紹介しました。
SPRESENSEのDNNRT機能が扱うことのできるデータは画像だけでなく、産業分野を中心に注目されている「異常検知・故障予知」に活用できる加速度センサーや大気圧センサーなどから収集した波形データも解析することができます。さらにSPRESENSEに内蔵されたハイレゾオーディオ録音機能も周辺環境を可聴域の波形データとして記録することができる優れたセンサーとして利用可能です。そこで、今回の初心者講座では、まず簡単な波形データの解析方法を例に、DNNRT機能から波形データを扱うシステムの構築方法について解説。DNNRT機能を活用した製品開発に必要となる技術を紹介いたします。
SPRESENSE Add-On/Extension Boardのラインナップ(PDF)
SPRESENSE×Neural Network Console:第1回
目次
DNNRT機能で異常値を検出するアプリケーションを実現する
オートエンコーダー|自己符号化器とは
オートエンコーダー(自己符号化器)とは、入力データから特徴量を抽出(エンコード)し、特徴量からデータを再生成(デコード)するディープニューラルネットワークです(図1)。最も単純なオートエンコーダーは、入力データをすべての点を特徴量として記録し、特徴量をそのまま出力データとするモデルですが、機械の振動やモーターの回転といった規則的な動き、機械的・電気的な特徴に着目することにより、大幅に特徴量の個数を削減、図1中央の橙色点のように情報を圧縮可能です。
特徴量は、機械の振動やモーターの回転が正常である状況を想定して抽出されているため、この特徴量からデータを再生成すると「システムが正常に動作している」と仮定した場合の「理想的な信号」を生成することができます。このことから、正常な場合における波形データをオートエンコーダーへ入力すると、出力波形データは入力波形データとほぼ同等の内容となりますが(図1上)、異常値を含む波形データをオートエンコーダーに入力すると、理想的なシステムが生成するであろう波形データが生成されることから、入力波形データとの間に大きく差のある出力波形データが生成されます(図1下)。
このように、オートエンコーダーのモデルを活用することにより、異常検知のシステムを開発することができます。今回の初心者講座では、このオートエンコーダーのモデルの入手から、モデルの学習と推論モデルの生成、SPRESENSE上で推論モデルを実行するまでの流れを紹介。推論モデルを使って波形を解析する方法を解説いたします。SPRESENSEへ実際に入力したデータと、推論モデルによって生成された出力データの例を図2に示します。実行方法は後述します。
Neural Network Consoleでオートエンコーダーの推論モデルを開発する
それでは早速、オートエンコーダーの推論モデルを搭載したエッジデバイスの開発を始めていきましょう。
ニューラルネットワークのモデルを入手・開発する
Neural Network ConsoleをWindows PCへインストールし、起動するとサンプルモデルの一覧が表示されます。また、さらに多くのモデルがNeural Network ConsoleのWEBサイトで公開されています。今回は、Neural Network ConsoleのWEBサイトで公開されている画像認識用のDNNモデル「tutorial_anomaly_detection.sine_wave」を利用します。
Neural Network Consoleのインストール方法
Neural Network Consoleのウィンドウ左にある「More Sample Projects」をクリックしWEBサイトを開き、サイト下部にある「tutorial_anomaly_detection.sine_wave」を選択、ダウンロードします。ダウンロード後、Neural Network Consoleのウィンドウ左上にある「Open Project」からダウンロードしたファイルを選択することにより、モデルをロードすることができます(図3)。Neural Network ConsoleのWEBサイトにて配布されているオートエンコーダーのネットワークは128点の浮動小数点数を入力データとして、入力データに近しい理想的なサインカーブの波形データを算出します。出力される波形データも入力同様の128点の浮動小数点数となります。
Neural Network Console(Windows版)のダウンロードはこちら
データセットによりニューラルネットワークの学習を行う(Train)
モデルのプロジェクトを開くと「学習と検証に使うデータセットをダウンロードするか」を確認する画面が表示されます。「はい」をクリックし、学習用データ・検証用データをダウンロードします。Neural Network Consoleのウィンドウ右上にある「Train(Run)」をクリックすると、モデル内で扱うパラメータの調整を行う「学習」が開始されます。学習では、ダウンロードした学習用データの一部を切り出した30セットのデータを使った30回のパラメータ調整が実行されます。図4が学習結果を示すグラフ、学習曲線です。学習の回数を重ねるごとに、パラメータが正答に近くなり、パラメータの調整幅が小さくなり(青線実線:COST)、入力に対して期待する出力値の乖離が小さくなり(橙色実線:TRAINING ERROR)、入力から出力を導くことができなかった頻度が改善されます(橙色破線:VALIDATION ERROR)。
なお、図3のように早期に収束する学習曲線はLog Scale表示を使うことで学習効果を精密に確認可能です(図5)。
学習が完了したニューラルネットワークを評価する(Evaluate)
学習が完了した後は検証用データを使って、入力に対して期待する出力を得られるかを評価します。Neural Network Consoleのウィンドウ右上にある「Evaluate(Run)」をクリックすると評価が開始されます。評価結果は図6のように表形式で出力されます。各行が検証結果で、図6の1行目には入力の「波形データ」とそれ対する、出力「理想的なサインカーブの波形データ」が得られたことが示されています(サインカーブから外れた値が取り除かれた波形データ)。
DNNRT機能を使ってオートエンコーダー推論モデルを実行する
autoencoderの推論モデルを使ってSPRESENSE上で異常検知をするサンプルプログラム「dnnrt_autoencoder」を紹介します。処理フローを図7に示します。dnnrt_autoencoderは以下のURLにて配布していますので、WindowsのSPRESENSE SDK開発環境にて下記のコマンドを実行することによりプログラム一式を入手可能です。SPRESENSE本体のソースコードもセットでダウンロードされます。
# gitコマンドによりソースコード一式をダウンロード $ git clone --recursive https://github.com/inscape-sa/spresense-nnc-step1.git $ cd ./spresense-nnc-step1 $ git checkout -b v1.0 refs/tags/v1.0 $ git reset --hard HEAD # ダウンロード後 # SPRESENSE本体のソースコードと、 # dnnrt_autoencoderを含むappフォルダと、 # Visual Studio Code用のプロジェクトファイルを入手できる $ ls /app /spresense LICENSE spresense-nnc_v1.code-workspace
各ファイルの役割
本サンプルアプリケーションは、CSV形式ファイルに格納されている128点の波形データを入力を、autoencoder推論モデルにより変換し、128点の波形データを出力を生成します。autoencoderのビルドには、SPRESENSE SDKの「SDKコンフィグ」から選択することのできる「Feature/dnnrt」「Feature/asmp」が必要となります。「app/dnnrt_autoencoder」フォルダに含まれているサンプルアプリケーションを構成する各ファイルの役割は下記の通りです。
ファイル名 | 役割 |
---|---|
dnnrt_autoencoder_main.c | SPRESENSE SDKの提供するDNNRT機能を使って推論を実行し、結果を表示する。 |
loader_large_nnb.c | サイズの大きな推論モデルをメモリ上に展開する。 |
csv_util.c | カンマ区切りの数値データ(CSV形式)の波形データをメモリ上に展開する。 |
推論結果
SPRESENSE上でdnnrt_autoencoderを実行すると、入力データに対して推論処理が実行され、入力値に近しい理想的なサインカーブが出力波形として生成されます。図2上のように異常値のないデータを入力とした場合、入力波形と出力波形は、ほぼ同じ波形となります。図2下のように異常値のあるデータを入力とした場合は、出力として得られる理想的な波形データと入力データは大きく異なる形状となります。そのため、入力波形データを推論モデルに入力し、出力された波形データを比較することで、異常検知を実現することができます。
開発のポイント
DNNRT機能が利用するメモリをasmp機能を使って確保する
DNNRT機能を利用するアプリケーションは「推論モデル」や「入出力データ」を扱うために大きなメモリを必要とします。前回紹介した「Examples/dnnrt_lenet」ではメモリの確保に「malloc関数」を使っていましたが、さらに大きなメモリを一括で確保するにはSPRESENSE SDKの提供するASMP機能の提供する「共有メモリ機能(mpshm)による128KB単位のメモリタイルの確保」が便利です(図8)。これを実現するためにサンプルプログラムには「memtile_alloc関数」が定義されています。
なお、確保したメモリは、確保処理を実行したCPUコアだけでなく、すべてのCPUコア、SPRESENSE SDKの提供する各機能からもアクセスできるように扱う必要があります。そのため、メモリアドレスはmpshm_attachにて取得できるCPU毎の仮想メモリアドレス(virt)ではなく、実際のメモリが存在する物理メモリアドレス(phys)を使います。アドレスはmpshm機能の「mpshm_virt2phys」APIにより変換します。
確保したメモリに推論モデルと波形データを展開する
本サンプルプログラムを構成するファイル「loader_large_nnb.c
」と「csv_util.c
」は、上記の手順で確保したメモリタイルそれぞれに推論モデルと波形データをロードします。推論モデルは「*.nnb」形式、波形データは「*.csv(図9)」形式に対応しており、波形データはメモリ上にfloat型128要素の配列に展開されます。
dnn_runtime_output_*を使って出力を取得・表示する
DNNの出力は必ず1次元配列とは限りません。そのため下記のDNNRT機能を使ってサイズと形式を検査しながらdnn_runtime_output_buffer
関数を使ってバッファを参照する必要があります(図10)。
dnn_runtime_output_num
DNNが出力するデータセットが何組あるかを出力します。前回紹介したdnnrt_lenetの場合は「0〜9の確率」のみであることからdnn_runtime_output_num
は1を返しますが、dnnrt_autoencoderの場合は「最大差分」と「出力波形」が表示されることからdnn_runtime_output_num
は2を返します。
dnn_runtime_output_size
1つのデーターセットに何個の要素が含まれているかを返します。dnnrt_lenetの場合は「0〜9の確率」のみであることからdnn_runtime_output_size
は10を返しますが、dnnrt_autoencoderの2個目のデータセット「出力波形」の場合は波形を構成するデータ数としてdnn_runtime_output_size
は128を返します。ここでの注意は、dnn_runtime_output_size
の出力はメモリサイズではなく、要素数であることです。
dnn_runtime_output_ndim
1つのデーターセットが何次元の配列であるかを返します。dnnrt_autoencoderの1個目のデータセット「最大差分」と2個目のデータセット「出力波形」はいずれも1次元のデータであるためdnn_runtime_output_ndim
は1を返します。Neural Network ConsoleのMore Sample Projectsから選択できるimage generation(画像生成)等の推論モデルを実行した場合「画像横、画像縦、画像ピクセル情報」としてdnn_runtime_output_ndim
は3を返します(図11)。
まとめ
今回の初心者講座では、SPRESENSEのDNNRT機能で波形データを扱う方法について解説しました。また、大きな推論モデルを扱うために必要となるメモリの確保方法についても紹介しました。
次回の初心者講座では、SPRESENSEのハードウェアに統合されたハイレゾオーディオ録音機能を使って実際の波形データを収集、環境情報をDNNRT機能により解析するシステムを開発する技法について紹介します。
こちらも是非
“もっと見る” マルチコア|SPRESENSE編
SPRESENSE×Neural Network Console:第4回|推論モデルを最適化し、エッジAIによるオリジナルの音声識別システムを構築する
今回の初心者講座では、SPRESENSEの「ハイレゾオーディオ入力」と「DNNRT機能」により「Neural Network Console」で生成したディープニューラルネットワーク(DNN)の推論モデルを統合。エッジ単体で完結するオリジナルの音声識別システムを構築する技法を解説いたします。
SPRESENSE×Neural Network Console:第3回|オーディオ解析に必要な学習用データを採取し、PC上で学習・推論を実行する
今回の初心者講座では、SPRESENSEに搭載されたハイレゾオーディオ入力を活用し、環境音を録音し、ディープニューラルネットワークによる音声分類に不可欠な学習用データと検証用データを生成する方法について解説します。また、PC上で動作するNeural Network Consoleによって生成した推論モデルをエッジ・デバイスへ統合するために解決すべき課題を紹介します。
SPRESENSE×Neural Network Console:第1回|エッジで推論モデルを実行し、データを分析する
今回はSPRESENSE SDKの提供するAI、ディープニューラルネットワーク(DNN)実行機能である「DNNRT機能」について紹介します。はじめてSPRESENSEの開発環境に触れる方はもちろん、はじめてDNNに取り組む方も安心して技術を学んでいただけるよう、サンプルアプリケーションの開発・解説をから、アプリケーションの変更方法、実際の環境データを使った解析方法まで段階的に解説します。