unetLayers

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

Описание

пример

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

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

[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)

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

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

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

Создайте imageDatastore объект для хранения обучающих изображений.

imds = imageDatastore(imageDir);

Задайте имена классов и связанные с ними идентификаторы меток.

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 = combine(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 |       75.57% |       2.4341 |          0.0010 |
|      10 |          10 |       00:00:36 |       96.02% |       0.4517 |          0.0010 |
|      20 |          20 |       00:01:13 |       97.62% |       0.2324 |          0.0010 |
|========================================================================================|
net = 
  DAGNetwork with properties:

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

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

свернуть все

Размер входного изображения сети, заданный как:

  • 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 состоит из подсети энкодера и соответствующей подсети декодера. Глубина этих сетей определяет количество раз, когда входное изображение уменьшается или усиливается во время обработки. Сеть энкодера уменьшает изображение входа в 2 разаD, где D - значение EncoderDepth. Сеть декодера усиливает сеть энкодера в 2 разаD.

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

Примечание

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

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

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

Количество выхода каналов для первого каскада энкодера, заданное в виде положительного целого числа или вектора положительных целых чисел. На каждом последующем этапе энкодера количество каналов выхода удваивается. The 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 (Deep Learning Toolbox) в подсетях энкодера и декодера. Пространственный размер выход карты функций зависит от типа заполнения. Если вы задаете тип заполнения как:

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

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

Примечание

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

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

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

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

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

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

свернуть все

Слои, которые представляют архитектуру сети U-Net, возвращаются как layerGraph (Deep Learning Toolbox) объект.

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

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

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

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

Подробнее о

свернуть все

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

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

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

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

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

  • Срок смещения всех сверточных слоев равен нулю.

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

Совет

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

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

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

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

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

расширить все

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

Ссылки

[1] Ronneberger, O., P. Fischer, and T. Brox. U-Net: Сверточные сети для сегментации биомедицинских изображений. Вычисление медицинских изображений и компьютерное вмешательство (MICCAI). Том 9351, 2015, с. 234-241.

[2] He, K., X. Zhang, S. Ren, and J. Sun. «Delving Deep Into Rectifiers: Overpassing Human-Level Performance on ImageNet Classification». Материалы Международной конференции IEEE по компьютерному зрению. 2015, 1026–1034.

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

.
Введенный в R2018b