В этом примере показано, как использовать MATLAB®, Computer Vision Toolbox™, и Image Processing Toolbox™, чтобы выполнить общие виды изображения и пикселя помечает увеличение как часть рабочих процессов семантической сегментации.
Обучающие данные семантической сегментации состоят из изображений, представленных числовыми матрицами и пиксельными изображениями метки, представленными категориальными матрицами. Когда вы увеличиваете обучающие данные, необходимо применить идентичные преобразования к изображению и сопоставленным пиксельным меткам. Этот пример демонстрирует три общих типа преобразований:
Пример затем показывает, как применить увеличение к обучающим данным семантической сегментации в хранилищах данных с помощью комбинации нескольких типов преобразований.
Можно использовать увеличенные обучающие данные, чтобы обучить сеть. Для примера, показывающего, как обучить сеть семантической сегментации, смотрите, что Семантическая Сегментация Использует Глубокое обучение (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
и centerCropWindow2d
функции. Убедитесь, что вы выбираете окно обрезки, которое включает желаемое содержимое в изображение. Затем обрежьте изображение и пиксельное изображение метки к тому же окну при помощи 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')
randomAffine2d
функция создает рандомизированное 2D аффинное преобразование из комбинации вращения, перевода, масштабируясь (изменение размеров), отражение и сдвиг. Примените преобразование к изображениям и пиксельным изображениям метки при помощи imwarp
. Управляйте пространственными границами и разрешением деформированного выхода при помощи affineOutputView
функция.
Вращайте входное изображение и пиксельное изображение метки углом, выбранным случайным образом из области значений [-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')
Хранилища данных являются удобным способом считать и увеличить наборы изображений. Создайте 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);
Считайте первое изображение и его assocated пиксельное изображение метки от объединенного 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)
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
centerCropWindow2d
| randomAffine2d
| randomCropWindow2d