Main Content

GoogLeNet을 사용하여 Simulink에서 영상 분류하기

이 예제에서는 Image Classifier 블록을 사용하여 Simulink®에서 영상을 분류하는 방법을 보여줍니다. 예제에서는 사전 훈련된 심층 컨벌루션 신경망 GoogLeNet을 사용하여 분류를 수행합니다.

사전 훈련된 GoogLeNet 신경망

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

net = googlenet;
inputSize = net.Layers(1).InputSize;
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)

이 데이터를 Simulink 모델로 가져오기 위해 입력 영상 데이터와 빈 시간 벡터가 들어 있는 구조체 변수를 지정합니다.

simin.time = [];
simin.signals.values = I;
simin.signals.dimensions = size(I);

예측을 위한 Simulink 모델

영상 분류를 위한 Simulink 모델이 표시됩니다. 이 모델은 From Workspace 블록을 사용하여 입력 영상을 불러오고, Deep Neural Networks 라이브러리의 Image Classifier 블록을 사용하여 입력값을 분류하고, Display 블록을 사용하여 예측된 출력값을 표시합니다.

model = 'googlenet_classifier';
open_system(model);

시뮬레이션 실행하기

Simulink 모델을 검증하기 위해 시뮬레이션을 실행합니다.

set_param(model,'SimulationMode','Normal');
sim(model);

신경망이 영상을 피망으로 분류합니다.

상위 예측 표시하기

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

scores = yout.signals(1).values(:,:,1);
labels = yout.signals(2).values(:,:,1);
[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
scoresTop = scores(idx);
labelsTop = split(string(labels(idx)),'_');
labelsTop = labelsTop(:,:,1);

figure
imshow(I)
title(labelsTop(5) + ", " + num2str(100*scoresTop(5) + "%"));

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