В этом примере показано, как использовать MATLAB ®, Computer Vision Toolbox™ и 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 функция. Пиксели с меткой «floor» имеют синий оттенок, а пиксели с меткой «dog» имеют голубой оттенок.
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 Функция (Панель инструментов обработки изображений) создает рандомизированное аффинное преобразование 2-D из комбинации поворота, перемещения, масштабирования (изменения размеров), отражения и сдвига. Применение преобразования к изображениям и изображениям меток пикселей с помощью 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')![]()
Хранилища данных - это удобный способ чтения и дополнения коллекций изображений. Создайте хранилище данных, в котором хранятся данные изображения и изображения метки пикселя, и дополните данные несколькими операциями.
Чтобы увеличить размер хранилищ данных образца, реплицируйте имена файлов изображения и изображения метки пикселя.
numObservations = 4;
trainImages = repelem({filenameImage},numObservations,1);
trainLabels = repelem({filenameLabels},numObservations,1);Создание imageDatastore из файлов обучающих изображений. Создать pixelLabelDatastore из файлов меток обучающих пикселей. Хранилища данных содержат несколько копий одних и тех же данных.
imds = imageDatastore(trainImages); pxds = pixelLabelDatastore(trainLabels,classes,ids);
Связывайте пары меток изображения и пикселей, комбинируя хранилище данных изображения и хранилище данных меток пикселей.
trainingData = combine(imds,pxds);
Считывание первого изображения и связанного с ним изображения метки пикселя из объединенного хранилища данных.
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(Панель инструментов обработки изображений)