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

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

См. также

| | | |

Похожие примеры

Подробнее о