exponenta event banner

Расчет показателей сегментации в рабочем процессе на основе блоков

В этом примере показано, как вычислить матрицу путаницы семантической сегментации для отдельных блоков в blockedImage затем вычислите глобальные и блочные метрики сегментации.

Загрузите предварительно подготовленную сеть, которая выполняет двоичную сегментацию треугольников на фоне.

load('triangleSegmentationNetwork');

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 для обработки каждого блока. 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

См. также

| | | |

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

Подробнее