MobileNet-v2 ネットワークのコード生成と Raspberry Pi への展開
この例では、事前学習済みの MobileNet-v2 ネットワーク用に、サードパーティの深層学習ライブラリに依存しない C コードを生成する方法を示します。コードを生成したら、それを Raspberry Pi® サポートに展開できます。
ハードウェア サポート パッケージを使用するコードを生成する場合、関数 codegen はホスト コンピューター上でコードを生成し、生成されたファイルをターゲット ハードウェアにコピーして、ターゲット ハードウェアで実行可能ファイルをビルドします。
サードパーティの前提条件
NEON 拡張をサポートする ARM プロセッサ
ターゲット ハードウェア上の Open Source Computer Vision Library (OpenCV)
コンパイラおよびライブラリの環境変数
この例は MATLAB Online ではサポートされていません。
エントリポイント関数 mobilenet_predict
関数 mobilenet_predict は、imagePretrainedNetworkを使用して、MATLAB 用の事前学習済みの MobileNet-v2 ネットワークを読み込みます。次に、このエントリポイント関数は、入力イメージに対して MobileNet-v2 ネットワーク オブジェクトの predict メソッドを呼び出し、予測スコアの出力を返します。dlarray オブジェクトはエントリポイント関数内で作成され、関数への入力と出力のデータ型はプリミティブ型になります。詳細については、Code Generation for dlarray (MATLAB Coder)を参照してください。
type mobilenet_predictfunction out = mobilenet_predict(in)
%#codegen
% Copyright 2019-2024 The MathWorks, Inc.
dlIn = dlarray(in,'SSC');
persistent dlnet;
opencv_linkflags = '`pkg-config --cflags --libs opencv4`';
coder.updateBuildInfo('addLinkFlags',opencv_linkflags);
coder.updateBuildInfo('addCompileFlags',opencv_linkflags);
if isempty(dlnet)
dlnet = imagePretrainedNetwork('mobilenetv2');
end
dlOut = predict(dlnet, dlIn);
out = extractdata(dlOut);
end
mobilenet_predict の実行可能ファイルの生成
コード生成構成オブジェクト cfg を作成します。生成されたコードに Neon v7 内部パラメーターを活用するには、cfg の InstructionSetExtensions プロパティを Neon v7 に設定します。
cfg = coder.config('exe'); cfg.InstructionSetExtensions = 'Neon v7'; cfg.InstructionSetExtensionsConfig.FMA = true;
深層学習構成オブジェクトを作成し、ターゲット ライブラリを none に設定します。コード生成構成オブジェクトに深層学習構成オブジェクトを追加します。
dlcfg = coder.DeepLearningConfig(TargetLibrary = 'none');
cfg.DeepLearningConfig = dlcfg;Raspberry Pi への接続の作成
Raspberry Pi® Blockset の関数 raspi を使用して、Raspberry Pi への接続を作成します。
r = raspi;
Raspberry Pi ボードに初めて接続する場合、または別のボードに接続する場合は、コードの次の行を使用して置き換えます。
raspiname: 自分の Raspberry Pi のホスト名username: 自分のユーザー名password: 自分のパスワード
r = raspi('raspiname','username','password');
Raspberry Pi 用のコード生成ハードウェア パラメーターの構成
Raspberry Pi 用の coder.Hardware オブジェクトを作成してコード生成構成オブジェクトに追加します。
hw = coder.hardware('Raspberry Pi');
cfg.Hardware = hw;Raspberry Pi 上のビルド フォルダーを指定します。
buildDir = '/home/pi/remoteBuildDir';
cfg.Hardware.BuildDir = buildDir;C++ メイン ファイルの指定
コード生成構成オブジェクトでメイン ファイル main_mobilenet.cpp を指定します。このファイルは関数 mobilenet_predict 用に生成された C コードを呼び出します。このファイルは、入力イメージを読み取り、そのデータを生成された関数に渡し、関数の出力からイメージに対する予測を取得し、予測スコアをファイルに出力します。
cfg.CustomSource = 'main_mobilenet.cpp';Raspberry Pi での実行可能プログラムの生成
C コードを生成する。Raspberry Pi Blockset と共に codegen 関数を使用すると、関数は Raspberry Pi 上に実行可能ファイルをビルドします。
codegen -config cfg mobilenet_predict -args {ones(224, 224, 3,'single')} -report
Code generation successful: View report
Raspberry Pi での実行可能プログラムの実行
生成コードを Raspberry Pi 上でテストするには、入力イメージを生成コードのフォルダーにコピーします。このフォルダーは手動で、または raspi.utils.getRemoteBuildDirectory API を使用して見つけることができます。この関数は、関数 codegen が生成するバイナリ ファイルのフォルダーをリストします。バイナリが 1 つのフォルダーのみにあると仮定して、次のように入力します。
applicationDirPaths = raspi.utils.getRemoteBuildDirectory('applicationName','mobilenet_predict'); targetDirPath = applicationDirPaths{1}.directory;
関数 putFile を使用して、実行可能プログラムの実行に必要なファイルをコピーします。
r.putFile('peppers_raspi_mobilenet.png',targetDirPath);MATLAB から Raspberry Pi で実行可能プログラムを実行し、出力を MATLAB に戻します。
exeName = 'mobilenet_predict.elf'; argsforexe = ' peppers_raspi_mobilenet.png '; command = ['cd ' targetDirPath ';sudo ./' exeName argsforexe]; output = system(r,command);
ネットワークの 1000 個の出力クラスについて、予測スコアを取得します。
outputfile = [targetDirPath, '/output.txt'];
r.getFile(outputfile);ラベルへの予測スコアのマッピングおよび出力の表示
上位 5 つの予測スコアを学習済みネットワークの対応するラベルにマッピングし、出力を表示します。
mapPredictedScores_mobilenet
参考
coder.ARMNEONConfig (MATLAB Coder) | coder.DeepLearningConfig (MATLAB Coder) | coder.hardware (MATLAB Coder)
トピック
- ARM Compute Library を使用した、深層学習ネットワークのためのコード生成 (MATLAB Coder)
- SqueezeNet ネットワークのコード生成と Raspberry Pi への展開 (MATLAB Coder)