Main Content

セマンティック セグメンテーションのピクセル ラベル付きデータセットのインポート

この例では、セマンティック セグメンテーション ネットワークのピクセル ラベル付きデータセットをインポートする方法を示します。

ピクセル ラベル付きデータセットは、セマンティック セグメンテーション ネットワークに学習させるために使用されるイメージ コレクションと対応するグラウンド トゥルース ピクセル ラベルのセットです。ピクセルごとのラベルで注釈が付けられたイメージを提供する多くのパブリック データセットがあります。これらのタイプのデータセットをインポートする手順を示すために、この例では、Cambridge 大学の CamVid データセット [1] を使用します。

CamVid データセットは、運転中に得られた路上レベルでのビューが含まれるイメージ コレクションです。データセットは、車、歩行者、道路を含む 32 個のセマンティック クラスについてピクセルレベルのラベルを提供します。CamVid をインポートするための手順を使用して、他のピクセル ラベル付きデータセットをインポートできます。

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');
imageDir = fullfile(outputFolder,'images');
labelDir = fullfile(outputFolder,'labels');

if ~exist(outputFolder, 'dir')
    disp('Downloading 557 MB CamVid data set...');
    
    unzip(imageURL, imageDir);
    unzip(labelURL, labelDir);
end

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

CamVid ピクセル ラベル

CamVid データセットはピクセル ラベルを RGB イメージとして符号化します。RGB イメージでは各クラスが RGB カラーで表されます。以下に、データセットで RGB 符号化と共に定義するクラスを示します。

classNames = [ ...
    "Animal", ...
    "Archway", ...
    "Bicyclist", ...
    "Bridge", ...
    "Building", ...
    "Car", ...
    "CartLuggagePram", ...
    "Child", ...
    "Column_Pole", ...
    "Fence", ...
    "LaneMkgsDriv", ...
    "LaneMkgsNonDriv", ...
    "Misc_Text", ...
    "MotorcycleScooter", ...
    "OtherMoving", ...
    "ParkingBlock", ...
    "Pedestrian", ...
    "Road", ...
    "RoadShoulder", ...
    "Sidewalk", ...
    "SignSymbol", ...
    "Sky", ...
    "SUVPickupTruck", ...
    "TrafficCone", ...
    "TrafficLight", ...
    "Train", ...
    "Tree", ...
    "Truck_Bus", ...
    "Tunnel", ...
    "VegetationMisc", ...
    "Wall"];

classNames(k)labelIDs(k,:) に対応するようにラベル インデックスとクラス名間のマッピングを定義します。

labelIDs = [ ...
    064 128 064; ... % "Animal"
    192 000 128; ... % "Archway"
    000 128 192; ... % "Bicyclist"
    000 128 064; ... % "Bridge"
    128 000 000; ... % "Building"
    064 000 128; ... % "Car"
    064 000 192; ... % "CartLuggagePram"
    192 128 064; ... % "Child"
    192 192 128; ... % "Column_Pole"
    064 064 128; ... % "Fence"
    128 000 192; ... % "LaneMkgsDriv"
    192 000 064; ... % "LaneMkgsNonDriv"
    128 128 064; ... % "Misc_Text"
    192 000 192; ... % "MotorcycleScooter"
    128 064 064; ... % "OtherMoving"
    064 192 128; ... % "ParkingBlock"
    064 064 000; ... % "Pedestrian"
    128 064 128; ... % "Road"
    128 128 192; ... % "RoadShoulder"
    000 000 192; ... % "Sidewalk"
    192 128 128; ... % "SignSymbol"
    128 128 128; ... % "Sky"
    064 128 192; ... % "SUVPickupTruck"
    000 000 064; ... % "TrafficCone"
    000 064 064; ... % "TrafficLight"
    192 064 128; ... % "Train"
    128 128 000; ... % "Tree"
    192 128 192; ... % "Truck_Bus"
    064 000 064; ... % "Tunnel"
    192 192 000; ... % "VegetationMisc"
    064 192 000];    % "Wall"

他のデータセットは符号化データの形式が異なることに注意してください。たとえば、PASCAL VOC [2] データセットでは、0 ~ 21 の数値ラベル ID を使用してそれらのクラス ラベルを符号化します。

CamVid イメージのいずれか 1 つに対してピクセル ラベルを可視化します。

labels = imread(fullfile(labelDir,'0001TP_006690_L.png'));
figure
imshow(labels)

% Add colorbar to show class to color mapping.
N = numel(classNames);
ticks = 1/(N*2):1/N:1;
colorbar('TickLabels',cellstr(classNames),'Ticks',ticks,'TickLength',0,'TickLabelInterpreter','none');
colormap(labelIDs./255)

CamVid データの読み込み

ピクセル ラベル付きデータセットは、imageDatastore および pixelLabelDatastore を使用して読み込むことができます。

CamVid イメージを読み込む imageDatastore を作成します。

imds = imageDatastore(fullfile(imageDir,'701_StillsRaw_full'));

CamVid ピクセル ラベルを読み込む pixelLabelDatastore を作成します。

pxds = pixelLabelDatastore(labelDir,classNames,labelIDs);

10 番目のイメージと対応するピクセル ラベル イメージを読み取ります。

I = readimage(imds,10);
C = readimage(pxds,10);

ピクセル ラベル イメージは categorical 配列として返されます。この配列では、C(i,j) がピクセル I(i,j) に割り当てられたカテゴリカル ラベルになります。イメージの上にピクセル ラベル イメージを表示します。

B = labeloverlay(I,C,'Colormap',labelIDs./255);
figure
imshow(B)

% Add a colorbar.
N = numel(classNames);
ticks = 1/(N*2):1/N:1;
colorbar('TickLabels',cellstr(classNames),'Ticks',ticks,'TickLength',0,'TickLabelInterpreter','none');
colormap(labelIDs./255)

undefined ラベルまたは void ラベル

ピクセル ラベル付きデータセットには "undefined" ラベルまたは "void" ラベルを含めるのが一般的です。これらは、ラベル付けされていないピクセルを示すために使用されます。たとえば、CamVid では、ラベル ID [0 0 0] は "void" クラスを指定するために使用されます。学習アルゴリズムと評価アルゴリズムでは、どの計算にもこれらのラベルが含まれないものと見なされます。

"void" クラスは、pixelLabelDatastore を使用するときに明示的に名前を付ける必要はありません。クラス名にマッピングされていないラベル ID には自動的に "undefined" のラベルが付き、計算対象から除外されます。未定義のピクセルを確認するには、isundefined を使用してマスクを作成した後、そのマスクをイメージの上に表示します。

undefinedPixels = isundefined(C);
B = labeloverlay(I,undefinedPixels);
figure
imshow(B)
title('Undefined Pixel Labels')

クラスの結合

パブリック データセットを使用する場合は、アプリケーションにより適合するよういくつかのクラスを結合しなければならない場合があります。たとえば、シーンを道路、空、車両、歩行者の 4 つのクラスと背景にセグメント化するセマンティック セグメンテーション ネットワークに学習させる場合を考えます。これを CamVid データセットで行うには、上記で定義したラベル ID を新しいクラスに合わせてグループ化します。最初に、新しいクラス名を定義します。

newClassNames = ["road","sky","vehicle","pedestrian","background"];

次に、M 行 3 列の行列の cell 配列を使用してラベル ID をグループ化します。

groupedLabelIDs = {
    % road
    [
    128 064 128; ... % "Road"
    128 000 192; ... % "LaneMkgsDriv"
    192 000 064; ... % "LaneMkgsNonDriv"
    000 000 192; ... % "Sidewalk" 
    064 192 128; ... % "ParkingBlock"
    128 128 192; ... % "RoadShoulder"
    ]
   
    % "sky"
    [
    128 128 128; ... % "Sky"
    ]
    
    % "vehicle"
    [
    064 000 128; ... % "Car"
    064 128 192; ... % "SUVPickupTruck"
    192 128 192; ... % "Truck_Bus"
    192 064 128; ... % "Train"
    000 128 192; ... % "Bicyclist"
    192 000 192; ... % "MotorcycleScooter"
    128 064 064; ... % "OtherMoving"
    ]
     
    % "pedestrian"
    [
    064 064 000; ... % "Pedestrian"
    192 128 064; ... % "Child"
    064 000 192; ... % "CartLuggagePram"
    064 128 064; ... % "Animal"
    ]
    
    % "background"      
    [
    128 128 000; ... % "Tree"
    192 192 000; ... % "VegetationMisc"    
    192 128 128; ... % "SignSymbol"
    128 128 064; ... % "Misc_Text"
    000 064 064; ... % "TrafficLight"  
    064 064 128; ... % "Fence"
    192 192 128; ... % "Column_Pole"
    000 000 064; ... % "TrafficCone"
    000 128 064; ... % "Bridge"
    128 000 000; ... % "Building"
    064 192 000; ... % "Wall"
    064 000 064; ... % "Tunnel"
    192 000 128; ... % "Archway"
    ]
    };

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

pxds = pixelLabelDatastore(labelDir,newClassNames,groupedLabelIDs);

10 番目のピクセル ラベル イメージを読み取り、イメージの上に表示します。

C = readimage(pxds,10);
cmap = jet(numel(newClassNames));
B = labeloverlay(I,C,'Colormap',cmap);
figure
imshow(B)

% add colorbar
N = numel(newClassNames);
ticks = 1/(N*2):1/N:1;
colorbar('TickLabels',cellstr(newClassNames),'Ticks',ticks,'TickLength',0,'TickLabelInterpreter','none');
colormap(cmap)

新しいクラス名を持つ pixelLabelDatastore を使用すると、元の CamVid ピクセル ラベルを変更せずに、4 クラスについてネットワークに学習させることができます。

参考文献

[1] Brostow, Gabriel J., Julien Fauqueur, and Roberto Cipolla."Semantic object classes in video: A high-definition ground truth database." Pattern Recognition Letters 30.2 (2009): 88-97.

[2] Everingham, M., et al. "The PASCAL visual object classes challenge 2012 results." http://www. pascal-network. org/challenges/VOC/voc2012/workshop/index. html Vol. 5. 2012.

参考

|

関連するトピック