В этом примере показано, как вычислить матрицу беспорядка семантической сегментации для отдельных блоков в blockedImage
объект, затем вычислите глобальную переменную и метрики сегментации блока.
Загрузите предварительно обученную сеть, которая выполняет бинарную сегментацию треугольников на фоне.
load('triangleSegmentationNetwork');
triangleImages
набор данных имеет 100 тестовых изображений с метками основной истины. Задайте местоположение набора данных.
dataSetDir = fullfile(toolboxdir('vision'),'visiondata','triangleImages');
Задайте местоположение тестовых изображений.
testImagesDir = fullfile(dataSetDir,'testImages');
Считайте три тестовых изображения. Измените размер каждого изображения на коэффициент четыре, преобразуйте его в тип данных double
, затем создайте blockedImage
объект. blockedImage
поддерживает основанные на блоке рабочие процессы обработки изображений.
numImages = 3; for idx = 1:numImages im = imread(fullfile(testImagesDir,['image_' '00' num2str(idx) '.jpg'])); im = imresize(im,4); testImages(idx) = blockedImage(im); end
Отобразите первое тестовое изображение.
bigimageshow(testImages(1))
Задайте местоположение меток основной истины.
testLabelsDir = fullfile(dataSetDir,'testLabels');
Задайте имена классов и их связанную метку IDs.
classNames = ["triangle","background"]; labelIDs = [255 0];
Читайте в метках основной истины для каждого тестового изображения. Создайте blockedImage
объект от каждой метки основной истины.
for idx = 1:numImages gtLabel = imread(fullfile(testLabelsDir,['labeled_image_' '00' num2str(idx) '.png'])); gtLabel = imresize(gtLabel,4,'nearest'); groundTruthImages(idx) = blockedImage(gtLabel); end
Отобразите первое изображение основной истины.
bigimageshow(groundTruthImages(1))
Для каждого тестового изображения используйте apply
функционируйте, чтобы обработать каждый блок. apply
функция выполняет операции, заданные функцией помощника segmentAndCalculateBlockMetrics
, который задан в конце этого примера. Функция выполняет семантическую сегментацию каждого блока и вычисляет матрицу беспорядка между метками основной истины и предсказанным.
blockSize = [32 32]; datasetConfMat = table; for idx = 1:numImages [segmentedImages(idx),blockConfMatOneImage] = apply(testImages(idx), ... @(block,labeledImageBlock) segmentAndCalculateBlockMetrics(block,labeledImageBlock,net,classNames,labelIDs), ... 'ExtraImages',groundTruthImages(idx),'PadPartialBlocks',true,'BlockSize',blockSize,'UseParallel',false); % Read all the block results of an image and update the image number blockConfMatOneImageDS = blockedImageDatastore(blockConfMatOneImage); blockConfMat = readall(blockConfMatOneImageDS); blockConfMat = struct2table([blockConfMat{:}]); blockConfMat.ImageNumber = idx.*ones(height(blockConfMat),1); datasetConfMat = [datasetConfMat;blockConfMat]; 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,classNames,labelIDs) outputLabeledImageBlock = semanticseg(block.Data,net); % Convert the ground truth labels to categorical labeledImageBlock = categorical(labeledImageBlock,labelIDs,classNames); confusionMatrix = segmentationConfusionMatrix(outputLabeledImageBlock,labeledImageBlock); % blockConfMatPerBlock is a struct with confusion matrices, image number % and blockInfo. Use the struct with evaluateSemanticSegmentation to % calculate metrics and aggregate block-based results. blockConfMatPerBlock.ConfusionMatrix = confusionMatrix; blockConfMatPerBlock.ImageNumber = block.ImageNumber; blockInfo.Start = block.Start; blockInfo.End = block.End; blockConfMatPerBlock.BlockInfo = blockInfo; end
apply
| bigimage
| evaluateSemanticSegmentation
| segmentationConfusionMatrix
| semanticSegmentationMetrics