이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
딥러닝을 사용하여 웹캠 영상 분류하기
R2026a이 예제에서는 사전 훈련된 심층 컨벌루션 신경망 GoogLeNet을 사용하여 웹캠의 영상을 실시간으로 분류하는 방법을 보여줍니다.
MATLAB®과 간단한 웹캠 및 심층 신경망을 사용하여 주변의 사물을 식별합니다. 이 예제에서는 사전 훈련된 심층 컨벌루션 신경망(CNN 또는 ConvNet) GoogLeNet을 사용합니다. 1백만 개가 넘는 영상에 대해 훈련된 GoogLeNet은 영상을 키보드, 커피 머그잔, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. GoogLeNet을 다운로드하고 MATLAB을 사용하여 계속해서 카메라 영상을 실시간으로 처리할 수 있습니다.
GoogLeNet은 다양한 영상을 대표하는 다양한 특징을 학습했습니다. 영상을 입력값으로 받아 영상에 포함된 사물의 레이블과 각 사물 범주의 확률을 제공합니다. 주변의 사물을 사용하여 GoogLeNet이 영상을 얼마나 정확히 분류하는지 실험해 볼 수 있습니다. GoogLeNet의 사물 분류에 대해 자세히 알아보기 위해, 최종 결정된 클래스만 표시하는 대신 상위 5개의 클래스에 대한 점수를 실시간으로 표시할 수 있습니다.
카메라와 사전 훈련된 신경망 불러오기
카메라에 연결하고 사전 훈련된 GoogLeNet 신경망을 불러옵니다. 이 단계에서는 임의의 사전 훈련된 신경망을 사용할 수 있습니다. 이 예제를 실행하려면 MATLAB Support Package for USB Webcams와 Deep Learning Toolbox™ Model for GoogLeNet Network가 필요합니다. 필요한 지원 패키지가 설치되어 있지 않으면 이를 다운로드할 수 있는 링크가 제공됩니다.
camera = webcam; net = googlenet;
이 예제를 다시 실행하려면 먼저 clear camera 명령을 실행하십시오. 여기서 camera는 웹캠에 대한 연결입니다. 이렇게 하지 않으면 동일한 웹캠에 대한 또 하나의 연결을 만들 수 없기 때문에 오류가 표시됩니다.
카메라의 스냅샷 분류하기
영상을 분류하려면 신경망의 입력 크기에 맞게 영상의 크기를 조정해야 합니다. 신경망 영상 입력 계층의 InputSize 속성의 처음 2개 요소를 가져옵니다. 영상 입력 계층은 신경망의 첫 번째 계층입니다.
inputSize = net.Layers(1).InputSize(1:2)
inputSize = 224 224
카메라의 영상을 예측된 레이블 및 해당 레이블의 확률과 함께 표시합니다. classify를 호출하기 전에 먼저 신경망의 입력 크기에 맞게 영상의 크기를 조정해야 합니다.
figure
im = snapshot(camera);
image(im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title({char(label),num2str(max(score),2)});

카메라의 영상을 연속해서 분류하기
카메라의 영상을 연속해서 분류하려면 위 단계들을 루프 내에 포함시키십시오. Figure를 열어 둔 상태로 루프를 실행합니다. 실시간 예측을 중지하려면 Figure를 닫으십시오. 각 반복의 끝에서 drawnow를 사용하여 Figure를 업데이트합니다.
h = figure; while ishandle(h) im = snapshot(camera); image(im) im = imresize(im,inputSize); [label,score] = classify(net,im); title({char(label), num2str(max(score),2)}); drawnow end
상위 예측 표시하기
예측된 클래스는 빠르게 바뀔 수 있습니다. 따라서 상위 예측들을 한 번에 표시하는 것이 유용할 수 있습니다. 예측 점수가 가장 높은 클래스들을 플로팅하여 상위 5개의 예측과 그 확률을 표시할 수 있습니다.
카메라의 스냅샷을 분류합니다. 카메라의 영상을 예측된 레이블 및 해당 레이블의 확률과 함께 표시합니다. classify 함수의 score 출력값을 사용하여 상위 5개 예측의 확률 히스토그램을 표시합니다.
Figure 창을 만듭니다. 먼저 창의 너비가 2배가 되도록 크기를 조정한 다음 서브플롯 2개를 만듭니다.
h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2);
왼쪽 서브플롯에 영상과 분류를 함께 표시합니다.
im = snapshot(camera);
image(ax1,im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title(ax1,{char(label),num2str(max(score),2)});
점수가 가장 높은 클래스를 선택하여 상위 5개의 예측을 선택합니다.
[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
classes = net.Layers(end).Classes;
classNamesTop = string(classes(idx));
scoreTop = score(idx);
상위 5개의 예측을 히스토그램으로 표시합니다.
barh(ax2,scoreTop) xlim(ax2,[0 1]) title(ax2,'Top 5') xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop) ax2.YAxisLocation = 'right';

영상을 연속해서 분류하고 상위 예측 표시하기
카메라 영상을 연속해서 분류하고 상위 예측을 표시하려면 위 단계들을 루프 내에 포함시키십시오. Figure를 열어 둔 상태로 루프를 실행합니다. 실시간 예측을 중지하려면 Figure를 닫으십시오. 각 반복의 끝에서 drawnow를 사용하여 Figure를 업데이트합니다.
Figure 창을 만듭니다. 먼저 창의 너비가 2배가 되도록 크기를 조정한 다음 서브플롯 2개를 만듭니다. 좌표축의 크기가 변경되지 않도록 하려면 PositionConstraint 속성을 'innerposition'으로 설정하십시오.
h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);
ax2.PositionConstraint = 'innerposition';
영상을 연속해서 분류하고 영상과 상위 5개의 예측에 대한 히스토그램을 함께 표시합니다.
while ishandle(h) % Display and classify the image im = snapshot(camera); image(ax1,im) im = imresize(im,inputSize); [label,score] = classify(net,im); title(ax1,{char(label),num2str(max(score),2)}); % Select the top five predictions [~,idx] = sort(score,'descend'); idx = idx(5:-1:1); scoreTop = score(idx); classNamesTop = string(classes(idx)); % Plot the histogram barh(ax2,scoreTop) title(ax2,'Top 5') xlabel(ax2,'Probability') xlim(ax2,[0 1]) yticklabels(ax2,classNamesTop) ax2.YAxisLocation = 'right'; drawnow end
참고 항목
imagePretrainedNetwork | dlnetwork | trainingOptions | trainnet