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

В этом примере показано, как использовать MATLAB ®, Computer Vision Toolbox™ и Image Processing Toolbox™ для выполнения общих видов увеличения меток изображений и пикселей как части рабочих процессов семантической сегментации.

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

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

Можно использовать дополненные обучающие данные для обучения сети. Пример, показывающий, как обучить сеть семантической сегментации, см. в Semantic Segmentation Using Deep Learning (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. The axes 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. The axes with title Resized Image and Pixel Labels contains an object of type image.

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

Обрезка является общим шагом предварительной обработки, чтобы данные совпадали с входом сети. Чтобы создать выходные изображения необходимого размера, сначала укажите размер и положение окна подрезки при помощи randomCropWindow2d (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. The axes with title Center Cropped Image and Pixel Labels contains an object of type image.

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

win = randomCropWindow2d(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. The axes with title Random Cropped Image and Pixel Labels contains an object of type image.

Деформация меток изображений и пикселей

The randomAffine2d (Image Processing Toolbox) функция создает рандомизированное 2-D аффинное преобразование из комбинации вращения, перемещения, масштабирования (изменения размера), отражения и сдвига. Примените преобразование к изображениям и пиксельным изображениям с метками при помощи 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. The axes with title Rotated Image and Pixel Labels contains an object of type image.

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

Datastores - удобный способ чтения и увеличения наборов изображений. Создайте 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. The axes 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. The axes 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. The axes contains an object of type image.

Вспомогательные функции для увеличения

The 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

The centerCropImageAndLabel Функция helper создает окно подрезки с центром на изображении, затем обрезает и изображение, и изображение метки пикселя с помощью окна подрезки. Область входа 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)

Похожие примеры

Подробнее о