Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

countEachLabel

(削除予定) bigimageDatastore オブジェクトの各クラスのピクセル ラベル数のカウント

R2020a 以降

bigimageDatastore オブジェクトの関数 countEachLabel は将来のリリースで削除される予定です。代わりに、blockedImageDatastore オブジェクトに関連付けられた関数 countEachLabel を使用してください。詳細については、互換性の考慮事項を参照してください。

説明

counts = countEachLabel(bigds) は、大きなイメージのデータストア bigds に含まれるすべての大きなイメージについて、各ピクセル ラベルの数を返します。

すべて折りたたむ

ピクセル ラベル データを読み込みます。

load('buildingPixelLabeled.mat');

ピクセル ラベル データのクラスとピクセル ラベル ID を指定します。

pixelLabelID = [1 2 3 4];
classNames = ["sky" "grass" "building" "sidewalk"];

ピクセル ラベル データを管理する bigimage を作成します。

bigLabeledImage = bigimage(uint8(label),'Classes',classNames,'PixelLabelIDs',pixelLabelID);
bigimageshow(bigLabeledImage)

bigLabeledImage から最も細かい解像度レベルで 200 x 150 ピクセルのブロックを読み取る bigimageDatastore を作成します。

level = 1;
blockSize = [200 150];
biglabelds = bigimageDatastore(bigLabeledImage,level,'BlockSize',blockSize);

各クラスのピクセル ラベル数をカウントします。

tbl = countEachLabel(biglabelds)
tbl=4×3 table
       Name       PixelCount    BlockPixelCount
    __________    __________    _______________

    "sky"              81525        1.58e+05   
    "grass"            32983           51200   
    "building"    1.8036e+05       3.072e+05   
    "sidewalk"         10491           51200   

一様な事前重み付けを使用して、クラスのバランスを調整します。

prior = 1/numel(classNames);
uniformClassWeights = prior ./ tbl.PixelCount
uniformClassWeights = 4×1
10-4 ×

    0.0307
    0.0758
    0.0139
    0.2383

逆頻度重み付けを使用して、クラスのバランスを調整します。

 totalNumberOfPixels = sum(tbl.PixelCount);
 freq = tbl.PixelCount / totalNumberOfPixels;
 invFreqClassWeights = 1./freq
invFreqClassWeights = 4×1

    3.7456
    9.2580
    1.6931
   29.1067

中央頻度重み付けを使用して、クラスのバランスを調整します。

freq = tbl.PixelCount ./ tbl.BlockPixelCount;
medFreqClassWeights = median(freq) ./ freq
medFreqClassWeights = 4×1

    1.0689
    0.8562
    0.9394
    2.6917

入力引数

すべて折りたたむ

大きなイメージ データストア。bigimageDatastore オブジェクトとして指定します。

出力引数

すべて折りたたむ

ラベル情報。3 つの変数を含むテーブルとして返されます。

ピクセル数の変数説明
Nameピクセル ラベルのクラス名
PixelCountクラスに含まれているピクセル数
BlockPixelCountクラスのインスタンスをもつブロックに含まれているピクセルの総数

ヒント

countEachLabel によって返されたラベル情報を使用して、クラス バランス調整のために、クラスの重み付けを計算できます。たとえば、tbl に含まれる、ラベル付けされたピクセル データ情報の場合、次のようになります。

  • 一様なクラス バランス調整は、それぞれの事前確率が一様になるよう、各クラスに重み付けをします。

    numClasses = height(tbl)
    prior = 1/numClasses;
    classWeights = prior./tbl.PixelCount

  • 逆頻度バランス調整は、少数しか存在しないクラスの重みが大きくなるよう、各クラスに重み付けをします。

    totalNumberOfPixels = sum(tbl.PixelCount)
    frequency = tbl.PixelCount / totalNumberOfPixels;
    classWeights = 1./frequency

  • 中央頻度バランス調整は、中央頻度を使用して、各クラスに重み付けをします。

    imageFreq = tbl.PixelCount ./ tbl.BlockPixelCount
    classWeights = median(imageFreq) ./ imageFreq
    

計算されたクラスの重みは pixelClassificationLayer (Computer Vision Toolbox) に渡せます。

バージョン履歴

R2020a で導入

すべて展開する

R2023b: countEachLabel は削除予定

bigimageDatastore オブジェクトとこの関数は将来のリリースで削除される予定です。代わりに、blockedImageDatastore オブジェクトの関数 countEachLabel を使用してください。

コードを更新するには、次の手順に従い、blockedImageDatastore オブジェクトを作成してクラス ラベルの数をカウントします。

  • categorical データを使用している場合、データを数値データ型に変換することでクラス ラベルの順序を指定することもできます。

  • 数値または categorical のイメージ データを読み取るための blockedImage オブジェクトを作成します。

  • データ ブロックを管理するための blockedImageDatastore オブジェクトを作成します。

  • 関数 countEachLabel の呼び出しで、最初の入力引数を blockedImageDatastore オブジェクトに置き換えます。イメージ データが数値の場合、名前と値の引数 Classes および PixelLabelIDs をそれぞれ使用して、クラス名とピクセル ラベル ID も指定します。

blockedImageDatastore および blockedImageDatastore の関数 countEachLabel は、出力引数 counts の変数 BlockPixelCount に関して異なる結果を返す場合があります。

非推奨の使用方法推奨される代替案

この例では、bigimageDatastore オブジェクトの各クラスのピクセル ラベル数をカウントします。

load("buildingPixelLabeled.mat");
numericLabels = uint8(label);
pixelLabelID = [1 2 3 4];
classNames = ["sky" "grass" "building" "sidewalk"];
bigLabeledImage = bigimage(numericLabels,BlockSize=[200 150], ...
    Classes=classNames,PixelLabelIDs=pixelLabelID);
bigLabeledDS = bigimageDatastore(bigLabeledImage,1);
tbl = countEachLabel(bigLabeledDS)

以下は、blockedImageDatastore オブジェクトと数値データを使用するほぼ等価なコードです。table に含まれるクラスは、変数 classNames に従って並べ替えられます。

load("buildingPixelLabeled.mat");
numericLabels = uint8(label);
pixelLabelID = [1 2 3 4];
classNames = ["sky" "grass" "building" "sidewalk"];
blockedIm = blockedImage(numericLabels,BlockSize=[200 150]);
blockedDS = blockedImageDatastore(blockedIm);
tbl = countEachLabel(blockedDS, ...
    Classes=classNames,PixelLabelIDs=pixelLabelID)

以下は、blockedImageDatastore オブジェクトと categorical データを使用するほぼ等価なコードです。table に含まれるクラスは、クラス名のアルファベット順に並べ替えられます。

load("buildingPixelLabeled.mat");
blockedLabeledImage = blockedImage(label,BlockSize=[200 150]);
blockedLabeledDS = blockedImageDatastore(blockedLabeledImage);
tbl = countEachLabel(blockedLabeledDS)