Main Content

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

深層学習を使用した Web カメラ イメージの分類

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

MATLAB®、シンプルな Web カメラ、および深層ニューラル ネットワークを使用して、身の回りの物を識別します。この例では、GoogLeNet を使用します。この事前学習済みの深層畳み込みニューラル ネットワーク (CNN または ConvNet) は、100 万個を超えるイメージについて学習済みであり、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、多くの動物など) に分類できます。GoogLeNet をダウンロードし、MATLAB を使用してカメラのイメージをリアルタイムで連続的に処理できます。

GoogLeNet は広範囲のイメージに対する豊富な特徴表現を学習しています。入力としてイメージを取り、イメージ内のオブジェクトのラベルと各オブジェクト カテゴリの確率を表示します。身の回りの物で実験して、GoogLeNet によってイメージがどの程度正確に分類されるかを確認できます。ネットワークによるオブジェクト分類の詳細を確認するには、最終的なクラスの判定だけでなく、上位 5 クラスのスコアをリアルタイムで表示します。

カメラおよび事前学習済みのネットワークの読み込み

カメラを接続し、事前学習済みの GoogLeNet ネットワークを読み込みます。この手順では任意の事前学習済みのネットワークを使用できます。この例には、MATLAB Support Package for USB Webcams、および Deep Learning Toolbox™ Model for GoogLeNet Network が必要です。必要なサポート パッケージがインストールされていない場合、ダウンロード用リンクが表示されます。

camera = webcam;
net = googlenet;

例をもう一度実行する場合は、まずコマンド clear camera を実行します。ここで、camera は Web カメラへの接続です。そうしない場合、同じ Web カメラへの新しい接続は作成できないため、エラーが表示されます。

カメラのスナップショットの分類

イメージを分類するには、ネットワークの入力サイズに合わせてイメージのサイズを変更しなければなりません。ネットワークのイメージ入力層の InputSize プロパティから最初の 2 つの要素を取得します。イメージ入力層は、ネットワークの最初の層です。

inputSize = net.Layers(1).InputSize(1:2)
inputSize =

   224   224

カメラのイメージを、予測ラベルとその確率と共に表示します。classify を呼び出す前に、ネットワークの入力サイズに合わせてイメージのサイズを変更しなければなりません。

figure
im = snapshot(camera);
image(im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title({char(label),num2str(max(score),2)});

カメラのイメージの連続的な分類

カメラのイメージを連続的に分類するには、前の手順をループ内に含めます。Figure が開いている間、ループを実行します。ライブ予測を停止するには、単に Figure を閉じます。反復が終了するたびに drawnow を使用して Figure を更新します。

h = figure;

while ishandle(h)
    im = snapshot(camera);
    image(im)
    im = imresize(im,inputSize);
    [label,score] = classify(net,im);
    title({char(label), num2str(max(score),2)});
    drawnow
end

上位の予測の表示

予測されるクラスは急速に変化する可能性があります。そのため、上位の予測を一緒に表示すると便利な場合があります。予測の最高スコアを使用してクラスをプロットすることで、上位 5 つの予測とその確率を表示できます。

カメラのスナップショットを分類します。カメラのイメージを、予測ラベルとその確率と共に表示します。関数 classifyscore 出力を使用して、上位 5 つの予測について確率のヒストグラムを表示します。

Figure ウィンドウを作成します。まず、幅が 2 倍になるようにウィンドウのサイズを変更して、2 つのサブプロットを作成します。

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

左のサブプロットに、イメージと分類をまとめて表示します。

im = snapshot(camera);
image(ax1,im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title(ax1,{char(label),num2str(max(score),2)});

スコアの高いクラスを選択して、上位 5 つの予測を選択します。

[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
classes = net.Layers(end).Classes;
classNamesTop = string(classes(idx));
scoreTop = score(idx);

上位 5 つの予測をヒストグラムとして表示します。

barh(ax2,scoreTop)
xlim(ax2,[0 1])
title(ax2,'Top 5')
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop)
ax2.YAxisLocation = 'right';

イメージの連続的な分類と上位の予測の表示

カメラのイメージを連続的に分類して上位の予測を表示するには、前の手順をループ内に含めます。Figure が開いている間、ループを実行します。ライブ予測を停止するには、単に Figure を閉じます。反復が終了するたびに drawnow を使用して Figure を更新します。

Figure ウィンドウを作成します。まず、幅が 2 倍になるようにウィンドウのサイズを変更して、2 つのサブプロットを作成します。座標軸のサイズが変更されないようにするには、PositionConstraint プロパティを 'innerposition' に設定します。

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);
ax2.PositionConstraint = 'innerposition';

上位 5 つの予測のヒストグラムをイメージと共に連続的に表示して分類します。

while ishandle(h)
    % Display and classify the image
    im = snapshot(camera);
    image(ax1,im)
    im = imresize(im,inputSize);
    [label,score] = classify(net,im);
    title(ax1,{char(label),num2str(max(score),2)});

    % Select the top five predictions
    [~,idx] = sort(score,'descend');
    idx = idx(5:-1:1);
    scoreTop = score(idx);
    classNamesTop = string(classes(idx));

    % Plot the histogram
    barh(ax2,scoreTop)
    title(ax2,'Top 5')
    xlabel(ax2,'Probability')
    xlim(ax2,[0 1])
    yticklabels(ax2,classNamesTop)
    ax2.YAxisLocation = 'right';

    drawnow
end

参考

| |

関連するトピック