Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

GoogLeNet を使用したイメージの分類

この例では、事前学習済みの深層畳み込みニューラル ネットワーク GoogLeNet を使用してイメージを分類する方法を説明します。

GoogLeNet は、100 万個を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、多くの動物など) に分類できます。このネットワークは広範囲にわたるイメージについての豊富な特徴表現を学習しています。このネットワークは入力としてイメージを取り、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。

事前学習済みのネットワークの読み込み

事前学習済みの GoogLeNet ネットワークを読み込みます。この手順には、Deep Learning Toolbox™ Model for GoogLeNet Network サポート パッケージが必要です。必要なサポート パッケージがインストールされていない場合、ダウンロード用リンクが表示されます。

イメージ分類用の異なる事前学習済みネットワークを読み込むこともできます。別の事前学習済みネットワークを試すには、この例を MATLAB® で開き、別のネットワークを選択します。たとえば、googlenet よりも高速なネットワークである squeezenet を試すことができます。この例は、他の事前学習済みネットワークを使用して実行することもできます。使用可能なすべてのネットワークについては、事前学習済みのニューラル ネットワークの読み込みを参照してください。

net = googlenet;

分類するイメージのサイズは、ネットワークの入力サイズと同じでなければなりません。GoogLeNet では、ネットワークの Layers プロパティの最初の要素はイメージ入力層です。ネットワーク入力サイズはイメージ入力層の InputSize プロパティです。

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   224   224     3

Layers プロパティの最後の要素は分類出力層です。この層の ClassNames プロパティには、ネットワークによって学習されたクラスの名前が含まれています。合計 1000 個のクラス名のうち 10 個をランダムに表示します。

classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    'papillon'
    'eggnog'
    'jackfruit'
    'castle'
    'sleeping bag'
    'redshank'
    'Band Aid'
    'wok'
    'seat belt'
    'orange'

イメージの読み取りとサイズ変更

分類するイメージを読み取って表示します。

I = imread('peppers.png');
figure
imshow(I)

イメージのサイズを表示します。このイメージは 384 x 512 ピクセルで 3 つのカラー チャネル (RGB) があります。

size(I)
ans = 1×3

   384   512     3

imresize を使用して、イメージのサイズをネットワークの入力サイズに変更します。このサイズ変更では、イメージの縦横比が多少変化します。

I = imresize(I,inputSize(1:2));
figure
imshow(I)

用途によっては、異なる方法でイメージのサイズを変更する必要がある場合もあります。たとえば、I(1:inputSize(1),1:inputSize(2),:) を使用して、イメージの左上隅をトリミングできます。Image Processing Toolbox™ がある場合は、関数 imcrop を使用できます。

イメージの分類

classify を使用してイメージを分類し、クラス確率を計算します。このネットワークはイメージをピーマンとして正しく分類します。分類用のネットワークは、イメージに複数のオブジェクトが含まれていても各入力イメージに対して 1 つのラベルを出力するように学習されています。

[label,scores] = classify(net,I);
label
label = categorical
     bell pepper 

イメージを、予測ラベルとイメージがそのラベルを持つ予測確率と共に表示します。

figure
imshow(I)
title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");

上位の予測の表示

上位 5 つの予測ラベルとそれらに対応する確率をヒストグラムとして表示します。ネットワークはイメージを非常に多くのオブジェクト カテゴリに分類しますが、多くのカテゴリは似ているため、ネットワークを評価するときは、通常、上位 5 つの精度を考慮します。このネットワークは高い確率でこのイメージをピーマンとして分類します。

[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
classNamesTop = net.Layers(end).ClassNames(idx);
scoresTop = scores(idx);

figure
barh(scoresTop)
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(classNamesTop)

参照

[1] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. "Going deeper with convolutions." In Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 1-9. 2015.

参考

| | | |

関連するトピック