セマンティック セグメンテーションの結果の評価と検査
テスト データ セットをインポートして、事前学習済みのセマンティック セグメンテーション ネットワークを実行し、予測される結果に対してセマンティック セグメンテーションの品質メトリクスを検査します。
データセットのインポート
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
参考
semanticseg
| semanticSegmentationMetrics
| evaluateSemanticSegmentation