Семантическая сегментация изображений с помощью глубокого обучения
C = semanticseg(I,network)
[C,score,allScores] = semanticseg(I,network)
[___] = semanticseg(I,network,roi)
pxds = semanticseg(imds,network)
[___] = semanticseg(___,Name,Value)
возвращает семантическую сегментацию входного изображения с помощью глубокого обучения. Вход C
= semanticseg(I
,network
)network
должен быть любой объектом SeriesNetwork
или DAGNetwork
.
[
возвращает семантическую сегментацию входного изображения с музыкой классификации к каждой категориальной метке в C
,score
,allScores
] = semanticseg(I
,network
)C
. Очки возвращены в категориальном массиве, который соответствует каждому пикселю или вокселу во входном изображении. allScores
содержит музыку ко всем категориям метки, которые может классифицировать входная сеть.
возвращает семантическую сегментацию для набора изображений в pxds
= semanticseg(imds
,network
)imds
, объекте ImageDatastore
.
Эта функция поддерживает параллельные вычисления с помощью нескольких рабочих MATLAB® при обработке объекта ImageDatastore
. Можно включить параллельные вычисления с помощью диалогового окна Настроек Computer Vision Toolbox.
[___] = semanticseg(___,
возвращает семантическую сегментацию с дополнительными опциями, заданными одним или несколькими аргументами пары Name,Value
)Name,Value
.
Наложите результаты сегментации на изображении и отобразите результаты.
Загрузите предварительно обученную сеть.
data = load('triangleSegmentationNetwork');
net = data.net
net = SeriesNetwork with properties: Layers: [10x1 nnet.cnn.layer.Layer]
Перечислите сетевые слои.
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,'WriteLocation',tempdir);
Running semantic segmentation network ------------------------------------- * Processing 100 images. * Progress: 100.00%
Сравните результаты с наземной истиной.
metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTruth)
Evaluating semantic segmentation results ---------------------------------------[==================================================] 100% Elapsed time: 00:00:01 Estimated time remaining: 00:00:00 * 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).
Поставьте на карту потерю
Потеря Игры в кости основана на коэффициенте подобия Sørensen-игры-в-кости для измерения перекрытия между двумя сегментированными изображениями. Обобщенная потеря Игры в кости [1,2], , поскольку между одним изображением и соответствующая наземная истина дают
,
где количество классов, число элементов по первым двум измерениям , и класс определенный фактор взвешивания, который управляет вкладом, который каждый класс делает к потере. обычно обратная область ожидаемой области:
Это взвешивание помогает противостоять влиянию более крупных областей на счете Игры в кости, облегчающем для сети изучить, как сегментировать меньшие области.
Шаблон слоя классификации
Скопируйте шаблон слоя классификации в новый файл в 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
установлен в ''
, то программное обеспечение автоматически присваивает имя в учебное время.
Описание
Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в массиве Layer
. Если вы не задаете описание слоя, то программное обеспечение отображает имя класса слоя.
Ввод
Тип слоя, заданного как вектор символов или скаляр строки. Значение Type
появляется, когда слой отображен в массиве Layer
. Если вы не задаете тип слоя, то программное обеспечение отображает 'Classification layer'
или 'Regression layer'
.
Пользовательские слои классификации также имеют следующее свойство:
Классы
Классы выходного слоя, заданного как категориальный вектор, массив строк, массив ячеек из символьных векторов или 'auto'
. Если Classes
является 'auto'
, то программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str
, то программное обеспечение устанавливает классы выходного слоя к categorical(str,str)
. Значением по умолчанию является 'auto'
.
Если слой не имеет никаких других свойств, то можно не использовать раздел properties
.
Потеря Игры в кости требует, чтобы маленькое постоянное значение предотвратило деление на нуль. Задайте свойство, 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
-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 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
Создайте обратную функцию потерь
Создайте обратную функцию потерь, которая возвращает производные потери Игры в кости относительно прогнозов 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
-by-W-by-K-by-
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}))
Ссылки
Crum, Уильям Р., Оскар Камара и Дерек ЛГ Хилл. "Обобщенное перекрытие измеряется для оценки и валидации в медицинском анализе изображения". Транзакции IEEE на медицинской обработке изображений 25.11 (2006): 1451-1461.
Sudre, Кэрол Х., и др. "Обобщенные Игры в кости накладываются как функция потерь глубокого обучения для очень несбалансированных сегментаций". Глубокое обучение в Медицинском Анализе изображения и Многомодальном Изучении для Клинической Поддержки принятия решений. Спрингер, Хан, 2017. 240-248.
Этот пример показывает, как обучить семантическую сеть сегментации использование расширенных сверток.
Семантическая сеть сегментации классифицирует каждый пиксель на изображение, приводящее к изображению, которое сегментируется классом. Приложения для семантической сегментации включают дорожную сегментацию для автономного управления и сегментацию раковой клетки для медицинского диагноза. Чтобы узнать больше, смотрите Семантические Основы Сегментации.
Семантические сети сегментации как DeepLab [1] делают широкое применение расширенных сверток (также известный atrous свертки), потому что они могут увеличить восприимчивое поле слоя (область входа, который слои видят), не увеличивая число параметров или вычислений.
Загрузите данные тренировки
Пример использует простой набор данных 32x32 треугольные изображения в целях рисунка. Набор данных включает сопроводительные пиксельные наземные данные об истине метки. Загрузите данные тренировки с помощью imageDatastore
и pixelLabelDatastore
.
dataFolder = fullfile(toolboxdir('vision'),'visiondata','triangleImages'); imageFolderTrain = fullfile(dataFolder,'trainingImages'); labelFolderTrain = fullfile(dataFolder,'trainingLabels');
Создайте datastore изображений для изображений.
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;
Создайте сеть для пикселя classificaiton с входным слоем изображений с входным размером, соответствующим размеру входных изображений. Затем, задайте три блока свертки, обработайте в пакетном режиме нормализацию и слои 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)];
Обучение сети
Задайте опции обучения. Используя решатель SGDM, обучайтесь в течение 100 эпох, мини-пакетный размер 64, и изучите уровень 0.001.
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 | |========================================================================================|
Тестирование сети
Загрузите тестовые данные. Создайте datastore изображений для изображений. Создайте 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)
Ссылки
Чен, Лян-Чие, Георгиос Папандреу, Iasonas Kokkinos, Кевин Мерфи и Алан Л. Юилл. "Deeplab: Семантическая сегментация изображений с глубокими сверточными сетями, atrous свертка и полностью соединенный crfs". Транзакции IEEE согласно анализу шаблона и искусственному интеллекту 40, № 4 (2018): 834-848.
I
Введите изображениеВведите изображение, заданное как одно из следующих.
Тип изображения | Формат данных |
---|---|
Одно 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
network
— СетьSeriesNetwork
| объект DAGNetwork
Сеть, заданная или как SeriesNetwork
или как объект DAGNetwork
.
roi
— Видимая областьВидимая область, заданная как одно из следующих.
Тип изображения | Формат ROI |
---|---|
2D изображение | Вектор с 4 элементами формы [x, y, width, height] |
3-D изображение | Вектор с 6 элементами формы [x, y, z, width, height, depth] |
Вектор задает прямоугольную или кубовидную видимую область, полностью содержавшуюся во входном изображении. Пиксели изображения вне видимой области присвоены <undefined
> категориальная метка. Если входное изображение состоит из серии изображений, то semanticseg
применяет тот же roi
ко всем изображениям в ряду.
imds
Набор данных изображенияimageDataStore
Набор изображений, заданных как объект ImageDatastore
. Функция возвращает семантическую сегментацию как категориальный массив, который связывает метку с каждым пикселем или вокселом во входном изображении.
Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми.
Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение.
Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.
'ExecutionEnvironment'
, 'gpu'
'OutputType'
Возвращенный тип сегментации'categorical'
(значение по умолчанию) | 'double'
| 'uint8'
Возвращенный тип сегментации, заданный или как 'categorical'
, 'double'
или как 'uint8'
. Когда вы выбираете 'double'
или 'uint8'
, функция возвращает результаты сегментации как массив метки, содержащий метку IDs. Идентификаторы являются целочисленными значениями, которые соответствуют именам классов, заданным в слое классификации, используемом во входной сети.
Свойство OutputType
не может использоваться с входом объекта ImageDatastore
.
'MiniBatchSize'
— Группа изображений128
(значение по умолчанию) | целое числоГруппа изображений, заданных как целое число. Изображения сгруппированы и обработаны вместе как пакет. Они используются для обработки большого количества изображений, и они повышают вычислительную эффективность. При увеличении повышений стоимости MiniBatchSize
эффективность, но это также поднимает больше памяти.
Среда выполнения
Аппаратный ресурс'auto'
(значение по умолчанию) | 'gpu'
| 'cpu'
Аппаратный ресурс раньше обрабатывал изображения с сетью, заданной как 'auto'
, 'gpu'
или 'cpu'
.
Среда выполнения | Описание |
---|---|
'auto' | Используйте графический процессор при наличии. В противном случае используйте центральный процессор. Использование графического процессора требует Parallel Computing Toolbox, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. |
'gpu' | Используйте графический процессор. Если подходящий графический процессор не доступен, функция возвращает сообщение об ошибке. |
'cpu' | Используйте центральный процессор. |
'WriteLocation'
— Местоположение папкиpwd
(текущая рабочая папка) (значение по умолчанию) | представляет скаляр в виде строки | вектор символовМестоположение папки, заданное как pwd
(ваша текущая рабочая папка), скаляр строки или вектор символов. Заданная папка должна существовать и иметь полномочия записи.
Это свойство применяется только при использовании входа объекта ImageDatastore
.
'NamePrefix'
— Снабдите префиксом применился к именам выходного файла'pixelLabel'
(значение по умолчанию) | представляет скаляр в виде строки | вектор символовПрефикс применился к именам выходного файла, заданным как скаляр строки или вектор символов. Файлы изображений называют можно следующим образом:
, где prefix_N.png
соответствует индексу входного файла изображения, N
imds.Files
(N).
Это свойство применяется только при использовании входа объекта ImageDatastore
.
'Verbose'
— Отобразите информацию о прогрессе'true'
(значение по умолчанию) | 'false'
Отобразите информацию прогресса, указанную как 'true'
или 'false'
.
Это свойство применяется только при использовании входа объекта ImageDatastore
.
C
Категориальные меткиКатегориальные метки, возвращенные как категориальный массив. Элементы массива метки соответствуют пикселю или элементам воксела входного изображения. Если вы выбрали 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). |
score
— Очки классификацииМузыка классификации к каждой категориальной метке в C
, возвращенном как категориальный массив. Очки представляют уверенность в предсказанном, маркирует 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). |
allScores
— Музыка ко всем категориям меткиМузыка ко всем категориям метки, которые может классифицировать входная сеть, возвратилась как числовой массив. Формат массива описан в следующей таблице с 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). |
pxds
— Семантические результаты сегментацииPixelLabelDatastore
Семантические результаты сегментации, возвращенные как объект pixelLabelDatastore
. Объект содержит семантические результаты сегментации для всех изображений, содержавшихся во входном объекте imds
. Результат для каждого изображения сохранен как отдельные матрицы метки uint8
изображений PNG. Можно использовать read
(pxds
), чтобы возвратить категориальные метки, присвоенные изображениям в imds
.
Чтобы запуститься параллельно, установите 'UseParallel'
на true
или включите это значением по умолчанию с помощью настроек Computer Vision Toolbox™.
Для получения дополнительной информации смотрите Поддержку Parallel Computing Toolbox.
Image Labeler | ImageDatastore
| Video Labeler | evaluateSemanticSegmentation
| labeloverlay
| pixelLabelDatastore
| trainNetwork
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.