exponenta event banner

Добавление изображений для процессов глубокого обучения с помощью инструментария обработки изображений

В этом примере показано, как MATLAB ® и Toolbox™ обработки изображений могут выполнять общие виды увеличения изображения в рамках процессов глубокого обучения.

Функции панели инструментов обработки изображений позволяют реализовать общие стили увеличения изображения. В этом примере демонстрируются пять распространенных типов преобразований:

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

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

Чтение и отображение образца изображения. Для сравнения эффекта различных типов увеличения изображения каждое преобразование использует одно и то же входное изображение.

imOriginal = imread('kobi.png');
imshow(imOriginal) 

Преобразования случайного искажения изображения

randomAffine2d Функция (Панель инструментов обработки изображений) создает рандомизированное аффинное преобразование 2-D из комбинации поворота, перемещения, масштаба (изменения размеров), отражения и сдвига. Можно указать включаемые преобразования и диапазон параметров преобразования. Если диапазон указан как двухэлементный числовой вектор, то randomAffine2d выбирает значение параметра из равномерного распределения вероятности по указанному интервалу. Для дополнительного управления диапазоном значений параметров можно указать диапазон с помощью дескриптора функции.

Управление пространственными границами и разрешением искривленного изображения, созданного imwarp(Панель инструментов обработки изображений) с помощью affineOutputView(Панель инструментов обработки изображений).

Вращение

Создайте рандомизированное преобразование поворота, которое поворачивает входное изображение на угол, произвольно выбранный из диапазона [-45, 45] градусов.

tform = randomAffine2d('Rotation',[-45 45]); 
outputView = affineOutputView(size(imOriginal),tform);
imAugmented = imwarp(imOriginal,tform,'OutputView',outputView);  
imshow(imAugmented)

Перевод

Создайте преобразование преобразования, которое сдвигает входное изображение по горизонтали и вертикали на расстояние, выбранное случайным образом из диапазона [-50, 50] пикселей.

tform = randomAffine2d('XTranslation',[-50 50],'YTranslation',[-50 50]);
outputView = affineOutputView(size(imOriginal),tform);
imAugmented = imwarp(imOriginal,tform,'OutputView',outputView);
imshow(imAugmented)

Масштаб

Создайте преобразование масштаба, которое изменяет размер входного изображения с помощью масштабного коэффициента, выбранного случайным образом из диапазона [1.2, 1.5]. Это преобразование изменяет размер изображения на один и тот же коэффициент в горизонтальном и вертикальном направлениях.

tform = randomAffine2d('Scale',[1.2,1.5]);
outputView = affineOutputView(size(imOriginal),tform);
imAugmented = imwarp(imOriginal,tform,'OutputView',outputView);
imshow(imAugmented)

Отражение

Создайте преобразование отражения, которое переворачивает входное изображение с вероятностью 50% в каждом измерении.

tform = randomAffine2d('XReflection',true,'YReflection',true);
outputView = affineOutputView(size(imOriginal),tform);
imAugmented = imwarp(imOriginal,tform,'OutputView',outputView);
imshow(imAugmented)

Постричь

Создайте преобразование горизонтального сдвига с углом сдвига, выбранным случайным образом из диапазона [-30, 30].

tform = randomAffine2d('XShear',[-30 30]); 
outputView = affineOutputView(size(imOriginal),tform); 
imAugmented = imwarp(imOriginal,tform,'OutputView',outputView);
imshow(imAugmented) 

Управление диапазоном параметров преобразования с помощью пользовательской функции выбора

В предыдущих преобразованиях диапазон параметров преобразования задавался двухэлементными числовыми векторами. Для дополнительного управления диапазоном параметров преобразования укажите дескриптор функции вместо числового вектора. Дескриптор функции не принимает входных аргументов и выдает допустимое значение для каждого параметра.

Например, этот код выбирает угол поворота из дискретного набора углов поворота на 90 градусов.

angles = 0:90:270; 
tform = randomAffine2d('Rotation',@() angles(randi(4))); 
outputView = affineOutputView(size(imOriginal),tform); 
imAugmented = imwarp(imOriginal,tform,'OutputView',outputView); 
imshow(imAugmented) 

Контрольное значение заполнения

При искажении изображения с помощью геометрического преобразования пикселы в выходном изображении могут отображаться за пределами входного изображения. В этом случае imwarp присваивает значение заливки тем пикселям в выходном изображении. По умолчанию imwarp выбирает черный цвет в качестве значения заливки. Можно изменить значение заливки, указав 'FillValues' аргумент пары имя-значение.

Создайте преобразование случайного поворота, затем примените преобразование и укажите значение заливки серого цвета.

tform = randomAffine2d('Rotation',[-45 45]);
outputView = affineOutputView(size(imOriginal),tform);
imAugmented = imwarp(imOriginal,tform,'OutputView',outputView,'FillValues',[128 128 128]);
imshow(imAugmented)

Обрезка преобразований

Для создания выходных изображений нужного размера используйте randomWindow2d(Панель инструментов обработки изображений) и centerCropWindow2d(Панель инструментов обработки изображений). Будьте внимательны, чтобы выбрать окно, которое включает нужное содержимое в изображение.

Укажите требуемый размер обрезанной области в виде двухэлементного вектора формы [высота, ширина].

targetSize = [200,100];

Обрезайте изображение до целевого размера от центра изображения.

win = centerCropWindow2d(size(imOriginal),targetSize); 
imCenterCrop = imcrop(imOriginal,win); 
imshow(imCenterCrop)

Обрезайте изображение до целевого размера из случайного расположения в изображении.

win = randomWindow2d(size(imOriginal),targetSize);
imRandomCrop = imcrop(imOriginal,win); 
imshow(imRandomCrop)

Цветовые преобразования

Можно случайным образом настроить оттенок, насыщенность, яркость и контрастность цветного изображения с помощью jitterColorHSV(Панель инструментов обработки изображений). Можно указать, какие цветовые преобразования включены, и диапазон параметров преобразования.

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

Дрожание тона

Оттенок определяет оттенок цвета или положение цвета на цветовом круге. Поскольку оттенок варьируется от 0 до 1, цвета варьируются от красного до желтого, зеленого, голубого, синего, фиолетового, пурпурного и обратно до красного. Дрожание тона изменяет кажущийся оттенок цветов на изображении.

Отрегулируйте оттенок входного изображения с помощью небольшого положительного смещения, выбранного случайным образом из диапазона [0,05, 0,15]. Красные цвета теперь выглядят более оранжевыми или желтыми, оранжевые - желтыми или зелеными и так далее.

imJittered = jitterColorHSV(imOriginal,'Hue',[0.05 0.15]);
montage({imOriginal,imJittered})

Джиттер насыщения

Насыщенность - это чистота цвета. Так как насыщенность варьируется от 0 до 1, оттенки варьируются от серого (указывая на смесь всех цветов) до одного чистого цвета. Джиттер насыщения смещает, насколько тусклыми или яркими являются цвета.

Настройте насыщенность входного изображения на смещение, выбранное случайным образом из диапазона [-0.4, -0.1]. Цвета в выходном изображении выглядят более приглушенными, как ожидалось при уменьшении насыщенности.

imJittered = jitterColorHSV(imOriginal,'Saturation',[-0.4 -0.1]); 
montage({imOriginal,imJittered})

Дрожание яркости

Яркость - это величина оттенка. Поскольку яркость изменяется от 0 до 1, цвета переходят от черного к белому. Дрожание яркости изменяет темноту и яркость входного изображения.

Регулировка яркости входного изображения путем случайного выбора смещения из диапазона [-0.3, -0.1]. Изображение выглядит темнее, как и ожидалось, когда яркость уменьшается.

imJittered = jitterColorHSV(imOriginal,'Brightness',[-0.3 -0.1]); 
montage({imOriginal,imJittered})

Дрожание контрастности

Дрожание контраста случайным образом регулирует разницу между самой темной и самой яркой областями во входном изображении.

Отрегулируйте контрастность входного изображения по масштабному коэффициенту, выбранному случайным образом из диапазона [1.2, 1.4]. Контраст увеличивается, так что тени становятся темнее, а подсветки - ярче.

imJittered = jitterColorHSV(imOriginal,'Contrast',[1.2 1.4]);
montage({imOriginal,imJittered})

Яркость и дрожание контрастности изображений в градациях серого

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

Преобразование образца изображения в градации серого. Задайте коэффициент масштаба случайной контрастности в диапазоне [0,8, 1] и смещение случайной яркости в диапазоне [-0,15, 0,15]. Умножьте изображение на масштабный коэффициент контрастности, а затем добавьте смещение яркости.

imGray = rgb2gray(im2double(imOriginal)); 
contrastFactor = 1-0.2*rand; 
brightnessOffset = 0.3*(rand-0.5); 
imJittered = imGray.*contrastFactor + brightnessOffset;
imJittered = im2uint8(imJittered);
montage({imGray,imJittered})

Рандомизированный цвет в градациях серого

Один тип увеличения цвета случайным образом удаляет информацию о цвете из изображения RGB, сохраняя при этом количество каналов, ожидаемое сетью. Этот код показывает «случайное преобразование в градациях серого», при котором RGB-изображение случайным образом преобразуется с вероятностью 80% в трехканальное выходное изображение, где R = = G = = B.

desiredProbability = 0.8;
if rand <= desiredProbability
    imJittered = repmat(rgb2gray(imOriginal),[1 1 3]);
end
imshow(imJittered) 

Другие операции обработки изображений

Используйте transform для применения любой комбинации функций панели инструментов обработки изображений к входным изображениям. Добавление шума и размытие - две общие операции обработки изображений, используемые в приложениях глубокого обучения.

Синтетический шум

Чтобы применить синтетический шум к входному изображению, используйте imnoise(Панель инструментов обработки изображений). Можно указать, какую модель шума использовать, например гауссову, пуассоновскую, соль и перец и мультипликативный шум. Можно также указать уровень шума.

imSaltAndPepperNoise = imnoise(imOriginal,'salt & pepper',0.1);
imGaussianNoise = imnoise(imOriginal,'gaussian');
montage({imSaltAndPepperNoise,imGaussianNoise}) 

Синтетическое размытие

Чтобы применить рандомизированное размытие по Гауссу к изображению, используйте imgaussfilt(Панель инструментов обработки изображений). Можно указать степень сглаживания.

sigma = 1+5*rand; 
imBlurred = imgaussfilt(imOriginal,sigma); 
imshow(imBlurred)

Применение дополнения к данным изображения в хранилищах данных

В практических проблемах глубокого обучения конвейер увеличения изображения обычно объединяет несколько операций. Хранилища данных - это удобный способ чтения и дополнения коллекций изображений.

Хранилища данных - это удобный способ чтения и дополнения коллекций изображений. В этом разделе примера показано, как определить конвейеры увеличения данных, которые увеличивают хранилища данных в контексте проблем классификации обучающих изображений и регрессии изображений.

Сначала создайте imageDatastore содержит необработанные изображения. Хранилище данных изображения в этом примере содержит цифровые изображения с метками.

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet', ...
    'nndemos','nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');
imds.ReadSize = 6;

Классификация изображений

При классификации изображения классификатор должен узнать, что случайно измененная версия изображения по-прежнему представляет тот же класс изображения. Для увеличения данных для классификации изображений достаточно увеличить входные изображения, оставив без изменений соответствующие категориальные метки.

Увеличение изображений в первозданном хранилище данных изображений со случайным размытием по Гауссу, шумом соли и перца, а также рандомизированным масштабом и вращением. Эти операции определены в функции помощника classificationAugmentationPipeline в конце этого примера. Применение увеличения данных к данным обучения с помощью transform функция.

dsTrain = transform(imds,@classificationAugmentationPipeline,'IncludeInfo',true);

Визуализируйте выборку выходных данных из дополненного трубопровода.

dataPreview = preview(dsTrain);
montage(dataPreview(:,1))
title("Augmented Images for Image Classification")

Регрессия изображения

Увеличение изображения для регрессии от изображения к изображению является более сложным, поскольку к входным и ответным изображениям необходимо применить идентичные геометрические преобразования. Связывание пар изображений ввода и ответа с помощью combine функция. Преобразование одного или обоих изображений в каждой паре с помощью transform функция.

Объединение двух идентичных копий хранилища данных образа imds. Когда данные считываются из объединенного хранилища данных, данные изображения возвращаются в массиве ячеек из двух столбцов, где первый столбец представляет сетевые входные изображения, а второй столбец содержит сетевые ответы.

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")

Полный пример, включающий обучение и оценку сети регрессии «изображение-изображение», см. в разделе Подготовка хранилища данных для регрессии «изображение-изображение».

Вспомогательные функции

classificationAugmentationPipeline функция помощника дополняет изображения для классификации. dataIn и dataOut представляют собой двухэлементные массивы ячеек, где первым элементом является сетевой входной образ, а вторым элементом - категориальная метка.

function [dataOut,info] = classificationAugmentationPipeline(dataIn,info)

dataOut = cell([size(dataIn,1),2]);

for idx = 1:size(dataIn,1)
    temp = dataIn{idx};
    
    % Add 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 the 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)
    
    % Resize images to 32-by-32 pixels and convert to data type single
    inputImage = im2single(imresize(dataIn{idx,1},[32 32]));
    targetImage = im2single(imresize(dataIn{idx,2},[32 32]));
    
    % Add salt and pepper noise
    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

См. также

|

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

Подробнее