В этом примере показано, как использовать 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')![]()
Вы можете изменить размер числовых и категориальных изображений с помощью imresize функция. Измените размер изображения и пиксельного изображения с меткой на тот же размер и отобразите метки на изображении.
targetSize = [300 300]; resizedI = imresize(I,targetSize); resizedC = imresize(C,targetSize);
Отображение измененных размеров меток над измененным размером изображения.
B = labeloverlay(resizedI,resizedC);
imshow(B)
title('Resized Image and Pixel Labels')![]()
Обрезка является общим шагом предварительной обработки, чтобы данные совпадали с входом сети. Чтобы создать выходные изображения необходимого размера, сначала укажите размер и положение окна подрезки при помощи 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')![]()
Обрезать изображение до целевого размера из случайного положения на изображении.
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')![]()
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')![]()
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)
![]()
Примените увеличение данных к обучающим данным при помощи 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)
![]()
Второй центр увеличения обрабатывает изображение и изображение пиксельной метки до целевого размера. Эти операции определены в 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)
![]()
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
centerCropWindow2d(Набор Image Processing Toolbox) | randomAffine2d(Набор Image Processing Toolbox) | randomCropWindow2d(Набор Image Processing Toolbox)