В этом примере показано, как создать и обучить простую сеть семантической сегментации с помощью 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 +, см. Семантическая сегментация с глубоким обучением.