Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MobileNet-v2 ネットワークのコード生成と Raspberry Pi への展開

この例では、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 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 で環境変数 (MATLAB Coder)ARM_COMPUTELIBLD_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

参考

(MATLAB Coder) | (MATLAB Coder) | (MATLAB Coder)

関連するトピック