ドキュメンテーション

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

ロゴ認識ネットワーク

この例では、深層学習を使用するロゴ分類用途のコード生成を説明します。codegen コマンドを使用し、LogoNet と呼ばれる SeriesNetwork オブジェクトについて予測を実行する MEX 関数を生成します。

必要条件

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

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

  • NVIDIA cuDNN ライブラリ v7 以上。

  • コンパイラおよびライブラリの環境変数。詳細は、Environment Variables を参照してください。

  • Deep Learning Toolbox™ (SeriesNetwork オブジェクトを使用するため)。

  • Image Processing Toolbox™ (イメージを読み取って表示するため)。

  • GPU Coder™ (CUDA コードを生成するため)。

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

GPU 環境の検証

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

coder.checkGpuInstall('gpu','codegen','cudnn','quiet');

ネットワークについて

ロゴを使用すると、ユーザーがブランドを識別したり認識したりするのに役立ちます。ロゴは、広告、ドキュメント、コミュニティなどさまざまな領域で利用されています。ロゴ認識ネットワーク (logonet) は MATLAB® で開発されたものであり、さまざまなライティング条件とカメラの動きの下で 32 個のロゴを認識できます。このネットワークのアーキテクチャは AlexNet に似ています。このネットワークは認識にのみ焦点を当てているため、位置推定が不要な用途で使用できます。

ネットワークの学習

ネットワークは MATLAB で学習されていて、ロゴ分類に使用した学習データには、ロゴあたり約 200 個のイメージが含まれています。ネットワークの学習に使用したイメージの数は少ないため、データ拡張を使用して、学習サンプルの数を増やしています。コントラスト正規化、ガウスぼかし、ランダム反転、およびせん断の 4 種類のデータ拡張が使用されています。このデータ拡張は、さまざまなライティング条件とカメラの動きで取得されたイメージのロゴの認識に役立ちます。logonet の入力サイズは [227 227 3] です。標準の SGDM を使用して、ミニバッチ サイズが 45 で学習率が 0.0001 の学習を 40 エポック行っています。trainLogonet.m スクリプトでは、サンプル イメージのデータ拡張、logonet のアーキテクチャ、学習に使用した学習オプションについて示しています。

事前学習済みの SeriesNetwork の取得

logonet ネットワークが存在しない場合、ダウンロードして LogoNet.mat に保存します。

getLogonet();

保存したネットワークには、畳み込み層、全結合層、分類出力層など、22 個の層が含まれています。

load('LogoNet.mat');
convnet.Layers
ans = 

  22x1 Layer array with layers:

     1   'imageinput'    Image Input             227x227x3 images with 'zerocenter' normalization and 'randfliplr' augmentations
     2   'conv_1'        Convolution             96 5x5x3 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'relu_1'        ReLU                    ReLU
     4   'maxpool_1'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     5   'conv_2'        Convolution             128 3x3x96 convolutions with stride [1  1] and padding [0  0  0  0]
     6   'relu_2'        ReLU                    ReLU
     7   'maxpool_2'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     8   'conv_3'        Convolution             384 3x3x128 convolutions with stride [1  1] and padding [0  0  0  0]
     9   'relu_3'        ReLU                    ReLU
    10   'maxpool_3'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    11   'conv_4'        Convolution             128 3x3x384 convolutions with stride [2  2] and padding [0  0  0  0]
    12   'relu_4'        ReLU                    ReLU
    13   'maxpool_4'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    14   'fc_1'          Fully Connected         2048 fully connected layer
    15   'relu_5'        ReLU                    ReLU
    16   'dropout_1'     Dropout                 50% dropout
    17   'fc_2'          Fully Connected         2048 fully connected layer
    18   'relu_6'        ReLU                    ReLU
    19   'dropout_2'     Dropout                 50% dropout
    20   'fc_3'          Fully Connected         32 fully connected layer
    21   'softmax'       Softmax                 softmax
    22   'classoutput'   Classification Output   crossentropyex with 'adidas' and 31 other classes

関数 'logonet_predict' について

関数 logonet_predict.m は、イメージ入力を受け取り、LogoNet.mat ファイルに保存されている深層学習ネットワークを使用して、イメージについて予測を実行します。この関数は、LogoNet.mat からネットワーク オブジェクトを永続変数 logonet に読み込みます。それ以降、この関数を呼び出すと、予測のためにこの永続オブジェクトが再利用されます。

type('logonet_predict.m')
function out = logonet_predict(in)
%#codegen

% Copyright 2017 The MathWorks, Inc.

% function for predicting the logos
% A persistent object logonet is used to load the series network object.
% At the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is reused 
% to call predict on inputs, thus avoiding reconstructing and reloading the
% network object.

persistent logonet;

if isempty(logonet)
    
    logonet = coder.loadDeepLearningNetwork('LogoNet.mat','logonet');
end

out = logonet.predict(in);

end

関数 'logonet_predict' の CUDA MEX の生成

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

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

生成された MEX の実行

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

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

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

im = imresize(im, [227,227]);
predict_scores = logonet_predict_mex(im);

上位 5 つの予測スコアを synset ディクショナリ (ロゴ) の単語にマッピングします。

synsetOut = {'adidas', 'aldi', 'apple', 'becks', 'bmw', 'carlsberg', ...
    'chimay', 'cocacola', 'corona', 'dhl', 'erdinger', 'esso', 'fedex',...
    'ferrari', 'ford', 'fosters', 'google', 'guinness', 'heineken', 'hp',...
    'milka', 'nvidia', 'paulaner', 'pepsi', 'rittersport', 'shell', 'singha', 'starbucks', 'stellaartois', 'texaco', 'tsingtao', 'ups'};

[val,indx] = sort(predict_scores, 'descend');
scores = val(1:5)*100;
top5labels = synsetOut(indx(1:5));

上位 5 つの分類ラベルを表示します。

outputImage = zeros(227,400,3, 'uint8');
for k = 1:3
    outputImage(:,174:end,k) = im(:,:,k);
end

scol = 1;
srow = 20;

for k = 1:5
    outputImage = insertText(outputImage, [scol, srow], [top5labels{k},' ',num2str(scores(k), '%2.2f'),'%'], 'TextColor', 'w','FontSize',15, 'BoxColor', 'black');
    srow = srow + 20;
end

 imshow(outputImage);

clear mex を使用して、メモリに読み込まれた静的ネットワーク オブジェクトを削除します。

clear mex;

関連するトピック