Main Content

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

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

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

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

imagePretrainedNetwork 함수를 사용하여 사전 훈련된 GoogLeNet 신경망과 해당 클래스 이름을 불러옵니다. 이 단계에서는 Deep Learning Toolbox™ Model for GoogLeNet Network 지원 패키지가 필요합니다. 필요한 지원 패키지가 설치되어 있지 않으면 이를 다운로드할 수 있는 링크가 제공됩니다.

영상 분류를 위해 사전 훈련된 다른 신경망을 불러와도 됩니다. 사전 훈련된 다른 신경망을 사용해 보려면 MATLAB®에서 이 예제를 연 다음 다른 신경망을 선택하십시오. 예를 들어, GoogLeNet보다 훨씬 빠른 신경망인 SqueezeNet을 사용해 볼 수 있습니다. 사전 훈련된 다른 신경망을 사용하여 이 예제를 실행할 수 있습니다. 사용 가능한 모든 신경망 목록을 보려면 사전 훈련된 심층 신경망 항목을 참조하십시오.

[net,classNames] = imagePretrainedNetwork("googlenet");

분류하려는 영상의 크기는 신경망의 입력 크기와 같아야 합니다. GoogLeNet의 경우 신경망의 Layers 속성의 첫 번째 요소는 영상 입력 계층입니다. 영상 입력 계층의 InputSize 속성은 신경망의 입력 크기입니다.

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

   224   224     3

클래스 이름 중 10개를 무작위로 표시합니다.

numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    "hartebeest"
    "streetcar"
    "hair slide"
    "entertainment center"
    "wreck"
    "Siamese cat"
    "racket"
    "purse"
    "marmoset"
    "fountain"

영상 읽어 들이기

분류하려는 영상을 읽어 들이고 표시합니다.

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

영상 크기를 조정한 후 분류하기

영상의 크기를 표시합니다. 영상은 크기가 384×512 픽셀이고 3개의 색 채널(RGB)을 갖습니다.

size(I)
ans = 1×3

   384   512     3

imresize를 사용하여 영상의 크기를 신경망의 입력 크기에 맞게 조정합니다. 이렇게 크기를 조정하면 영상의 종횡비가 약간 변경됩니다.

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

애플리케이션에 따라 다른 방식으로 영상의 크기를 조정하려 할 수 있습니다. 예를 들어, I(1:inputSize(1),1:inputSize(2),:)를 사용하여 영상의 왼쪽 위 코너를 자를 수 있습니다. Image Processing Toolbox™가 있다면 imcrop 함수를 사용할 수 있습니다.

신경망을 사용하여 예측을 수행합니다. 하나의 영상을 사용하여 예측을 수행하기 위해 predict 함수를 사용합니다. 영상의 데이터형은 uint8입니다. 이 신경망으로 예측을 수행하기 위해 영상의 데이터형을 single형으로 변환합니다. GPU를 사용하려면 데이터를 gpuArray로 변환합니다. GPU를 사용하려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. GPU를 사용할 수 없는 경우, 함수는 CPU를 사용합니다.

X = single(X);
if canUseGPU
    X = gpuArray(X);
end
scores = predict(net,X);

predict 함수는 각 클래스에 대한 확률을 반환합니다. 분류 점수를 categorical형 레이블로 변환하기 위해 scores2label 함수를 사용합니다.

[label,score] = scores2label(scores,classNames);

원본 영상을 표시하고, 이 영상에 대해 예측된 레이블과 이 레이블로 예측된 확률을 함께 표시합니다.

figure
imshow(I)
title(string(label) + ", " + score)

상위 예측 표시하기

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

[~,idx] = sort(scores,"descend");
idx = idx(5:-1:1);
classNamesTop = 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.

참고 항목

| | | | | |

관련 항목