Увеличение ограничивающих коробок для обнаружения объектов

В этом примере показано, как использовать 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

См. также

(Computer Vision Toolbox) | (Computer Vision Toolbox) | (Computer Vision Toolbox) | (Набор Image Processing Toolbox) | (Набор Image Processing Toolbox) | (Набор Image Processing Toolbox) | (Набор Image Processing Toolbox)

Похожие примеры

Подробнее о