exponenta event banner

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)

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'}

Создайте хранилище данных для обучения сети.

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-элементный вектор в виде [высота, ширина].

  • 3-элементный вектор в виде [высота, ширина, глубина]. глубина - количество каналов изображения. Установить глубину в 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-элементный вектор строки

Фильтр имеет размер [ширина высоты ].

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

Тип заполнения, указанный как 'same' или 'valid'. Тип заполнения определяет стиль заполнения для convolution2dLayer (Deep Learning Toolbox) в подсетях кодера и декодера. Пространственный размер карты элементов вывода зависит от типа заполнения. Если тип заполнения указан как:

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

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

Примечание

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

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

  • При указании 'ConvolutionPadding' как 'valid', то высота и ширина входного изображения должны выбираться такими, чтобы высота ∑i=1D2i (fh 1) и ширина ∑i=1D2i (fw − 1) были кратны 2D.

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

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

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

свернуть все

Уровни, представляющие архитектуру сети U-Net, возвращаемые в виде layerGraph(Панель инструментов глубокого обучения).

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

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

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

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

Подробнее

свернуть все

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

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

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

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

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

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

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

Совет

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

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

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

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

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

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

Не рекомендуется начинать с R2019b

Ссылки

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

[2] Он, К., X. Zhang, С. Рен и Дж. Сун. «Углубляясь в выпрямители: превосходя показатели на уровне человека по классификации ImageNet». Материалы Международной конференции IEEE по компьютерному зрению. 2015, 1026–1034.

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

.

См. также

Объекты

Функции

Представлен в R2018b