주요 콘텐츠

unet

의미론적 분할을 위한 U-Net 컨벌루션 신경망 만들기

R2024a 이후

설명

unetNetwork = unet(imageSize,numClasses)는 U-Net 신경망을 반환합니다.

unet을 사용하여 U-Net 신경망 아키텍처를 만듭니다. Deep Learning Toolbox™ 함수 trainnet (Deep Learning Toolbox)을 사용하여 신경망을 훈련시켜야 합니다.

예제

[unetNetwork,outputSize] = unet(imageSize,numClasses)는 U-Net 신경망의 출력 크기도 반환합니다.

___ = unet(imageSize,numClasses,Name=Value)는 하나 이상의 이름-값 인수를 사용하여 옵션을 지정합니다. 예를 들어, unet(imageSize,numClasses,NumFirstEncoderFilters=64)는 첫 번째 인코더 단계의 출력 채널 개수를 64로 지정합니다.

예제

모두 축소

인코더-디코더 깊이가 3인 U-Net 신경망을 만듭니다.

imageSize = [480 640 3];
numClasses = 5;
encoderDepth = 3;
unetNetwork = unet(imageSize,numClasses,EncoderDepth=encoderDepth)
unetNetwork = 
  dlnetwork with properties:

         Layers: [48×1 nnet.cnn.layer.Layer]
    Connections: [53×2 table]
     Learnables: [36×3 table]
          State: [0×3 table]
     InputNames: {'encoderImageInputLayer'}
    OutputNames: {'FinalNetworkSoftmax-Layer'}
    Initialized: 1

  View summary with summary.

신경망을 표시합니다.

plot(unetNetwork)

Figure contains an axes object. The axes object contains an object of type graphplot.

훈련 영상과 픽셀 레이블을 작업 공간으로 불러옵니다.

dataSetDir = fullfile(toolboxdir("vision"),"visiondata","triangleImages");
imageDir = fullfile(dataSetDir,"trainingImages");
labelDir = fullfile(dataSetDir,"trainingLabels");

훈련 영상을 저장할 imageDatastore 객체를 만듭니다.

imds = imageDatastore(imageDir);

클래스 이름 및 연결된 레이블 ID를 정의합니다.

classNames = ["triangle","background"];
labelIDs   = [255 0];

훈련 영상의 ground truth 픽셀 레이블을 저장할 pixelLabelDatastore 객체를 만듭니다.

pxds = pixelLabelDatastore(labelDir,classNames,labelIDs);

U-Net 신경망을 만듭니다.

imageSize = [32 32];
numClasses = 2;
unetNetwork = unet(imageSize, numClasses)
unetNetwork = 
  dlnetwork with properties:

         Layers: [61×1 nnet.cnn.layer.Layer]
    Connections: [68×2 table]
     Learnables: [46×3 table]
          State: [0×3 table]
     InputNames: {'encoderImageInputLayer'}
    OutputNames: {'FinalNetworkSoftmax-Layer'}
    Initialized: 1

  View summary with summary.

신경망 훈련을 위한 데이터저장소를 만듭니다.

ds = combine(imds,pxds);

훈련 옵션을 설정합니다.

options = trainingOptions("sgdm", ...
    InitialLearnRate=1e-3, ...
    MaxEpochs=20, ...
    VerboseFrequency=10);

신경망을 훈련시킵니다.

net = trainnet(ds,unetNetwork,"crossentropy",options)
    Iteration    Epoch    TimeElapsed    LearnRate    TrainingLoss
    _________    _____    ___________    _________    ____________
            1        1       00:00:05        0.001          3.2975
           10       10       00:00:48        0.001          0.6778
           20       20       00:01:36        0.001         0.27066
Training stopped: Max epochs completed
net = 
  dlnetwork with properties:

         Layers: [61×1 nnet.cnn.layer.Layer]
    Connections: [68×2 table]
     Learnables: [46×3 table]
          State: [0×3 table]
     InputNames: {'encoderImageInputLayer'}
    OutputNames: {'FinalNetworkSoftmax-Layer'}
    Initialized: 1

  View summary with summary.

입력 인수

모두 축소

신경망 입력 영상 크기로, 다음으로 지정됩니다.

  • [height, width] 형식의 요소를 2개 가진 벡터.

  • [height, width, depth] 형식의 요소를 3개 가진 벡터. depth는 영상 채널의 개수입니다. RGB 영상의 경우 depth3으로, 회색조 영상의 경우 1로, 다중분광 영상과 초분광 영상의 경우 채널 개수로 설정합니다.

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

의미론적 분할의 클래스 개수로, 1보다 큰 정수로 지정됩니다.

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

이름-값 인수

모두 축소

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

예: EncoderDepth=3은 인코더 깊이를 3으로 지정합니다.

unet이 인코더로 사용하는 인코더 신경망으로, dlnetwork (Deep Learning Toolbox) 객체로 지정됩니다. 사전 훈련된 인코더 신경망이나 사용자 지정 인코더 신경망을 지정할 수 있습니다. 사전 훈련된 인코더 신경망을 사용하려면 pretrainedEncoderNetwork 함수를 사용하여 신경망을 생성하십시오.

참고

EncoderNetwork를 지정하면 unet 함수는 신경망을 구성하는 데 다음 이름-값 인수를 사용하지 않습니다.

인코더 깊이로, 양의 정수로 지정됩니다. U-Net은 인코더 하위 신경망과 대응하는 디코더 하위 신경망으로 구성됩니다. 이러한 신경망의 깊이는 처리 중에 입력 영상이 다운샘플링되거나 업샘플링되는 횟수를 결정합니다. 인코더 신경망은 입력 영상을 2D의 인수로 다운샘플링합니다. 여기서 DEncoderDepth의 값입니다. 디코더 신경망은 인코더 신경망 출력을 2D의 인수로 업샘플링합니다.

참고

EncoderNetwork도 지정하는 경우 EncoderNetwork 입력의 깊이를 사용하여 EncoderDepth 값을 지정하십시오.

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

첫 번째 인코더 단계의 출력 채널 개수로, 양의 정수 또는 양의 정수로 구성된 벡터로 지정됩니다. 이후의 각 인코더 단계에서는 출력 채널 개수가 두 배가 됩니다. unet 함수는 각 디코더 단계의 출력 채널 개수를 대응하는 인코더 단계의 개수와 일치하도록 설정합니다.

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

컨벌루션 계층 필터 크기로, 양의 홀수 정수 또는 양의 홀수 정수로 구성된 요소를 2개 가진 행 벡터로 지정됩니다. 일반적인 값의 범위는 [3, 7]입니다.

FilterSize설명
스칼라필터가 정사각형입니다.
요소를 2개 가진 행 벡터

필터 크기는 [height width]입니다.

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

채우기 유형으로, "same" 또는 "valid"로 지정됩니다. 채우기 유형은 인코더와 디코더의 하위 신경망에서 convolution2dLayer (Deep Learning Toolbox)의 채우기 스타일을 지정합니다. 출력 특징 맵의 공간 크기는 채우기 유형에 따라 달라집니다. 채우기 유형을 다음과 같이 지정할 수 있습니다.

  • "same" — 출력 특징 맵과 입력 특징 맵의 크기가 같아지도록 컨벌루션 계층의 입력값에 0 채우기가 적용됩니다.

  • "valid" — 컨벌루션 계층의 입력값에 0 채우기가 적용되지 않습니다. 컨벌루션 계층은 0 채우기 없이 계산된 컨벌루션 값만 반환합니다. 출력 특징 맵은 입력 특징 맵보다 작습니다.

참고

최댓값 풀링 계층에 대한 입력값의 heightwidth가 짝수가 되도록 하려면 신경망 입력 영상 크기를 다음 기준 중 하나를 충족하도록 선택하십시오.

  • ConvolutionPadding"same"으로 지정하는 경우 입력 영상의 heightwidth는 2D의 배수여야 합니다.

  • ConvolutionPadding"valid"로 지정하면 입력 영상의 heightwidth12D(heighti=1D2i(fh1))12D(widthi=1D2i(fw1))이 2D의 배수가 되도록 선택해야 합니다.

    여기서 fhfw는 각각 2차원 컨벌루션 커널의 높이와 너비입니다. D는 인코더 깊이입니다.

데이터형: char | string

출력 인수

모두 축소

U-Net 신경망 아키텍처를 나타내는 계층으로, dlnetwork (Deep Learning Toolbox) 객체로 반환됩니다.

신경망 출력 영상 크기로, [height, width, channels] 형식의 요소를 3개 가진 벡터로 반환됩니다. channels는 출력 채널 개수이며 입력에 지정된 클래스 개수와 같습니다. 신경망 출력 영상의 heightwidth는 채우기 컨벌루션 유형에 따라 달라집니다.

  • ConvolutionPadding"same"으로 지정하면 신경망 출력 영상의 heightwidth가 신경망 입력 영상의 높이 및 너비와 같아집니다.

  • ConvolutionPadding"valid"로 지정하면 신경망 출력 영상의 heightwidth가 신경망 입력 영상의 높이 및 너비보다 작아집니다.

데이터형: double

세부 정보

모두 축소

  • 컨벌루션 계층에서 'same' 채우기를 사용하면 입력에서 출력까지 동일한 데이터 크기를 유지하고 다양한 입력 영상 크기를 사용할 수 있습니다.

  • 패치 기반 접근 방식을 사용하면 큰 영상을 원활하게 분할할 수 있습니다. randomPatchExtractionDatastore 함수를 사용하여 영상 패치를 추출할 수 있습니다.

  • 'valid' 채우기를 사용하면 패치 기반 접근 방식을 사용하여 분할하는 동안 경계 아티팩트를 방지할 수 있습니다.

  • trainnet (Deep Learning Toolbox)으로 훈련한 후 unet 함수를 사용하여 생성된 신경망을 GPU 코드 생성에 사용할 수 있습니다. 자세한 내용과 예제는 코드 생성 및 심층 신경망 배포하기 (Deep Learning Toolbox) 항목을 참조하십시오.

참고 문헌

[1] Ronneberger, O., P. Fischer, and T. Brox. "U-Net: Convolutional Networks for Biomedical Image Segmentation." Medical Image Computing and Computer-Assisted Intervention (MICCAI). Vol. 9351, 2015, pp. 234–241.

[2] He, K., X. Zhang, S. Ren, and J. Sun. "Delving Deep Into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." Proceedings of the IEEE International Conference on Computer Vision. 2015, 1026–1034.

확장 기능

모두 확장

버전 내역

R2024a에 개발됨