주요 콘텐츠

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

R2026b

이 예제에서는 Classify 블록을 사용하여 Simulink®에서 영상을 분류하는 방법을 보여줍니다.

이 예제에서는 사전 훈련된 SqueezeNet 신경망을 사용하여 분류를 수행합니다.

사전 훈련된 SqueezeNet 신경망

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

[net,classNames] = imagePretrainedNetwork;
inputSize = net.Layers(1).InputSize;
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)

Figure contains an axes object. The hidden axes object contains an object of type image.

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

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

예측을 위한 Simulink 모델

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

model = "SqueezeNetClassifier";
open_system(model);

Screenshot of Simulink model. The simin block is connected to a single block and then the classify block. The classify block has the outputs ypred, scores, and labels.

시뮬레이션 실행하기

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

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

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

Screenshot of Simulink model. The ypred output is connected to display block that shows bellPepper_label.

상위 예측 표시하기

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

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 contains an axes object. The hidden axes object with title bellPepper, 89.3935% contains an object of type image.

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

Figure contains an axes object. The axes object with title Top 5 Predictions, xlabel Probability contains an object of type bar.