В этом примере показано, как вычислить матрицу беспорядка семантической сегментации для отдельных блоков в категориальном bigimage
объект, затем вычислите глобальную переменную и метрики сегментации блока.
Загрузите предварительно обученную сеть, которая выполняет бинарную сегментацию треугольников на фоне.
load('triangleSegmentationNetwork');
triangleImages
набор данных имеет 100 тестовых изображений с метками основной истины. Задайте местоположение набора данных.
dataSetDir = fullfile(toolboxdir('vision'),'visiondata','triangleImages');
Задайте местоположение тестовых изображений.
testImagesDir = fullfile(dataSetDir,'testImages');
Считайте три тестовых изображения. Измените размер каждого изображения на коэффициент четыре, преобразуйте его в тип данных double
, затем создайте bigimage
объект. bigimage
поддерживает основанные на блоке рабочие процессы обработки изображений.
numImages = 3; for idx = 1:numImages im = imread(fullfile(testImagesDir,['image_' '00' num2str(idx) '.jpg'])); im = imresize(im,4); testImages(idx) = bigimage(im); end
Отобразите первое тестовое изображение.
bigimageshow(testImages(1))
Задайте местоположение меток основной истины.
testLabelsDir = fullfile(dataSetDir,'testLabels');
Задайте имена классов и их связанную метку IDs.
classNames = ["triangle","background"]; labelIDs = [255 0];
Читайте в метках основной истины для каждого тестового изображения. Создайте категориальный bigimage
объект от метки основной истины.
for idx = 1:numImages gtLabel = imread(fullfile(testLabelsDir,['labeled_image_' '00' num2str(idx) '.png'])); gtLabel = imresize(gtLabel,4,'nearest'); groundTruthImages(idx) = bigimage(gtLabel, ... 'Classes',classNames,'PixelLabelIDs',labelIDs,'UndefinedID',1); end
Отобразите первое изображение основной истины.
bigimageshow(groundTruthImages(1))
Для каждого тестового изображения используйте apply
функционируйте, чтобы обработать каждый блок. apply
функция выполняет операции, заданные функцией помощника segmentAndCalculateBlockMetrics
, который задан в конце этого примера. Функция выполняет семантическую сегментацию каждого блока и вычисляет матрицу беспорядка между метками основной истины и предсказанным.
blockSize = [32 32]; datasetConfMat = table(); for idx = 1:numImages [segmentedImages(idx),blockConfMatOneImage] = apply(testImages(idx),1, ... @(block,labeledImageBlock,blockInfo) segmentAndCalculateBlockMetrics(block,labeledImageBlock,net,blockInfo), ... groundTruthImages(idx),'PadPartialBlocks',true, ... 'BlockSize',blockSize,'UseParallel',false,'IncludeBlockInfo',true); % Add an image number corresponding to the block results for each image blockConfMatOneImage.ImageNumber = idx.*ones(height(blockConfMatOneImage),1); datasetConfMat = [datasetConfMat;blockConfMatOneImage]; end
Отобразите первое сегментированное изображение.
bigimageshow(segmentedImages(1))
Оцените метрики набора данных и метрики блока для сегментации.
[metrics,blockMetrics] = evaluateSemanticSegmentation(datasetConfMat,classNames,'Metrics','all');
Evaluating semantic segmentation results ---------------------------------------- * Selected metrics: global accuracy, class accuracy, IoU, weighted IoU. * Processed 3 images. * Finalizing... Done. * Data set metrics: GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU ______________ ____________ _______ ___________ 0.95428 0.82739 0.69927 0.92533
Вычислите счет Jaccard ко всем изображениям.
jaccardSimilarity = metrics.ImageMetrics.MeanIoU
jaccardSimilarity = 3×1
0.7664
0.7277
0.6538
segmentAndCalculateBlockMetrics
функция выполняет семантическую сегментацию одного блока, затем вычисляет матрицу беспорядка меток основной истины и предсказанного.
function [outputLabeledImageBlock,blockConfMatPerBlock] = segmentAndCalculateBlockMetrics(block,labeledImageBlock,net,blockInfo) outputLabeledImageBlock = semanticseg(block,net); confusionMatrix = segmentationConfusionMatrix(outputLabeledImageBlock,labeledImageBlock); % blockConfMatPerBlock is a struct with confusion matrices and % blockInfo. Use the struct with evaluateSemanticSegmentation to % calculate metrics and aggregate block-based results. blockConfMatPerBlock.ConfusionMatrix = confusionMatrix; blockConfMatPerBlock.BlockInfo = blockInfo; end
apply
| bigimage
| evaluateSemanticSegmentation
| segmentationConfusionMatrix
| semanticSegmentationMetrics