主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

英特尔ターゲットでのさまざまなバッチサイズの深層学習コードの生成

この例では,codegenコマンドを使用して,英特尔®プロセッサでの深層学習を使用するイメージ分類用途のコードを生成する方法を説明します。生成されたコードは,英特尔数学内核库深层神经网络(MKL-DNN)を使用します。この例は,次の2つの部分で構成されます。

  • 最初の部分では,イメージのバッチを入力として受け入れる墨西哥人関数を生成する方法を示します。

  • 2番目の部分では,イメージのバッチを入力として受け入れる実行可能ファイルを生成する方法を示します。

必要条件

  • 英特尔高级向量扩展2(英特尔AVX2)命令をサポートする英特尔プロセッサ

  • 用于深度神经网络的英特尔数学内核库(MKL-DNN)

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラのバージョンの詳細については、サポートされるコンパイラを参照してください。環境変数の設定は,MATLAB编码器を使用した深層学習の前提条件(MATLAB编码器)を参照してください。

この例は、Linux®、Windows®,およびMac®プラットフォームでサポートされていますが,MATLAB在线ではサポートされていません。

入力ビデオファイルのダウンロード

サンプルビデオファイルをダウンロードします。

如果~存在(“。/ object_class。Avi ', 'file') url = '//www.tatmou.com金宝app/supportfiles/gpucoder/media/object_class.avi.zip';websave (object_class.avi.zip, url);解压缩(“object_class.avi.zip”);结束

関数resnet_predictの定義

この例では,DAGネットワークResNet-50を使用して,英特尔デスクトップでイメージの分類を表示します。MATLAB用の事前学習済み ResNet-50 モデルは、Deep Learning Toolbox Model for ResNet-50 Network サポート パッケージに含まれています。

関数resnet_predictは,ResNet-50ネットワークを永続ネットワークオブジェクトに読み込んだ後,入力に対して予測を実行します。関数のそれ以降の呼び出しでは,この永続オブジェクトが再利用されます。

类型resnet_predict
% Copyright 2020 The MathWorks, Inc. function out = resnet_predict(in) %#codegen %第一次调用这个函数时,将构造持久对象并设置。当后续调用该函数时,将重用相同的对象%来调用预测输入,从而避免重新构造和重新加载%网络对象。持久mynet;调用函数resnet50,返回一个DAG网络%的ResNet-50模型。mynet = coder.loadDeepLearningNetwork(“resnet50”、“resnet”);输入输出= mynet.predict(in);

resnet_predict用の墨西哥人生成

関数resnet_predict用に墨西哥人関数を生成するために,MKL-DNNライブラリ用の深層学習構成オブジェクトを指定してcodegenを使用します。codegenに渡す墨西哥人コード生成構成オブジェクトに深層学習構成オブジェクトを追加します。codegenコマンドを実行し,サイズ[224224年3 | batchSize |]の4次元行列を入力として指定します。この値はResNet-50ネットワークの入力層サイズに対応します。

batchSize = 5;cfg = coder.config (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“mkldnn”);codegen配置cfgresnet_predictarg游戏{的(224224 3 batchSize '单')}报告
代码生成成功:要查看报告,打开('codegen\mex\resnet_predict\html\report.mldatx')。

イメージのバッチでの予測の実行

Object_class。aviビデオファイルが既にダウンロードされていると仮定します。videoReader読み取り関数を使用してvideoReaderオブジェクトを作成し,5フレームを読み取ります。batchSizeが5に設定されているため,5つのイメージが読み取られます。入力イメージのバッチのサイズを,resnet50に必要なサイズ(resnet50ネットワークで期待されるサイズ)に変更します。

videoReader = videoReader(“Object_class.avi”);imBatch = read(videoReader,[1 5]); / /点击图片imBatch = imresize(imBatch, [224,224]);

生成された関数resnet_predict_mexを呼び出します。この関数は,指定した入力についての分類結果を出力します。

predict_scores = resnet_predict_mex(单(imBatch));

バッチ内の各イメージについて,上5位つの確率スコアおよびそのラベルを取得します。

[val,indx] = sort(转置(predict_scores), '下降');成绩=瓦尔(1:5:)* 100;网= resnet50;一会= net.Layers .ClassNames(结束);for i = 1:batchSize labels = classnames(indx(1:5,i));disp(['Top 5 predictions on image, ', num2str(i)]);j = 1:5 disp([标签{j},“num2str(分数(j,我),% 2.2 f), ' % '])结束

最初のイメージの予測について,上5位つの予測スコアを同义词集ディクショナリの単語にマッピングします。

fid = fopen(“synsetWords.txt”);synsetOut = textscan(fid,'%s', 'delimiter', '\n'); / /指定字符串synsetOut = synsetOut {1};文件关闭(fid);[val,indx] = sort(转置(predict_scores), '下降');成绩=瓦尔(1:5,1)* 100;top5labels = synsetOut (indx (1:5, 1));

イメージ上に上第五位つの分類ラベルを表示します。

outputImage = 0 (uint8); / / uint8for k = 1:3 outputImage(:,177:end,k) = imBatch(:,:,k,1);结束
scol = 1;srow = 1;outputImage = insertText(outputImage, [scol, srow], 'Classification with ResNet-50', 'TextColor', 'w','FontSize',20, 'BoxColor', 'black');Srow = Srow + 30;for k = 1:5 outputImage = insertText(outputImage, [scol, srow], [top5labels{k},' ',num2str(scores(k), '%2.2f'),'%'], 'TextColor', 'w','FontSize',15, 'BoxColor', 'black');Srow = Srow + 25;结束
imshow (outputImage);

永続ネットワークオブジェクトをメモリからクリアします。

清晰的墨西哥人

エントリポイント関数resnet_predict_exeの定義

MATLABコードから実行可能ファイルを生成するには,新しいエントリポイント関数resnet_predict_exeを定義します。この関数は,前のエントリポイント関数resent_predictに似ていますが,加えて前処理と後処理のコードが含まれています。resnet_predict_exeで使用するAPIはプラットフォームに依存しません。この関数は,ビデオとバッチ サイズを入力引数として受け入れます。これらの引数はコンパイル時の定数です。

类型resnet_predict_exe
% Copyright 2020 The MathWorks, Inc. function resnet_predict_exe(inputVideo,batchSize) %#codegen %一个持久对象mynet被用于加载系列网络对象。第一次调用这个函数时,将构造持久对象并设置。当后续调用该函数时,将重用相同的对象%来调用预测输入,从而避免重新构造和重新加载%网络对象。持久mynet;调用函数resnet50,返回一个DAG网络%的ResNet-50模型。mynet = coder.loadDeepLearningNetwork(“resnet50”、“resnet”);end %创建视频阅读器和视频播放器对象% videoReader = videoReader (inputVideo);depVideoPlayer = vision.DeployableVideoPlayer;%读取分类标签名称% synsetOut = readImageClassLabels('synsetWords.txt');i = 1; % Read frames until end of video file % while ~(i+batchSize > (videoReader.NumFrames+1)) % Read and resize batch of frames as specified by input argument% reSizedImagesBatch = readImageInputBatch(videoReader,batchSize,i); % run predict on resized input images % predict_scores = mynet.predict(reSizedImagesBatch); % overlay the prediction scores on images and display % overlayResultsOnImages(predict_scores,synsetOut,reSizedImagesBatch,batchSize,depVideoPlayer) i = i+ batchSize; end release(depVideoPlayer); end function synsetOut = readImageClassLabels(classLabelsFile) % Read the classification label names from the file % % Inputs : % classLabelsFile - supplied by user % % Outputs : % synsetOut - cell array filled with 1000 image class labels synsetOut = cell(1000,1); fid = fopen(classLabelsFile); for i = 1:1000 synsetOut{i} = fgetl(fid); end fclose(fid); end function reSizedImagesBatch = readImageInputBatch(videoReader,batchSize,i) % Read and resize batch of frames as specified by input argument% % % Inputs : % videoReader - Object used for reading the images from video file % batchSize - Number of images in batch to process. Supplied by user % i - index to track frames read from video file % % Outputs : % reSizedImagesBatch - Batch of images resized to 224x224x3xbatchsize img = read(videoReader,[i (i+batchSize-1)]); reSizedImagesBatch = coder.nullcopy(ones(224,224,3,batchSize,'like',img)); resizeTo = coder.const([224,224]); reSizedImagesBatch(:,:,:,:) = imresize(img,resizeTo); end function overlayResultsOnImages(predict_scores,synsetOut,reSizedImagesBatch,batchSize,depVideoPlayer) % Read and resize batch of frames as specified by input argument% % % Inputs : % predict_scores - classification results for given network % synsetOut - cell array filled with 1000 image class labels % reSizedImagesBatch - Batch of images resized to 224x224x3xbatchsize % batchSize - Number of images in batch to process. Supplied by user % depVideoPlayer - Object for displaying results % % Outputs : % Predicted results overlayed on input images % sort the predicted scores % [val,indx] = sort(transpose(predict_scores), 'descend'); for j = 1:batchSize scores = val(1:5,j)*100; outputImage = zeros(224,400,3, 'uint8'); for k = 1:3 outputImage(:,177:end,k) = reSizedImagesBatch(:,:,k,j); end % Overlay the results on image % scol = 1; srow = 1; outputImage = insertText(outputImage, [scol, srow], 'Classification with ResNet-50', 'TextColor', [255 255 255],'FontSize',20, 'BoxColor', [0 0 0]); srow = srow + 30; for k = 1:5 scoreStr = sprintf('%2.2f',scores(k)); outputImage = insertText(outputImage, [scol, srow], [synsetOut{indx(k,j)},' ',scoreStr,'%'], 'TextColor', [255 255 255],'FontSize',15, 'BoxColor', [0 0 0]); srow = srow + 25; end depVideoPlayer(outputImage); end end

関数resnet_predict_exeの構造

関数resnet_predict_exeには,次のアクションを実行する4つのサブセクションが含まれています。

  • 指定された入力テキストファイルから分類ラベルを読み取る

  • イメージの入力バッチを読み取り,ネットワークの必要に応じてサイズを変更する

  • 入力イメージバッチで推論を実行する

  • 結果をイメージに重ね合わせる

これらの各手順の詳細については,後続の節を参照してください。

関数readImageClassLabels

この関数は,synsetWords.txtファイルを入力引数として受け入れます。分類ラベルを読み取り,细胞配列を挿入します。

% % input: % classLabelsFile -由用户提供% % Outputs: % synsetOut -单元格数组,由1000个图像类标签填充
synsetOut =细胞(1000 1);fid = fopen (classLabelsFile);for i = 1:1000 synsetOut{i} = fgetl(fid);最终文件关闭(fid);结束

関数readImageInputBatch

この関数は,入力引数として関数に渡されるビデオ入力ファイルからイメージを読み取り,サイズを変更します。指定された入力イメージを読み取り,resnet50ネットワークのサイズである224 x224x3にサイズを変更します。

% % % input: % videoReader -用于从视频文件中读取图像的对象% batchSize -要处理的批处理图像数量。由用户% i - index跟踪从视频文件读取的帧% % Outputs: % reSizedImagesBatch -批图像调整为224x224x3xbatchsize
img = read(videoReader,[i (i+batchSize-1)]);reSizedImagesBatch = coder.nullcopy((224224年3 batchSize‘喜欢’,img));resizeTo = coder.const ([224224]);reSizedImagesBatch (:,:,:,:) = imresize (img resizeTo);结束

関数mynet.predict

この関数は,サイズ変更されたイメージのバッチを入力として受け入れ,予測結果を返します。

% run predict on resized input images % predict_scores = mynet.predict(reSizedImagesBatch);

関数overlayResultsOnImages

この関数は,予測結果を受け入れ,降順に並べ替えます。これらの結果を入力イメージに重ねて合わせて表示します。

按照输入参数% % % Inputs的指定读取并调整帧的批大小:% synsetOut - cells array filled with 1000 image class labels % reSizedImagesBatch - Batch of images resized to 224x224x3xbatchsize % batchSize - Batch of images to processing的数量。由用户% depVideoPlayer提供-显示结果的对象% % Outputs: %预测结果叠加在输入图像上
% [val,indx] = sort(转置(predict_scores), '下降');
for j = 1:batchSize scores = val(1:5,j)*100;outputImage = 0 (uint8); / / uint8for k = 1:3 outputImage(:,177:end,k) = reSizedImagesBatch(:,:,k,j);结束
%覆盖结果的图像% scol = 1;srow = 1;outputImage = insertText(outputImage, [scol, srow], 'Classification with ResNet-50', 'TextColor', [255 255 255],'FontSize',20, 'BoxColor', [0 0 0]);Srow = Srow + 30;for k = 1:5 scoreStr = sprintf('%2.2f',score (k)); / /积分outputImage = insertText(outputImage, [scol, srow], [synsetOut{indx(k,j)},' ',scoreStr,'%'], 'TextColor', [255 255 255],'FontSize',15, 'BoxColor', [0 0 0]);Srow = Srow + 25;结束
depVideoPlayer (outputImage);结束结束

実行可能ファイルのビルドと実行

実行可能ファイルを生成するために,コード構成オブジェクトを作成します。深層学習構成オブジェクトを追加します。変数batchSizeと変数inputVideoFileを設定します。

カスタムのc++主要関数を作成せず,代わりに,生成されたサンプルのc++主要関数を使用する場合は,GenerateExampleMainパラメーターを“GenerateCodeAndCompile”に設定します。また,デスクトップターミナルから実行可能ファイルを実行するときに,cfg。EnableOpenMPを無効にし,openmpライブラリの依存関係がないことを確認してください。

cfg = coder.config (exe);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig(“mkldnn”);batchSize = 5;inputVideoFile =“object_class.avi”;cfg。GenerateExampleMain =“GenerateCodeAndCompile”;cfg。EnableOpenMP = 0;

codegenコマンドを実行し,実行可能ファイルをビルドします。生成された実行可能ファイルresnet_predict_exeを,MATLABコマンドラインまたはデスクトップターミナルで実行します。

codegen -config cfg resnet_predict_exe -args {coder.Constant(inputVideoFile), coder.Constant(batchSize)} -report system('./resnet_predict_exe')

関連するトピック