이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

GoogLeNet을 사용하여 이미지 분류하기

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

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

사전 훈련된 네트워크 불러오기

사전 훈련된 GoogLeNet 네트워크를 불러옵니다. 이미지 분류를 위해 사전 훈련된 다른 네트워크를 불러와도 됩니다. 이 단계에서는 Deep Learning Toolbox™ Model for GoogLeNet Network 지원 패키지가 필요합니다. 필요한 지원 패키지가 설치되어 있지 않으면 이를 다운로드할 수 있는 링크가 제공됩니다.

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)))
    'speedboat'
    'window screen'
    'isopod'
    'wooden spoon'
    'lipstick'
    'drake'
    'hyena'
    'dumbbell'
    'strawberry'
    'custard apple'

이미지 읽기 및 크기 조정하기

분류하려는 이미지를 읽어 들이고 표시합니다.

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.

참고 항목

| | | |

관련 항목