주요 콘텐츠

imagePretrainedNetwork

영상에 대해 사전 훈련된 신경망

R2024a 이후

    설명

    imagePretrainedNetwork 함수는 사전 훈련된 신경망을 불러오고, 신경망 아키텍처를 전이 학습과 미세 조정에 맞도록 선택적으로 조정합니다.

    [net,classNames] = imagePretrainedNetwork는 사전 훈련된 SqueezeNet 신경망과 이 신경망의 클래스 이름을 반환합니다. 이 신경망은 ImageNet 데이터 세트에서 1000개 클래스에 대해 훈련됩니다.

    예제

    [net,classNames] = imagePretrainedNetwork(name)은 지정된 사전 훈련된 신경망과 해당 클래스 이름을 반환합니다.

    [net,classNames] = imagePretrainedNetwork(___,Name=Value)는 위에 열거된 구문에 나와 있는 입력 인수 조합 외에, 하나 이상의 이름-값 인수를 사용하여 옵션을 지정합니다. 예를 들어 Weights="none"은 신경망을 사전 훈련된 가중치 없이 초기화되지 않은 상태로 반환하도록 지정합니다.

    예제

    모두 축소

    사전 훈련된 SqueezeNet 신경망과 해당 신경망 클래스 이름을 작업 공간에 불러옵니다.

    [net,classNames] = imagePretrainedNetwork;

    신경망 속성을 확인합니다.

    net
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    처음 몇 개의 클래스 이름을 확인합니다.

    head(classNames)
        "tench"
        "goldfish"
        "great white shark"
        "tiger shark"
        "hammerhead"
        "electric ray"
        "stingray"
        "cock"
    

    사전 훈련된 SqueezeNet 신경망을 작업 공간에 불러옵니다.

    [net,classNames] = imagePretrainedNetwork;

    PNG 파일에서 영상을 읽어 들이고 분류합니다. 영상을 분류하기 위해 먼저 영상을 single형으로 변환합니다.

    im = imread("peppers.png");
    figure
    imshow(im)

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

    X = single(im);
    scores = predict(net,X);
    [label,score] = scores2label(scores,classNames);

    영상을 예측 레이블 및 그에 대응되는 점수와 함께 표시합니다.

    figure
    imshow(im)
    title(string(label) + " (Score: " + score + ")")

    Figure contains an axes object. The hidden axes object with title bell pepper (Score: 0.89394) contains an object of type image.

    사전 훈련된 신경망을 새로운 작업에 맞도록 조정하고 학습된 가중치를 출발점으로 사용하여, 사전 훈련된 신경망을 새 데이터셋에 맞게 다시 훈련시킬 수 있습니다. 신경망을 새 데이터에 맞게 조정하려면, 새 작업의 각 클래스별 예측 점수가 출력되도록 마지막 몇 개 계층(신경망 헤드라고 함)을 바꿔야 합니다.

    훈련 데이터 불러오기

    MathWorks™ Merch 데이터 세트를 추출합니다. MathWorks Merch 데이터 세트는 5개의 서로 다른 클래스에 속하는 MathWorks 기념품 75개의 영상을 포함하는 소규모 데이터 세트입니다. 데이터는 영상들이 이 5개 클래스에 해당하는 하위 폴더에 속하도록 정렬되어 있습니다.

    folderName = "MerchData";
    unzip("MerchData.zip",folderName);

    영상 데이터 저장소를 만듭니다. 영상 데이터저장소를 사용하면 메모리에 담을 수 없는 데이터를 포함하여 다량의 영상 데이터 모음을 저장할 수 있고 신경망 훈련 시 영상 배치를 효율적으로 읽어 들일 수 있습니다. 추출된 영상이 있는 폴더를 지정하고 하위 폴더 이름이 영상 레이블에 대응됨을 표시합니다.

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

    샘플 영상 몇 개를 표시합니다.

    numImages = numel(imds.Labels);
    idx = randperm(numImages,16);
    I = imtile(imds,Frames=idx);
    figure
    imshow(I)

    클래스 이름과 클래스 개수를 확인합니다.

    classNames = categories(imds.Labels)
    classNames = 5×1 cell
        {'MathWorks Cap'          }
        {'MathWorks Cube'         }
        {'MathWorks Playing Cards'}
        {'MathWorks Screwdriver'  }
        {'MathWorks Torch'        }
    
    
    numClasses = numel(classNames)
    numClasses = 
    5
    

    데이터를 훈련 데이터 세트와 검증 데이터 세트로 분할합니다. 영상의 70%는 훈련용, 15%는 검증용, 15%는 테스트용으로 사용합니다. splitEachLabel 함수는 영상 데이터저장소를 2개의 새로운 데이터저장소로 분할합니다.

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

    사전 훈련된 신경망 불러오기

    사전 훈련된 SqueezeNet 신경망을 작업 공간에 불러옵니다. 신경망을 새 데이터에 대해 다시 훈련시킬 수 있는 상태로 반환하기 위해 클래스 개수를 지정합니다.

    net = imagePretrainedNetwork(NumClasses=numClasses)
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    입력 계층에서 신경망 입력 크기를 가져옵니다.

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

    신경망 헤드(학습 가능한 파라미터가 있는 마지막 계층)의 학습 가능한 계층을 다시 훈련시켜야 합니다. 이 계층은 대개 출력 크기가 클래스 개수와 일치하는 완전 연결 계층 또는 컨벌루션 계층입니다.

    이 계층의 업데이트 수준을 증가시키고 수렴을 가속화하기 위해 setLearnRateFactor 함수를 사용하여 학습 가능한 파라미터의 학습률 인자를 높입니다. 학습 가능한 파라미터의 학습률 인자를 10으로 설정합니다.

    net = setLearnRateFactor(net,"conv10/Weights",10);
    net = setLearnRateFactor(net,"conv10/Bias",10);

    훈련을 위해 데이터 준비하기

    데이터저장소의 영상은 크기가 다를 수 있습니다. 훈련 영상의 크기를 자동으로 조정하려면 증강 영상 데이터저장소를 사용하십시오. 데이터 증강은 신경망이 과적합되는 것을 방지하고 훈련 영상의 정확한 세부 정보가 기억되지 않도록 하는 데에도 도움이 됩니다. 훈련 영상에 대해 추가로 수행할 증강 연산을 지정합니다. 즉, 세로 축을 따라 훈련 영상을 무작위로 뒤집고, 최대 30개의 픽셀을 가로와 세로 방향으로 무작위로 평행 이동합니다.

    pixelRange = [-30 30];
    
    imageAugmenter = imageDataAugmenter( ...
        RandXReflection=true, ...
        RandXTranslation=pixelRange, ...
        RandYTranslation=pixelRange);
    
    augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
        DataAugmentation=imageAugmenter);

    추가적인 데이터 증강을 수행하지 않고 검증 영상과 테스트 영상의 크기를 자동으로 조정하려면 증강 영상 데이터저장소를 추가적인 전처리 연산 지정 없이 사용하십시오.

    augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
    augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

    훈련 옵션 지정하기

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

    이 예제에서는 다음 옵션을 사용합니다.

    • Adam 최적화 함수를 사용하여 훈련시킵니다.

    • 업데이트 수준을 사전 훈련된 가중치로 줄이기 위해 더 작은 학습률을 사용합니다. 학습률을 0.0001로 설정합니다.

    • 5회 반복마다 검증 데이터를 사용하여 신경망을 검증합니다. 더 큰 데이터셋의 경우 검증으로 인해 훈련 속도가 떨어지지 않도록 하려면 이 값을 늘리십시오.

    • 훈련 진행 상황을 플롯으로 표시하고 정확도 메트릭을 모니터링합니다.

    • 상세 출력값을 비활성화합니다.

    options = trainingOptions("adam", ...
        InitialLearnRate=0.0001, ...
        ValidationData=augimdsValidation, ...
        ValidationFrequency=5, ...
        Plots="training-progress", ...
        Metrics="accuracy", ...
        Verbose=false);

    신경망 훈련시키기

    trainnet 함수를 사용하여 신경망을 훈련시킵니다. 분류에는 교차 엔트로피 손실을 사용합니다. 기본적으로 trainnet 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다. GPU를 사용하려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. GPU를 사용할 수 없는 경우, trainnet 함수는 CPU를 사용합니다. 실행 환경을 지정하려면 ExecutionEnvironment 훈련 옵션을 사용하십시오.

    net = trainnet(augimdsTrain,net,"crossentropy",options);

    신경망 테스트하기

    testnet 함수를 사용하여 신경망을 테스트합니다. 단일 레이블 분류의 경우 정확도를 평가합니다. 정확도는 올바른 예측의 비율입니다. 기본적으로 testnet 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다. 실행 환경을 수동으로 선택하려면 testnet 함수의 ExecutionEnvironment 인수를 사용하십시오.

    accuracy = testnet(net,augimdsTest,"accuracy")
    accuracy = 
    100
    

    예측 수행하기

    테스트 영상을 읽어 들이고 표시합니다.

    im = imread("MerchDataTest.jpg");
    figure
    imshow(im)

    신경망을 사용하여 예측을 수행합니다. 하나의 영상을 사용하여 예측을 수행하려면 영상을 single형으로 변환하고 predict 함수를 사용합니다. 사용 가능한 GPU가 있는 경우 이를 사용하려면 먼저 데이터를 gpuArray로 변환합니다. 여러 개의 영상을 사용하여 예측을 수행하려면 minibatchpredict 함수를 사용합니다.

    X = single(im);
    
    if canUseGPU
        X = gpuArray(X);
    end
    
    scores = predict(net,X);
    label = scores2label(scores,classNames);

    영상과 예측 결과를 표시합니다.

    figure
    imshow(im)
    title("Prediction: " + string(label))

    입력 인수

    모두 축소

    사전 훈련된 신경망 이름으로, 다음 값 중 하나로 지정됩니다.

    imagePretrainedNetwork 모델 이름 인수신경망 이름심도파라미터 메모리파라미터(단위: 백만)영상 입력 크기입력값 범위입력 계층 정규화필요한 지원 패키지
    "squeezenet"SqueezeNet [2] 18

    4.7MB

    1.24

    227×227

    [0, 255]"zerocenter"없음
    "googlenet"GoogLeNet [3][4]22

    27MB

    7.0

    224×224

    [0, 255]"zerocenter"

    Deep Learning Toolbox™ Model for GoogLeNet Network

    "googlenet-places365"[0, 255]"zerocenter"
    "inceptionv3"Inception-v3 [5]48

    91MB

    23.9

    299×299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-v3 Network
    "densenet201"DenseNet-201 [6]201

    77MB

    20.0

    224×224

    [0, 255]"zscore"Deep Learning Toolbox Model for DenseNet-201 Network
    "mobilenetv2"MobileNet-v2 [7]53

    14MB

    3.5

    224×224

    [0, 255]"zscore"Deep Learning Toolbox Model for MobileNet-v2 Network
    "resnet18"ResNet-18 [8]18

    45MB

    11.7

    224×224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-18 Network
    "resnet50"ResNet-50 [8]50

    98MB

    25.6

    224×224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-50 Network
    "resnet101"ResNet-101 [8]101

    171MB

    44.6

    224×224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for ResNet-101 Network
    "xception"Xception [9]71

    88MB

    22.9299×299[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Xception Network
    "inceptionresnetv2"Inception-ResNet-v2 [10]164

    213MB

    55.9

    299×299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-ResNet-v2 Network
    "shufflenet"ShuffleNet [11]505.5MB1.4224×224[0, 255]"zscore"Deep Learning Toolbox Model for ShuffleNet Network
    "nasnetmobile"NASNet-Mobile [12]*20MB 5.3224×224[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Mobile Network
    "nasnetlarge"NASNet-Large [12]*340MB88.9331×331[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Large Network
    "darknet19"DarkNet-19 [13]1980MB20.8256×256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-19 Network
    "darknet53"DarkNet-53 [13]53159MB41.6256×256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-53 Network
    "efficientnetb0"EfficientNet-b0 [14]8220MB5.3

    224×224

    [0, 255]"zscore"Deep Learning Toolbox Model for EfficientNet-b0 Network
    "alexnet"AlexNet [15]8

    233MB

    61.0

    227×227

    [0, 255]"zerocenter"Deep Learning Toolbox Model for AlexNet Network
    "vgg16"VGG-16 [16]16

    528MB

    138

    224×224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-16 Network
    "vgg19"VGG-19 [16]19

    548MB

    144

    224×224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-19 Network

    참고

    Weights 옵션을 "none"으로 설정하면 대부분의 모델에서는 지원 패키지 다운로드가 필요하지 않습니다.

    이름-값 인수

    모두 축소

    선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

    예: net = imagePretrainedNetwork("googlenet",NumClasses=10)은 사전 훈련된 GoogLeNet 신경망을 10개 클래스의 분류 작업에 대해 다시 훈련시킬 수 있는 상태로 반환합니다.

    분류 작업의 클래스 개수로, 양의 정수 또는 []로 지정됩니다.

    NumClasses가 정수이면 imagePretrainedNetwork 함수는 신경망 분류 헤드의 학습 가능한 계층을 바꿔서, 사전 훈련된 신경망을 지정된 클래스 개수를 사용한 분류 작업에 적합하게 조정합니다.

    NumClasses 옵션을 지정하면 NumResponses[]이어야 하고 함수는 classNames 인수를 출력해서는 안 됩니다.

    데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    회귀 작업의 응답 변수 개수로, 양의 정수 또는 []로 지정됩니다.

    NumResponses가 정수이면 imagePretrainedNetwork 함수는 신경망의 분류 헤드를 회귀 작업 헤드로 바꿔서, 사전 훈련된 신경망을 지정된 응답 변수 개수를 사용한 회귀 작업에 적합하게 조정합니다.

    NumResponses 옵션을 지정하면 NumClasses[]이어야 하고 함수는 classNames 인수를 출력해서는 안 됩니다.

    데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    신경망 가중치로, 다음 값 중 하나로 지정됩니다.

    • "pretrained" — 사전 훈련된 가중치가 포함된 신경망을 반환합니다.

    • "none" — 초기화되지 않은 신경망 아키텍처만 반환합니다. 이 경우 대부분의 신경망은 지원 패키지를 다운로드할 필요가 없습니다.

    클래스 이름 유형으로, 다음 값 중 하나로 지정됩니다.

    • "string" — 클래스 이름을 string형 배열로 반환합니다.

    • "cell" — 클래스 이름을 문자형 벡터로 구성된 셀형 배열로 반환합니다. 코드 생성 시에는 이 옵션을 사용하십시오.

    출력 인수

    모두 축소

    신경망으로, dlnetwork 객체로 반환됩니다.

    클래스 이름으로, string형 배열 또는 문자형 벡터로 구성된 셀형 배열로 반환됩니다.

    이 함수는 NumClasses 값과 NumResponses 값이 모두 []이면 클래스 이름만 반환합니다. classNames의 데이터형은 ClassNamesTypes 인수에 따라 달라집니다.

    데이터형: string | cell

    • 2차원 및 3차원 ResNet 신경망 아키텍처를 만들고 사용자 지정하려면, 각각 resnetNetwork 함수와 resnet3dNetwork 함수를 사용하십시오.

    참고 문헌

    [1] ImageNet. http://www.image-net.org.

    [2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. “SqueezeNet: AlexNet-Level Accuracy with 50x Fewer Parameters and <0.5MB Model Size.” Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

    [3] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. “Going Deeper with Convolutions.” In 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 1–9. Boston, MA, USA: IEEE, 2015. https://doi.org/10.1109/CVPR.2015.7298594.

    [4] Places. http://places2.csail.mit.edu/

    [5] Szegedy, Christian, Vincent Vanhoucke, Sergey Ioffe, Jon Shlens, and Zbigniew Wojna. “Rethinking the Inception Architecture for Computer Vision.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2818–26. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.308.

    [6] Huang, Gao, Zhuang Liu, Laurens Van Der Maaten, and Kilian Q. Weinberger. “Densely Connected Convolutional Networks.” In 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2261–69. Honolulu, HI: IEEE, 2017. https://doi.org/10.1109/CVPR.2017.243.

    [7] Sandler, Mark, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, and Liang-Chieh Chen. “MobileNetV2: Inverted Residuals and Linear Bottlenecks.” In 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition, 4510–20. Salt Lake City, UT: IEEE, 2018. https://doi.org/10.1109/CVPR.2018.00474.

    [8] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. “Deep Residual Learning for Image Recognition.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 770–78. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.90.

    [9] Chollet, François. “Xception: Deep Learning with Depthwise Separable Convolutions.” Preprint, submitted in 2016. https://doi.org/10.48550/ARXIV.1610.02357.

    [10] Szegedy, Christian, Sergey Ioffe, Vincent Vanhoucke, and Alexander Alemi. “Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning.” Proceedings of the AAAI Conference on Artificial Intelligence 31, no. 1 (February 12, 2017). https://doi.org/10.1609/aaai.v31i1.11231.

    [11] Zhang, Xiangyu, Xinyu Zhou, Mengxiao Lin, and Jian Sun. “ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices.” Preprint, submitted July 4, 2017. http://arxiv.org/abs/1707.01083.

    [12] Zoph, Barret, Vijay Vasudevan, Jonathon Shlens, and Quoc V. Le. “Learning Transferable Architectures for Scalable Image Recognition.” Preprint, submitted in 2017. https://doi.org/10.48550/ARXIV.1707.07012.

    [13] Redmon, Joseph. “Darknet: Open Source Neural Networks in C.” https://pjreddie.com/darknet.

    [14] Tan, Mingxing, and Quoc V. Le. “EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks.” Preprint, submitted in 2019. https://doi.org/10.48550/ARXIV.1905.11946.

    [15] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Communications of the ACM 60, no. 6 (May 24, 2017): 84–90. https://doi.org/10.1145/3065386.

    [16] Simonyan, Karen, and Andrew Zisserman. “Very Deep Convolutional Networks for Large-Scale Image Recognition.” Preprint, submitted in 2014. https://doi.org/10.48550/ARXIV.1409.1556.

    확장 기능

    모두 확장

    버전 내역

    R2024a에 개발됨