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

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

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

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

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

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

設定

この例では、VGG-16 ネットワークから初期化された重みを使用して SegNet ネットワークを作成します。VGG-16 を入手するには、Deep Learning Toolbox™ Model for VGG-16 Network をインストールします。インストールが完了したら、次のコードを実行して正しくインストールされていることを確認します。

vgg16();
Warning: Renaming duplicate class names.

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

pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/segnetVGG16CamVid.mat';
pretrainedFolder = fullfile(tempdir,'pretrainedSegNet');
pretrainedSegNet = fullfile(pretrainedFolder,'segnetVGG16CamVid.mat'); 
if ~exist(pretrainedFolder,'dir')
    mkdir(pretrainedFolder);
    disp('Downloading pretrained SegNet (107 MB)...');
    websave(pretrainedSegNet,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 をクラス名のマッピングにカプセル化します。

元の SegNet ペーパー [1] で使用されている手順に従って、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 データのリサイズ

CamVid データセット内のイメージは 720 × 960 です。学習時間を短縮し、メモリ使用量を削減するには、イメージおよびピクセル ラベル イメージを 360 × 480 にリサイズします。サポート関数である resizeCamVidImagesresizeCamVidPixelLabels は、この例の最後にリストされています。

imageFolder = fullfile(outputFolder,'imagesResized',filesep);
imds = resizeCamVidImages(imds,imageFolder);

labelFolder = fullfile(outputFolder,'labelsResized',filesep);
pxds = resizeCamVidPixelLabels(pxds,labelFolder);

学習セットとテスト セットの準備

SegNet の学習には、データセットのイメージの 60% が使用されます。残りのイメージはテスト用に使用されます。次のコードでは、イメージとピクセル ラベル データを学習セットとテスト セットに無作為に分割します。

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

60 対 40 に分割すると、トレーニング イメージとテスト イメージの数が次のようになります。

numTrainingImages = numel(imdsTrain.Files)
numTrainingImages = 421
numTestingImages = numel(imdsTest.Files)
numTestingImages = 280

ネットワークの作成

segnetLayers を使用して、VGG-16 の重みを使用して初期化された SegNet ネットワークを作成します。segnetLayers は、VGG-16 から重みを転送するのに必要なネットワーク変換を自動的に実行し、セマンティック セグメンテーションに必要な層をさらに追加します。segnetLayers の出力は SegNet を表す LayerGraph オブジェクトです。LayerGraph オブジェクトは、ネットワーク層および層間の接続をカプセル化します。

imageSize = [360 480 3];
numClasses = numel(classes);
lgraph = segnetLayers(imageSize,numClasses,'vgg16');
Warning: Renaming duplicate class names.

イメージ サイズは、データセット内のイメージのサイズに基づいて選択されます。クラスの数は CamVid 内のクラスに基づいて選択されます。

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

前に示したように、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)
pxLayer = 
  PixelClassificationLayer with properties:

            Name: 'labels'
         Classes: [11×1 categorical]
    ClassWeights: [11×1 double]
      OutputSize: 'auto'

   Hyperparameters
    LossFunction: 'crossentropyex'

現在の pixelClassificationLayer を削除して新しい層を追加することで、新しい pixelClassificationLayer で SegNet ネットワークを更新します。現在の pixelClassificationLayer には 'pixelLabels' という名前が付けられています。removeLayers を使用してこれを削除し、addLayers を使用して新しい層を追加し、connectLayers を使用して新しい層を残りのネットワークに接続します。

lgraph = removeLayers(lgraph,'pixelLabels');
lgraph = addLayers(lgraph, pxLayer);
lgraph = connectLayers(lgraph,'softmax','labels');

学習オプションの選択

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

options = trainingOptions('sgdm', ...
    'Momentum',0.9, ...
    'InitialLearnRate',1e-3, ...
    'L2Regularization',0.0005, ...
    'MaxEpochs',100, ...  
    'MiniBatchSize',4, ...
    'Shuffle','every-epoch', ...
    'CheckpointPath', tempdir, ...
    'VerboseFrequency',2);

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

また、'CheckpointPath' は一時的な場所に設定されています。この名前と値のペアを設定すると、各学習エポックの終わりにネットワーク チェックポイントを保存できます。システム障害や停電で学習が中断された場合に、保存したチェックポイントから学習を再開できます。'CheckpointPath' で指定された場所に、ネットワーク チェックポイントを保存するのに十分なスペースがあることを確認します。たとえば、100 個の SegNet チェックポイントを保存する場合、各チェックポイントが 107 MB であるため、約 11 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(pretrainedSegNet);
    net = data.net;
end

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

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

I = read(imdsTest);
C = semanticseg(I, net);

結果を表示します。

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

C での結果と、pxdsTest に格納されている予想されるグラウンド トゥルースを比較します。緑とマゼンタの領域は、セグメンテーション結果が予想されるグラウンド トゥルースと異なる領域を強調表示しています。

expectedResult = read(pxdsTest);
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.92659
    "Building"        0.7987
    "Pole"           0.16978
    "Road"           0.95177
    "Pavement"       0.41877
    "Tree"           0.43401
    "SignSymbol"     0.32509
    "Fence"            0.492
    "Car"           0.068756
    "Pedestrian"           0
    "Bicyclist"            0

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.88204          0.85097       0.60893      0.79795        0.6098   

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

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

    Sky           0.93493     0.89243      0.88152  
    Building      0.79777     0.75263      0.59707  
    Pole          0.72635     0.18663      0.52252  
    Road          0.93676     0.90672      0.71043  
    Pavement      0.90674     0.72865      0.70362  
    Tree          0.86657     0.73747       0.6642  
    SignSymbol    0.75591      0.3452        0.434  
    Fence         0.82807     0.50592       0.5083  
    Car           0.91187     0.75001      0.64351  
    Pedestrian    0.84866     0.35046       0.4555  
    Bicyclist     0.84705     0.54208      0.46818  

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

サポート関数

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 imds = resizeCamVidImages(imds, imageFolder)
% Resize images to [360 480].

if ~exist(imageFolder,'dir') 
    mkdir(imageFolder)
else
    imds = imageDatastore(imageFolder);
    return; % Skip if images already resized
end

reset(imds)
while hasdata(imds)
    % Read an image.
    [I,info] = read(imds);     
    
    % Resize image.
    I = imresize(I,[360 480]);    
    
    % Write to disk.
    [~, filename, ext] = fileparts(info.Filename);
    imwrite(I,[imageFolder filename ext])
end

imds = imageDatastore(imageFolder);
end
function pxds = resizeCamVidPixelLabels(pxds, labelFolder)
% Resize pixel label data to [360 480].

classes = pxds.ClassNames;
labelIDs = 1:numel(classes);
if ~exist(labelFolder,'dir')
    mkdir(labelFolder)
else
    pxds = pixelLabelDatastore(labelFolder,classes,labelIDs);
    return; % Skip if images already resized
end

reset(pxds)
while hasdata(pxds)
    % Read the pixel data.
    [C,info] = read(pxds);
    
    % Convert from categorical to uint8.
    L = uint8(C);
    
    % Resize the data. Use 'nearest' interpolation to
    % preserve label IDs.
    L = imresize(L,[360 480],'nearest');
    
    % Write the data to disk.
    [~, filename, ext] = fileparts(info.Filename);
    imwrite(L,[labelFolder filename ext])
end

labelIDs = 1:numel(classes);
pxds = pixelLabelDatastore(labelFolder,classes,labelIDs);
end
function [imdsTrain, imdsTest, pxdsTrain, 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.
N = round(0.60 * numFiles);
trainingIdx = shuffledIndices(1:N);

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

% Create image datastores for training and test.
trainingImages = imds.Files(trainingIdx);
testImages = imds.Files(testIdx);
imdsTrain = imageDatastore(trainingImages);
imdsTest = imageDatastore(testImages);

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

% Create pixel label datastores for training and test.
trainingLabels = pxds.Files(trainingIdx);
testLabels = pxds.Files(testIdx);
pxdsTrain = pixelLabelDatastore(trainingLabels, classes, labelIDs);
pxdsTest = pixelLabelDatastore(testLabels, classes, labelIDs);
end

参照

[1] Badrinarayanan, V., A. Kendall, and R. Cipolla. "SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation." arXiv preprint arXiv:1511.00561, 2015.

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

参考

| | | | | | | | | |

関連するトピック