Вычислите метрики сегментации в основанном на блоке рабочем процессе

В этом примере показано, как вычислить матрицу беспорядка семантической сегментации для отдельных блоков в 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

Смотрите также

| | | |

Связанные примеры

Больше о