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