В этом примере показано, как MATLAB® и Image Processing Toolbox™ могут выполнить общие виды увеличения изображений как часть рабочих процессов глубокого обучения.
Функции Image Processing Toolbox позволяют вам реализовать общие стили увеличения изображений. Этот пример демонстрирует пять общих типов преобразований:
Пример затем показывает, как применить увеличение к данным изображения в хранилищах данных с помощью комбинации нескольких типов преобразований.
Можно использовать увеличенные обучающие данные, чтобы обучить сеть. Для примера обучения сеть с помощью увеличенных изображений смотрите, Готовят Datastore к Регрессии От изображения к изображению.
Считайте и отобразите демонстрационное изображение. Чтобы сравнить эффект различных типов увеличения изображений, каждое преобразование использует то же входное изображение.
peppers = imread('kobi.png');
imshow(peppers)
randomAffine2d
функция создает рандомизированное 2D аффинное преобразование из комбинации вращения, перевода, шкала (изменение размеров), отражение и сдвиг. Можно задать который преобразования включать и область значений параметров преобразования. Если вы указываете диапазон как двухэлементный числовой вектор, то randomAffine2d
выбирает значение параметра от универсального вероятностного распределения на заданном интервале. Для большего количества управления области значений значений параметров можно указать диапазон с помощью указателя на функцию.
Управляйте пространственными границами и разрешением деформированного изображения, созданного imwarp
при помощи affineOutputView
функция.
Создайте рандомизированное преобразование вращения, которое вращает входное изображение углом, выбранным случайным образом из области значений [-45,45] степени.
tform = randomAffine2d('Rotation',[-45 45]); outputView = affineOutputView(size(peppers),tform); augmented = imwarp(peppers,tform,'OutputView',outputView); imshow(augmented)
Создайте преобразование перевода, которое переключает входное изображение горизонтально и вертикально расстоянием, выбранным случайным образом из области значений [-50,50] пиксели.
tform = randomAffine2d('XTranslation',[-50 50],'YTranslation',[-50 50]); outputView = affineOutputView(size(peppers),tform); augmented = imwarp(peppers,tform,'OutputView',outputView); imshow(augmented)
Создайте преобразование шкалы, которое изменяет размер входного изображения с помощью масштабного коэффициента, выбранного случайным образом из области значений [1.2 1.5]. Это преобразование изменяет размер изображения тем же самым, включают горизонтальные и вертикальные направления.
tform = randomAffine2d('Scale',[1.2,1.5]); outputView = affineOutputView(size(peppers),tform); augmented = imwarp(peppers,tform,'OutputView',outputView); imshow(augmented)
Создайте отражательное преобразование, которое инвертирует входное изображение с 50%-й вероятностью в каждой размерности.
tform = randomAffine2d('XReflection',true,'YReflection',true); outputView = affineOutputView(size(peppers),tform); augmented = imwarp(peppers,tform,'OutputView',outputView); imshow(augmented)
Создайте горизонтальное преобразование сдвига с углом сдвига, выбранным случайным образом из области значений [-30,30].
tform = randomAffine2d('XShear',[-30 30]); outputView = affineOutputView(size(peppers),tform); augmented = imwarp(peppers,tform,'OutputView',outputView); imshow(augmented)
В предыдущих преобразованиях диапазон параметров преобразования был указан двухэлементными числовыми векторами. Для большего количества управления области значений параметров преобразования задайте указатель на функцию вместо числового вектора. Указатель на функцию не берет входных параметров и дает к допустимому значению для каждого параметра.
Например, этот код выбирает угол поворота из дискретного набора 90 углов поворота степени.
angles = 0:90:270; tform = randomAffine2d('Rotation',@() angles(randi(4))); outputView = affineOutputView(size(peppers),tform); augmented = imwarp(peppers,tform,'OutputView',outputView); imshow(augmented)
Когда вы деформируете изображение с помощью геометрического преобразования, пиксели в выходном изображении могут сопоставить с местоположением вне границ входного изображения. В этом случае, imwarp
присваивает значение заливки тем пикселям в выходном изображении. По умолчанию, imwarp
выбирает черный как значение заливки. Можно изменить значение заливки путем определения 'FillValues'
аргумент пары "имя-значение".
Создайте случайное rotatation преобразование, затем примените преобразование и задайте серое значение заливки.
tform = randomAffine2d('Rotation',[-45 45]); outputView = affineOutputView(size(peppers),tform); augmented = imwarp(peppers,tform,'OutputView',outputView,'FillValues',[128 128 128]); imshow(augmented)
Чтобы создать выходные изображения желаемого размера, используйте randomCropWindow2d
и centerCropWindow2d
функции. Старайтесь выбрать окно обрезки, которое включает желаемое содержимое в изображение.
Задайте желаемый размер обрезанной области как вектор с 2 элементами формы [высота, ширина].
targetSize = [200,100];
Обрежьте изображение к целевому размеру от центра изображения.
win = centerCropWindow2d(size(peppers),targetSize); peppersCenterCrop = imcrop(peppers,win); imshow(peppersCenterCrop)
Обрежьте изображение к целевому размеру от случайного местоположения в изображении.
win = randomCropWindow2d(size(peppers),targetSize); peppersRandomCrop = imcrop(peppers,win); imshow(peppersRandomCrop)
Можно случайным образом настроить оттенок, насыщение, яркость и контраст цветного изображения при помощи jitterColorHSV
функция. Можно задать, какие преобразования цвета включены и область значений параметров преобразования.
Можно случайным образом настроить яркость и контраст полутоновых изображений при помощи основных математических операций.
Оттенок задает оттенок цвета или позицию цвета по цветовому диску. Когда оттенок варьируется от 0 до 1, цвета варьируются от красного до желтого, зеленого, голубого цвета, синего, фиолетового, пурпурного цвета, и назад к красному. Дрожание оттенка переключает очевидный оттенок, раскрашивает изображение.
Настройте оттенок входного изображения маленьким положительным смещением, выбранным случайным образом из области значений [0.05, 0.15]. Цвета, которые были красными теперь, кажутся более оранжевыми или желтыми, цвета, которые были оранжевыми, кажутся желтыми или зелеными и так далее.
augmented = jitterColorHSV(peppers,'Hue',[0.05 0.15]);
montage({peppers,augmented})
Насыщение является чистотой цвета. Когда насыщение варьируется от 0 до 1, оттенки варьируются от серого (указание на смесь всех цветов) к одному чистому цвету. Дрожание насыщения переключает, как тусклые или вибрирующие цвета.
Настройте насыщение входного изображения смещением, выбранным случайным образом из области значений [-0.4,-0.1]. Цвета в выходном изображении кажутся более с отключенным звуком, как ожидалось когда насыщение уменьшается.
augmented = jitterColorHSV(peppers,'Saturation',[-0.4 -0.1]);
montage({peppers,augmented})
Яркость является суммой оттенка. Когда яркость варьируется от 0 до 1, цвета идут от черного до белого. Колебание яркости переключает темноту и легкость входного изображения.
Настройте яркость входного изображения смещением, выбранным случайным образом из области значений [-0.3,-0.1]. Изображение кажется более темным, как ожидалось когда яркость уменьшается.
augmented = jitterColorHSV(peppers,'Brightness',[-0.3 -0.1]);
montage({peppers,augmented})
Контрастное дрожание случайным образом настраивает различие между самыми темными и самыми яркими областями во входном изображении.
Настройте контраст входного изображения масштабным коэффициентом, выбранным случайным образом из области значений [1.2, 1.4]. Контрастные увеличения, такие, что тени становятся более темными и подсветки, становятся более яркими.
augmented = jitterColorHSV(peppers,'Contrast',[1.2 1.4]);
montage({peppers,augmented})
Можно применить рандомизированную яркость и контрастировать дрожание с полутоновыми изображениями при помощи основных математических операций.
Преобразуйте демонстрационное изображение в шкалу полутонов. Задайте случайный контрастный масштабный коэффициент в области значений [0.8, 1] и случайное смещение яркости в области значений [-0.15, 0.15]. Умножьте изображение на контрастный масштабный коэффициент, затем добавьте смещение яркости.
peppersGray = rgb2gray(im2double(peppers)); contrastFactor = 1-0.2*rand; brightnessOffset = 0.3*(rand-0.5); peppersJittered = peppersGray.*contrastFactor + brightnessOffset; peppersJittered = im2uint8(peppersJittered); montage({peppersGray,peppersJittered})
Один тип цветного увеличения случайным образом исключает информацию о цвете из изображения RGB при сохранении количества каналов, ожидаемых сетью. Этот код показывает "случайное полутоновое" преобразование, в котором изображение RGB случайным образом преобразовано с 80% prabability к трем выходным изображениям канала где R == G == B.
desiredProbability = 0.8; if rand > desiredProbability peppersGray = repmat(rgb2gray(peppers),[1 1 3]); end imshow(peppersGray)
Используйте transform
функция, чтобы применить любую комбинацию Image Processing Toolbox функционирует, чтобы ввести изображения. Добавление шума и размытости является двумя общими операциями обработки изображений, используемыми в применении глубокого обучения.
Чтобы применить синтетический шум к входному изображению, используйте imnoise
функция. Можно задать который шумовая модель использовать, такой как Гауссовы, Пуассон, соль и перец и мультипликативный шум. Можно также задать силу шума.
peppersSaltAndPepper = imnoise(peppers,'salt & pepper',0.1); peppersGaussian = imnoise(peppers,'gaussian'); montage({peppersSaltAndPepper,peppersGaussian})
Чтобы применить рандомизированную Гауссову размытость к изображению, используйте imgaussfilt
функция. Можно задать объем сглаживания.
sigma = 1+5*rand; blurredPeppers = imgaussfilt(peppers,sigma); imshow(blurredPeppers)
В практических проблемах глубокого обучения конвейер увеличения изображений обычно комбинирует несколько операций. Хранилища данных являются удобным способом считать и увеличить наборы изображений.
Хранилища данных являются удобным способом считать и увеличить наборы изображений. Этот раздел примера показывает, как задать конвейеры увеличения данных, которые увеличивают хранилища данных в контексте учебной классификации изображений и отображают проблемы регрессии.
Во-первых, создайте imageDatastore
это содержит необработанные изображения. Datastore изображений в этом примере содержит изображения цифры с метками.
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet', ... 'nndemos','nndatasets','DigitDataset'); imds = imageDatastore(digitDatasetPath, ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); imds.ReadSize = 6;
В классификации изображений классификатор должен узнать, что случайным образом измененная версия изображения все еще представляет тот же класс изображений. Чтобы увеличить данные для классификации изображений, достаточно увеличить входные изображения при оставлении соответствующих категориальных меток без изменений.
Увеличьте изображения в нетронутом datastore изображений со случайной Гауссовой размытостью, солью и перечным шумом, и рандомизированной шкалой и вращением. Эти операции заданы в функции помощника classificationAugmentationPipeline
в конце этого примера. Примените увеличение данных к обучающим данным при помощи transform
функция.
dsTrain = transform(imds,@classificationAugmentationPipeline,'IncludeInfo',true);
Визуализируйте выборку выхода, прибывающего из увеличенного конвейера.
dataPreview = preview(dsTrain);
montage(dataPreview(:,1))
title("Augmented Images for Image Classification")
Увеличение изображений для регрессии от изображения к изображению более сложно, потому что необходимо применить идентичные геометрические преобразования к изображениям ответа и входу. Объединенные пары входа и ответа отображают при помощи combine
функция. Преобразуйте одно или оба изображения в каждую пару при помощи transform
функция.
Объедините две идентичных копии datastore изображений imds
. Когда данные считаны из объединенного datastore, данные изображения возвращены в массиве 2D ячейки столбца, где первый столбец представляет сетевые входные изображения, и второй столбец содержит сетевые ответы.
dsCombined = combine(imds,imds); montage(preview(dsCombined)','Size',[6 2]) title("Combined Input and Response Pairs Before Augmentation")
Увеличьте каждую пару учебных изображений с рядом операций обработки изображений:
Измените размер входа и изображения ответа к 32 32 пикселям.
Добавьте, что соль и перечный шум к входу отображают только.
Создайте преобразование, которое рандомизировало шкалу и вращение.
Примените то же преобразование к изображению ответа и входу.
Эти операции заданы в функции помощника imageRegressionAugmentationPipeline
в конце этого примера. Примените увеличение данных к обучающим данным при помощи transform
функция.
dsTrain = transform(dsCombined,@imageRegressionAugmentationPipeline); montage(preview(dsTrain)','Size',[6 2]) title("Combined Input and Response Pairs After Augmentation")
Для полного примера, который включает обучение и оценку сети регрессии от изображения к изображению, смотрите, Готовят Datastore к Регрессии От изображения к изображению.
classificationAugmentationPipeline
функция помощника увеличивает изображения для классификации. dataIn
и dataOut
двухэлементные массивы ячеек, где первый элемент является сетевым входным изображением, и второй элемент является сетевым изображением ответа.
function [dataOut,info] = classificationAugmentationPipeline(dataIn,info) dataOut = cell([size(dataIn,1),2]); for idx = 1:size(dataIn,1) temp = dataIn{idx}; % Randomized Gaussian blur temp = imgaussfilt(temp,1.5*rand); % Add salt and pepper noise temp = imnoise(temp,'salt & pepper'); % Add randomized rotation and scale tform = randomAffine2d('Scale',[0.95,1.05],'Rotation',[-30 30]); outputView = affineOutputView(size(temp),tform); temp = imwarp(temp,tform,'OutputView',outputView); % Form second column expected by trainNetwork which is expected response, % the categorical label in this case dataOut(idx,:) = {temp,info.Label(idx)}; end end
imageRegressionAugmentationPipeline
функция помощника увеличивает изображения для регрессии от изображения к изображению. dataIn
и dataOut
двухэлементные массивы ячеек, где первый элемент является сетевым входным изображением, и второй элемент является сетевым изображением ответа.
function dataOut = imageRegressionAugmentationPipeline(dataIn) dataOut = cell([size(dataIn,1),2]); for idx = 1:size(dataIn,1) inputImage = im2single(imresize(dataIn{idx,1},[32 32])); targetImage = im2single(imresize(dataIn{idx,2},[32 32])); inputImage = imnoise(inputImage,'salt & pepper'); % Add randomized rotation and scale tform = randomAffine2d('Scale',[0.9,1.1],'Rotation',[-30 30]); outputView = affineOutputView(size(inputImage),tform); % Use imwarp with the same tform and outputView to augment both images % the same way inputImage = imwarp(inputImage,tform,'OutputView',outputView); targetImage = imwarp(targetImage,tform,'OutputView',outputView); dataOut(idx,:) = {inputImage,targetImage}; end end