Увеличьте пиксельные метки для Семантической Сегментации

В этом примере показано, как выполнить общие виды изображения, и пиксель помечают увеличение как часть рабочих процессов семантической сегментации.

Обучающие данные семантической сегментации состоят из изображений, представленных числовыми матрицами и пиксельными изображениями метки, представленными категориальными матрицами. Когда вы увеличиваете обучающие данные, необходимо применить идентичные преобразования к изображению и сопоставленным пиксельным меткам. Этот пример демонстрирует три общих типа преобразований:

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

Можно использовать увеличенные обучающие данные, чтобы обучить сеть. Для примера, показывающего, как обучить сеть семантической сегментации, смотрите, что Семантическая Сегментация Использует Глубокое обучение (Computer Vision Toolbox).

Чтобы продемонстрировать эффекты различных типов увеличения, каждое преобразование в этом примере использует то же входное изображение и пиксельное изображение метки.

Считайте демонстрационное изображение.

filenameImage = 'kobi.png';
I = imread(filenameImage);

Считайте пиксельное изображение метки. Изображение имеет два класса.

filenameLabels = 'kobiPixelLabeled.png';
L = imread(filenameLabels);
classes = ["floor","dog"];
ids = [1 2];

Преобразуйте пиксельное изображение метки в тип категориальных данных.

C = categorical(L,ids,classes);

Отобразите метки по изображению при помощи labeloverlay функция. Пиксели с меткой "пол" имеют синий оттенок, и пиксели с меткой "собака" имеют голубой оттенок.

B = labeloverlay(I,C);
imshow(B)
title('Original Image and Pixel Labels')

Figure contains an axes object. The axes object with title Original Image and Pixel Labels contains an object of type image.

Измените размер и пиксельных меток изображений

Можно изменить размер числовых и категориальных изображений при помощи imresize функция. Измените размер изображения и пиксельного изображения метки к тому же размеру, и отобразите метки по изображению.

targetSize = [300 300];
resizedI = imresize(I,targetSize);
resizedC = imresize(C,targetSize);

Отобразите измененные метки по измененному изображению.

B = labeloverlay(resizedI,resizedC);
imshow(B)
title('Resized Image and Pixel Labels')

Figure contains an axes object. The axes object with title Resized Image and Pixel Labels contains an object of type image.

Обрежьте и пиксельные метки изображений

Обрезка является общим шагом предварительной обработки, чтобы заставить данные совпадать с входным размером сети. Чтобы создать выходные изображения желаемого размера, сначала задайте размер и положение окна обрезки при помощи randomWindow2d (Image Processing Toolbox) и centerCropWindow2d (Image Processing Toolbox) функции. Убедитесь, что вы выбираете окно обрезки, которое включает желаемое содержимое в изображение. Затем обрежьте изображение и пиксельное изображение метки к тому же окну при помощи imcrop.

Задайте желаемый размер обрезанной области как двухэлементный вектор из формы [высота, ширина].

targetSize = [300 300];

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

win = centerCropWindow2d(size(I),targetSize);
croppedI = imcrop(I,win);
croppedC = imcrop(C,win);

Отобразите обрезанные метки по кадрированному изображению.

B = labeloverlay(croppedI,croppedC);
imshow(B)
title('Center Cropped Image and Pixel Labels')

Figure contains an axes object. The axes object with title Center Cropped Image and Pixel Labels contains an object of type image.

Обрежьте изображение к целевому размеру от случайного положения в изображении.

win = randomWindow2d(size(I),targetSize);
croppedI = imcrop(I,win);
croppedC = imcrop(C,win);

Отобразите обрезанные метки по кадрированному изображению.

B = labeloverlay(croppedI,croppedC);
imshow(B)
title('Random Cropped Image and Pixel Labels')

Figure contains an axes object. The axes object with title Random Cropped Image and Pixel Labels contains an object of type image.

Деформируйте и пиксельные метки изображений

randomAffine2d (Image Processing Toolbox) функция создает рандомизированное 2D аффинное преобразование из комбинации вращения, перевода, масштабируясь (изменение размеров), отражение и сдвиг. Примените преобразование к изображениям и пиксельным изображениям метки при помощи imwarp (Image Processing Toolbox). Управляйте пространственными границами и разрешением деформированного выхода при помощи affineOutputView (Image Processing Toolbox) функция.

Вращайте входное изображение и пиксельное изображение метки углом, выбранным случайным образом из области значений [-50,50] степени.

tform = randomAffine2d("Rotation",[-50 50]);

Создайте выходное представление для деформированного изображения и пиксельного изображения метки.

rout = affineOutputView(size(I),tform);

Используйте imwarp чтобы вращать изображение и пиксель помечают изображение.

rotatedI = imwarp(I,tform,'OutputView',rout);
rotatedC = imwarp(C,tform,'OutputView',rout);

Отобразите вращаемые метки по вращаемому изображению.

B = labeloverlay(rotatedI,rotatedC);
imshow(B)
title('Rotated Image and Pixel Labels')

Figure contains an axes object. The axes object with title Rotated Image and Pixel Labels contains an object of type image.

Примените увеличение к обучающим данным Семантической Сегментации в хранилищах данных

Хранилища данных являются удобным способом считать и увеличить наборы изображений. Создайте datastore, который хранит изображение, и пиксель помечают данные изображения и увеличивают данные с рядом нескольких операций.

Создайте хранилища данных, содержащие изображение и пиксельные данные изображения метки

Чтобы увеличить размер демонстрационных хранилищ данных, реплицируйте имена файлов изображения и пиксельного изображения метки.

numObservations = 4;
trainImages = repelem({filenameImage},numObservations,1);
trainLabels = repelem({filenameLabels},numObservations,1);

Создайте imageDatastore от учебных файлов изображений. Создайте pixelLabelDatastore от учебного пикселя помечают файлы. Хранилища данных содержат несколько копий тех же данных.

imds = imageDatastore(trainImages);
pxds = pixelLabelDatastore(trainLabels,classes,ids);

Сопоставьте изображение и пиксельные пары метки путем объединения datastore изображений и пиксельного datastore метки.

trainingData = combine(imds,pxds);

Считайте первое изображение и его связанное пиксельное изображение метки от объединенного datastore.

data = read(trainingData);
I = data{1};
C = data{2};

Отобразите изображение и данные о пиксельных метках.

B = labeloverlay(I,C);
imshow(B)

Figure contains an axes object. The axes object contains an object of type image.

Примените увеличение данных

Примените увеличение данных к обучающим данным при помощи transform функция. Этот пример выполняет два отдельных увеличения к обучающим данным.

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

augmentedTrainingData = transform(trainingData,@jitterImageColorAndWarp);

Считайте все увеличенные данные.

data = readall(augmentedTrainingData);

Отобразите увеличенное изображение и данные о пиксельных метках.

rgb = cell(numObservations,1);
for k = 1:numObservations
    I = data{k,1};
    C = data{k,2};
    rgb{k} = labeloverlay(I,C);
end
montage(rgb)

Figure contains an axes object. The axes object contains an object of type image.

Второе увеличение сосредотачивает обрезки изображение и пиксельное изображение метки к целевому размеру. Эти операции заданы в centerCropImageAndLabel функция помощника в конце этого примера.

targetSize = [800 800];
preprocessedTrainingData = transform(augmentedTrainingData,...
    @(data)centerCropImageAndLabel(data,targetSize));

Считайте все предварительно обработанные данные.

data = readall(preprocessedTrainingData);

Отобразите предварительно обработанное изображение и данные о пиксельных метках.

rgb = cell(numObservations,1);
for k = 1:numObservations
    I = data{k,1};
    C = data{k,2};
    rgb{k} = labeloverlay(I,C);
end
montage(rgb)

Figure contains an axes object. The axes object contains an object of type image.

Помощник функционирует для увеличения

jitterImageColorAndWarp функция помощника применяет дрожание произвольного цвета к данным изображения, затем применяет идентичное аффинное преобразование к изображению, и пиксель помечают данные изображения. Преобразование состоит из случайной комбинации масштабирования масштабным коэффициентом в области значений [0.8 1.5], горизонтальное отражение и вращение в области значений [-30, 30] степени. Вход data и выход out двухэлементные массивы ячеек, где первым элементом являются данные изображения, и вторым элементом являются пиксельные данные изображения метки.

function out = jitterImageColorAndWarp(data)
% Unpack original data.
I = data{1};
C = data{2};

% Apply random color jitter.
I = jitterColorHSV(I,"Brightness",0.3,"Contrast",0.4,"Saturation",0.2);

% Define random affine transform.
tform = randomAffine2d("Scale",[0.8 1.5],"XReflection",true,'Rotation',[-30 30]);
rout = affineOutputView(size(I),tform);

% Transform image and bounding box labels.
augmentedImage = imwarp(I,tform,"OutputView",rout);
augmentedLabel = imwarp(C,tform,"OutputView",rout);

% Return augmented data.
out = {augmentedImage,augmentedLabel};
end

centerCropImageAndLabel функция помощника создает окно обрезки, сосредоточенное на изображении, затем обрезки и изображение и пиксельное изображение метки с помощью окна обрезки. Вход data и выход out двухэлементные массивы ячеек, где первым элементом являются данные изображения, и вторым элементом являются пиксельные данные изображения метки.

function out = centerCropImageAndLabel(data,targetSize)
win = centerCropWindow2d(size(data{1}),targetSize);
out{1} = imcrop(data{1},win);
out{2} = imcrop(data{2},win);
end

Смотрите также

(Image Processing Toolbox) | (Image Processing Toolbox) | (Image Processing Toolbox)

Связанные примеры

Больше о