semanticseg

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

Описание

пример

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

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

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

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

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

[___] = 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)

Figure contains an axes. The axes contains an object of type image.

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

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

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

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

Figure contains an axes. The axes contains an object of type image.

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

figure
imagesc(scores)
axis square
colorbar

Figure contains an axes. The axes contains an object of type image.

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

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

Figure contains an axes. The axes contains an object of type image.

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

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

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
                              }
                     Folders: {
                              ' .../build/matlab/toolbox/vision/visiondata/triangleImages/testImages'
                              }
    AlternateFileSystemRoots: {}
                    ReadSize: 1
                      Labels: {}
      SupportedOutputFormats: ["png"    "jpg"    "jpeg"    "tif"    "tiff"]
         DefaultOutputFormat: "png"
                     ReadFcn: @readDatastoreImage

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

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

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

pxdsResults = semanticseg(imds,net,'MiniBatchSize',4,'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]

В этом примере показано, как определить и создать пользовательский слой классификации пикселей, который использует потери Тверского.

Этот слой может использоваться для обучения сетей семантической сегментации. Дополнительные сведения о создании пользовательских слоев глубокого обучения см. в разделе «Определение пользовательских слоев глубокого обучения» (Deep Learning Toolbox).

Тверская потеря

Тверская потеря основана на индексе Тверского для измерения перекрытия между двумя сегментированными изображениями [1]. Индекс Тверского TIc между одним изображением Y и соответствующая основная истина T дается

TIc=m=1MYcmTcmm=1MYcmTcm+αm=1MYcmTcm+βm=1MYcmTcm

  • c соответствует классу и cсоответствует отсутствию в классе c.

  • M количество элементов по первым двум размерностям Y.

  • α и β являются весовыми факторами, которые контролируют вклад, который ложные срабатывания и ложные срабатывания для каждого класса вносят в потерю.

Потеря Lпо количеству классов C дается

L=c=1C1-TIc

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

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

classdef tverskyPixelClassificationLayer < nnet.layer.ClassificationLayer

   properties
      % Optional properties
   end

   methods

        function loss = forwardLoss(layer, Y, T)
            % Layer forward 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 раздел.

Тверская потеря требует небольшого постоянного значения, чтобы предотвратить деление на нули. Задайте свойство, Epsilon, чтобы удержать это значение. Это также требует двух свойств переменной A lpha и Beta которые контролируют взвешивание ложных срабатываний и ложных срабатываний, соответственно.

classdef tverskyPixelClassificationLayer < nnet.layer.ClassificationLayer

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

    properties
       % Default weighting coefficients for false positives and false negatives 
       Alpha = 0.5;
       Beta = 0.5;  
    end

    ...
end

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

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

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

function layer = tverskyPixelClassificationLayer(name, alpha, beta)
    % layer =  tverskyPixelClassificationLayer(name) creates a Tversky
    % pixel classification layer with the specified name.
           
    % Set layer name          
    layer.Name = name;

    % Set layer properties
    layer.Alpha = alpha;
    layer.Beta = beta;

    % Set layer description
    layer.Description = 'Tversky loss';
end

Создайте функцию Forward Loss

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

Для семантических задач сегментации, размерности T соответствовать размерности Y, где Y - 4-D массив размера H-by- W-by- K-by- 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 Tversky loss between
    % the predictions Y and the training targets T.

    Pcnot = 1-Y;
    Gcnot = 1-T;
    TP = sum(sum(Y.*T,1),2);
    FP = sum(sum(Y.*Gcnot,1),2);
    FN = sum(sum(Pcnot.*T,1),2);

    numer = TP + layer.Epsilon;
    denom = TP + layer.Alpha*FP + layer.Beta*FN + layer.Epsilon;
    
    % Compute Tversky index
    lossTIc = 1 - numer./denom;
    lossTI = sum(lossTIc,3);
    
    % Return average Tversky index loss
    N = size(Y,4);
    loss = sum(lossTI)/N;

end

Функция обратных потерь

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

Список функций, поддерживающих автоматическую дифференциацию, см. в Списке функций с поддержкой dlarray (Deep Learning Toolbox).

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

Завершенный слой обеспечен в tverskyPixelClassificationLayer.m.

classdef tverskyPixelClassificationLayer < nnet.layer.ClassificationLayer
    % This layer implements the Tversky loss function for training
    % semantic segmentation networks.
    
    % References
    % Salehi, Seyed Sadegh Mohseni, Deniz Erdogmus, and Ali Gholipour.
    % "Tversky loss function for image segmentation using 3D fully
    % convolutional deep networks." International Workshop on Machine
    % Learning in Medical Imaging. Springer, Cham, 2017.
    % ----------
    
    
    properties(Constant)
        % Small constant to prevent division by zero.
        Epsilon = 1e-8;
    end
    
    properties
        % Default weighting coefficients for False Positives and False
        % Negatives
        Alpha = 0.5;
        Beta = 0.5;
    end

    
    methods
        
        function layer = tverskyPixelClassificationLayer(name, alpha, beta)
            % layer =  tverskyPixelClassificationLayer(name, alpha, beta) creates a Tversky
            % pixel classification layer with the specified name and properties alpha and beta.
            
            % Set layer name.          
            layer.Name = name;
            
            layer.Alpha = alpha;
            layer.Beta = beta;
            
            % Set layer description.
            layer.Description = 'Tversky loss';
        end
        
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the Tversky loss between
            % the predictions Y and the training targets T.   

            Pcnot = 1-Y;
            Gcnot = 1-T;
            TP = sum(sum(Y.*T,1),2);
            FP = sum(sum(Y.*Gcnot,1),2);
            FN = sum(sum(Pcnot.*T,1),2); 
            
            numer = TP + layer.Epsilon;
            denom = TP + layer.Alpha*FP + layer.Beta*FN + layer.Epsilon;
            
            % Compute tversky index
            lossTIc = 1 - numer./denom;
            lossTI = sum(lossTIc,3);
            
            % Return average tversky index loss.
            N = size(Y,4);
            loss = sum(lossTI)/N;
            
        end     
    end
end

Совместимость с GPU

Функции MATLAB, используемые в forwardLoss в tverskyPixelClassificationLayer все gpuArray поддержки вводит, поэтому слой совместим с графическим процессором.

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

Создайте образец слоя.

layer = tverskyPixelClassificationLayer('tversky',0.7,0.3);

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

numClasses = 2;
validInputSize = [4 4 numClasses];
checkLayer(layer,validInputSize, 'ObservationDimension',4)
Skipping GPU tests. No compatible GPU device found.
 
Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the 'CheckCodegenCompatibility' and 'ObservationDimension' options.
 
Running nnet.checklayer.TestOutputLayerWithoutBackward
........
Done nnet.checklayer.TestOutputLayerWithoutBackward
__________

Test Summary:
	 8 Passed, 0 Failed, 0 Incomplete, 2 Skipped.
	 Time elapsed: 1.083 seconds.

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

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

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

layers = [
    imageInputLayer([32 32 1])
    convolution2dLayer(3,64,'Padding',1)
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(2,'Stride',2)
    convolution2dLayer(3,64,'Padding',1)
    reluLayer
    transposedConv2dLayer(4,64,'Stride',2,'Cropping',1)
    convolution2dLayer(1,2)
    softmaxLayer
    tverskyPixelClassificationLayer('tversky',0.3,0.7)]
layers = 
  11x1 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   ''          Batch Normalization      Batch normalization
     4   ''          ReLU                     ReLU
     5   ''          Max Pooling              2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     6   ''          Convolution              64 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     7   ''          ReLU                     ReLU
     8   ''          Transposed Convolution   64 4x4 transposed convolutions with stride [2  2] and cropping [1  1  1  1]
     9   ''          Convolution              2 1x1 convolutions with stride [1  1] and padding [0  0  0  0]
    10   ''          Softmax                  softmax
    11   'tversky'   Classification Output    Tversky 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('adam', ...
    'InitialLearnRate',1e-3, ...
    'MaxEpochs',100, ...
    'LearnRateDropFactor',5e-1, ...
    'LearnRateDropPeriod',20, ...
    'LearnRateSchedule','piecewise', ...
    'MiniBatchSize',50);

net = trainNetwork(ds,layers,options);
Training on single CPU.
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |       50.32% |       1.2933 |          0.0010 |
|      13 |          50 |       00:00:08 |       98.83% |       0.0988 |          0.0010 |
|      25 |         100 |       00:00:15 |       99.33% |       0.0547 |          0.0005 |
|      38 |         150 |       00:00:21 |       99.37% |       0.0473 |          0.0005 |
|      50 |         200 |       00:00:28 |       99.48% |       0.0400 |          0.0003 |
|      63 |         250 |       00:00:36 |       99.48% |       0.0383 |          0.0001 |
|      75 |         300 |       00:00:43 |       99.54% |       0.0348 |          0.0001 |
|      88 |         350 |       00:00:50 |       99.51% |       0.0353 |      6.2500e-05 |
|     100 |         400 |       00:00:57 |       99.56% |       0.0331 |      6.2500e-05 |
|========================================================================================|

Оцените обученную сеть, сегментировав тестовое изображение и отобразив результат сегментации.

I = imread('triangleTest.jpg');
[C,scores] = semanticseg(I,net);

B = labeloverlay(I,C);
montage({I,B})

Figure contains an axes. The axes contains an object of type image.

Ссылки

[1] Салехи, Сейед Садег Мохсени, Дениз Эрдогмус и Али Голипур. «Функция потерь Тверского для сегментации изображений 3D используя полностью сверточные глубокие сети». Международный семинар по машинному обучению в медицинской визуализации. Спрингер, Чэм, 2017.

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

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

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

Загрузка обучающих данных

Пример использует простой набор данных из изображений треугольника 32 на 32 в целях рисунка. Набор данных включает в себя сопровождающие пиксельные достоверные данные. Загрузите обучающие данные с помощью imageDatastore и a 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: {200x1 cell}
                  ClassNames: {2x1 cell}
                    ReadSize: 1
                     ReadFcn: @readDatastoreImage
    AlternateFileSystemRoots: {}

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

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

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

pximdsTrain = pixelLabelImageDatastore(imdsTrain,pxdsTrain);
tbl = countEachLabel(pxdsTrain)
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 CPU.
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |       91.62% |       1.6825 |          0.0010 |
|      17 |          50 |       00:00:08 |       88.56% |       0.2393 |          0.0010 |
|      34 |         100 |       00:00:15 |       92.08% |       0.1672 |          0.0010 |
|      50 |         150 |       00:00:23 |       93.17% |       0.1472 |          0.0010 |
|      67 |         200 |       00:00:31 |       94.15% |       0.1313 |          0.0010 |
|      84 |         250 |       00:00:38 |       94.47% |       0.1167 |          0.0010 |
|     100 |         300 |       00:00:46 |       95.04% |       0.1100 |          0.0010 |
|========================================================================================|

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

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

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

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

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

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

metrics = evaluateSemanticSegmentation(pxdsPred,pxdsTest);
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.95237          0.97352       0.72081      0.92889        0.46416  

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

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

Чтение и отображение тестового изображения triangleTest.jpg.

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

Figure contains an axes. The axes contains an object of type image.

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

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

Figure contains an axes. The axes contains an object of type image.

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

свернуть все

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

Тип изображенияФормат данных
Одно 2-D полутонового изображения2-D матрица размера H -by- W
Одно 2-D цветное изображение или 2-D мультиспектральное изображениеТрехмерный массив размера H -by- W -by- C. Количество цветовых каналов C составляет 3 для цветных изображений.
Серия P 2-D изображений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 размера <reservedrangesplaceholder4>-by-<reservedrangesplaceholder3>-by-<reservedrangesplaceholder2>-by-<reservedrangesplaceholder1>-by-<reservedrangesplaceholder0>

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

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

Сеть, заданная как SeriesNetwork (Deep Learning Toolbox), DAGNetwork (Deep Learning Toolbox), или dlnetwork (Deep Learning Toolbox) объект.

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

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

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

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

Для получения дополнительной информации смотрите Datastores for Глубокое Обучение (Deep Learning Toolbox).

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

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

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

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

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

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

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

ExecutionEnvironmentОписание
'auto'При наличии используйте графический процессор. В противном случае используйте центральный процессор. Для использования графический процессор требуется Parallel Computing Toolbox и CUDA® enabled NVIDIA® ГРАФИЧЕСКИЙ ПРОЦЕССОР. Для получения информации о поддерживаемых вычислительных возможностях смотрите Поддержку GPU by Release (Parallel Computing Toolbox).
'gpu'Используйте графический процессор. Если подходящий графический процессор недоступен, функция возвращает сообщение об ошибке.
'cpu'Используйте центральный процессор.

Оптимизация эффективности, заданная как 'auto', 'mex', или 'none'.

УскорениеОписание
'auto'Автоматически примените ряд оптимизаций, подходящих для входа сети и оборудования ресурса.
'mex'Скомпилируйте и выполните MEX-функцию. Эта опция доступна только при использовании графического процессора. Необходимо также установить компилятор C/C + +. Инструкции по настройке см. в MEX Setup (GPU Coder).
'none'Отключите все ускорения.

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

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

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

The 'mex' опция доступна только при использовании графического процессора. Для использования GPU требуется Parallel Computing Toolbox и графический процессор NVIDIA с поддержкой CUDA. Для получения информации о поддерживаемых вычислительных возможностях смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Если Parallel Computing Toolbox или подходящий графический процессор недоступен, то функция возвращает ошибку.

'mex' ускорение не поддерживает сети, заданные как dlnetwork (Deep Learning Toolbox) объект.

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

Классы, в которые классифицируются пиксели или воксели, заданные как 'auto', массив ячеек из векторов символов, строковый вектор или категориальный вектор. Если значение является категориальным векторным Y, то элементы вектора сортируются и упорядочиваются согласно categories(Y).

Если сеть является dlnetwork (Deep Learning Toolbox), затем количество классов, заданное как 'Classes'должен совпадать с количеством каналов в выходах сетевых предсказаний. По умолчанию, когда 'Classes'имеет значение 'auto'классы нумеруются от 1 до C, где C количество каналов на выход уровне сети.

Если сеть является SeriesNetwork (Deep Learning Toolbox) или DAGNetwork (Deep Learning Toolbox), затем количество классов, заданное как 'Classes'должен совпадать с количеством классов в выходном слое классификации. По умолчанию, когда 'Classes'имеет значение 'auto'классы автоматически устанавливаются с помощью выходного слоя классификации.

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

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

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

  • prefix_ N.png, где N соответствует индексу файла входа изображения, imds.Files(<reservedrangesplaceholder0>).

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

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

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

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

свернуть все

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

Тип изображенияКатегориальный формат метки
Одно 2-D изображение2-D матрица размера H -by - W. Элементный C(i, j) - категориальная метка, назначенная пикселю I(i, j).
Серия P 2-D изображенийТрехмерный массив размера 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. Более высокие значения баллов указывают на более высокое доверие в предсказанной метке.

Тип изображенияФормат счета
Одно 2-D изображение2-D матрица размера H -by - W. Элементный score(i, j) - классификационная оценка пикселя I(i, j).
Серия P 2-D изображенийТрехмерный массив размера 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 представляет общее количество категорий меток.

Тип изображенияФормат всех счетов
Одно 2-D изображениеТрехмерный массив размера H -by- W -by- L. Элементный allScores(i, j, q) - счет q-й метки в пикселе I(i, j).
Серия P 2-D изображений4-D массив размера H -by- W -by- L -by- P. Элементный allScores(i, j, q, p) - счет q-й метки в пикселе I(i, j, p).
Одно 3-D изображение4-D массив размера H -by- W -by- D -by- L. Элементный allScores(i, j, k, q) - счет q-й метки в воксели I(i, j, k).
Серия P 3-D изображенийМассив 5-D размера <reservedrangesplaceholder5>-by-<reservedrangesplaceholder4>-by-<reservedrangesplaceholder3>-by-<reservedrangesplaceholder2>-by-<reservedrangesplaceholder1>. Элементный allScores(i, j, k, q, p) - счет q-й метки в воксели I(i, j, k, p).

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

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

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

Введенный в R2017b