Evaluate semantic segmentation data set against ground truth
computes semantic segmentation metrics using one or more
ssm
= evaluateSemanticSegmentation(dsResults
,dsTruth
,Name,Value
)Name,Value
pair arguments to control the evaluation.
Evaluate the results of semantic segmentation by computing a confusion matrix and metrics for each class, each image, and the entire data set.
Perform Semantic Segmentation
Label each pixel in a series of images either as an object or as the background. This example uses the triangleImages
data set, which has 100 test images of triangles with ground truth labels.
Define the location of the data set, test images, and ground truth labels.
dataSetDir = fullfile(toolboxdir('vision'),'visiondata','triangleImages'); testImagesDir = fullfile(dataSetDir,'testImages'); testLabelsDir = fullfile(dataSetDir,'testLabels');
Create an image datastore holding the test images.
imds = imageDatastore(testImagesDir);
Define the class names and their associated label IDs.
classNames = ["triangle","background"]; labelIDs = [255 0];
Create a pixel label datastore holding the ground truth pixel labels for the test images.
pxdsTruth = pixelLabelDatastore(testLabelsDir,classNames,labelIDs);
Load a semantic segmentation network that has been trained on the training images of noisy shapes.
net = load('triangleSegmentationNetwork');
net = net.net;
Run the network on the test images. Predicted labels are written to disk in a temporary folder and returned as a pixelLabelDatastore
.
pxdsResults = semanticseg(imds,net,"WriteLocation",tempdir);
Running semantic segmentation network ------------------------------------- * Processed 100 images.
Compute Confusion Matrix and Segmentation Metrics
Evaluate the prediction results against the ground truth. By default, evaluateSemanticSegmentation
computes all available metrics, including the confusion matrix, normalized confusion matrix, data set metrics, class metrics, and image metrics.
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.90624 0.95085 0.61588 0.87529 0.40652
metrics = semanticSegmentationMetrics with properties: ConfusionMatrix: [2x2 table] NormalizedConfusionMatrix: [2x2 table] DataSetMetrics: [1x5 table] ClassMetrics: [2x3 table] ImageMetrics: [100x5 table]
To explore the results, display the classification accuracy, the intersection over union, and the boundary F-1 score for each class. These values are stored in the ClassMetrics
property. Also, display the normalized confusion matrix.
metrics.ClassMetrics
ans=2×3 table
Accuracy IoU MeanBFScore
________ _______ ___________
triangle 1 0.33005 0.028664
background 0.9017 0.9017 0.78438
metrics.NormalizedConfusionMatrix
ans=2×2 table
triangle background
________ __________
triangle 1 0
background 0.0983 0.9017
dsResults
— Predicted pixel labelsPixelLabelDatastore
object | PixelLabelImageDatastore
| cell array of datastore objectsPredicted pixel labels resulting from semantic segmentation, specified as
a datastore or a cell array of datastore objects.
dsResults
can be any datastore that returns
categorical images, such as PixelLabelDatastore
or pixelLabelImageDatastore
. The read
(dsResults
) must return a
categorical array, a cell array, or a table. If the
read
function returns a multicolumn cell array or
table, the second column must contain categorical arrays.
dsTruth
— Ground truth pixel labelsPixelLabelDatastore
object | cell array of PixelLabelDatastore
objectsGround truth pixel labels, specified as a datastore or a cell array of
datastore objects. dsResults
can be any datastore that
returns categorical images, such as PixelLabelDatastore
or pixelLabelImageDatastore
. Using read
(dsTruth
) must return a categorical
array, a cell array, or a table. If the read
function
returns a multicolumn cell array or table, the second column must contain
categorical arrays.
Specify optional
comma-separated pairs of Name,Value
arguments. Name
is
the argument name and Value
is the corresponding value.
Name
must appear inside quotes. You can specify several name and value
pair arguments in any order as
Name1,Value1,...,NameN,ValueN
.
metrics =
evaluateSemanticSegmentation(pxdsResults,pxdsTruth,'Metrics',"bfscore")
computes only the mean BF score of each class, each image, and the entire data
set.'Metrics'
— Segmentation metrics"all"
(default) | vector of stringsSegmentation metrics in semanticSegmentationMetrics
to compute, specified as the
comma-separated pair consisting of 'Metrics'
and a
vector of strings. This argument specifies which variables in the
DataSetMetrics
, ClassMetrics
,
and ImageMetrics
tables to compute.
ConfusionMatrix
and
NormalizedConfusionMatrix
are computed regardless
of the value of 'Metric'
.
Value | Description | Aggregate Data Set Metric | Image Metric | Class Metric |
---|---|---|---|---|
"all" | Evaluate all semantic segmentation metrics. | All aggregate data set metrics | All image metrics | All class metrics |
"accuracy" |
Accuracy indicates the percentage of correctly identified pixels for each class. Use the accuracy metric if you want to know how well each class correctly identifies pixels.
The class accuracy is a simple metric analogous to global accuracy, but it can be misleading. For example, labeling all pixels "car" gives a perfect score for the "car" class (although not for the other classes). Use class accuracy in conjuction with IoU for a more complete evaluation of segmentation results. | MeanAccuracy | MeanAccuracy | Accuracy |
"bfscore" |
The boundary F1 (BF) contour matching score indicates how well the predicted boundary of each class aligns with the true boundary. Use the BF score if you want a metric that tends to correlate better with human qualitative assessment than the IoU metric.
For more information, see
| MeanBFScore | MeanBFScore | MeanBFScore |
"global-accuracy" |
| GlobalAccuracy | GlobalAccuracy | none |
"iou" |
Intersection over union (IoU), also known as the Jaccard similarity coefficient, is the most commonly used metric. Use the IoU metric if you want a statistical accuracy measurement that penalizes false positives.
For more information, see | MeanIoU | MeanIoU | IoU |
"weighted-iou" | Average IoU of each class, weighted by the number of pixels in that class. Use this metric if images have disproportionally sized classes, to reduce the impact of errors in the small classes on the aggregate quality score. | WeightedIoU | WeightedIoU | none |
Example: metrics = evaluateSemanticSegmentation(pxdsResults,
pxdsTruth,'Metrics',["global-accuracy","iou"])
calculates
the global accuracy and IoU metrics across the data set, images, and
classes.
Data Types: string
'Verbose'
— Flag to display evaluation progress1
(default) | 0
Flag to display evaluation progress information in the command window,
specified as the comma-separated pair consisting of
'Verbose'
and either 1
(true
) or 0
(false
).
The displayed information includes a progress bar, elapsed time, estimated time remaining, and data set metrics.
Example: metrics = evaluateSemanticSegmentation(pxdsResults,
pxdsTruth,'Verbose',0)
calculates segmentation metrics
without displaying progress information.
Data Types: logical
ssm
— Semantic segmentation metricssemanticSegmentationMetrics
objectSemantic segmentation metrics, returned as a semanticSegmentationMetrics
object.
[1] Csurka, G., D. Larlus, and F. Perronnin. "What is a good evaluation measure for semantic segmentation?" Proceedings of the British Machine Vision Conference, 2013, pp. 32.1–32.11.
To run in parallel, set 'UseParallel'
to true
or enable
this by default using the Computer
Vision Toolbox™ preferences.
For more information, see Parallel Computing Toolbox Support.
Parallel processing is only supported when the input datastores is a
pixelLabelDatastore
or a pixelLabelImageDatastore
.
You have a modified version of this example. Do you want to open this example with your edits?