Main Content

GoogLeNet을 사용하여 영상 분류하기

이 예제에서는 사전 훈련된 심층 컨벌루션 신경망 GoogLeNet을 사용하여 영상을 분류하는 방법을 보여줍니다.

1백만 개가 넘는 영상에 대해 훈련된 GoogLeNet은 영상을 키보드, 커피 머그잔, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 이 신경망은 다양한 영상을 대표하는 다양한 특징을 학습했습니다. 이 신경망은 영상을 입력값으로 받아서 영상에 있는 사물에 대한 레이블과 각 사물 범주의 확률을 출력합니다.

사전 훈련된 신경망 불러오기

사전 훈련된 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 속성은 신경망이 학습한 클래스의 이름을 포함합니다. 총 1,000개의 영상 중에서 임의로 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)

영상의 크기를 표시합니다. 영상은 크기가 384x512 픽셀이고 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를 사용하여 영상을 분류하고 클래스 확률을 계산합니다. 신경망이 영상을 피망으로 올바르게 분류합니다. 분류용 신경망은 입력 영상 하나에 사물이 여러 개 들어 있더라도 입력 영상당 하나의 레이블을 출력하도록 훈련되어 있습니다.

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

영상을 예측된 레이블 및 이 레이블을 갖는 영상의 예측된 확률과 함께 표시합니다.

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

상위 예측 표시하기

상위 다섯 개의 예측된 레이블과 각각의 확률을 히스토그램으로 표시합니다. 신경망은 영상을 수많은 사물 범주로 분류하고 그중 많은 범주가 비슷하기 때문에 신경망을 평가할 때는 보통 상위 다섯 개 정확도를 고려합니다. 신경망이 영상을 높은 확률로 피망으로 분류합니다.

[~,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.

참고 항목

| | | |

관련 항목