В этом примере показано, как использовать MATLAB ®, Computer Vision Toolbox™ и Toolbox™ обработки изображений для выполнения обычных видов увеличения изображения и ограничивающей рамки в рамках рабочих процессов обнаружения объектов.
Обучающие данные детектора объектов состоят из изображений и связанных меток ограничивающей рамки. При дополнении учебных данных необходимо применить идентичные преобразования к изображению и связанным ограничивающим рамкам. В этом примере демонстрируются три распространенных типа преобразований:
Затем в примере показано, как применять увеличение к обучающим данным в хранилищах данных с использованием комбинации нескольких типов преобразований.
Для обучения сети можно использовать дополненные данные обучения. Пример обучения сети обнаружения объектов см. в разделе Обнаружение объектов с помощью более быстрого глубокого обучения R-CNN (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(Панель инструментов обработки изображений) и centerCropWindow2d(Панель инструментов обработки изображений). Убедитесь, что выбрано окно обрезки, включающее нужное содержимое изображения. Затем обрезайте изображение и изображение метки пикселя в том же окне с помощью 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')

randomAffine2d Функция (Панель инструментов обработки изображений) создает рандомизированное аффинное преобразование 2-D из комбинации поворота, перемещения, масштабирования (изменения размеров), отражения и сдвига. Деформация изображения с помощью imwarp(Панель инструментов обработки изображений). Ограничивающие рамки деформации с помощью bboxwarp. Управление пространственными границами и разрешением деформированного выходного сигнала с помощью affineOutputView(Панель инструментов обработки изображений).
В этом примере показаны два рандомизированных аффинных преобразования: масштабирование и поворот.
Создайте преобразование масштаба, которое изменяет размер входного изображения и ограничивающей рамки, используя коэффициент масштаба, выбранный случайным образом из диапазона [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')

Хранилища данных - это удобный способ чтения и дополнения коллекций данных. Создайте хранилище данных, в котором хранятся данные изображения и ограничивающей рамки, и увеличьте их с помощью нескольких операций.
Чтобы увеличить размер хранилищ данных образцов, реплицируйте имена файлов изображения и ограничивающей рамки и меток.
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);
Свяжите пары меток изображения и коробки, объединив хранилище данных изображения и хранилище данных меток коробки.
trainingData = combine(imds,blds);
Прочитайте первое изображение и связанную с ним метку поля из объединенного хранилища данных.
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)

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
resizeImageAndLabel вспомогательная функция вычисляет масштабный коэффициент для изображения в соответствии с целевым размером, а затем изменяет размер изображения с помощью 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 (Панель инструментов компьютерного зрения) | bboxresize (Панель инструментов компьютерного зрения) | bboxwarp (Панель инструментов компьютерного зрения) | centerCropWindow2d(Панель инструментов обработки изображений) | imcrop(Панель инструментов обработки изображений) | imresize(Панель инструментов обработки изображений) | randomCropWindow2d(Панель инструментов обработки изображений)