unetLayers

Создайте слои U-Net для семантической сегментации

Описание

пример

lgraph = unetLayers(imageSize,numClasses) возвращает сеть U-Net. unetLayers включает слой классификации пикселей в сеть, чтобы предсказать категориальную метку для каждого пикселя во входном изображении.

Используйте unetLayers создать архитектуру сети U-Net. Необходимо обучить сеть с помощью функции Deep Learning Toolbox™ trainNetwork.

[lgraph,outputSize] = unetLayers(imageSize,numClasses) также возвращает размер выходного размера от сети U-Net.

___ = unetLayers(imageSize,numClasses,Name,Value) задает опции с помощью одного или нескольких аргументов пары "имя-значение". Заключите каждое имя свойства в кавычки. Например, unetLayers(imageSize,numClasses,'NumFirstEncoderFilters',64) дополнительно определяет номер выходных каналов к 64 для первого этапа энкодера.

Примеры

свернуть все

Создайте сеть U-Net с глубиной декодера энкодера 3.

imageSize = [480 640 3];
numClasses = 5;
encoderDepth = 3;
lgraph = unetLayers(imageSize,numClasses,'EncoderDepth',encoderDepth)
lgraph = 
  LayerGraph with properties:

         Layers: [46x1 nnet.cnn.layer.Layer]
    Connections: [48x2 table]
     InputNames: {'ImageInputLayer'}
    OutputNames: {'Segmentation-Layer'}

Отобразите сеть.

plot(lgraph)

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

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

Создайте imageDatastore возразите, чтобы сохранить учебные изображения.

imds = imageDatastore(imageDir);

Задайте имена классов и их связанную метку IDs.

classNames = ["triangle","background"];
labelIDs   = [255 0];

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

pxds = pixelLabelDatastore(labelDir,classNames,labelIDs);

Создайте сеть U-Net.

imageSize = [32 32];
numClasses = 2;
lgraph = unetLayers(imageSize, numClasses)
lgraph = 
  LayerGraph with properties:

         Layers: [58×1 nnet.cnn.layer.Layer]
    Connections: [61×2 table]
     InputNames: {'ImageInputLayer'}
    OutputNames: {'Segmentation-Layer'}

Создайте datastore для того, чтобы обучить сеть.

ds = pixelLabelImageDatastore(imds,pxds);

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

options = trainingOptions('sgdm', ...
    'InitialLearnRate',1e-3, ...
    'MaxEpochs',20, ...
    'VerboseFrequency',10);

Обучите сеть.

net = trainNetwork(ds,lgraph,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:04 |       79.88% |       1.8376 |          0.0010 |
|      10 |          10 |       00:00:40 |       97.18% |       0.3447 |          0.0010 |
|      20 |          20 |       00:01:20 |       97.95% |       0.1829 |          0.0010 |
|========================================================================================|
net = 
  DAGNetwork with properties:

         Layers: [58×1 nnet.cnn.layer.Layer]
    Connections: [61×2 table]
     InputNames: {'ImageInputLayer'}
    OutputNames: {'Segmentation-Layer'}

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

свернуть все

Сетевой входной размер изображения в виде a:

  • Вектор с 2 элементами в форме [height, width].

  • Вектор с 3 элементами в форме [height, width, depth]. depth является количеством каналов изображений. Установите depth на 3 для изображений RGB, к 1 для полутоновых изображений, или к количеству каналов для многоспектральных и гиперспектральных изображений.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Количество классов в семантической сегментации в виде целого числа, больше, чем 1.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Пример: 'EncoderDepth',3

Глубина энкодера в виде положительного целого числа. U-Net состоит из подсети энкодера и соответствующей подсети декодера. Глубина этих сетей определяет число раз, входное изображение прорежено или сверхдискретизировано во время обработки. Сеть энкодера прореживает входное изображение фактором 2D, где D является значением EncoderDepth. Сеть декодера сверхдискретизировала сеть энкодера, выведенную фактором 2D.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Примечание

NumOutputChannels переименован в NumFirstEncoderFilters и не будет поддерживаться в будущем релизе. Используйте NumFirstEncoderFilters вместо этого.

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Сверточный размер фильтра слоя в виде положительного нечетного целого числа или вектора-строки с 2 элементами из положительных нечетных целых чисел. Типичные значения находятся в области значений [3, 7].

FilterSizeОписание
скалярФильтр является квадратным.
Вектор-строка с 2 элементами

Фильтр имеет размер [height width].

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Тип дополнения в виде 'same' или 'valid'. Тип дополнения задает дополнительный стиль для convolution2dLayer в энкодере и подсетях декодера. Пространственный размер выходной карты функции зависит от типа дополнения. Если вы задаете тип дополнения как:

  • 'same' — Нулевое дополнение применяется к входным параметрам к слоям свертки, таким образом, что выход и входные карты функции одного размера.

  • 'valid' — Нулевое дополнение не применяется к входным параметрам к слоям свертки. Слой свертки возвращает только значения свертки, которые вычисляются без нулевого дополнения. Выходная карта функции меньше, чем входная карта функции.

Примечание

Чтобы гарантировать, что height и width входных параметров к макс. объединяющим слоям являются четными, выберите сетевой входной размер изображения, чтобы подтвердить к любому из этих критериев:

  • Если вы задаете 'ConvolutionPadding' как 'same', затем height и width входного изображения должны быть кратными 2D.

  • Если вы задаете 'ConvolutionPadding' как 'valid', затем height и width входного изображения должны быть выбраны таким образом что heighti=1D2i(fh1) и widthi=1D2i(fw1) множители 2D.

    где fh и fw являются высотой и шириной двумерного ядра свертки, соответственно. D является глубиной энкодера.

Типы данных: char | string

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

свернуть все

Слои, которые представляют архитектуру сети U-Net, возвратились как layerGraph объект.

Сетевой размер выходного изображения, возвращенный как трехэлементный вектор формы [height, width, channels]. channels является количеством выходных каналов, и это равно количеству классов, заданных во входе. height и width выходного изображения от сети зависят от типа дополнения свертки.

  • Если вы задаете 'ConvolutionPadding' как 'same', затем height и width сетевого выходного изображения совпадают с height сетевого входного изображения.

  • Если вы задаете 'ConvolutionPadding' как 'valid', затем height и width сетевого выходного изображения меньше height сетевого входного изображения.

Типы данных: double

Больше о

свернуть все

Архитектура U-Net

  • Архитектура U-Net состоит из подсети энкодера и подсети декодера, которые соединяются разделом моста.

  • Подсети энкодера и декодера в архитектуре U-Net состоят из нескольких этапов. EncoderDepth, то, которое задает глубину подсетей энкодера и декодера, определяет номер этапов.

  • Этапы в подсети энкодера U-Net состоят из двух наборов сверточных и слоев ReLU, сопровождаемых 2 22 макс. слоем объединения. Подсеть декодера состоит из транспонированного слоя свертки для повышающей дискретизации, сопровождаемый двумя наборами слоев ReLU и сверточных.

  • Раздел моста состоит из двух наборов слоев ReLU и свертки.

  • Срок смещения всех сверточных слоев инициализируется, чтобы обнулить.

  • Веса слоя Convolution в подсетях энкодера и декодера инициализируются с помощью 'He' метод инициализации веса [2].

Советы

  • Используйте 'same' дополнение в слоях свертки, чтобы обеспечить тот же размер данных от входа, чтобы вывести и включить использование широкого набора входных размеров изображения.

  • Используйте основанные на закрашенной фигуре подходы в бесшовной сегментации больших изображений. Можно извлечь закрашенные фигуры изображений при помощи randomPatchExtractionDatastore функция в Image Processing Toolbox™.

  • Используйте 'valid' дополнение, чтобы предотвратить артефакты границы, в то время как вы используете основанные на закрашенной фигуре подходы в сегментации.

  • Можно использовать сеть, созданную с помощью unetLayers функция для генерации кода графического процессора после обучения с trainNetwork. Для получения дополнительной информации и примеры, смотрите Генерацию кода Глубокого обучения (Deep Learning Toolbox).

Вопросы совместимости

развернуть все

Не рекомендуемый запуск в R2019b

Ссылки

[1] Ronneberger, O., П. Фишер и Т. Брокс. "U-Net: Сверточные Сети для Биомедицинской Сегментации Изображений". Медицинское Вычисление Изображений и Машинное Вмешательство (MICCAI). Издание 9351, 2015, стр 234–241.

[2] Он, K., С. Чжан, С. Жэнь и J. Sun. "Копаясь глубоко в выпрямителях: превышение производительности Человеческого Уровня на классификации ImageNet". Продолжения международной конференции IEEE по вопросам компьютерного зрения. 2015, 1026–1034.

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

Введенный в R2018b