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

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

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

| | | |

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

Больше о