最新のリリースでは,このページがまだ翻訳されていません。このページの最新版は英语でご覧になれます。

深层学习ネットワークのコード生成

この例では,深层学习を使用するイメージ分类アプリケーションのコード生成を実行する方法を说明します。代码生成コマンドを使用し,MobileNet-V2,RESNET,GoogLeNetなどのイメージ分类ネットワークを使用して予测を実行するMEX关数を生成します。

必要条件

  • 计算能力3.2以上のCUDA®対応NVIDIA®GPU。

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

  • NVIDIA cuDNNライブラリ。

  • コンパイラおよびライブラリの环境変数。サポートされているコンパイラおよびライブラリのバージョンの详细は,サードパーティ制品を参照してください。环境変数の设定は,前提条件となる制品の设定を参照してください。

  • GPU编码器接口深度学习图书馆サポートパッケージ。このサポートパッケージをインストールするには,アドオンエクスプローラーを使用します。

GPU环境の検证

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

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

mobilenetv2_predictエントリポイント关数

MobileNet-V2は,ImageNetデータベースからの100万枚を超えるイメージで学习済みの畳み込みニューラルネットワークです。このネットワークは,深さが155层であり,イメージを千个のオブジェクトカテゴリ(キーボード,マウス,铅笔,多くの动物など)に分类できます。ネットワークのイメージ入力サイズは224 X 224です。关数analyzeNetworkを使用して,深层学习ネットワークアーキテクチャを対话的に可视化して表示します。

净= mobilenetv2();analyzeNetwork(净值);

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

类型('mobilenetv2_predict.m'
%版权所有2017年至2019年MathWorks公司功能OUT = mobilenetv2_predict(上)%#CODEGEN持久我的网;如果的isEmpty(我的网)我的网= coder.loadDeepLearningNetwork( 'mobilenetv2', 'mobilenetv2');结束输入%的合格出= mynet.predict(IN);

MEXコード生成の実行

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

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');代码生成-configCFGmobilenetv2_predict-args{酮(224,224,3)}-报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / mobilenetv2_predict / HTML / report.mldatx')。

生成されたコードの说明

系列ネットワークは,155个の层クラスから成る配列と,ネットワークの设定,予测の呼び出し,クリーンアップを行う关数を含むC ++クラスとして生成されます。

b_mobilenetv2_0{...公共:b_mobilenetv2_0();空隙设置();空隙预测();空隙清理();〜b_mobilenetv2_0();};

このクラスの设定()メソッドは,ハンドルを设定し,ネットワークオブジェクトの各层にメモリを割り当てます。预测()メソッドは,ネットワーク内の155个の层それぞれについて予测を実行します。

生成されたコードファイルmobilenetv2_predict.cu内のエントリポイント关数mobilenetv2_predict()は,b_mobilenetv2クラス型の静的オブジェクトを构筑し,このネットワークオブジェクトに対して设置や预测を呼び出します。

静态的b_mobilenetv2_0我的网;静态的boolean_Tmynet_not_empty;
/ *函数定义* /空虚mobilenetv2_predict(常量real_T在[150528],real32_T出[1000]){如果!mynet_not_empty){DeepLearningNetwork_setup(我的网);mynet_not_empty = TRUE;}
/ *传中输入* / DeepLearningNetwork_predict(我的网,IN,OUT);}

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

DIR(完整文件(PWD,“代码生成”'MEX''mobilenetv2_predict'))

生成されたMEXの実行

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

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

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

IM = imresize(1M,[224224]);predict_scores = mobilenetv2_predict_mex(双(IM));

上位5つの予测スコアおよびそのラベルを取得します。

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(INDX(1:5));H =图。H.POSITION(3)= 2 * H.POSITION(3);AX1 =副区(1,2,1);AX2 =副区(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))xlabel(AX2,'可能性')yticklabels(AX2,classNamesTop(5:-1:1))= ax2.YAxisLocation'对';sgtitle(“五大预测使用MobileNet-V2”

ビデオの分类

用意されている补助关数mobilenet_live.mは,网络カメラからフレームを取得して予测を実行し,取得した各ビデオフレームについて分类结果を表示します。この例では,MATLAB®Supp金宝apport Package的USB摄像头™によってサポートされる关数を使用します。サポートパッケージはサポートパッケージインストーラーからダウンロードしてインストールできます。

类型('mobilenet_live.m'
%版权所有2017年至2019年MathWorks公司功能mobilenet_live%连接到照相机相机=摄像头;%与顶部5预测分数的标记是%映射到相应的标签网= mobilenetv2();类名= net.Layers(结束).ClassNames;imfull =零(224,400,3, 'UINT8');FPS = 0;AX =轴;而真%拍照IPICTURE = camera.snapshot;%调整大小和投图片单个图片= imresize(IPICTURE,[224224]);%呼叫MEX功能MobileNet-V2预测抽动;POUT = mobilenetv2_predict(单(画面)); 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

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

明确MEX;

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

DAGネットワ​​ークRESNET-50を使用してイメージを分类することもできます.MATLAB用の事前学习済みRESNET-50モデルは,深度学习工具箱のRESNET-50サポートパッケージに含まれています。このサポートパッケージをダウンロードしてインストールするには,アドオンエクスプローラーを使用します。アドオンの検索とインストールの详细は,アドオンの入手(MATLAB)を参照してください。

净= resnet50;DISP(净)
DAGNetwork与属性:层:[177×1 nnet.cnn.layer.Layer]连接:[192×2表] 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');代码生成-configCFGresnet_predict-args{酮(224,224,3)}-报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / resnet_predict / HTML / report.mldatx')。

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

predict_scores = resnet_predict_mex(双(IM));

上位5つの予测スコアおよびそのラベルを取得します。

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(INDX(1:5));H =图。H.POSITION(3)= 2 * H.POSITION(3);AX1 =副区(1,2,1);AX2 =副区(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))xlabel(AX2,'可能性')yticklabels(AX2,classNamesTop(5:-1:1))= ax2.YAxisLocation'对';sgtitle(“五大预测使用RESNET-50”

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

明确MEX;

GoogLeNet(以来)ネットワークを使用したイメージの分类

MATLAB用の事前学习済みGoogLeNetモデルは,深度学习工具箱のGoogLeNetサポートパッケージに含まれています。このサポートパッケージをダウンロードしてインストールするには,アドオンエクスプローラーを使用します。アドオンの検索とインストールの详细は,アドオンの入手(MATLAB)を参照してください。

净= googlenet;DISP(净)
DAGNetwork与属性:层:[144×1 nnet.cnn.layer.Layer]连接:[170×2表] InputNames:{ '数据'} OutputNames:{ '输出'}

MEXコード生成の実行

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

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');代码生成-configCFGgooglenet_predict-args{酮(224,224,3)}-报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / googlenet_predict / HTML / report.mldatx')。

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

IM = imresize(1M,[224224]);predict_scores = googlenet_predict_mex(双(IM));

上位5つの予测スコアおよびそのラベルを取得します。

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(INDX(1:5));H =图。H.POSITION(3)= 2 * H.POSITION(3);AX1 =副区(1,2,1);AX2 =副区(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))xlabel(AX2,'可能性')yticklabels(AX2,classNamesTop(5:-1:1))= ax2.YAxisLocation'对';sgtitle(“五大预测使用GoogLeNet”

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

明确MEX;