Main Content

영상 분류 시작하기

이 예제에서는 심층 신경망 디자이너 앱을 사용하여 딥러닝 분류를 수행하는 간단한 컨벌루션 신경망을 만드는 방법을 보여줍니다. 컨벌루션 신경망은 딥러닝 분야의 필수 툴로서, 특히 영상 인식에 적합합니다.

영상 데이터 불러오기

샘플 숫자 데이터를 영상 데이터저장소로 불러옵니다. 이 데이터에 액세스하려면 예제를 라이브 스크립트로 여십시오. imageDatastore 함수는 폴더 이름을 기준으로 영상에 자동으로 레이블을 지정합니다. 데이터 세트는 10개의 클래스를 갖고 데이터 세트의 각 영상은 28×28×1 픽셀입니다.

unzip("DigitsData.zip")

imds = imageDatastore("DigitsData", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

classNames = categories(imds.Labels);

데이터를 훈련 데이터 세트, 검증 데이터 세트, 테스트 데이터 세트로 분할합니다. 영상의 70%는 훈련용, 15%는 검증용, 15%는 테스트용으로 사용합니다. "randomized"를 지정하여 각 클래스에서 지정된 비율의 파일을 새 데이터 세트에 할당합니다. splitEachLabel 함수는 영상 데이터저장소를 3개의 새로운 데이터저장소로 분할합니다.

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.7,0.15,0.15,"randomized");

신경망 아키텍처 정의하기

신경망을 구축하려면 심층 신경망 디자이너 앱을 사용하십시오.

deepNetworkDesigner

빈 신경망을 만들기 위해 빈 신경망 위에 커서를 올리고 새로 만들기를 클릭합니다.

디자이너 창에서 컨벌루션 신경망 아키텍처를 정의합니다. 계층 라이브러리에서 계층을 끌어서 연결합니다. 계층을 빠르게 검색하려면 계층 라이브러리 창의 계층 필터링 검색 상자를 사용하십시오. 계층의 속성을 편집하려면 계층을 클릭하고 속성 창에서 값을 편집하십시오.

다음 계층들을 순서대로 끌어온 다음 순차적으로 연결합니다. 먼저 imageInputLayer를 캔버스 위로 끌어온 다음 InputSize28,28,1로 설정합니다.

그리고 다음 계층들을 캔버스 위로 순서대로 끌어와서 연결합니다.

  • convolution2dLayer

  • batchNormalizationLayer

  • reluLayer

그런 다음 fullyConnectedLayer를 연결하고 OutputSize를 데이터의 클래스 개수에 해당하는 값으로 설정합니다. 이 예제에서는 10입니다.

마지막으로 SoftmaxLayer를 추가합니다.

신경망이 훈련 준비가 되었는지 확인하려면 분석을 클릭하십시오. 딥러닝 신경망 분석기에 보고되는 오류나 경고가 없으므로 신경망이 훈련할 준비가 된 것입니다. 신경망을 내보내기 위해 내보내기를 클릭합니다. 그러면 앱이 신경망을 변수 net_1로 저장합니다.

훈련 옵션 지정하기

훈련 옵션을 지정합니다. 옵션 중에서 선택하려면 경험적 분석이 필요합니다. 실험을 실행하여 다양한 훈련 옵션 구성을 살펴보려면 실험 관리자 앱을 사용합니다.

options = trainingOptions("sgdm", ...
    MaxEpochs=4, ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=30, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

신경망 훈련시키기

trainnet 함수를 사용하여 신경망을 훈련시킵니다. 분류가 목적이므로 교차 엔트로피 손실을 사용합니다.

net = trainnet(imdsTrain,net_1,"crossentropy",options);

신경망 테스트하기

신경망을 테스트하기 위해 검증 데이터를 분류한 후 분류 정확도를 계산합니다.

minibatchpredict 함수를 사용하여 예측을 수행하고 scores2label 함수를 사용하여 점수를 레이블로 변환합니다. 기본적으로 minibatchpredict 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다.

scores = minibatchpredict(net,imdsValidation);
YValidation = scores2label(scores,classNames);

분류 정확도를 계산합니다. 정확도는 올바르게 예측된 레이블의 비율입니다.

TValidation = imdsValidation.Labels;
accuracy = mean(YValidation == TValidation)
accuracy = 0.9780

예측 결과를 일부 시각화합니다.

numValidationObservations = numel(imdsValidation.Files);
idx = randi(numValidationObservations,9,1);

figure
tiledlayout("flow")
for i = 1:9
    nexttile
    img = readimage(imdsValidation,idx(i));
    imshow(img)
    title("Predicted Class: " + string(YValidation(idx(i))))
end

딥러닝의 다음 단계로 넘어가서 사전 훈련된 신경망과 전이 학습을 사용해 볼 수 있습니다. 예제는 전이 학습 시작하기 항목을 참조하십시오.

참고 항목

|

관련 항목