В этом примере показано, как использовать MATLAB ®, Computer Vision Toolbox™ и Image Processing Toolbox™ для выполнения общих видов увеличения изображений и ограничивающих коробок как части рабочих процессов обнаружения объектов.
Обучающие данные детектора объектов состоят из изображений и связанных с ними меток ограничивающих прямоугольников. При увеличении обучающих данных необходимо применить идентичные преобразования к изображению и связанным ограничительным рамкам. Этот пример демонстрирует три распространенных типа преобразований:
Затем пример показывает, как применить увеличение к обучающим данным в хранилищах данных с помощью комбинации нескольких типов преобразований.
Можно использовать дополненные обучающие данные для обучения сети. Пример, показывающий, как обучить сеть обнаружения объектов, см. в разделе Обнаружение объектов с использованием Faster R-CNN Deep Learning (Computer Vision Toolbox).
Считайте и отобразите образец изображения и ограничивающий прямоугольник. Чтобы сравнить эффекты различных типов увеличения, каждое преобразование в этом примере использует одно и то же входное изображение и ограничивающий прямоугольник.
filenameImage = 'kobi.png'; I = imread(filenameImage); bbox = [4 156 1212 830]; label = "dog";
Отобразите изображение и ограничивающий прямоугольник.
annotatedImage = insertShape(I,"rectangle",bbox,"LineWidth",8); imshow(annotatedImage) title('Original Image and Bounding Box')
Использование imresize
масштабирование изображения в 2 раза.
scale = 1/2; J = imresize(I,scale);
Использование bboxresize
для применения того же масштабирования к связанному ограничивающему прямоугольнику.
bboxResized = bboxresize(bbox,scale);
Отобразите измененные размеры изображения и ограничивающий прямоугольник.
annotatedImage = insertShape(J,"rectangle",bboxResized,"LineWidth",8); imshow(annotatedImage) title('Resized Image and Bounding Box')
Обрезка является общим шагом предварительной обработки, чтобы данные совпадали с входом сети. Чтобы создать выходные изображения необходимого размера, сначала укажите размер и положение окна подрезки при помощи randomCropWindow2d
(Image Processing Toolbox) и centerCropWindow2d
(Image Processing Toolbox) функции. Убедитесь, что вы выбрали окно обрезки, которое включает в себя требуемое содержимое изображения. Затем обрезайте изображение и пиксельное изображение с меткой в то же окно при помощи imcrop
.
Задайте требуемый размер обрезанной области как двухэлементный вектор вида [высота, ширина].
targetSize = [1024 1024];
Обрезать изображение до целевого размера из центра изображения при помощи imcrop
.
win = centerCropWindow2d(size(I),targetSize); J = imcrop(I,win);
Обрезать ограничительные рамки, используя то же окно подрезки, используя bboxcrop
. Задайте OverlapThreshold
как значение меньше 1, так что функция обрезает ограничительные рамки в окне подрезки вместо того, чтобы отбрасывать их, когда окно подрезки не полностью окружает ограничительный прямоугольник. Порог перекрытия позволяет вам контролировать количество усечения, которое допустимо для объектов на ваших изображениях. Например, отсечение более половины человека не является полезным для обучения детектора человека, в то время как отсечение половины транспортного средства может быть допустимым.
[bboxCropped,valid] = bboxcrop(bbox,win,"OverlapThreshold",0.7);
Сохраните метки, которые находятся в окне обрезки.
label = label(valid);
Отобразите обрезанное изображение и ограничивающий прямоугольник.
annotatedImage = insertShape(J,"rectangle",bboxCropped,"LineWidth",8); imshow(annotatedImage) title('Cropped Image and Bounding Box')
Кадрирование и изменение размеров часто выполняются вместе. Можно использовать bboxcrop
и bboxresize
последовательно для реализации обычно используемого преобразования «обрезка и изменение размера».
Создайте окно подрезки из случайного положения на изображении. Обрезать изображение и ограничивающий прямоугольник до одного и того же окна подрезки.
cropSize = [1024 1024];
win = randomCropWindow2d(size(I),cropSize);
J = imcrop(I,win);
croppedBox = bboxcrop(bbox,win,"OverlapThreshold",0.5);
Измените размер изображения и коробки на целевой размер.
targetSize = [512 512]; J = imresize(J,targetSize); croppedAndResizedBox = bboxresize(croppedBox,targetSize./cropSize);
Отображение обрезанного и измененного размеров изображения и ограничивающего прямоугольника.
annotatedImage = insertShape(J,"rectangle",croppedAndResizedBox,"LineWidth",8); imshow(annotatedImage) title('Crop and Resized Image and Bounding Box')
The randomAffine2d
(Image Processing Toolbox) функция создает рандомизированное 2-D аффинное преобразование из комбинации вращения, перемещения, масштабирования (изменения размера), отражения и сдвига. Деформируйте изображение при помощи imwarp
(Image Processing Toolbox). Деформировать ограничительные рамки при помощи bboxwarp
. Управляйте пространственными границами и разрешением деформированного выхода при помощи affineOutputView
(Image Processing Toolbox) функция.
Этот пример демонстрирует два рандомизированных аффинных преобразования: масштабирование и вращение.
Создайте шкалу преобразование, которое изменяет размер входа изображения и ограничивающего прямоугольника с помощью коэффициента шкалы, выбранного случайным образом из области значений [1.5,1.8]. Это преобразование применяет тот же масштабный коэффициент в горизонтальном и вертикальном направлениях.
tform = randomAffine2d("Scale",[1.5 1.8]);
Создайте выход вид для смежного преобразования.
rout = affineOutputView(size(I),tform);
Поверните изображение с помощью imwarp
и поверните ограничивающий прямоугольник, используя bboxwarp
. Задайте OverlapThreshold
значение 0,5.
J = imwarp(I,tform,"OutputView",rout); bboxScaled = bboxwarp(bbox,tform,rout,"OverlapThreshold",0.5);
Отобразите масштабированное изображение и ограничивающий прямоугольник.
annotatedImage = insertShape(J,"rectangle",bboxScaled,"LineWidth",8); imshow(annotatedImage) title('Scaled Image and Bounding Box')
Создайте рандомизированное преобразование поворота, которое поворачивает изображение и прямоугольные метки на угол, выбранный случайным образом из области значений [-15, 15] степеней.
tform = randomAffine2d("Rotation",[-15 15]);
Создайте выход вид для imwarp
и bboxwarp
.
rout = affineOutputView(size(I),tform);
Поверните изображение с помощью imwarp
и поверните ограничивающий прямоугольник, используя bboxwarp
. Задайте OverlapThreshold
значение 0,5.
J = imwarp(I,tform,"OutputView",rout); bboxRotated = bboxwarp(bbox,tform,rout,"OverlapThreshold",0.5);
Отобразите обрезанное изображение и ограничивающий прямоугольник. Обратите внимание, что ограничительный прямоугольник, возвращенный bboxwarp
всегда выравнивается по осям изображения. Размер и соотношение сторон ограничивающего прямоугольника изменяются, чтобы соответствовать повернутому объекту.
annotatedImage = insertShape(J,"rectangle",bboxRotated,"LineWidth",8); imshow(annotatedImage) title('Rotated Image and Bounding Box')
Datastores - это удобный способ чтения и увеличения наборов данных. Создайте datastore, который хранит данные изображения и ограничивающего прямоугольника и увеличивает данные с помощью ряда нескольких операций.
Чтобы увеличить размер выборочных хранилищ данных, реплицируйте имена файлов изображения, ограничивающий прямоугольник и метки.
numObservations = 4; images = repelem({filenameImage},numObservations,1); bboxes = repelem({bbox},numObservations,1); labels = repelem({label},numObservations,1);
Создайте imageDatastore
из файлов обучающих изображений. Объедините ограничивающий прямоугольник и данные о метках в таблице, затем создайте boxLabelDatastore
со таблицы.
imds = imageDatastore(images); tbl = table(bboxes,labels); blds = boxLabelDatastore(tbl);
Связать пары меток изображений и коробок можно путем объединения datastore изображений и datastore меток коробок.
trainingData = combine(imds,blds);
Считайте первое изображение и связанную с ним прямоугольную метку из комбинированного datastore.
data = read(trainingData); I = data{1}; bboxes = data{2}; labels = data{3};
Отобразите изображение и данные о прямоугольной метке.
annotatedImage = insertObjectAnnotation(I,'rectangle',bbox,labels, ... 'LineWidth',8,'FontSize',40); imshow(annotatedImage)
Примените увеличение данных к обучающим данным при помощи transform
функция. Этот пример выполняет два отдельных увеличения к обучающим данным.
Первое увеличение джиттирует цвет изображения, а затем выполняет идентичное случайное горизонтальное отражение и поворот на парах меток изображений и коробок. Эти операции определены в jitterImageColorAndWarp
вспомогательная функция в конце этого примера.
augmentedTrainingData = transform(trainingData,@jitterImageColorAndWarp);
Считайте все дополненные данные.
data = readall(augmentedTrainingData);
Отобразите дополненное изображение и данные о прямоугольной метке.
rgb = cell(numObservations,1); for k = 1:numObservations I = data{k,1}; bbox = data{k,2}; labels = data{k,3}; rgb{k} = insertObjectAnnotation(I,'rectangle',bbox,labels,'LineWidth',8,'FontSize',40); end montage(rgb)
Второе увеличение преобразует изображение и прямоугольную метку в целевой размер. Эти операции определены в resizeImageAndLabel
вспомогательная функция в конце этого примера.
targetSize = [300 300];
preprocessedTrainingData = transform(augmentedTrainingData,...
@(data)resizeImageAndLabel(data,targetSize));
Считайте все предварительно обработанные данные.
data = readall(preprocessedTrainingData);
Отобразите предварительно обработанное изображение и данные о прямоугольной метке.
rgb = cell(numObservations,1); for k = 1:numObservations I = data{k,1}; bbox = data{k,2}; labels = data{k,3}; rgb{k} = insertObjectAnnotation(I,'rectangle',bbox,labels, ... 'LineWidth',8,'FontSize',15); end montage(rgb)
The jitterImageColorAndWarp
вспомогательная функция применяет случайное дрожание цвета к данным изображения, затем применяет идентичное преобразование аффина к изображению и данным о прямоугольной метке. Преобразование состоит из случайного горизонтального отражения и вращения. Область входа data
и выход out
являются двухэлементными массивами ячеек, где первый элемент является данными изображения, а второй элемент - данными о прямоугольной метке.
function out = jitterImageColorAndWarp(data) % Unpack original data. I = data{1}; boxes = data{2}; labels = data{3}; % Apply random color jitter. I = jitterColorHSV(I,"Brightness",0.3,"Contrast",0.4,"Saturation",0.2); % Define random affine transform. tform = randomAffine2d("XReflection",true,'Rotation',[-30 30]); rout = affineOutputView(size(I),tform); % Transform image and bounding box labels. augmentedImage = imwarp(I,tform,"OutputView",rout); [augmentedBoxes, valid] = bboxwarp(boxes,tform,rout,'OverlapThreshold',0.4); augmentedLabels = labels(valid); % Return augmented data. out = {augmentedImage,augmentedBoxes,augmentedLabels}; end
The resizeImageAndLabel
Функция helper вычисляет масштабный коэффициент для изображения, чтобы соответствовать целевому размеру, затем изменяет размер изображения, используя imresize
и прямоугольную метку с помощью bboxresize
. Входные и выходные данные являются двухэлементными массивами ячеек, где первый элемент является данными изображения, а второй элемент является данными прямоугольной метки.
function data = resizeImageAndLabel(data,targetSize) scale = targetSize./size(data{1},[1 2]); data{1} = imresize(data{1},targetSize); data{2} = bboxresize(data{2},scale); end
bboxcrop
(Computer Vision Toolbox) | bboxresize
(Computer Vision Toolbox) | bboxwarp
(Computer Vision Toolbox) | centerCropWindow2d
(Набор Image Processing Toolbox) | imcrop
(Набор Image Processing Toolbox) | imresize
(Набор Image Processing Toolbox) | randomCropWindow2d
(Набор Image Processing Toolbox)