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