В этом примере показано, как вычислить матрицу путаницы семантической сегментации для отдельных блоков в blockedImage
затем вычислите глобальные и блочные метрики сегментации.
Загрузите предварительно обученную сеть, которая выполняет двоичную сегментацию треугольников на фоне.
load('triangleSegmentationNetwork');
The triangleImages
набор данных имеет 100 тестовых изображений с основной истиной метками. Определите местоположение набора данных.
dataSetDir = fullfile(toolboxdir('vision'),'visiondata','triangleImages');
Определите местоположение тестовых изображений.
testImagesDir = fullfile(dataSetDir,'testImages');
Прочтите три тестовых изображения. Измените размер каждого изображения в четыре раза, преобразуйте его в тип данных double
, затем создайте blockedImage
объект. A 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');
Задайте имена классов и связанные с ними идентификаторы меток.
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
функция для обработки каждого блока. The 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
The 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