이 페이지의 내용은 이전 릴리스에 관한 것입니다. 해당 영문 페이지는 최신 릴리스에서 제거되었습니다.

AlexNet을 사용하여 특징 추출하기

이 예제에서는 사전 훈련된 컨벌루션 신경망에서 학습된 이미지 특징을 추출한 다음 추출한 특징을 사용하여 이미지 분류기를 훈련시키는 방법을 보여줍니다. 특징 추출은 사전 훈련된 심층 네트워크의 강력한 표현 기능을 가장 쉽고 빠르게 사용하는 방법입니다. 예를 들어, 추출된 특징에 대해 fitcecoc(Statistics and Machine Learning Toolbox™)를 사용하여 서포트 벡터 머신(SVM)을 훈련시킬 수 있습니다. 특징 추출은 데이터를 한 번만 통과하면 되기 때문에 네트워크 훈련을 가속할 GPU가 없을 때 시도할 수 있는 좋은 시작점이 됩니다.

데이터 불러오기

샘플 이미지의 압축을 풀고 이미지 데이터저장소로서 불러옵니다. imageDatastore는 폴더 이름을 기준으로 이미지에 자동으로 레이블을 지정하고 데이터를 ImageDatastore 객체로 저장합니다. 이미지 데이터저장소를 사용하면 메모리에 담을 수 없는 데이터를 포함하여 다량의 이미지 데이터를 저장할 수 있습니다. 데이터를 훈련 데이터 70%와 테스트 데이터 30%로 분할합니다.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

이 매우 작은 데이터 세트에는 이제 55개의 훈련 이미지와 20개의 검증 이미지가 있습니다. 샘플 이미지 몇 개를 표시합니다.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

사전 훈련된 네트워크 불러오기

사전 훈련된 AlexNet 네트워크를 불러옵니다. Deep Learning Toolbox Model for AlexNet Network 지원 패키지가 설치되어 있지 않으면 이를 다운로드할 수 있는 링크가 제공됩니다. 1백만 개가 넘는 이미지에 대해 훈련된 AlexNet은 이미지를 1,000가지 사물 범주로 분류할 수 있습니다. 키보드, 마우스, 연필, 각종 동물 등을 예로 들 수 있습니다. 그 결과 이 모델은 다양한 이미지를 대표하는 다양한 특징을 학습했습니다.

net = alexnet;

네트워크 아키텍처를 표시합니다. 이 네트워크는 5개의 컨벌루션 계층과 3개의 완전 연결 계층을 갖습니다.

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4], dilation factor [1  1] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Convolution                   256 5x5x48 convolutions with stride [1  1], dilation factor [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Convolution                   384 3x3x192 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Convolution                   256 3x3x192 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

첫 번째 계층인 이미지 입력 계층에 입력되는 이미지는 크기가 227x227x3이어야 합니다. 여기서 3은 색 채널의 개수입니다.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

이미지 특징 추출하기

네트워크는 입력 이미지에 대한 계층 표현을 생성합니다. 보다 심층의 계층에는 앞쪽 계층의 하위 수준 특징을 사용하여 생성한 상위 수준의 특징이 포함됩니다. 훈련 이미지와 테스트 이미지의 특징 표현을 가져오려면 완전 연결 계층 'fc7'에서 activations를 사용하십시오. 이미지의 하위 수준 표현을 가져오려면 네트워크의 앞쪽 계층을 사용하십시오.

이 네트워크의 입력 이미지는 크기가 227x227x3이 되어야 하는데 이미지 데이터저장소의 이미지는 이와 다른 크기를 갖습니다. 네트워크에 입력하기 전에 훈련 이미지와 테스트 이미지의 크기를 자동으로 조정하려면 증대 이미지 데이터저장소를 만들고 원하는 이미지 크기를 지정한 다음 이러한 데이터저장소를 activations에 대한 입력 인수로 사용하십시오.

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

layer = 'fc7';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

훈련 데이터와 테스트 데이터로부터 클래스 레이블을 추출합니다.

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

이미지 분류기 피팅하기

훈련 이미지로부터 추출한 특징을 예측 변수로 사용하고 fitcecoc(Statistics and Machine Learning Toolbox)를 사용하여 다중클래스 서포트 벡터 머신(SVM)을 피팅합니다.

classifier = fitcecoc(featuresTrain,YTrain);

테스트 이미지 분류하기

훈련된 SVM 모델과 테스트 이미지로부터 추출한 특징을 사용하여 테스트 이미지를 분류합니다.

YPred = predict(classifier,featuresTest);

4개의 샘플 테스트 이미지를 예측된 레이블과 함께 표시합니다.

idx = [1 5 10 15];
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    label = YPred(idx(i));
    imshow(I)
    title(char(label))
end

테스트 세트에 대한 분류 정확도를 계산합니다. 정확도는 네트워크가 올바르게 예측하는 레이블의 비율입니다.

accuracy = mean(YPred == YTest)
accuracy = 1

이 SVM은 높은 정확도를 갖습니다. 특징 추출을 사용했을 때의 정확도가 충분히 높지 않다면 그 대신 전이 학습을 사용해 보십시오.

참고 문헌

[1] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems. 2012.

[2] BVLC AlexNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

참고 항목

|

관련 항목