semanticseg

Семантическая сегментация изображений с помощью глубокого обучения

Описание

пример

C = semanticseg(I,network) возвращает семантическую сегментацию входного изображения с помощью глубокого обучения. Вход network должен быть любой SeriesNetwork или DAGNetwork объект.

[C,score,allScores] = semanticseg(I,network) возвращает семантическую сегментацию входного изображения с музыкой классификации к каждой категориальной метке в C. Функция возвращает баллы в массиве, который соответствует каждому пикселю или вокселу во входном изображении. allScores содержит музыку ко всем категориям метки, которые может классифицировать входная сеть.

[___] = semanticseg(I,network,roi) возвращает семантическую сегментацию для прямоугольной подобласти входного изображения.

pxds = semanticseg(ds,network) возвращает семантическую сегментацию для набора изображений в ds, объект ds datastore.

Функция поддерживает параллельные вычисления с помощью нескольких рабочих MATLAB®. Можно включить параллельные вычисления с помощью диалогового окна Настроек Computer Vision Toolbox.

[___] = semanticseg(___,Name,Value) возвращает семантическую сегментацию с дополнительными опциями, заданными одним или несколькими аргументами пары "имя-значение".

Примеры

свернуть все

Наложите результаты сегментации на изображении и отобразите результаты.

Загрузите предварительно обученную сеть.

data = load('triangleSegmentationNetwork');
net = data.net
net = 
  SeriesNetwork with properties:

         Layers: [10x1 nnet.cnn.layer.Layer]
     InputNames: {'imageinput'}
    OutputNames: {'classoutput'}

Перечислите сетевые слои.

net.Layers
ans = 
  10x1 Layer array with layers:

     1   'imageinput'        Image Input                  32x32x1 images with 'zerocenter' normalization
     2   'conv_1'            Convolution                  64 3x3x1 convolutions with stride [1  1] and padding [1  1  1  1]
     3   'relu_1'            ReLU                         ReLU
     4   'maxpool'           Max Pooling                  2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     5   'conv_2'            Convolution                  64 3x3x64 convolutions with stride [1  1] and padding [1  1  1  1]
     6   'relu_2'            ReLU                         ReLU
     7   'transposed-conv'   Transposed Convolution       64 4x4x64 transposed convolutions with stride [2  2] and cropping [1  1  1  1]
     8   'conv_3'            Convolution                  2 1x1x64 convolutions with stride [1  1] and padding [0  0  0  0]
     9   'softmax'           Softmax                      softmax
    10   'classoutput'       Pixel Classification Layer   Class weighted cross-entropy loss with classes 'triangle' and 'background'

Считайте и отобразите тестовое изображение.

I = imread('triangleTest.jpg');
figure
imshow(I)

Выполните семантическую сегментацию изображений.

[C,scores] = semanticseg(I,net);

Наложите результаты сегментации на изображении и отобразите результаты.

B = labeloverlay(I, C);
figure
imshow(B)

Отобразите баллы классификации.

figure
imagesc(scores)
axis square
colorbar

Создайте бинарную маску только с треугольниками.

BW = C == 'triangle';
figure
imshow(BW)

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

Загрузите предварительно обученную сеть.

data = load('triangleSegmentationNetwork');
net = data.net;

Изображения нагрузочного теста с помощью imageDatastore.

dataDir = fullfile(toolboxdir('vision'),'visiondata','triangleImages');
testImageDir = fullfile(dataDir,'testImages');
imds = imageDatastore(testImageDir)
imds = 
  ImageDatastore with properties:

                       Files: {
                              ' .../toolbox/vision/visiondata/triangleImages/testImages/image_001.jpg';
                              ' .../toolbox/vision/visiondata/triangleImages/testImages/image_002.jpg';
                              ' .../toolbox/vision/visiondata/triangleImages/testImages/image_003.jpg'
                               ... and 97 more
                              }
    AlternateFileSystemRoots: {}
                    ReadSize: 1
                      Labels: {}
                     ReadFcn: @readDatastoreImage

Загрузите тестовые метки основной истины.

testLabelDir = fullfile(dataDir,'testLabels');
classNames = ["triangle" "background"];
pixelLabelID = [255 0];
pxdsTruth = pixelLabelDatastore(testLabelDir,classNames,pixelLabelID);

Запустите семантическую сегментацию на всех тестовых изображениях.

pxdsResults = semanticseg(imds,net,'MiniBatchSize',32,'WriteLocation',tempdir);
Running semantic segmentation network
-------------------------------------
* Processed 100 images.

Сравните результаты с основной истиной.

metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTruth)
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 100 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.90624          0.95085       0.61588      0.87529        0.40652  
metrics = 
  semanticSegmentationMetrics with properties:

              ConfusionMatrix: [2x2 table]
    NormalizedConfusionMatrix: [2x2 table]
               DataSetMetrics: [1x5 table]
                 ClassMetrics: [2x3 table]
                 ImageMetrics: [100x5 table]

Задайте и создайте пользовательский слой классификации пикселей, который использует потерю Dice.

Можно использовать этот слой, чтобы обучить сети семантической сегментации. Чтобы узнать больше о создании пользовательских слоев глубокого обучения, смотрите, Задают Пользовательские Слои Глубокого обучения (Deep Learning Toolbox).

Поставьте на карту потерю

Потеря Dice основана на коэффициенте подобия Sørensen-Dice для измерения перекрытия между двумя сегментированными изображениями. Обобщенная потеря Dice [1,2] L поскольку между одним изображением Y и соответствующая основная истина T дают

L=1-2k=1Kwkm=1MYкмTкмk=1Kwkm=1MYкм2+Tкм2 ,

где K количество классов, M число элементов по первым двум измерениям Y, иwk специфичный для класса фактор взвешивания, который управляет вкладом, который каждый класс делает к потере. wk обычно обратная область ожидаемой области:

wk=1(m=1MTкм)2

Это взвешивание помогает возразить, что влияние более крупных областей на Dice выигрывает, и облегчает для сети изучать, как сегментировать меньшие области.

Шаблон слоя классификации

Скопируйте шаблон слоя классификации в новый файл в MATLAB®. Этот шаблон обрисовывает в общих чертах структуру слоя классификации и включает функции, которые задают поведение слоя. Остальная часть примера показывает, как завершить dicePixelClassificationLayer.

classdef dicePixelClassificationLayer < nnet.layer.ClassificationLayer

   properties
      % Optional properties
   end

   methods

        function loss = forwardLoss(layer, Y, T)
            % Layer forward loss function goes here.
        end
        
        function dLdY = backwardLoss(layer, Y, T)
            % Layer backward loss function goes here.
        end
    end
end

Объявите свойства слоя

По умолчанию пользовательские выходные слои имеют следующие свойства:

  • Name — Имя слоя, заданное как вектор символов или скаляр строки. Чтобы включать этот слой в график слоя, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть с этим слоем и Name установлен в '', затем программное обеспечение автоматически присваивает имя в учебное время.

  • Description — Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в Layer массив. Если вы не задаете описание слоя, то программное обеспечение отображает имя класса слоя.

  • Type — Тип слоя, заданного как вектор символов или скаляр строки. Значение Type появляется, когда слой отображен в Layer массив. Если вы не задаете тип слоя, то программное обеспечение отображает 'Classification layer' или 'Regression layer'.

Пользовательские слои классификации также имеют следующее свойство:

  • Classes — Классы выходного слоя, заданного как категориальный вектор, массив строк, массив ячеек из символьных векторов или 'auto'. Если Classes 'auto', затем программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str, затем программное обеспечение устанавливает классы выходного слоя к categorical(str,str). Значением по умолчанию является 'auto'.

Если слой не имеет никаких других свойств, то можно не использовать properties раздел.

Потеря Dice требует, чтобы маленькое постоянное значение предотвратило деление на нуль. Задайте свойство, Epsilon, содержать это значение.

classdef dicePixelClassificationLayer < nnet.layer.ClassificationLayer

    properties(Constant)
       % Small constant to prevent division by zero. 
       Epsilon = 1e-8;

    end

    ...
end

Создайте функцию конструктора

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

Задайте дополнительное имя входного параметра, чтобы присвоить Name свойство при создании.

        function layer = dicePixelClassificationLayer(name)
            % layer =  dicePixelClassificationLayer(name) creates a Dice
            % pixel classification layer with the specified name.
            
            % Set layer name.          
            layer.Name = name;
            
            % Set layer description.
            layer.Description = 'Dice loss';
        end

Создайте прямую функцию потерь

Создайте функцию с именем forwardLoss это возвращает взвешенную перекрестную энтропийную потерю между прогнозами, сделанными сетью и учебными целями. Синтаксис для forwardLoss loss = forwardLoss(layer, Y, T), где Y выход предыдущего слоя и T представляет учебные цели.

Для проблем семантической сегментации, размерностей T совпадайте с размерностью Y, где Y 4-D массив размера H- W- K- N, где K количество классов и N мини-пакетный размер.

Размер Y зависит от выхода предыдущего слоя. Гарантировать тот Y одного размера с T, необходимо включать слой, который выводит правильный размер перед выходным слоем. Например, чтобы гарантировать тот Y 4-D массив музыки прогноза к K классы, можно включать полносвязный слой размера K или сверточный слой с K фильтры сопровождаются softmax слоем перед выходным слоем.

        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the Dice loss between
            % the predictions Y and the training targets T.   

            % Weights by inverse of region size.
            W = 1 ./ sum(sum(T,1),2).^2;
            
            intersection = sum(sum(Y.*T,1),2);
            union = sum(sum(Y.^2 + T.^2, 1),2);          
            
            numer = 2*sum(W.*intersection,3) + layer.Epsilon;
            denom = sum(W.*union,3) + layer.Epsilon;
            
            % Compute Dice score.
            dice = numer./denom;
            
            % Return average Dice loss.
            N = size(Y,4);
            loss = sum((1-dice))/N;
            
        end

Создайте обратную функцию потерь

Создайте обратную функцию потерь, которая возвращает производные потери Dice относительно прогнозов Y. Синтаксис для backwardLoss loss = backwardLoss(layer, Y, T), где Y выход предыдущего слоя и T представляет учебные цели.

Размерности Y и T совпадают с входными параметрами в forwardLoss.

        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the Dice loss with respect to the predictions Y.
            
            % Weights by inverse of region size.
            W = 1 ./ sum(sum(T,1),2).^2;
            
            intersection = sum(sum(Y.*T,1),2);
            union = sum(sum(Y.^2 + T.^2, 1),2);
     
            numer = 2*sum(W.*intersection,3) + layer.Epsilon;
            denom = sum(W.*union,3) + layer.Epsilon;
            
            N = size(Y,4);
      
            dLdY = (2*W.*Y.*numer./denom.^2 - 2*W.*T./denom)./N;
        end

Завершенный слой

Завершенный слой обеспечивается в dicePixelClassificationLayer.m.

classdef dicePixelClassificationLayer < nnet.layer.ClassificationLayer
    % This layer implements the generalized Dice loss function for training
    % semantic segmentation networks.
    
    properties(Constant)
        % Small constant to prevent division by zero. 
        Epsilon = 1e-8;
    end
    
    methods
        
        function layer = dicePixelClassificationLayer(name)
            % layer =  dicePixelClassificationLayer(name) creates a Dice
            % pixel classification layer with the specified name.
            
            % Set layer name.          
            layer.Name = name;
            
            % Set layer description.
            layer.Description = 'Dice loss';
        end
        
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the Dice loss between
            % the predictions Y and the training targets T.   

            % Weights by inverse of region size.
            W = 1 ./ sum(sum(T,1),2).^2;
            
            intersection = sum(sum(Y.*T,1),2);
            union = sum(sum(Y.^2 + T.^2, 1),2);          
            
            numer = 2*sum(W.*intersection,3) + layer.Epsilon;
            denom = sum(W.*union,3) + layer.Epsilon;
            
            % Compute Dice score.
            dice = numer./denom;
            
            % Return average Dice loss.
            N = size(Y,4);
            loss = sum((1-dice))/N;
            
        end
        
        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the Dice loss with respect to the predictions Y.
            
            % Weights by inverse of region size.
            W = 1 ./ sum(sum(T,1),2).^2;
            
            intersection = sum(sum(Y.*T,1),2);
            union = sum(sum(Y.^2 + T.^2, 1),2);
     
            numer = 2*sum(W.*intersection,3) + layer.Epsilon;
            denom = sum(W.*union,3) + layer.Epsilon;
            
            N = size(Y,4);
      
            dLdY = (2*W.*Y.*numer./denom.^2 - 2*W.*T./denom)./N;
        end
    end
end

Совместимость графического процессора

Для совместимости графического процессора функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray. Любые другие функции, используемые слоем, должны сделать то же самое.

Функции MATLAB используются в forwardLoss и backwardLoss в dicePixelClassificationLayer вся поддержка gpuArray входные параметры, таким образом, слоем является совместимый графический процессор.

Проверяйте Выходную валидность слоя

Создайте экземпляр слоя.

layer = dicePixelClassificationLayer('dice');

Проверяйте валидность слоя слоя с помощью checkLayer. Задайте допустимый входной размер, чтобы быть размером одного наблюдения за типичным входом к слою. Слой ожидает H- W- K- N входные параметры массивов, где K количество классов и N количество наблюдений в мини-пакете.

numClasses = 2;
validInputSize = [4 4 numClasses];
checkLayer(layer,validInputSize, 'ObservationDimension',4)
Running nnet.checklayer.OutputLayerTestCase
.......... .......
Done nnet.checklayer.OutputLayerTestCase
__________

Test Summary:
	 17 Passed, 0 Failed, 0 Incomplete, 0 Skipped.
	 Time elapsed: 1.6227 seconds.

Тестовые сводные отчеты количество переданных, отказавших, неполные, и пропущенные тесты.

Используйте пользовательский слой в сети Семантической Сегментации

Создайте сеть семантической сегментации, которая использует dicePixelClassificationLayer.

layers = [
    imageInputLayer([32 32 1])
    convolution2dLayer(3,64,'Padding',1)
    reluLayer
    maxPooling2dLayer(2,'Stride',2)
    convolution2dLayer(3,64,'Padding',1)
    reluLayer
    transposedConv2dLayer(4,64,'Stride',2,'Cropping',1)
    convolution2dLayer(1,2)
    softmaxLayer
    dicePixelClassificationLayer('dice')]
layers = 
  10x1 Layer array with layers:

     1   ''       Image Input              32x32x1 images with 'zerocenter' normalization
     2   ''       Convolution              64 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     3   ''       ReLU                     ReLU
     4   ''       Max Pooling              2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     5   ''       Convolution              64 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     6   ''       ReLU                     ReLU
     7   ''       Transposed Convolution   64 4x4 transposed convolutions with stride [2  2] and output cropping [1  1]
     8   ''       Convolution              2 1x1 convolutions with stride [1  1] and padding [0  0  0  0]
     9   ''       Softmax                  softmax
    10   'dice'   Classification Output    Dice loss

Загрузите обучающие данные для семантической сегментации с помощью imageDatastore и pixelLabelDatastore.

dataSetDir = fullfile(toolboxdir('vision'),'visiondata','triangleImages');
imageDir = fullfile(dataSetDir,'trainingImages');
labelDir = fullfile(dataSetDir,'trainingLabels');

imds = imageDatastore(imageDir);

classNames = ["triangle" "background"];
labelIDs = [255 0];
pxds = pixelLabelDatastore(labelDir, classNames, labelIDs);

Сопоставьте изображение и данные о пиксельных метках с помощью pixelLabelImageDatastore.

ds = pixelLabelImageDatastore(imds,pxds);

Установите опции обучения и обучите сеть.

options = trainingOptions('sgdm', ...
    'InitialLearnRate',1e-2, ...
    'MaxEpochs',100, ...
    'LearnRateDropFactor',1e-1, ...
    'LearnRateDropPeriod',50, ...
    'LearnRateSchedule','piecewise', ...
    'MiniBatchSize',128);

net = trainNetwork(ds,layers,options);
Training on single GPU.
Initializing image normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:03 |       27.89% |       0.8346 |          0.0100 |
|      50 |          50 |       00:00:34 |       89.67% |       0.6384 |          0.0100 |
|     100 |         100 |       00:01:09 |       94.35% |       0.5024 |          0.0010 |
|========================================================================================|

Оцените обучивший сеть путем сегментации тестового изображения и отображения результата сегментации.

I = imread('triangleTest.jpg');

[C,scores] = semanticseg(I,net);

B = labeloverlay(I,C);
figure
imshow(imtile({I,B}))

Обучите сеть семантической сегментации использование расширенных сверток.

Семантическая сеть сегментации классифицирует каждый пиксель в изображении, получая к изображение, которое сегментировано по классам. Приложения для семантической сегментации включают дорожную сегментацию для автономного управления автомобилем и сегментацию раковой клетки для медицинского диагностирования. Чтобы узнать больше, смотрите Начало работы С Семантической Сегментацией Используя Глубокое обучение.

Сети семантической сегментации как DeepLab [1] делают широкое применение расширенных сверток (также известный atrous свертки), потому что они могут увеличить восприимчивое поле слоя (область входа, который слои видят), не увеличивая число параметров или расчетов.

Загрузите обучающие данные

Пример использует простой набор данных 32 32 треугольных изображений в целях рисунка. Набор данных включает сопроводительные пиксельные достоверные данные метки. Загрузите обучающие данные с помощью imageDatastore и pixelLabelDatastore.

dataFolder = fullfile(toolboxdir('vision'),'visiondata','triangleImages');
imageFolderTrain = fullfile(dataFolder,'trainingImages');
labelFolderTrain = fullfile(dataFolder,'trainingLabels');

Создайте imageDatastore для изображений.

imdsTrain = imageDatastore(imageFolderTrain);

Создайте pixelLabelDatastore для пиксельных меток основной истины.

classNames = ["triangle" "background"];
labels = [255 0];
pxdsTrain = pixelLabelDatastore(labelFolderTrain,classNames,labels)
pxdsTrain = 
  PixelLabelDatastore with properties:

                       Files: {200×1 cell}
                  ClassNames: {2×1 cell}
                    ReadSize: 1
                     ReadFcn: @readDatastoreImage
    AlternateFileSystemRoots: {}

Создайте сеть Семантической Сегментации

Этот пример использует простую сеть семантической сегментации на основе расширенных сверток.

Создайте источник данных для обучающих данных и получите пиксельные счета для каждой метки.

pximdsTrain = pixelLabelImageDatastore(imdsTrain,pxdsTrain);
tbl = countEachLabel(pximdsTrain)
tbl=2×3 table
        Name        PixelCount    ImagePixelCount
    ____________    __________    _______________

    'triangle'           10326       2.048e+05   
    'background'    1.9447e+05       2.048e+05   

Большинство пиксельных меток для фона. Эта неустойчивость класса смещает процесс обучения в пользу доминирующего класса. Чтобы зафиксировать это, используйте взвешивание класса, чтобы сбалансировать классы. Можно использовать несколько методов, чтобы вычислить веса класса. Одна общепринятая методика является обратным взвешиванием частоты, где веса класса являются инверсией частот класса. Этот метод увеличивает вес, данный под представленными классами. Вычислите веса класса с помощью обратного взвешивания частоты.

numberPixels = sum(tbl.PixelCount);
frequency = tbl.PixelCount / numberPixels;
classWeights = 1 ./ frequency;

Создайте сеть для классификации пикселей при помощи входного слоя изображений с входным размером, соответствующим размеру входных изображений. Затем задайте три блока свертки, обработайте в пакетном режиме нормализацию и слои ReLU. Для каждого сверточного слоя задайте 32 3х3 фильтра с увеличивающимися факторами расширения и заполните входные параметры, таким образом, они одного размера с выходными параметрами путем установки 'Padding' опция к 'same'. Чтобы классифицировать пиксели, включайте сверточный слой с K свертки 1 на 1, где K является количеством классов, сопровождаемых softmax слоем и pixelClassificationLayer с обратными весами класса.

inputSize = [32 32 1];
filterSize = 3;
numFilters = 32;
numClasses = numel(classNames);

layers = [
    imageInputLayer(inputSize)
    
    convolution2dLayer(filterSize,numFilters,'DilationFactor',1,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    convolution2dLayer(filterSize,numFilters,'DilationFactor',2,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    convolution2dLayer(filterSize,numFilters,'DilationFactor',4,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    convolution2dLayer(1,numClasses)
    softmaxLayer
    pixelClassificationLayer('Classes',classNames,'ClassWeights',classWeights)];

Обучение сети

Задайте опции обучения.

options = trainingOptions('sgdm', ...
    'MaxEpochs', 100, ...
    'MiniBatchSize', 64, ... 
    'InitialLearnRate', 1e-3);

Обучите сеть с помощью trainNetwork.

net = trainNetwork(pximdsTrain,layers,options);
Training on single GPU.
Initializing image normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |       67.54% |       0.7098 |          0.0010 |
|      17 |          50 |       00:00:03 |       84.60% |       0.3851 |          0.0010 |
|      34 |         100 |       00:00:06 |       89.85% |       0.2536 |          0.0010 |
|      50 |         150 |       00:00:09 |       93.39% |       0.1959 |          0.0010 |
|      67 |         200 |       00:00:11 |       95.89% |       0.1559 |          0.0010 |
|      84 |         250 |       00:00:14 |       97.29% |       0.1188 |          0.0010 |
|     100 |         300 |       00:00:18 |       98.28% |       0.0970 |          0.0010 |
|========================================================================================|

Тестирование сети

Загрузите тестовые данные. Создайте imageDatastore для изображений. Создайте pixelLabelDatastore для пиксельных меток основной истины.

imageFolderTest = fullfile(dataFolder,'testImages');
imdsTest = imageDatastore(imageFolderTest);
labelFolderTest = fullfile(dataFolder,'testLabels');
pxdsTest = pixelLabelDatastore(labelFolderTest,classNames,labels);

Сделайте прогнозы с помощью тестовых данных, и обучил сеть.

pxdsPred = semanticseg(imdsTest,net,'WriteLocation',tempdir);
Running semantic segmentation network
-------------------------------------
* Processing 100 images.
* Progress: 100.00%

Оцените точность прогноза с помощью evaluateSemanticSegmentation.

metrics = evaluateSemanticSegmentation(pxdsPred,pxdsTest);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processing 100 images...
[==================================================] 100%
Elapsed time: 00:00:00
Estimated time remaining: 00:00:00
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.98334          0.99107       0.85869      0.97109        0.68197  

Для получения дополнительной информации об оценке сетей семантической сегментации смотрите evaluateSemanticSegmentation.

Сегмент новое изображение

Читайте и отобразитесь, тест отображают triangleTest.jpg.

imgTest = imread('triangleTest.jpg');
figure
imshow(imgTest)

Сегментируйте тестовое изображение с помощью semanticseg и отобразите результаты с помощью labeloverlay.

C = semanticseg(imgTest,net);
B = labeloverlay(imgTest,C);
figure
imshow(B)

Входные параметры

свернуть все

Введите изображение, заданное как одно из следующих.

Тип изображенияФормат данных
Одно 2D полутоновое изображение2D матрица размера H-by-W
Одно 2D цветное изображение или 2D многоспектральное изображениеТрехмерный массив размера H-by-W-by-C. Количество цветовых каналов C 3 для цветных изображений.
Серия P 2D изображенияМассив 4-D размера H-by-W-by-C-by-P. Количество цветовых каналов C 1 для полутоновых изображений и 3 для цветных изображений.
Одно 3-D полутоновое изображение с глубиной DТрехмерный массив размера H-by-W-by-D
Одно 3-D цветное изображение или 3-D многоспектральное изображениеМассив 4-D размера H-by-W-by-D-by-C. Количество цветовых каналов C 3 для цветных изображений.
Серия P 3-D изображенияМассив 5-D размера H-by-W-by-D-by-C-by-P

Входным изображением может также быть gpuArray содержа один из предыдущих типов изображения (требует Parallel Computing Toolbox™).

Типы данных: uint8 | uint16 | int16 | double | single | logical

Сеть, заданная как любой SeriesNetwork или DAGNetwork объект.

Необходимая область, заданная как одно из следующих.

Тип изображенияФормат ROI
2D изображениеВектор с 4 элементами формы [x, y, width, height]
3-D изображениеВектор с 6 элементами формы [x, y, z, width, height, depth]

Вектор задает прямоугольную или кубовидную необходимую область, полностью содержавшуюся во входном изображении. Пиксели изображения вне необходимой области присвоены <undefined> категориальная метка. Если входное изображение состоит из серии изображений, то semanticseg применяет тот же roi ко всем изображениям в ряду.

Набор изображений, заданных как datastore. read функция datastore должна возвратить числовой массив, массив ячеек или таблицу. Для массивов ячеек или таблиц с несколькими столбцами, функциональные процессы только первый столбец.

Для получения дополнительной информации смотрите Хранилища данных для Глубокого обучения (Deep Learning Toolbox).

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'ExecutionEnvironment', 'gpu'

Возвращенный тип сегментации, заданный как 'categorical''double', или 'uint8'. Когда вы задаете 'double' или 'uint8', функция возвращает результаты сегментации как массив метки, содержащий метку IDs. Идентификаторы являются целочисленными значениями, которые соответствуют именам классов, заданным в слое классификации, используемом во входной сети.

Вы не можете использовать OutputType свойство с ImageDatastore объектный вход.

Группа изображений, заданных как целое число. Изображения сгруппированы и обработаны вместе как пакет. Пакеты используются в обработке большого количества изображений, и они повышают вычислительную эффективность. Увеличение 'MiniBatchSize'повышения стоимости КПД, но это также поднимает больше памяти.

Аппаратный ресурс для обработки изображений с сетью, заданной как 'auto', 'gpu', или 'cpu'.

Среда выполненияОписание
'auto'Используйте графический процессор при наличии. В противном случае используйте центральный процессор. Использование графического процессора требует Parallel Computing Toolbox, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше.
'gpu'Используйте графический процессор. Если подходящий графический процессор не доступен, функция возвращает сообщение об ошибке.
'cpu'Используйте центральный процессор.

Оптимизация производительности, заданная как 'auto'MEX, или 'none'.

УскорениеОписание
'auto'Автоматически примените много оптимизации, подходящей для входной сети и аппаратного ресурса.
'mex'Скомпилируйте и выполните MEX-функцию. Эта опция доступна при использовании графического процессора только. Используя графический процессор требует Parallel Computing Toolbox, и CUDA включил NVIDIA, графический процессор с вычисляет возможность 3.0 или выше. Если Parallel Computing Toolbox или подходящий графический процессор не доступны, то функция возвращает ошибку.
'none'Отключите все ускорение.

Опцией по умолчанию является 'auto'. Если вы используете 'auto' опция, MATLAB никогда не генерирует MEX-функцию.

Используя 'Acceleration' опции 'auto' и 'mex' может предложить выигрыши в производительности, но за счет увеличенного начального времени выполнения. Последующие вызовы совместимыми параметрами быстрее. Используйте оптимизацию производительности, когда вы запланируете вызвать функцию многократно с помощью новых входных данных.

'mex' опция генерирует и выполняет MEX-функцию на основе сети и параметров, используемых в вызове функции. У вас может быть несколько MEX-функций, сопоставленных с одной сетью когда-то. Очищение сетевой переменной также очищает любые MEX-функции, сопоставленные с той сетью.

'mex' опция только доступна, когда вы используете графический процессор. Необходимо было также установить компилятор C/C++. Для инструкций по настройке смотрите Setup MEX (GPU Coder).

'mex' ускорение не поддерживает все слои. Для списка поддерживаемых слоев смотрите Поддерживаемые Слои (GPU Coder).

Местоположение папки, заданное как pwd (ваша текущая рабочая папка), скаляр строки или вектор символов. Заданная папка должна существовать и иметь полномочия записи.

Это свойство применяется только при использовании ImageDatastore объектный вход.

Префикс применился к именам выходного файла, заданным как скаляр строки или вектор символов. Файлы изображений называют можно следующим образом:

  • prefixN.png, где N соответствует индексу входного файла изображения, imds.FilesN.

Это свойство применяется только при использовании ImageDatastore объектный вход.

Отобразите информацию прогресса, указанную как 'true' или 'false'.

Это свойство применяется только при использовании ImageDatastore объектный вход.

Выходные аргументы

свернуть все

Категориальные метки, возвращенные как категориальный массив. Категориальный массив связывает метку с каждым пикселем или вокселом во входном изображении. Изображения возвращены readalldatastore) имейте взаимно-однозначное соответствие с категориальными матрицами, возвращенными readall(pixelLabelDatastore). Элементы массива метки соответствуют пикселю или элементам воксела входного изображения. Если вы выбираете ROI, то метки ограничиваются областью в ROI. Пиксели изображения и вокселы вне необходимой области присвоены <undefined> категориальная метка.

Тип изображенияКатегориальный формат этикетки
Одно 2D изображение2D матрица размера H-by-W. Элемент C(i, j), категориальная метка, присвоенная пикселю I(i, j).
Серия P 2D изображенияТрехмерный массив размера H-by-W-by-P. Элемент C(i, j, p), категориальная метка, присвоенная пикселю I(i, j, p).
Одно 3-D изображениеТрехмерный массив размера H-by-W-by-D. Элемент C(i, j, k), категориальная метка, присвоенная вокселу I(i, j, k).
Серия P 3-D изображенияМассив 4-D размера H-by-W-by-D-by-P. Элемент C(i, j, k, p), категориальная метка, присвоенная вокселу I(i, j, k, p).

Музыка уверенности к каждой категориальной метке в C, возвращенный как массив значений между 0 и 1. Баллы представляют уверенность в предсказанном, маркирует C. Более высокие значения счета указывают на более высокую уверенность в предсказанной метке.

Тип изображенияВыиграйте формат
Одно 2D изображение2D матрица размера H-by-W. Элемент score(i, j), счет классификации пикселя I(i, j).
Серия P 2D изображенияТрехмерный массив размера H-by-W-by-P. Элемент score(i, j, p), счет классификации пикселя I(i, j, p).
Одно 3-D изображениеТрехмерный массив размера H-by-W-by-D. Элемент score(i, j, k), счет классификации воксела I(i, j, k).
Серия P 3-D изображенияМассив 4-D размера H-by-W-by-D-by-P. Элемент score(i, j, k, p), счет классификации воксела I(i, j, k, p).

Музыка ко всем категориям метки, которые может классифицировать входная сеть, возвратилась как числовой массив. Формат массива описан в следующей таблице. L представляет общее количество категорий метки.

Тип изображенияВесь формат баллов
Одно 2D изображениеТрехмерный массив размера H-by-W-by-L. Элемент allScores(i, j, q), счет q th метка на уровне пикселя I(i, j).
Серия P 2D изображенияМассив 4-D размера H-by-W-by-L-by-P. Элемент allScores(i, j, q, p), счет q th метка на уровне пикселя I(i, j, p).
Одно 3-D изображениеМассив 4-D размера H-by-W-by-D-by-L. Элемент allScores(i, j, k, q), счет q th метка в вокселе I(i, j, k).
Серия P 3-D изображенияМассив 5-D размера H-by-W-by-D-by-L-by-P. Элемент allScores(i, j, k, q, p), счет q th метка в вокселе I(i, j, k, p).

Результаты семантической сегментации, возвращенные как pixelLabelDatastore объект. Объект содержит результаты семантической сегментации для всех изображений, содержавшихся в ds входной объект. Результат для каждого изображения сохранен как отдельный uint8 пометьте матрицы изображений PNG. Можно использовать read(pxds) возвратить категориальные метки, присвоенные изображениям в ds.

Изображения в выходе readallds ) имейте взаимно-однозначное соответствие с категориальными матрицами в выходе readall(pxds).

Расширенные возможности

Введенный в R2017b