В этом примере показано, как создать и обучить простую сеть семантической сегментации с помощью 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.
Соедините слои в следующем порядке:
imageInputLayer с InputSize установлено на 32,32,1
convolution2dLayer с FilterSize установлено на 3,3, NumFilters установлено на 64, и Padding установлено на 1,1,1,1
reluLayer
maxPooling2dLayer с PoolSize установлено на 2,2, Stride установлено на 2,2, и Padding установлено на 0,0,0,0
convolution2dLayer с FilterSize установлено на 3,3, NumFilters установлено на 64, и Padding установлено на 1,1,1,1
reluLayer
transposedConv2dLayer с FilterSize установлено на 4,4, NumFilters установлено на 64, Stride установлено на 2,2, and Cropping установлено на 1,1,1,1
convolution2dLayer с FilterSize установлено на 1,1, NumFilters установлено на 2, и Padding установлено на 0,0,0,0
softmaxLayer
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 +, см. Семантическая сегментация с глубоким обучением.