Увеличьте изображения для рабочих процессов глубокого обучения Используя Image Processing Toolbox

В этом примере показано, как 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 функция. Можно задать, какие преобразования цвета включены и область значений параметров преобразования.

Можно случайным образом настроить яркость и контраст полутоновых изображений при помощи основных математических операций.

Оттенок Jiitter

Оттенок задает оттенок цвета или позицию цвета по цветовому диску. Когда оттенок варьируется от 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

Смотрите также

|

Связанные примеры

Больше о