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

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

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

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

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

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

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 изображений и пиксельный datastore метки в CombinedDatastore объект с помощью combine функция. Объединенный datastore обеспечивает четность между парой изображений в базовых хранилищах данных.

cds = combine(imds,pxds);

Сеть сборки

Открытый Deep Network Designer.

deepNetworkDesigner

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

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

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

  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, на вкладке Data, выбирают Import Data> Import Datastore. Выберите CombinedDatastore объект cds как обучающие данные. Для данных о валидации выберите None. Импортируйте обучающие данные путем нажатия на Import.

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

Обучение сети

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

На вкладке Training нажмите Training Options. Установите InitialLearnRate на 0.001, MaxEpochs к 100, и MiniBatchSize к 64. Установите опции обучения путем нажатия на Close.

Обучите сеть путем нажатия на Train.

Если обучение завершено, нажмите Export, чтобы экспортировать обучивший сеть в рабочую область. Обучивший сеть хранится в переменной 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 + сеть, смотрите Семантическую Сегментацию С Глубоким обучением.