このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
コードの生成と Raspberry Pi への MobileNet-v2 ネットワークの展開
この例では、オブジェクト予測に MobileNet-v2 の事前学習済みネットワークを使用する C++ コードを生成する方法について説明します。コードを生成したら、そのコードを Raspberry Pi に展開できます。この例では、DAG ネットワーク MobileNet-v2 を使用して ARM® Compute Library でイメージ分類を実行します。MATLAB 向けの事前学習済みの MobileNet-v2 ネットワークが、Deep Learning Toolbox Model for MobileNet-v2 Network サポート パッケージで使用できます。
ARM Compute Library とハードウェア サポート パッケージを使用するコードを生成する場合、関数 codegen
はホスト コンピューターでコードを生成し、生成されたファイルをターゲット ハードウェアにコピーして、ターゲット ハードウェアで実行可能ファイルをビルドします。
サードパーティの前提条件
NEON 拡張をサポートする ARM プロセッサ
ARM Compute Library (ターゲット ARM ハードウェア上)
Open Source Computer Vision Library (OpenCV) v2.4 (ターゲット ARM ハードウェア上)
コンパイラおよびライブラリの環境変数
この例で使用する ARM Compute Library のバージョンは、コード生成でサポートされている最新バージョンではない可能性があります。サポートされているライブラリのバージョンと、環境変数の設定に関する詳細については、深層学習に MATLAB Coder を使用するための前提条件を参照してください。
この例は MATLAB Online ではサポートされていません。
関数 mobilenet_predict
用のコード生成の構成
関数 mobilenet_predict
は入力イメージに対して MobileNet-v2 ネットワーク オブジェクトの predict メソッドを呼び出して、予測スコア出力を返します。関数は coder.updateBuildInfo
を呼び出して、生成された makefile のリンク オプションを指定します。
type mobilenet_predict
function out = mobilenet_predict(in) persistent net; opencv_linkflags = '`pkg-config --cflags --libs opencv`'; coder.updateBuildInfo('addLinkFlags',opencv_linkflags); coder.updateBuildInfo('addCompileFlags',opencv_linkflags); if isempty(net) net = coder.loadDeepLearningNetwork('mobilenetv2', 'mobilenet'); end out = net.predict(in); end
C++ コード生成構成オブジェクトを作成します。
cfg = coder.config('exe'); cfg.TargetLang = 'C++';
ARM Compute Library は Raspberry Pi ハードウェアに最適化された機能を提供します。ARM Compute Library を使用するコードを生成するには coder.ARMNEONConfig
オブジェクトを作成します。Raspberry Pi にインストールされている ARM Compute Library のバージョンと Raspberry Pi のアーキテクチャを指定します。深層学習構成オブジェクトをコード生成構成オブジェクトに添付します。
dlcfg = coder.DeepLearningConfig('arm-compute'); supportedVersions = dlcfg.getARMComputeSupportedVersions; dlcfg.ArmArchitecture = 'armv7'; dlcfg.ArmComputeVersion = '20.02.1'; cfg.DeepLearningConfig = dlcfg;
Raspberry Pi への接続の作成
MATLAB Support Package for Raspberry Pi Hardware 関数 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';
cfg.Hardware.BuildDir = buildDir;
C++ メイン ファイルの指定
メイン ファイル main_mobilenet.cpp
をコード生成構成オブジェクトで指定します。このファイルは関数 mobilenet_predict
について生成された C++ コードを呼び出します。ファイルは入力イメージを読み取り、データを生成された関数呼び出しに渡し、イメージについての予測を取得し、予測スコアをファイルにプリントします。
cfg.CustomSource = 'main_mobilenet.cpp';
Raspberry Pi での実行可能プログラムの生成
C++ コードを生成します。MATLAB Support Package for Raspberry PI Hardware で関数 codegen
を使用すると、関数は Raspberry Pi で実行可能ファイルをビルドします。
コード生成には、Raspberry Pi に環境変数 ARM_COMPUTELIB
および LD_LIBRARY_PATH
を設定しなければなりません。
codegen -config cfg mobilenet_predict -args {ones(224, 224, 3,'single')} -report
Deploying code. This may take a few minutes. 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
| coder.DeepLearningConfig
| coder.hardware
| coder.updateBuildInfo