メインコンテンツ

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

この例では、事前学習済みの MobileNet-v2 ネットワーク用に、サードパーティの深層学習ライブラリに依存しない C コードを生成する方法を示します。コードを生成したら、それを Raspberry Pi に展開できます。

ハードウェア サポート パッケージを使用するコードを生成する場合、関数 codegen はホスト コンピューター上でコードを生成し、生成されたファイルをターゲット ハードウェアにコピーして、ターゲット ハードウェアで実行可能ファイルをビルドします。

サードパーティの前提条件

  • NEON 拡張をサポートする ARM プロセッサ

  • ターゲット ハードウェア上の Open Source Computer Vision Library (OpenCV)

  • コンパイラおよびライブラリの環境変数

この例は MATLAB Online ではサポートされていません。

エントリポイント関数 mobilenet_predict

関数 mobilenet_predict は、imagePretrainedNetwork (Deep Learning Toolbox)を使用して、MATLAB 用の事前学習済みの MobileNet-v2 ネットワークを読み込みます。次に、このエントリポイント関数は、入力イメージに対して MobileNet-v2 ネットワーク オブジェクトの predict メソッドを呼び出し、予測スコアの出力を返します。dlarray オブジェクトはエントリポイント関数内で作成され、関数への入力と出力のデータ型はプリミティブ型になります。詳細については、Code Generation for dlarrayを参照してください。

type mobilenet_predict
function 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 内部パラメーターを活用するには、cfgInstructionSetExtensions プロパティを 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 への接続の作成

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/remoteBuildDir';
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 上に実行可能ファイルをビルドします。

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

Figure contains an axes object. The hidden axes object contains an object of type image.

参考

| | |

トピック