Main Content

セマンティック セグメンテーションの結果の評価と検査

テスト データ セットをインポートして、事前学習済みのセマンティック セグメンテーション ネットワークを実行し、予測される結果に対してセマンティック セグメンテーションの品質メトリクスを検査します。

データセットのインポート

triangleImages データセットには、グラウンド トゥルース ラベルの付いた 100 個のテスト イメージがあります。データセットの場所を定義します。

dataSetDir = fullfile(toolboxdir("vision"),"visiondata","triangleImages");

テスト イメージの場所を定義します。

testImagesDir = fullfile(dataSetDir,"testImages");

テスト イメージを保持する imageDatastore オブジェクトを作成します。

imds = imageDatastore(testImagesDir);

グラウンド トゥルース ラベルの場所を定義します。

testLabelsDir = fullfile(dataSetDir,"testLabels");

クラス名と関連するラベル ID を定義します。ラベル ID は、イメージ ファイルで各クラスを表すために使用されるピクセル値です。

classNames = ["triangle" "background"];
labelIDs = [255 0];

テスト イメージのグラウンド トゥルース ピクセル ラベルを保持する pixelLabelDatastore オブジェクトを作成します。

pxdsTruth = pixelLabelDatastore(testLabelsDir,classNames,labelIDs);

セマンティック セグメンテーション分類器の実行

triangleImages の学習イメージで学習させられたセマンティック セグメンテーション ネットワークを読み込みます。

net = load("triangleSegmentationNetwork.mat");
net = net.net;

テスト イメージでネットワークを実行します。予測されたラベルは、一時ディレクトリのディスクに書き込まれ、pixelLabelDatastore オブジェクトとして返されます。

pxdsResults = semanticseg(imds,net,Classes=classNames,WriteLocation=tempdir);
Running semantic segmentation network
-------------------------------------
* Processed 100 images.

予測の品質の評価

予測されたラベルはグラウンド トゥルース ラベルと比較されます。セマンティック セグメンテーション メトリクスが計算されている間、進行状況がコマンド ウィンドウに出力されます。

metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTruth);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 100 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.99074          0.99183       0.91118      0.98299        0.80563  

クラス メトリクスの検査

データセットの各クラスの分類の精度、Intersection over Union (IoU)、および境界 F-1 スコアを表示します。

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

    triangle      0.99302     0.83206      0.67208  
    background    0.99063      0.9903      0.93918  

混同行列の表示

混同行列を表示します。

metrics.ConfusionMatrix
ans=2×2 table
                  triangle    background
                  ________    __________

    triangle        4697           33   
    background       915        96755   

正規化された混同行列を Figure ウィンドウの混同チャートとして可視化します。

cm = confusionchart(metrics.ConfusionMatrix.Variables, ...
  classNames,Normalization="row-normalized");
cm.Title = "Normalized Confusion Matrix (%)";

イメージ メトリクスの検査

イメージごとの Intersection over Union (IoU) のヒストグラムを可視化します。

imageIoU = metrics.ImageMetrics.MeanIoU;
figure
histogram(imageIoU)
title("Image Mean IoU")

最小の IoU を持つテスト イメージを見つけます。

[minIoU, worstImageIndex] = min(imageIoU);
minIoU = minIoU(1);
worstImageIndex = worstImageIndex(1);

比較用に、最悪の IoU を持つテスト イメージ、そのグラウンド トゥルース ラベル、およびその予測されたラベルを読み取ります。

worstTestImage = readimage(imds,worstImageIndex);
worstTrueLabels = readimage(pxdsTruth,worstImageIndex);
worstPredictedLabels = readimage(pxdsResults,worstImageIndex);

ラベル イメージを Figure ウィンドウに表示できるイメージに変換します。

worstTrueLabelImage = im2uint8(worstTrueLabels == classNames(1));
worstPredictedLabelImage = im2uint8(worstPredictedLabels == classNames(1));

最悪のテスト イメージ、グラウンド トゥルースおよび予測を表示します。

worstMontage = cat(4,worstTestImage,worstTrueLabelImage,worstPredictedLabelImage);
worstMontage = imresize(worstMontage,4,"nearest");
figure
montage(worstMontage,Size=[1 3])
title("Test Image vs. Truth vs. Prediction. IoU = "+minIoU)

同様に、最高の IoU を持つテスト イメージを見つけます。

[maxIoU, bestImageIndex] = max(imageIoU);
maxIoU = maxIoU(1);
bestImageIndex = bestImageIndex(1);

前の手順を繰り返して、最高の IoU を持つテスト イメージをそのグラウンド トゥルースおよび予測されたラベルと共に読み取り、変換し、表示します。

bestTestImage = readimage(imds,bestImageIndex);
bestTrueLabels = readimage(pxdsTruth,bestImageIndex);
bestPredictedLabels = readimage(pxdsResults,bestImageIndex);

bestTrueLabelImage = im2uint8(bestTrueLabels == classNames(1));
bestPredictedLabelImage = im2uint8(bestPredictedLabels == classNames(1));

bestMontage = cat(4,bestTestImage,bestTrueLabelImage,bestPredictedLabelImage);
bestMontage = imresize(bestMontage,4,"nearest");
figure
montage(bestMontage,Size=[1 3])
title("Test Image vs. Truth vs. Prediction. IoU = "+maxIoU)

評価するメトリクスの指定

オプションで、名前と値の引数 Metrics を使用して、評価するメトリクスをリストします。

計算するメトリクスを定義します。

evaluationMetrics = ["accuracy" "iou"];

triangleImages テスト データセットについてこれらのメトリクスを計算します。

metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTruth,Metrics=evaluationMetrics);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: class accuracy, IoU.
* Processed 100 images.
* Finalizing... Done.
* Data set metrics:

    MeanAccuracy    MeanIoU
    ____________    _______

      0.99183       0.91118

クラスごとに選択したメトリクスを表示します。

metrics.ClassMetrics
ans=2×2 table
                  Accuracy      IoU  
                  ________    _______

    triangle      0.99302     0.83206
    background    0.99063      0.9903

参考

| |

関連するトピック