Создайте простую сеть семантической сегментации в Deep Network Designer

В этом примере показано, как создать и обучить простую сеть семантической сегментации с помощью Deep Network Designer.

Семантическая сегментация описывает процесс связи каждого пикселя изображения с меткой класса (такой как цветок, человек, дорога, небо, океан или автомобиль). Приложения для семантической сегментации включают сегментацию дорог для автономного управления автомобилем и сегментацию раковых камер для медицинского диагностирования. Дополнительные сведения см. в разделе Начало работы с семантической сегментацией с использованием глубокого обучения.

Предварительная обработка обучающих данных

Чтобы обучить семантическую сеть сегментации, вам нужна набор изображений и ее соответствующий набор пиксельных изображений. Маркированное пикселями изображение является изображением, где каждое значение пикселя представляет категориальную метку этого пикселя. Этот пример использует простой набор данных из 32 на 32 изображений треугольников в целях рисунка. Можно интерактивно маркировать пиксели и экспортировать данные о метках для приложений компьютерного зрения с помощью Image Labeler. Для получения дополнительной информации о создании обучающих данных для приложений семантической сегментации, смотрите Пиксели меток для семантической сегментации.

Загрузите обучающие данные.

dataFolder  = fullfile(toolboxdir('vision'), ...
'visiondata','triangleImages');

imageDir = fullfile(dataFolder,'trainingImages');
labelDir = fullfile(dataFolder,'trainingLabels');

Создайте ImageDatastore содержащие изображения.

imds = imageDatastore(imageDir);

Создайте PixelLabelDatastore содержащие основные истины пиксельных меток. Этот набор данных имеет два класса: "triangle" и "background".

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

pxds = pixelLabelDatastore(labelDir,classNames,labelIDs);

Объедините изображение datastore и pixel label datastore в CombinedDatastore объект с использованием combine функция. Комбинированный datastore поддерживает четность между парой изображений в базовых хранилищах данных.

cds = combine(imds,pxds);

Построение сети

Откройте Deep Network Designer.

deepNetworkDesigner

В Deep Network Designer можно создавать, редактировать и обучать нейронные сети для глубокого обучения. Пауза в пустой сети и нажмите кнопку Создать.

Создайте семантическую сеть сегментации путем перетаскивания слоев из библиотеки слоев на панель Designer.

Соедините слои в следующем порядке:

  1. imageInputLayer с InputSize установлено на 32,32,1

  2. convolution2dLayer с FilterSize установлено на 3,3, NumFilters установлено на 64, и Padding установлено на 1,1,1,1

  3. reluLayer

  4. maxPooling2dLayer с PoolSize установлено на 2,2, Stride установлено на 2,2, и Padding установлено на 0,0,0,0

  5. convolution2dLayer с FilterSize установлено на 3,3, NumFilters установлено на 64, и Padding установлено на 1,1,1,1

  6. reluLayer

  7. transposedConv2dLayer с FilterSize установлено на 4,4, NumFilters установлено на 64, Stride установлено на 2,2, and Cropping установлено на 1,1,1,1

  8. convolution2dLayer с FilterSize установлено на 1,1, NumFilters установлено на 2, и Padding установлено на 0,0,0,0

  9. softmaxLayer

  10. pixelClassificationLayer

Можно также создать эту сеть в командной строке и затем импортировать сеть в Deep Network Designer с помощью deepNetworkDesigner(layers).

layers = [
    imageInputLayer([32 32 1])
    convolution2dLayer([3,3],64,'Padding',[1,1,1,1])
    reluLayer
    maxPooling2dLayer([2,2],'Stride',[2,2])
    convolution2dLayer([3,3],64,'Padding',[1,1,1,1])
    reluLayer
    transposedConv2dLayer([4,4],64,'Stride',[2,2],'Cropping',[1,1,1,1])
    convolution2dLayer([1,1],2)
    softmaxLayer
    pixelClassificationLayer
    ];

Эта сеть является простой семантической сетью сегментации, основанной на проекте понижающей дискретизации и повышающей дискретизации. Для получения дополнительной информации о построении семантической сети сегментации смотрите Создание семантической сети сегментации.

Импорт данных

Чтобы импортировать обучающий datastore, на вкладке Данные, выберите Импорт данных > Импорт Datastore. Выберите CombinedDatastore cds объекта в качестве обучающих данных. Для данных валидации выберите None. Импортируйте обучающие данные нажав Импортировать.

Deep Network Designer отображает предварительный просмотр импортированных данных семантической сегментации. В предварительном просмотре отображаются обучающие изображения и основная истина пиксельные метки. Сеть требует входных изображений (слева) и возвращает классификацию для каждого пикселя как треугольник или фон (справа).

Обучите сеть

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

На вкладке Обучение нажмите Опции обучения. Установите InitialLearnRate на 0.001, MaxEpochs для 100, и MiniBatchSize, чтобы 64. Установите опции обучения нажав кнопку Закрыть.

Обучите сеть, нажав Train.

После завершения обучения щелкните Экспортом, чтобы экспортировать обученную сеть в рабочую область. Обученная сеть сохранена в переменной trainedNetwork_1.

Тестирование сети

Делайте предсказания с помощью тестовых данных и обученной сети.

Сегментируйте тестовое изображение с помощью semanticseg. Отображение меток над изображением при помощи labeloverlay функция.

imgTest = imread('triangleTest.jpg');
testSeg = semanticseg(imgTest,trainedNetwork_1);
testImageSeg = labeloverlay(imgTest,testSeg);

Отображение результатов.

figure
imshow(testImageSeg)

Сеть успешно помечает треугольники в тестовом изображении.

Сеть семантической сегментации, обученная в этом примере, очень проста. Чтобы создать более сложные семантические сети сегментации, можно использовать функции Computer Vision Toolbox segnetLayers, deeplabv3plusLayers, и unetLayers. Для примера, показывающего, как использовать deeplabv3plusLayers функция для создания сети DeepLab v3 +, см. Семантическая сегментация с глубоким обучением.