Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

딥러닝을 사용한 의미론적 분할

이예제딥러닝사용하여의미론분할을시키는방법을보여줍니다줍니다。

의미론적 분할 신경망은 영상의 모든 픽셀을 분류하여 클래스별로 분할된 영상을 산출합니다. 의미론적 분할의 응용 분야에는 자율 주행을 위한 도로 분할, 의료 진단을 위한 암 세포 분할 등이 있습니다. 자세한 내용은Getting Started with Semantic Segmentation Using Deep Learning(计算机视觉工具箱)항목을 참조하십시오.

훈련 과정을 보여주기 위해 이 예제에서는 의미론적 영상 분할을 위해 설계된 CNN(컨벌루션 신경망)의 일종인 Deeplab v3+ [1]를 훈련시킵니다. 의미론적 분할을 위한 신경망에는 그 밖에도 FCN(완전 컨벌루션 신경망), SegNet 및 U-Net이 있습니다. 여기에서 설명하는 훈련 과정은 이러한 신경망에도 적용할 수 있습니다.

이 예제에서는 훈련을 위해 University of Cambridge의CamVid 데이터셋[2]를 사용합니다. 이 데이터셋은 주행하면서 얻은 거리 수준 뷰가 들어있는 영상 모음입니다. 이 데이터셋은 자동차, 보행자, 도로를 비롯한 32개의 의미론적 클래스에 대해 픽셀 수준의 레이블을 제공합니다.

설치

Resnet-18신경망신경망신경망초기화화된된가중치가중치를를사용사용사용하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여하여resnet-18은리소스한정적응용에적합효율적인입니다입니다。Mobilenet V2나나사항사항요구요구요구사항나나나과과사전훈련된신경망도할할있습니다있습니다있습니다자세한내용은사전훈련된신경망항목을 참조하십시오.

사전 훈련된 Resnet-18을 받으려면RESNET18를 설치하십시오. 설치가 완료되면 다음 코드를 실행하여 올바르게 설치되었는지 확인합니다.

RESNET18();

또한deeplab v3+의의훈련버전합니다합니다합니다。사전훈련사용하면훈련이될까지기다리지않고예제를실행할수있습니다있습니다。

pretrainedURL ='//www.tatmou.com/supportfiles/vision/data/deeplabv3plusResnet18CamVid.mat'; pretrainedFolder = fullfile(tempdir,'pretrainedNetwork');预处理network = fullfile(预先填充者,'deeplabv3plusResnet18CamVid.mat');if~exist(pretrainedNetwork,'file')Mkdir(预备菲尔德);disp('Downloading pretrained network (58 MB)...');Websave(预处理,预处理);结尾

이 예제를 실행할 때는 CUDA 지원 NVIDIA™ GPU를 사용하는 것이 권장됩니다. GPU를 사용하려면 Parallel Computing Toolbox™가 필요합니다. 지원되는 Compute Capability에 대한 자세한 내용은릴리스별 GPU 지원(Parallel Computing Toolbox)항목을 참조하십시오.

CamVid 데이터셋 다운로드하기

다음 URL에서 CamVid 데이터셋을 다운로드합니다.

ImageUrl ='http://web4.cs.ucl.ac.uk/staff/g.brostow/motionsegrecdata/files/701_stillsraw_full.zip'; labelURL ='http://web4.cs.ucl.ac.uk/staff/g.brostow/motionsegrecdata/data/labeledappraved_full.zip'; outputFolder = fullfile(tempdir,'CamVid');labelsZip = fullfile(outputFolder,'labels.zip');imagesZip = fullfile(outputFolder,'images.zip');if~exist(labelsZip,'file')||〜存在(imageszip,'file')mkdir(outputFolder) disp('Downloading 16 MB CamVid dataset labels...');websave(labelsZip, labelURL); unzip(labelsZip, fullfile(outputFolder,'labels'));disp(“下载557 MB CAMVID数据集图像...”);websave(imagesZip, imageURL); unzip(imagesZip, fullfile(outputFolder,'images'));结尾

참고: 데이터 다운로드에 걸리는 시간은 인터넷 연결에 따라 달라집니다. 위에서 사용한 명령은 다운로드가 완료될 때까지 MATLAB을 차단합니다. 또는 웹 브라우저를 사용하여 먼저 로컬 디스크에 데이터셋을 다운로드할 수도 있습니다. 웹에서 다운로드한 파일을 사용하려면 위에서outputFolder변수를 다운로드한 파일의 위치로 변경하십시오.

CamVid 영상 불러오기

imageDatastore를 사용하여 CamVid 영상을 불러옵니다.imageDatastore를사용의모음을에효율으로불러올있습니다있습니다있습니다。

imgDir = fullfile(outputFolder,'images',,,,'701_StillsRaw_full');imds = imageDatastore(imgDir);

영상하나표시합니다。

i =读数(IMDS,559);i = histeq(i);imshow(i)

픽셀에이지정된된된영상영상영상

pixelLabelDatastore(计算机视觉工具箱)를 사용하여 픽셀에 레이블이 지정된 CamVid 영상 데이터를 불러옵니다.pixelLabelDatastore는 픽셀 레이블 데이터와 레이블 ID를 클래스 이름 매핑으로 캡슐화합니다.

훈련을 보다 쉽게 하기 위해 CamVid에 포함된 32개의 원본 클래스를 11개의 클래스로 그룹화합니다. 이러한 클래스를 지정합니다.

classes = [“天空”“建造”"Pole"“路”“路面”"Tree""SignSymbol""Fence""Car""Pedestrian""Bicyclist"这是给予的;

32개의 클래스를 11개로 줄이기 위해 원본 데이터셋의 여러 클래스가 하나로 그룹화됩니다. 예를 들어, "Car", "SUVPickupTruck", "Truck_Bus", "Train", "OtherMoving"이 모두 "Car"로 그룹화됩니다. 그룹화된 레이블 ID를 지원 함수camvidPixelLabelIDs(이 예제의 마지막에 나열되어 있음)를 사용하여 반환합니다.

labelids = camvidPixellabelIds();

클래스클래스레이블레이블를사용하여하여Pixellabeldatastore。를만듭니다。

labelDir = fullfile(outputFolder,'labels');pxds = pixelLabelDatastore(labelDir,classes,labelIDs);

픽셀에 레이블이 지정된 영상 중 하나를 읽어 들이고 영상 위에 중첩하여 표시합니다.

C= readimage(pxds,559); cmap = camvidColorMap; B = labeloverlay(I,C,'ColorMap',,,,cmap); imshow(B) pixelLabelColorbar(cmap,classes);

색 중첩이 없는 영역은 픽셀 레이블을 갖지 않으며 훈련 중에 사용되지 않습니다.

데이터셋 통계량 분석하기

CamVid 데이터셋의 클래스 레이블의 분포를 보려면countEachLabel(计算机视觉工具箱)을 사용하십시오. 이 함수는 클래스 레이블을 기준으로 픽셀 개수를 셉니다.

tbl = countEachLabel(pxds)
tbl =11×3 table名字PixelCount ImagePixelCount  ______________ __________ _______________ {'Sky' } 7.6801e+07 4.8315e+08 {'Building' } 1.1737e+08 4.8315e+08 {'Pole' } 4.7987e+06 4.8315e+08 {'Road' } 1.4054e+08 4.8453e+08 {'Pavement' } 3.3614e+07 4.7209e+08 {'Tree' } 5.4259e+07 4.479e+08 {'SignSymbol'} 5.2242e+06 4.6863e+08 {'Fence' } 6.9211e+06 2.516e+08 {'Car' } 2.4437e+07 4.8315e+08 {'Pedestrian'} 3.4029e+06 4.4444e+08 {'Bicyclist' } 2.5912e+06 2.6196e+08

클래스별 픽셀 개수를 시각화합니다.

frequency = tbl.PixelCount/sum(tbl.PixelCount); bar(1:numel(classes),frequency) xticks(1:numel(classes)) xticklabels(tbl.Name) xtickangle(45) ylabel('Frequency'

이상적인 경우라면 모든 클래스가 동일한 개수의 관측값을 갖습니다. 그러나 CamVid에 포함된 클래스 간에 균형이 맞지 않습니다. 이것은 거리 장면으로 구성된 자동차 데이터 세트에서 일반적으로 나타나는 문제입니다. 이러한 장면에서는 하늘과 건물, 도로가 영상에서 더 많은 영역을 차지하기 때문에 보행자, 자전거 운전자의 픽셀보다 하늘, 건물, 도로의 픽셀이 더 많습니다. 이러한 불균형을 올바르게 처리하지 않으면 비중이 더 큰 클래스로 인해 학습에 편향이 발생하여 학습을 저해할 수 있습니다. 이 예제의 뒷부분에서 클래스 가중치를 사용하여 이 문제를 처리합니다.

camvid데이터데이터의영상크기크기는는는는는는는는는는는는는12GB메모리메모리탑재탑재된된된된tit titan X x에서에서크기의영상배치가메모리에담길담길있도록선택되었습니다되었습니다되었습니다되었습니다되었습니다。gpu에메모리없으면영상더크기조정하거나일괄처리작업을줄여야줄여야할수있습니다。

훈련 세트, 검증 세트와 테스트 세트 준비하기

Deeplab v3+는 데이터셋의 영상 중 60%를 사용하여 훈련되었습니다. 나머지 영상은 검증용과 테스트용으로 각각 20%와 20%로 균일하게 분할되었습니다. 다음 코드는 영상과 픽셀 레이블 데이터를 훈련 세트, 검증 세트 및 테스트 세트로 임의 분할합니다.

[imdsTrain, imdsVal, imdsTest, pxdsTrain, pxdsVal, pxdsTest] = partitionCamVidData(imds,pxds);

60/20/20 분할을 통해 다음과 같은 개수의 훈련 영상, 검증 영상 및 테스트 영상을 얻게 됩니다.

numTrainingImages = numel(imdsTrain.Files)
numTrainingImages = 421
numValImages = numel(imdsVal.Files)
numValImages = 140
numTestingImages = numel(imdsTest.Files)
numTestingImages = 140

신경망만들기

deeplabv3pluslayers함수를 사용하여 ResNet-18을 기반으로 하는 DeepLab v3+ 신경망을 만듭니다. 응용 사례에 가장 적합한 신경망을 선택하려면 경험적 분석이 필요하며 이것은 또 다른 수준의 하이퍼파라미터 조정이 됩니다. 예를 들어, ResNet-50이나 MobileNet v2와 같은 다른 기본 신경망으로 실험해 보거나 SegNet, FCN(완전 컨벌루션 신경망) 또는 U-Net과 같은 다른 의미론적 분할 신경망 아키텍처를 사용해 볼 수 있습니다.

%指定网络图像大小。这通常与Traing图像大小相同。图像= [720 960 3];%指定类的数量。numClasses = numel(class);%Create DeepLab v3+.lgraph = deeplabv3plusLayers(imageSize, numClasses,"resnet18");

클래스가중치사용하여간의균형맞추기

앞에서 보았듯이 CamVid는 클래스 간에 균형이 맞지 않습니다. 훈련의 향상을 위해 클래스 가중치를 사용하여 클래스 간의 균형을 맞출 수 있습니다. 앞부분에서countEachLabel(计算机视觉工具箱)로계산레이블를사용하여값클래스가중치계산합니다합니다합니다。

imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount; classWeights = median(imageFreq) ./ imageFreq
classWeights =11×10.3182 0.2082 5.0924 0.1744 0.7103 0.4175 4.5371 1.8386 1.0000 6.6059 ⋮

PixelClassificationLayer(计算机视觉工具箱)를 사용하여 클래스 가중치를 지정합니다.

pxLayer = pixelClassificationLayer('姓名',,,,'labels',,,,'Classes',,,,tbl.Name,'classWights',,,,classWeights); lgraph = replaceLayer(lgraph,"classification",pxlayer);

훈련 옵션 선택하기

훈련에 사용되는 최적화 알고리즘은 SGDM(모멘텀을 사용한 확률적 경사하강법)입니다.trainingOptions를 사용하여 SGDM에 사용할 하이퍼파라미터를 지정합니다.

%Define validation data.dsval = combine(iMDSVAL,pxDSVAL);%定义培训选项。options = trainingOptions('sgdm',,,,。。。'LearnRateSchedule',,,,'piecewise',,,,。。。'LearnRateDropPeriod',,,,10,。。。'LearnRateDropFactor',,,,0.3,。。。'Momentum',,,,0.9,。。。'InitialLearnRate',,,,1e-3,。。。'L2Regularization',,,,0.005,。。。'ValidationData',,,,dsVal,。。。'MaxEpochs',,,,30,。。。'MiniBatchSize',8,。。。'Shuffle',,,,'every-epoch',,,,。。。'CheckpointPath',,,,tempdir,。。。'VerboseFrequency',,,,2,。。。“绘图”,,,,'training-progress',,,,。。。'ValidationPatience',4);

학습률은 조각별 스케줄을 사용합니다. Epoch 10회마다 학습률이 0.3배만큼 줄어듭니다. 이렇게 하면 신경망이 더 높은 초기 학습률로 빠르게 학습할 수 있으면서도 학습률이 떨어지기 시작하면 국소 최적해에 가까운 해를 구할 수 있습니다.

'ValidationData'파라미터를 설정함으로써 신경망이 매 Epoch마다 검증 데이터에 테스트됩니다.'ValidationPatience'는 검증 정확도가 수렴하면 훈련이 조기에 중지되도록 4로 설정되었습니다. 이렇게 하면 신경망이 훈련 데이터셋에 대해 과적합되는 것이 방지됩니다.

훈련 중에 사용되는 메모리를 줄이기 위해 미니 배치의 크기는 8을 사용합니다. 시스템의 GPU 메모리 양에 따라 이 값을 늘리거나 줄일 수 있습니다.

또한'CheckpointPath'가 임시 위치로 설정됩니다. 이 이름-값 쌍을 사용하면 매 훈련 Epoch가 끝날 때마다 신경망 검사 지점을 저장할 수 있습니다. 시스템 장애나 정전으로 인해 훈련이 중단된 경우, 저장된 검사 지점에서 훈련을 재개할 수 있습니다.'CheckpointPath'로 지정하는 위치에 신경망 검사 지점을 저장할 수 있을 만큼 충분한 공간이 있는지 확인하십시오. 예를 들어, 각 Deeplab v3+ 검사 지점은 61MB이므로 검사 지점을 100개 저장하려면 약 6GB의 디스크 공간이 필요합니다.

데이터 증대

데이터증대중원본를무작위변환으로써신경망정확도를개선하는데됩니다됩니다됩니다。데이터증대하면이지정훈련샘플개수를않고도않고도훈련데이터에다양성다양성을더더할할수수。영상과레이블에동일한무작위을적용하려면데이터저장소combinetransform을 사용하십시오. 먼저,ImdsrainpxdsTrain을결합합니다。

dsTrain = combine(imdsTrain, pxdsTrain);

다음,데이터저데이터저transform을사용하여함수augmentImageAndLabel에정의하는데이터를합니다합니다합니다。여기서와와와와 ++/- 10의x/y무작위무작위평행을사용합니다합니다합니다합니다。

xTrans = [-10 10]; yTrans = [-10 10]; dsTrain = transform(dsTrain, @(data)augmentImageAndLabel(data,xTrans,yTrans));

테스트 데이터와 검증 데이터에는 데이터 증대가 적용되지 않는다는 것에 유의하십시오. 이상적인 경우라면 테스트 데이터와 검증 데이터가 원본 데이터를 대표해야 하므로 편향되지 않은 평가를 위해 수정되지 않은 상태로 남겨 두는 것이 좋습니다.

훈련 시작하기

dotraining플래그가true이면trainNetwork를 사용하여 훈련을 시작합니다. 그렇지 않으면 사전 훈련된 신경망을 불러오십시오.

참고:이훈련은12 gb의GPU메모리가탑재된NVIDIA™泰坦X에서검증되었습니다. GPU 메모리가 이보다 적으면 훈련 중에 메모리 부족이 발생할 수 있습니다. 메모리 부족이 발생하면trainingOptions에서'MiniBatchSize'를 1로 설정해 보거나 신경망 입력값을 줄이고 훈련 데이터의 크기를 조정해 보십시오. 이 신경망을 훈련시키는 데는 약 5시간이 걸립니다. GPU 하드웨어에 따라 시간이 더 걸릴 수 있습니다.

dotraining= false;ifdotraining[net, info] = trainNetwork(dsTrain,lgraph,options);elsedata = load(预处理);net = data.net;结尾

한개으로신경망테스트하기

간단히 확인하기 위해 훈련된 신경망을 한 개의 테스트 영상에 대해 실행합니다.

I = readimage(imdsTest,35); C = semanticseg(I, net);

결과를 표시합니다.

B = labeloverlay(I,C,'Colormap',cmap,'Transparency',,,,0.4); imshow(B) pixelLabelColorbar(cmap, classes);

C의결과를pxdsTest에저장예상과합니다합니다。녹색영역영역분할결과예상과다른을가리킵니다가리킵니다가리킵니다。

expectedResult = readimage(pxdsTest,35); actual = uint8(C); expected = uint8(expectedResult); imshowpair(actual, expected)

의미론적결과도로,하늘,건물건물대해중첩것을볼있습니다있습니다。그러나,자동차와상대으로가사물그만큼정확않습니다않습니다않습니다。jaccard jaccard지수지수지수지수도부르는부르는부르는부르는부르는부르는부르는부르는부르는부르는부르는부르는부르는부르는부르는부르는jaccard(Image Processing Toolbox)함수를하여를를합니다합니다。

iou = jaccard(C,expectedResult); table(classes,iou)
ans=11×2桌classes iou ____________ _______ "Sky" 0.91837 "Building" 0.84479 "Pole" 0.31203 "Road" 0.93698 "Pavement" 0.82838 "Tree" 0.89636 "SignSymbol" 0.57644 "Fence" 0.71046 "Car" 0.66688 "Pedestrian" 0.48417 "Bicyclist" 0.68431

iou메트릭을적결과확인있습니다있습니다있습니다。도로,하늘,건물클래스는점수가보행자,자동차자동차는는낮습니다낮습니다낮습니다그밖에사용되는분에는에는dice(Image Processing Toolbox)BFSCORE(Image Processing Toolbox)윤곽선 일치 점수가 있습니다.

훈련된 신경망 평가하기

여러테스트영상에대한정확도를측정하려면전체테스트세트에대해semanticseg(计算机视觉工具箱)를 실행하십시오. 영상 분할 시 사용되는 메모리를 줄이기 위해 미니 배치의 크기는 4를 사용합니다. 시스템의 GPU 메모리 양에 따라 이 값을 늘리거나 줄일 수 있습니다.

pxdsresults = semanticseg(imdstest,net,。。。'MiniBatchSize',,,,4,。。。“写入”,,,,tempdir,。。。'Verbose',,,,false);

semanticseg는테스트에대한결과를pixelLabelDatastore객체로합니다。imdsTest의 각 테스트 영상에 대한 실제 픽셀 레이블 데이터는“写入”파라미터로위치있는디스크쓰입니다입니다。评估电子细分(计算机视觉工具箱)을 사용하여 테스트 세트 결과에 대한 의미론적 분할 메트릭을 측정합니다.

metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTest,'Verbose',,,,false);

评估电子细分은 전체 데이터셋, 개별 클래스 및 각 테스트 영상에 대한 다양한 메트릭을 반환합니다. 데이터셋 수준 메트릭을 보려면metrics.DataSetMetrics를조사하십시오。

metrics.DataSetMetrics
ans=1×5 tableGlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore ______________ ____________ _______ ___________ ___________ 0.87695 0.85392 0.6302 0.80851 0.65051

데이터셋 메트릭은 신경망 성능에 대한 개요를 제공합니다. 각 클래스가 전체 성능에 미치는 영향을 보려면metrics.ClassMetrics를 사용하여 클래스별 메트릭을 조사하십시오.

metrics.ClassMetrics
ans=11×3 tableAccuracy IoU MeanBFScore ________ _______ ___________ Sky 0.93112 0.90209 0.8952 Building 0.78453 0.76098 0.58511 Pole 0.71586 0.21477 0.51439 Road 0.93024 0.91465 0.76696 Pavement 0.88466 0.70571 0.70919 Tree 0.87377 0.76323 0.70875 SignSymbol 0.79358 0.39309 0.48302 Fence 0.81507 0.46484 0.48566 Car 0.90956 0.76799 0.69233 Pedestrian 0.87629 0.4366 0.60792 Bicyclist 0.87844 0.60829 0.55089

전반적성능은우수하지만,클래스클래스보면보면보면行人,,,,骑自行车的人,,,,Car처럼부족표시되었던클래스는Road,,,,Sky,,,,建造같은클래스분할않았음을수있습니다있습니다。부족하게클래스샘플더많이한를추가하면결과가개선될있습니다있습니다있습니다。

지원 함수

functionlabelids = camvidpixellabelids()%Return the label IDs corresponding to each class.%The CamVid dataset has 32 classes. Group them into 11 classes following%the original SegNet training methodology [1].%The 11 classes are:%“天空”“建造”,,,,"Pole", "Road", "Pavement", "Tree", "SignSymbol",%“围栏”,“汽车”,“行人”和“骑自行车的人”。%Camvid像素标签ID作为RGB颜色值提供。将它们分组为%11 classes and return them as a cell array of M-by-3 matrices. The%original CamVid class names are listed alongside each RGB value. Note%that the Other/Void class are excluded below.labelIDs = {。。。%“天空”[128 128 128;。。。%“天空”这是给予的%“建造”[ 000 128 064;。。。%"Bridge"128 000 000;。。。%“建造”064 192 000;。。。%"Wall"064 000 064;。。。%"Tunnel"192 000 128;。。。%“拱门”这是给予的%"Pole"[ 192 192 128;。。。%"Column_Pole"000 000 064;。。。%"TrafficCone"这是给予的%Road[ 128 064 128;。。。%“路”128 000 192;。。。%"LaneMkgsDriv"192 000 064;。。。%"LaneMkgsNonDriv"这是给予的%“路面”[000 000 192;。。。%“人行道”064 192 128;。。。%"ParkingBlock"128 128 192;。。。%“ Roadshoulder”这是给予的%"Tree"[ 128 128 000;。。。%"Tree"192 192 000;。。。%"VegetationMisc"这是给予的%"SignSymbol"[192 128 128;。。。%"SignSymbol"128 128 064;。。。%“ misc_text”000 064 064;。。。%"TrafficLight"这是给予的%"Fence"[ 064 064 128;。。。%"Fence"这是给予的%"Car"[ 064 000 128;。。。%"Car"064 128 192;。。。%“ suvpickuptruck”192 128 192;。。。%"Truck_Bus"192 064 128;。。。%"Train"128 064 064;。。。%"OtherMoving"这是给予的%"Pedestrian"[ 064 064 000;。。。%"Pedestrian"192 128 064;。。。% “孩子”064 000 192;。。。%"CartLuggagePram"064 128 064;。。。%"Animal"这是给予的%“骑自行车的人”[ 000 128 192;。。。%“骑自行车的人”192 000 192;。。。%"MotorcycleScooter"这是给予的};结尾
functionpixelLabelColorbar(cmap, classNames)%Add a colorbar to the current axis. The colorbar is formatted%to display the class names with the color.colormap(gca,cmap)%Add colorbar to current figure.c = colorbar('peer',,,,gca);%Use class names for tick marks.c.TickLabels = classNames; numClasses = size(cmap,1);%Center tick labels.c.Ticks = 1/(numClasses*2):1/numClasses:1;%Remove tick mark.c.TickLength = 0;结尾
functioncmap = camvidColorMap()%定义CAMVID数据集使用的colormap。cmap = [ 128 128 128百分比的天空128 0 0%建造192 192 192%Pole128 64 128%Road60 40 222人行道%128 128 0%Tree192 128 128%符号符号64 64 128%Fence64 0 128%Car64 64 0%行人0 128 192%骑自行车的人这是给予的;%Normalize between [0 1].cmap = cmap ./ 255;结尾
function[imdsTrain, imdsVal, imdsTest, pxdsTrain, pxdsVal, pxdsTest] = partitionCamVidData(imds,pxds)%Partition CamVid data by randomly selecting 60% of the data for training. The%rest is used for testing.%Set initial random state for example reproducibility.rng(0); numFiles = numel(imds.Files); shuffledIndices = randperm(numFiles);%使用60%的图像进行培训。numTrain= round(0.60 * numFiles); trainingIdx = shuffledIndices(1:numTrain);%使用20%的图像进行验证numVal = round(0.20 * numFiles); valIdx = shuffledIndices(numTrain+1:numTrain+numVal);%Use the rest for testing.testIdx = shuffledIndices(numTrain+numVal+1:end);%创建图像数据存储用于培训和测试。trieberimages = imds.files(triendingiDx);valimages = imds.files(vallx);sistimages = imds.files(testIdx);imdsrain = imagedatastore(训练图);imdsval = imagedatastore(阀门);imdstest = imagedatastore(estistimages);%Extract class and label IDs info.class = pxds.classnames;labelids = camvidPixellabelIds();%创建用于培训和测试的像素标签数据存储。训练标签= pxds.files(trieberIdx);vallabels = pxds.files(vallx);testLabels = pxds.files(testIdx);PXDSTRAIN = PIXELLABELDATASTASTORE(训练标签,类,标签);PXDSVAL = PIXELLABELDATASTASTORE(Vallabels,类,Labelids);pxdstest = pixellabeldatastore(testlabels,class,labelids);结尾
functiondata = augmentImageAndLabel(data, xTrans, yTrans)%Augment images and pixel label images using random reflection and%translation.为了i = 1:size(data,1) tform = randomAffine2d(。。。'XReflection',,,,true,。。。'XTranslation',Xtrans,。。。'translation',,,,yTrans);%中心在输出空间中的图像中心视图%allowing translation to move the output image out of view.rout = affineOutputView(size(data{i,1}), tform,'BoundsStyle',,,,“中心输出”);%Warp the image and pixel labels using the same transform.data {i,1} = imwarp(data {i,1},tform,'OutputView',,,,rout); data{i,2} = imwarp(data{i,2}, tform,'OutputView',,,,rout);结尾结尾

참고 문헌

[1] Chen, Liang-Chieh et al. “Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation.” ECCV (2018).

[2] Brostow, G. J., J. Fauqueur, and R. Cipolla. "Semantic object classes in video: A high-definition ground truth database."Pattern Recognition Letters。Vol. 30, Issue 2, 2009, pp 88-97.

참고 항목

(计算机视觉工具箱)|(计算机视觉工具箱)|(计算机视觉工具箱)|(Image Processing Toolbox)|(计算机视觉工具箱)|(计算机视觉工具箱)|(计算机视觉工具箱)||||(计算机视觉工具箱)

관련 항목