このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。
この例では、深層学習を使用するイメージ分類用途のコード生成を実行する方法を説明します。codegen
コマンドを使用し、MobileNet-v2、ResNet、GoogLeNet などのイメージ分類ネットワークを使用して予測を実行する MEX 関数を生成します。
Compute Capability 3.2 以上の CUDA® 対応 NVIDIA® GPU。
NVIDIA CUDA ツールキットおよびドライバー。
NVIDIA cuDNN ライブラリ。
コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティ製品を参照してください。環境変数の設定は、前提条件となる製品の設定を参照してください。
GPU Coder Interface for Deep Learning Libraries サポート パッケージ。このサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。
関数 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
(Deep Learning Toolbox) を使用して、深層学習ネットワーク アーキテクチャを対話的に可視化して表示します。
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);
エントリポイント関数 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'))
入力イメージを読み込みます。
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
(MATLAB Support Package for USB Webcams) を使用します。サポート パッケージはサポート パッケージ インストーラーからダウンロードしてインストールできます。
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;
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'}
エントリポイント関数 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;
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'}
エントリポイント関数 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;
codegen
| coder.CuDNNConfig
| coder.DeepLearningConfig
| coder.gpuEnvConfig
| coder.loadDeepLearningNetwork
| mobilenetv2
(Deep Learning Toolbox) | resnet50
(Deep Learning Toolbox)