В этом примере показано, как использовать 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)