주요 콘텐츠

deeplabv3plus

의미론적 영상 분할을 위한 DeepLab v3+ 컨벌루션 신경망 생성

R2024a 이후

설명

deepLabNetwork = deeplabv3plus(imageSize,numClasses,network)는 지정된 기본 신경망, 클래스 개수, 영상 크기를 갖는 DeepLab v3+ 계층을 반환합니다.

예제

deepLabNetwork = deeplabv3plus(___,DownsamplingFactor=value)는 다운샘플링 인자(출력 스트라이드)[1]8 또는 16으로 추가로 설정합니다. 다운샘플링 인자는 DeepLab v3+의 인코더 섹션에서 입력 영상이 다운샘플링되는 정도를 설정합니다.

예제

모두 축소

ResNet-18을 기반으로 하는 DeepLab v3+ 신경망을 만듭니다.

imageSize = [480 640 3];
numClasses = 5;
network = "resnet18";
net = deeplabv3plus(imageSize,numClasses,network, ...
             DownsamplingFactor=16);

신경망을 표시합니다.

analyzeNetwork(net)

영상 데이터저장소를 사용하여 삼각형 데이터 세트 영상을 불러옵니다. 이 데이터저장소에는 무작위 삼각형의 회색조 영상 200개가 들어 있습니다. 각 영상은 32×32입니다.

dataSetDir = fullfile(toolboxdir("vision"),"visiondata","triangleImages");
imageDir = fullfile(dataSetDir,"trainingImages");
imds = imageDatastore(imageDir);

픽셀 레이블 데이터저장소를 사용하여 삼각형 데이터 세트 픽셀 레이블을 불러옵니다.

labelDir = fullfile(dataSetDir, "trainingLabels");
classNames = ["triangle","background"];
labelIDs   = [255 0];
pxds = pixelLabelDatastore(labelDir,classNames,labelIDs);

DeepLab v3+ 신경망을 만듭니다.

imageSize = [256 256];
numClasses = numel(classNames);
net = deeplabv3plus(imageSize,numClasses,"resnet18");

훈련을 위해 영상과 픽셀 레이블 데이터를 결합하고 전처리 변환을 적용하여 훈련 영상의 크기를 조정합니다.

cds = combine(imds,pxds);
tds = transform(cds, @(data)preprocessTrainingData(data,imageSize));

훈련 옵션을 지정합니다. 메모리 사용량을 줄이기 위해 미니 배치 크기를 낮춥니다.

opts = trainingOptions("sgdm",...
    MiniBatchSize=8,...
    MaxEpochs=3);

신경망을 훈련시킵니다.

net = trainnet(tds,net,"crossentropy",opts);
    Iteration    Epoch    TimeElapsed    LearnRate    TrainingLoss
    _________    _____    ___________    _________    ____________
            1        1       00:00:04         0.01         0.93844
           50        2       00:04:09         0.01        0.033749
           75        3       00:05:35         0.01        0.026353
Training stopped: Max epochs completed

테스트 영상을 읽어 들입니다.

I = imread("triangleTest.jpg");

테스트 영상의 삼각형이 훈련 중인 삼각형의 크기와 대략적으로 같아지도록, 입력 영상 크기를 32로 나눈 값에 해당하는 인자로 테스트 영상의 크기를 조정합니다.

I = imresize(I,Scale=imageSize./32);

영상을 분할합니다.

C = semanticseg(I,net);

결과를 표시합니다.

B = labeloverlay(I,C);
figure
imshow(B)

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

지원 함수

function data = preprocessTrainingData(data, imageSize)
% Resize the training image and associated pixel label image.
data{1} = imresize(data{1},imageSize);
data{2} = imresize(data{2},imageSize);

% Convert grayscale input image into RGB for use with ResNet-18, which
% requires RGB image input.
data{1} = repmat(data{1},1,1,3);
end

입력 인수

모두 축소

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

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

  • [height, width, 3] 형식의 요소를 3개 가진 벡터 세 번째 요소 3은 RGB에 해당합니다.

분류할 신경망의 클래스 개수로, 1보다 큰 정수로 지정됩니다.

기본 신경망으로, resnet18 (Deep Learning Toolbox), resnet50 (Deep Learning Toolbox), mobilenetv2 (Deep Learning Toolbox), xception (Deep Learning Toolbox) 또는 inceptionresnetv2 (Deep Learning Toolbox)로 지정됩니다. 해당 신경망 애드온을 설치해야 합니다.

출력 인수

모두 축소

DeepLab v3+ 신경망으로, 의미론적 영상 분할을 위한 dlnetwork (Deep Learning Toolbox) 객체로 반환됩니다. 영상 분할을 위해 신경망에는 인코더-디코더 아키텍처, 팽창된 컨벌루션 및 건너뛰기 연결이 사용됩니다. 의미론적 분할에 신경망을 사용하려면 먼저 trainnet (Deep Learning Toolbox) 함수(Deep Learning Toolbox™가 필요함)를 사용하여 신경망을 훈련시켜야 합니다.

알고리즘

  • xception (Deep Learning Toolbox) 또는 mobilenetv2 (Deep Learning Toolbox) 기본 신경망을 사용하여 DeepLab v3+ 신경망을 만드는 경우, 아트루스(atrous, 즉 팽창된) 공간 피라미드 풀링(ASPP) 하위 신경망과 디코더 하위 신경망 내에서 심도별로 분리 가능한 컨벌루션이 사용됩니다. 그 외 모든 기본 신경망에는 컨벌루션 계층이 사용됩니다.

  • 이 DeepLab v3+ 구현의 ASPP에는 전역 평균값 풀링 계층이 포함되지 않습니다.

참고 문헌

[1] Chen, L., Y. Zhu, G. Papandreou, F. Schroff, and H. Adam. "Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation." Computer Vision — ECCV 2018, 833-851. Munic, Germany: ECCV, 2018.

확장 기능

모두 확장

버전 내역

R2024a에 개발됨

참고 항목

객체

함수