ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

深層学習を使用したセマンティック セグメンテーション

この例では、深層学習を使用してセマンティック セグメンテーション ネットワークの学習を行う方法を説明します。

セマンティック セグメンテーション ネットワークはイメージ内のすべてのピクセルを分類して、クラスごとにセグメント化されたイメージを作成します。セマンティック セグメンテーションの応用例としては、自動運転のための道路セグメンテーションや医療診断のための癌細胞セグメンテーションなどがあります。詳細は、セマンティック セグメンテーションの基礎 (Computer Vision Toolbox)を参照してください。

学習手順を示すために、この例では、セマンティック イメージ セグメンテーション用に設計された 1 つのタイプの畳み込みニューラル ネットワーク (CNN) である Deeplab v3+ [1] に学習させます。他のタイプのセマンティック セグメンテーション ネットワークには、完全畳み込みネットワーク (FCN)、SegNet、U-Net などがあります。ここで示す学習手順は、これらのネットワークにも適用することができます。

この例では、学習用に Cambridge University の CamVid データセット [2] を使用します。このデータセットは、運転中に得られた路上レベルでのビューが含まれるイメージの集合です。データセットは、車、歩行者、道路を含む 32 個のセマンティック クラスについてピクセルレベルのラベルを提供します。

設定

この例では、事前学習済みの Resnet-18 ネットワークから初期化された重みを使用して Deeplab v3+ ネットワークを作成します。ResNet-18 は、処理するリソースが限られている用途に非常に適した効率的なネットワークです。用途の要件によって、MobileNet v2 や ResNet-50 など、その他の事前学習済みのネットワークも使用できます。詳細は、事前学習済みの深層ニューラル ネットワーク (Deep Learning Toolbox)を参照してください。

事前学習済みの Resnet-18 を入手するには、Deep Learning Toolbox™ Model for Resnet-18 Network をインストールします。インストールが完了したら、次のコードを実行して正しくインストールされていることを確認します。

resnet18();

さらに、事前学習済みのバージョンの DeepLab v3+ をダウンロードします。事前学習済みのモデルを使用することで、学習の完了を待つことなく例全体を実行することができます。

pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/deeplabv3plusResnet18CamVid.mat';
pretrainedFolder = fullfile(tempdir,'pretrainedNetwork');
pretrainedNetwork = fullfile(pretrainedFolder,'deeplabv3plusResnet18CamVid.mat'); 
if ~exist(pretrainedFolder,'dir')
    mkdir(pretrainedFolder);
    disp('Downloading pretrained network (58 MB)...');
    websave(pretrainedNetwork,pretrainedURL);
end

この例を実行するには、Compute Capability 3.0 以上の CUDA 対応 NVIDIA™ GPU を使用することを強くお勧めします。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/LabeledApproved_full.zip';
outputFolder = fullfile(tempdir,'CamVid'); 

if ~exist(outputFolder, 'dir')
   
    mkdir(outputFolder)
    labelsZip = fullfile(outputFolder,'labels.zip');
    imagesZip = fullfile(outputFolder,'images.zip');   
    
    disp('Downloading 16 MB CamVid dataset labels...'); 
    websave(labelsZip, labelURL);
    unzip(labelsZip, fullfile(outputFolder,'labels'));
    
    disp('Downloading 557 MB CamVid dataset images...');  
    websave(imagesZip, imageURL);       
    unzip(imagesZip, fullfile(outputFolder,'images'));    
end

メモ: データのダウンロードにかかる時間はインターネット接続の速度によって異なります。上記で使用したコマンドは、ダウンロードが完了するまで MATLAB をブロックします。別の方法として、Web ブラウザーを使用して、データセットをローカル ディスクにまずダウンロードしておくことができます。Web からダウンロードしたファイルを使用するには、上記の変数 outputFolder の値を、ダウンロードしたファイルの場所に変更します。

CamVid イメージの読み込み

imageDatastore を使用して CamVid イメージを読み込みます。imageDatastore は、ディスク上の大規模なイメージの集合を効率的に読み込むことができます。

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

イメージのうちの 1 つを表示します。

I = readimage(imds,1);
I = histeq(I);
imshow(I)

CamVid のピクセル ラベル付きイメージの読み込み

pixelLabelDatastore を使用して、CamVid のピクセル ラベル イメージ データを読み込みます。pixelLabelDatastore は、ピクセル ラベル データとラベル ID をクラス名のマッピングにカプセル化します。

学習を容易にするために、CamVid の元の 32 個のクラスを 11 個のクラスにグループ化します。次のクラスを指定します。

classes = [
    "Sky"
    "Building"
    "Pole"
    "Road"
    "Pavement"
    "Tree"
    "SignSymbol"
    "Fence"
    "Car"
    "Pedestrian"
    "Bicyclist"
    ];

32 個のクラスを 11 個に減らすには、元のデータセットの複数のクラスをグループとしてまとめます。たとえば、"Car"、"SUVPickupTruck"、"Truck_Bus"、"Train"、および "OtherMoving" を組み合わせたものを "Car" とします。この例の最後にリストされているサポート関数 camvidPixelLabelIDs を使用することで、グループ化されたラベル ID が返されます。

labelIDs = camvidPixelLabelIDs();

クラスとラベル ID を使用して pixelLabelDatastore. を作成します。

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

イメージの上に重ね合わせることで、ピクセル ラベル付きイメージのうちの 1 つを読み取って表示します。

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

色の重ね合わせが存在しない領域にはピクセル ラベルはなく、学習中は使用されません。

データセット統計の解析

CamVid データセット内のクラス ラベルの分布を表示するには、countEachLabel を使用します。この関数は、クラス ラベル別にピクセルの数をカウントします。

tbl = countEachLabel(pxds)
tbl=11×3 table
        Name        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 データセット内のイメージのサイズは 720 × 960 です。イメージ サイズは、12 GB のメモリ搭載の NVIDIA™ Titan 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

ネットワークの作成

サポート ファイルとしてこの例に添付されている関数 helperDeeplabv3PlusResnet18 を使用して、ResNet-18 に基づいて DeepLab v3+ ネットワークを作成します。用途に最適なネットワークを選択することは、経験的解析が必要であり、別のレベルのハイパーパラメーター調整です。たとえば、ResNet-50 や Inception v3 などの異なる基本ネットワークで試すか、または SegNet、完全畳み込みネットワーク (FCN)、U-Net などの他のセマンティック セグメンテーション ネットワーク アーキテクチャを試すことができます。

% Specify the network image size. This is typically the same as the traing image sizes.
imageSize = [720 960 3];

% Specify the number of classes.
numClasses = numel(classes);

% Create DeepLab v3+.
lgraph = helperDeeplabv3PlusResnet18(imageSize, numClasses);

クラスの重み付けを使用したクラスのバランス調整

前に示したように、CamVid 内のクラスはバランスがとれていません。学習を改善するために、クラスの重み付けを使用してクラスのバランスを調整することができます。前に countEachLabel を使用して計算したピクセル ラベルのカウントを使用して、中央頻度クラスの重みを計算します。

imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount;
classWeights = median(imageFreq) ./ imageFreq
classWeights = 11×1

    0.3182
    0.2082
    5.0924
    0.1744
    0.7103
    0.4175
    4.5371
    1.8386
    1.0000
    6.6059
      ⋮

pixelClassificationLayer を使用してクラスの重みを指定します。

pxLayer = pixelClassificationLayer('Name','labels','Classes',tbl.Name,'ClassWeights',classWeights);
lgraph = replaceLayer(lgraph,"classification",pxLayer);

学習オプションの選択

学習に使用される最適化アルゴリズムはモーメンタム項付き確率的勾配降下法 (SGDM) です。trainingOptions を使用して、SGDM に使用されるハイパーパラメーターを指定します。

% Define validation data.
pximdsVal = pixelLabelImageDatastore(imdsVal,pxdsVal);

% Define training options. 
options = trainingOptions('sgdm', ...
    'LearnRateSchedule','piecewise',...
    'LearnRateDropPeriod',10,...
    'LearnRateDropFactor',0.3,...
    'Momentum',0.9, ...
    'InitialLearnRate',1e-3, ...
    'L2Regularization',0.005, ...
    'ValidationData',pximdsVal,...
    'MaxEpochs',30, ...  
    'MiniBatchSize',8, ...
    'Shuffle','every-epoch', ...
    'CheckpointPath', tempdir, ...
    'VerboseFrequency',2,...
    'Plots','training-progress',...
    'ValidationPatience', 4); ...

学習率には区分的なスケジュールが使用されます。学習率は 10 エポックごとに 0.3 ずつ減少します。これにより、ネットワークはより高い初期学習率で高速に学習することができる一方で、学習率が低下すると、局所的最適値に近い解を求めることができます。

'ValidationData' パラメーターを設定することによって、すべてのエポックで検証データに対してネットワークのテストが行われます。'ValidationPatience' は 4 に設定されており、検証精度が収束すると学習が早期に停止します。これにより、学習データセットに対するネットワークの過適合を防ぎます。

ミニバッチのサイズ 8 を使用して、学習中のメモリ使用量を削減します。この値は、システムに搭載されている GPU メモリの量に応じて増減させることができます。

また、'CheckpointPath' は一時的な場所に設定されています。この名前と値のペアを設定すると、各学習エポックの終わりにネットワーク チェックポイントを保存できます。システム障害や停電で学習が中断された場合に、保存したチェックポイントから学習を再開できます。'CheckpointPath' で指定された場所に、ネットワーク チェックポイントを保存するのに十分なスペースがあることを確認します。たとえば、100 個の Deeplab v3+ チェックポイントを保存する場合、各チェックポイントが 61 MB であるため、約 6 GB のディスク領域が必要です。

データ拡張

データ拡張はネットワークの精度を高めるのに役立つため、学習中にネットワークに対してより多くの例を提供するために使用されます。ここでは、データ拡張に対して +/- 10 ピクセルのランダムな左/右反射とランダムな X/Y 平行移動が使用されます。これらのデータ拡張パラメーターを指定するには、imageDataAugmenter を使用します。

augmenter = imageDataAugmenter('RandXReflection',true,...
    'RandXTranslation',[-10 10],'RandYTranslation',[-10 10]);

imageDataAugmenter は、この他にいくつかのタイプのデータ拡張をサポートします。それらの中から選択することは、経験的解析が必要であり、別のレベルのハイパーパラメーター調整です。

学習の開始

pixelLabelImageDatastore を使用して学習データとデータ拡張の選択を組み合わせます。pixelLabelImageDatastore は学習データのバッチを読み取り、データ拡張を適用し、拡張されたデータを学習アルゴリズムに送信します。

pximds = pixelLabelImageDatastore(imdsTrain,pxdsTrain, ...
    'DataAugmentation',augmenter);

doTraining フラグが true の場合、trainNetwork を使用して学習を開始します。そうでない場合は、事前学習済みのネットワークを読み込みます。

メモ: この学習は、12 GB の GPU メモリ搭載の NVIDIA™ Titan X で検証済みです。GPU のメモリがこれより少ない場合、メモリ不足が発生する可能性があります。これが発生する場合は、trainingOptions において 'MiniBatchSize' を 1 に設定してみてください。このネットワークに学習させるには、約 5 時間かかります。GPU ハードウェアによっては、さらに時間がかかる場合があります。

doTraining = false;
if doTraining    
    [net, info] = trainNetwork(pximds,lgraph,options);
else
    data = load(pretrainedNetwork); 
    net = data.net;
end

1 つのイメージを使用したネットワーク テスト

迅速な正常性チェックとして、1 つのテスト イメージ上で学習済みのネットワークを実行します。

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)

視覚的には、道路、空、建物などのクラスのセマンティック セグメンテーションの結果は適切にオーバーラップしてます。しかし、歩行者や車のような小さいオブジェクトはそれほど正確ではありません。クラスごとのオーバーラップ量は、ジャカード インデックスとしても知られている Intersection over Union (IoU) メトリクスを使用して測定できます。関数 jaccard を使用して IoU を測定します。

iou = jaccard(C,expectedResult);
table(classes,iou)
ans=11×2 table
      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 メトリクスでは視覚的な結果を確認できます。道路、空、建物クラスの IoU スコアは高く、一方で歩行者や自動車などのクラスのスコアは低くなります。その他の一般的なセグメンテーション メトリクスには、dicebfscore の輪郭マッチング スコアなどがあります。

学習済みネットワークの評価

複数のテスト イメージの精度を測定するには、テスト セット全体に対して semanticseg を実行します。ミニバッチのサイズ 4 を使用して、イメージのセグメント化中のメモリ使用量を削減します。この値は、システムに搭載されている GPU メモリの量に応じて増減させることができます。

pxdsResults = semanticseg(imdsTest,net, ...
    'MiniBatchSize',4, ...
    'WriteLocation',tempdir, ...
    'Verbose',false);

semanticseg はテスト セットに対する結果を pixelLabelDatastore オブジェクトとして返します。imdsTest 内の各テスト イメージの実際のピクセル ラベル データは、'WriteLocation' パラメーターで指定された場所にあるディスクに書き込まれます。evaluateSemanticSegmentation を使用して、テスト セット結果のセマンティック セグメンテーション メトリクスを測定します。

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

evaluateSemanticSegmentation は、データセット全体、個々のクラス、各テスト イメージに関するさまざまなメトリクスを返します。データセット レベルのメトリクスを確認するには、metrics.DataSetMetrics を検査します。

metrics.DataSetMetrics
ans=1×5 table
    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.87695          0.85392       0.6302       0.80851        0.65051  

データセット メトリクスは、ネットワーク パフォーマンスに関する大まかな概要を示します。各クラスがパフォーマンス全体に与える影響を確認するには、metrics.ClassMetrics を使用してクラスごとのメトリクスを検査します。

metrics.ClassMetrics
ans=11×3 table
                  Accuracy      IoU      MeanBFScore
                  ________    _______    ___________

    Sky           0.93111     0.90209       0.8952  
    Building      0.78453     0.76098      0.58511  
    Pole          0.71586     0.21477       0.5144  
    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.48565  
    Car           0.90956     0.76799      0.69233  
    Pedestrian    0.87629      0.4366      0.60792  
    Bicyclist     0.87844     0.60829      0.55089  

データセット全体のパフォーマンスは非常に高いですが、クラス メトリクスは、PedestrianBicyclistCar といった少数しか存在しないクラスは RoadSkyBuilding などのクラスと同じようにうまくセグメント化されていないことを示しています。少数しか存在しないクラスのサンプルが多く含まれているデータが追加されることで、結果が改善する可能性があります。

サポート関数

helperDeeplabv3PlusResnet18.m は、この例にサポート ファイルとして添付されています。

% lgraph = helperDeeplabv3PlusResnet18(imageSize, numClasses) creates a
% DeepLab v3+ layer graph object using a pre-trained ResNet-18 configured
% using the following inputs:
%
%   Inputs
%   ------
%   imageSize    - size of the network input image specified as a vector
%                  [H W] or [H W C], where H and W are the image height and
%                  width, and C is the number of image channels.
%
%   numClasses   - number of classes the network should be configured to
%                  classify.
%
% The output lgraph is a LayerGraph object.
function labelIDs = 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:
%   "Sky" "Building", "Pole", "Road", "Pavement", "Tree", "SignSymbol",
%   "Fence", "Car", "Pedestrian",  and "Bicyclist".
%
% CamVid pixel label IDs are provided as RGB color values. Group them into
% 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 = { ...
    
    % "Sky"
    [
    128 128 128; ... % "Sky"
    ]
    
    % "Building" 
    [
    000 128 064; ... % "Bridge"
    128 000 000; ... % "Building"
    064 192 000; ... % "Wall"
    064 000 064; ... % "Tunnel"
    192 000 128; ... % "Archway"
    ]
    
    % "Pole"
    [
    192 192 128; ... % "Column_Pole"
    000 000 064; ... % "TrafficCone"
    ]
    
    % Road
    [
    128 064 128; ... % "Road"
    128 000 192; ... % "LaneMkgsDriv"
    192 000 064; ... % "LaneMkgsNonDriv"
    ]
    
    % "Pavement"
    [
    000 000 192; ... % "Sidewalk" 
    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; ... % "Child"
    064 000 192; ... % "CartLuggagePram"
    064 128 064; ... % "Animal"
    ]
    
    % "Bicyclist"
    [
    000 128 192; ... % "Bicyclist"
    192 000 192; ... % "MotorcycleScooter"
    ]
    
    };
end
function pixelLabelColorbar(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;
end
function cmap = camvidColorMap()
% Define the colormap used by CamVid dataset.

cmap = [
    128 128 128   % Sky
    128 0 0       % Building
    192 192 192   % Pole
    128 64 128    % Road
    60 40 222     % Pavement
    128 128 0     % Tree
    192 128 128   % SignSymbol
    64 64 128     % Fence
    64 0 128      % Car
    64 64 0       % Pedestrian
    0 128 192     % Bicyclist
    ];

% Normalize between [0 1].
cmap = cmap ./ 255;
end
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);

% Use 60% of the images for training.
numTrain = round(0.60 * numFiles);
trainingIdx = shuffledIndices(1:numTrain);

% Use 20% of the images for validation
numVal = round(0.20 * numFiles);
valIdx = shuffledIndices(numTrain+1:numTrain+numVal);

% Use the rest for testing.
testIdx = shuffledIndices(numTrain+numVal+1:end);

% Create image datastores for training and test.
trainingImages = imds.Files(trainingIdx);
valImages = imds.Files(valIdx);
testImages = imds.Files(testIdx);

imdsTrain = imageDatastore(trainingImages);
imdsVal = imageDatastore(valImages);
imdsTest = imageDatastore(testImages);

% Extract class and label IDs info.
classes = pxds.ClassNames;
labelIDs = camvidPixelLabelIDs();

% Create pixel label datastores for training and test.
trainingLabels = pxds.Files(trainingIdx);
valLabels = pxds.Files(valIdx);
testLabels = pxds.Files(testIdx);

pxdsTrain = pixelLabelDatastore(trainingLabels, classes, labelIDs);
pxdsVal = pixelLabelDatastore(valLabels, classes, labelIDs);
pxdsTest = pixelLabelDatastore(testLabels, classes, labelIDs);
end

参考文献

[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.

参考

| | | | | | | | | |

関連するトピック