딥러닝을 사용하여 웹캠 영상 분류하기
이 예제에서는 사전 훈련된 심층 컨벌루션 신경망 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