このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

深層学習ネットワークのコード生成

この例では、深層学習を使用するイメージ分類用途のコード生成を実行する方法を説明します。codegen コマンドを使用し、MobileNet-v2、ResNet、GoogLeNet などのイメージ分類ネットワークを使用して予測を実行する MEX 関数を生成します。

必要条件

  • Compute Capability 3.2 以上の CUDA® 対応 NVIDIA® GPU。

  • NVIDIA CUDA ツールキットおよびドライバー。

  • NVIDIA cuDNN ライブラリ。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティ製品 (GPU Coder)を参照してください。環境変数の設定は、前提条件となる製品の設定 (GPU Coder)を参照してください。

  • GPU Coder Interface for Deep Learning Libraries サポート パッケージ。このサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。

GPU 環境の検証

関数 coder.checkGpuInstall を使用し、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

エントリポイント関数 mobilenetv2_predict

MobileNet-v2 は、ImageNet データベースの 100 万枚を超えるイメージで学習済みの畳み込みニューラル ネットワークです。このネットワークは、深さが 155 層であり、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。ネットワークのイメージ入力サイズは 224 x 224 です。関数 analyzeNetwork を使用して、深層学習ネットワーク アーキテクチャを対話的に可視化して表示します。

net = mobilenetv2();
analyzeNetwork(net);

エントリポイント関数 mobilenetv2_predict.m は、イメージ入力を受け取り、事前学習済み MobileNet-v2 畳み込みニューラル ネットワークを使用して、イメージについて予測を実行します。この関数は永続オブジェクト mynet を使用して系列ネットワーク オブジェクトを読み込み、それ以降の呼び出しではこの永続オブジェクトを予測に再利用します。

type('mobilenetv2_predict.m')
% Copyright 2017-2019 The MathWorks, Inc.

function out = mobilenetv2_predict(in) 
%#codegen

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('mobilenetv2','mobilenetv2');
end

% pass in input   
out = mynet.predict(in);

MEX コード生成の実行

エントリポイント関数 mobilenetv2_predict の CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig を使用して CuDNN 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。codegen コマンドを実行し、入力サイズを [224,224,3] に指定します。この値は MobileNet-v2 ネットワークの入力層サイズに対応します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg mobilenetv2_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/mobilenetv2_predict/html/report.mldatx').

生成されたコードの説明

系列ネットワークは、155 個の層クラスから成る配列と、ネットワークの設定、予測の呼び出し、クリーンアップを行う関数を含む C++ クラスとして生成されます。

class b_mobilenetv2_0
{
   ....
   public:
     b_mobilenetv2_0();
     void setup();
     void predict();
     void cleanup();
     ~b_mobilenetv2_0();
};

このクラスの setup() メソッドは、ハンドルを設定し、ネットワーク オブジェクトの各層にメモリを割り当てます。predict() メソッドは、ネットワーク内の 155 個の層それぞれについて予測を実行します。

生成されたコード ファイル mobilenetv2_predict.cu 内のエントリポイント関数 mobilenetv2_predict() は、b_mobilenetv2 クラス型の静的オブジェクトを構築し、このネットワーク オブジェクトに対して setup や predict を呼び出します。

static b_mobilenetv2_0 mynet;
static boolean_T mynet_not_empty;
/* Function Definitions */
void mobilenetv2_predict(const real_T in[150528], real32_T out[1000])
{
  if (!mynet_not_empty) {
    DeepLearningNetwork_setup(&mynet);
    mynet_not_empty = true;
  }
   /*  pass in input    */
   DeepLearningNetwork_predict(&mynet, in, out);
 }

バイナリ ファイルは、ネットワーク内の全結合層や畳み込み層などのパラメーターを持つ層に対してエクスポートされます。たとえば、ファイル cnn_mobilenetv2_conv*_w および cnn_mobilenetv2_conv*_b は、ネットワーク内の畳み込み層の重みとバイアス パラメーターに対応します。生成されたファイルのリストを表示するには、次を使用します。

dir(fullfile(pwd, 'codegen', 'mex', 'mobilenetv2_predict'))

生成された MEX の実行

入力イメージを読み込みます。

im = imread('peppers.png');
imshow(im);

入力イメージに対して mobilenetv2_predict_mex を呼び出します。

im = imresize(im, [224,224]);
predict_scores = mobilenetv2_predict_mex(double(im));

上位 5 つの予測スコアとそのラベルを取得します。

[scores,indx] = sort(predict_scores, 'descend');
classNames = net.Layers(end).ClassNames;
classNamesTop = classNames(indx(1:5));

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,im);
barh(ax2,scores(5:-1:1))
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop(5:-1:1))
ax2.YAxisLocation = 'right';
sgtitle('Top Five Predictions That Use MobileNet-v2')

ビデオの分類

用意されている補助関数 mobilenet_live.m は、Web カメラからフレームを取得して予測を実行し、取得した各ビデオ フレームについて分類結果を表示します。この例では、MATLAB® Support Package for USB Webcams™ によってサポートされる関数 webcam を使用します。サポート パッケージはサポート パッケージ インストーラーからダウンロードしてインストールできます。

type('mobilenet_live.m')
% Copyright 2017-2019 The MathWorks, Inc.

function mobilenet_live

% Connect to a camera
camera = webcam; 

% The labels with top 5 prediction scores are 
% mapped to corresponding labels
net = mobilenetv2();
classnames = net.Layers(end).ClassNames;

imfull = zeros(224,400,3, 'uint8');

fps = 0;

ax = axes;

while true
    % Take a picture
    ipicture = camera.snapshot;       
    
    % Resize and cast the picture to single        
    picture = imresize(ipicture,[224,224]);  
    
    % Call MEX function for MobileNet-v2 prediction
    tic;    
    pout = mobilenetv2_predict(single(picture));
    newt = toc;
       
    % fps 
    fps = .9*fps + .1*(1/newt);
    
    % top 5 scores
    [top5labels, scores] = getTopFive(pout,classnames);
    
    % display
    if isvalid(ax)
        dispResults(ax, imfull, picture, top5labels, scores, fps);   
    else
        break;
    end
end

end

function dispResults(ax, imfull, picture, top5labels, scores, fps)
for k = 1:3
    imfull(:,177:end,k) = picture(:,:,k);
end

h = imshow(imfull, 'InitialMagnification',200, 'Parent', ax);
scol = 1;
srow = 20;
text(get(h, 'Parent'), scol, srow, sprintf('MobileNet-v2 Demo'), 'color', 'w', 'FontSize', 20);
srow = srow + 20;

text(get(h, 'Parent'), scol, srow, sprintf('Fps = %2.2f', fps), 'color', 'w', 'FontSize', 15);
srow = srow + 20;
for k = 1:5
    t = text(get(h, 'Parent'), scol, srow, top5labels{k}, 'color', 'w','FontSize', 15);
    pos = get(t, 'Extent');
    text(get(h, 'Parent'), pos(1)+pos(3)+5, srow, sprintf('%2.2f%%', scores(k)), 'color', 'w', 'FontSize', 15);
    srow = srow + 20;
end

drawnow;
end

function [labels, scores] = getTopFive(predictOut,classnames)
[val,indx] = sort(predictOut, 'descend');
scores = val(1:5)*100;
labels = classnames(indx(1:5));
end

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear mex;

ResNet-50 ネットワークを使用したイメージの分類

DAG ネットワーク ResNet-50 を使用してイメージを分類することもできます。MATLAB 用の事前学習済み ResNet-50 モデルは、Deep Learning Toolbox の ResNet-50 サポート パッケージに含まれています。このサポート パッケージをダウンロードしてインストールするには、アドオン エクスプローラーを使用します。アドオンの検索とインストールの詳細は、アドオンの入手 (MATLAB) を参照してください。

net = resnet50;
disp(net)
  DAGNetwork with properties:

         Layers: [177×1 nnet.cnn.layer.Layer]
    Connections: [192×2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_fc1000'}

MEX コード生成の実行

エントリポイント関数 resnet_predict.m の CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。このエントリポイント関数は関数 resnet50 を呼び出して、ネットワークを読み込み、入力イメージに対して予測を実行します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg resnet_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/resnet_predict/html/report.mldatx').

入力イメージに対して resnet_predict_mex を呼び出します。

predict_scores = resnet_predict_mex(double(im));

上位 5 つの予測スコアとそのラベルを取得します。

[scores,indx] = sort(predict_scores, 'descend');
classNames = net.Layers(end).ClassNames;
classNamesTop = classNames(indx(1:5));

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,im);
barh(ax2,scores(5:-1:1))
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop(5:-1:1))
ax2.YAxisLocation = 'right';
sgtitle('Top Five Predictions That Use ResNet-50')

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear mex;

GoogLeNet (Inception) ネットワークを使用したイメージの分類

MATLAB 用の事前学習済み GoogLeNet モデルは、Deep Learning Toolbox の GoogLeNet サポート パッケージに含まれています。このサポート パッケージをダウンロードしてインストールするには、アドオン エクスプローラーを使用します。アドオンの検索とインストールの詳細は、アドオンの入手 (MATLAB) を参照してください。

net = googlenet;
disp(net)
  DAGNetwork with properties:

         Layers: [144×1 nnet.cnn.layer.Layer]
    Connections: [170×2 table]
     InputNames: {'data'}
    OutputNames: {'output'}

MEX コード生成の実行

エントリポイント関数 googlenet_predict.m の CUDA コードを生成します。このエントリポイント関数は関数 googlenet を呼び出して、ネットワークを読み込み、入力イメージに対して予測を実行します。このエントリポイント関数のコードを生成するには、MEX ターゲットの GPU 構成オブジェクトを作成します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/googlenet_predict/html/report.mldatx').

入力イメージに対して googlenet_predict_mex を呼び出します。

im = imresize(im, [224,224]);
predict_scores = googlenet_predict_mex(double(im));

上位 5 つの予測スコアとそのラベルを取得します。

[scores,indx] = sort(predict_scores, 'descend');
classNames = net.Layers(end).ClassNames;
classNamesTop = classNames(indx(1:5));

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,im);
barh(ax2,scores(5:-1:1))
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop(5:-1:1))
ax2.YAxisLocation = 'right';
sgtitle('Top Five Predictions That Use GoogLeNet')

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear mex;

関連するトピック