主要内容

增强对象检测的包围框

这个例子展示了如何执行常见类型的图像和边界框增强作为对象检测工作流程的一部分。

目标检测器训练数据由图像和相关的包围框标签组成。扩充训练数据时,必须对图像和相关边界框应用相同的转换。这个例子演示了三种常见的转换类型:

接下来的示例将展示如何进行对数据存储中的训练数据应用增强使用多种类型转换的组合。

你可以使用增强训练数据来训练网络。有关如何训练对象检测网络的示例,请参见使用更快的R-CNN深度学习进行目标检测(计算机视觉工具箱)

读取并显示示例图像和包围框。为了比较不同类型增强的效果,本例中的每个变换都使用相同的输入图像和包围框。

filenameImage =“kobi.png”;I = imread(filenameImage);Bbox = [4 156 1212 830];标签=“狗”

显示图像和包围框。

annotatedImage = insertShape(I,“矩形”bbox,“线宽”8);imshow (annotatedImage)标题(“原始图像和包围框”

图中包含一个轴对象。标题为Original Image和Bounding Box的坐标轴对象包含一个Image类型的对象。

调整图像和包围框的大小

使用imresize将图像按2倍的比例缩小。

比例= 1/2;J = imresize(I,scale);

使用bboxresize对相关的包围框应用相同的缩放。

bboxresize = bboxresize(bbox,scale);

显示调整后的图像和包围框。

annotatedImage = insertShape(J,“矩形”bboxResized,“线宽”8);imshow (annotatedImage)标题(“调整图像大小和边框”

图中包含一个轴对象。标题为Resized Image和Bounding Box的axes对象包含一个Image类型的对象。

裁剪图像和包围框

裁剪是一个常见的预处理步骤,以使数据匹配网络的输入大小。属性指定裁剪窗口的大小和位置,以创建所需大小的输出图像randomWindow2d(图像处理工具箱)centerCropWindow2d(图像处理工具箱)函数。确保您选择的裁剪窗口包含图像中所需的内容。然后,使用将图像和像素标签图像裁剪到同一窗口imcrop

将裁剪区域的所需大小指定为形式为[的两元素向量高度宽度]。

targetSize = [1024 1024];

使用将图像从图像的中心裁剪到目标大小imcrop

win = centerCropWindow2d(size(I),targetSize);J = imcrop(I,win);

使用相同的裁剪窗口裁剪边界框bboxcrop.指定OverlapThreshold作为小于1的值,以便该函数将边界框剪辑到裁剪窗口,而不是在裁剪窗口没有完全包围边界框时丢弃它们。重叠阈值使您能够控制图像中对象可容忍的剪切量。例如,截取超过一半的人对于训练人员检测器是没有用的,而截取一半的车辆可能是可以容忍的。

[bboxcrop,valid] = bboxcrop(bbox,win,“OverlapThreshold”, 0.7);

保留裁剪窗口内的标签。

标签=标签(有效);

显示裁剪图像和包围框。

annotatedImage = insertShape(J,“矩形”bboxCropped,“线宽”8);imshow (annotatedImage)标题(裁剪图像和包围框

图中包含一个轴对象。标题为“裁剪图像”和“包围框”的axis对象包含一个图像类型的对象。

裁剪和调整图像和包围框的大小

裁剪和调整大小通常一起执行。你可以使用bboxcrop而且bboxresize在系列实现中常用“裁剪和调整大小”转换。

从图像中的随机位置创建一个裁剪窗口。将图像和包围框裁剪到同一裁剪窗口。

cropSize = [1024 1024];win = randomWindow2d(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,“矩形”croppedAndResizedBox,“线宽”8);imshow (annotatedImage)标题(裁剪和调整图像大小和边界框

图中包含一个轴对象。标题为Crop和Resized Image和Bounding Box的axes对象包含一个Image类型的对象。

扭曲图像和包围框

randomAffine2d(图像处理工具箱)函数从旋转、平移、缩放(调整大小)、反射和剪切的组合中创建一个随机的2-D仿射转换。使用使图像变形imwarp(图像处理工具箱).通过使用扭曲包围框bboxwarp.控件控制扭曲输出的空间边界和分辨率affineOutputView(图像处理工具箱)函数。

这个例子演示了两种随机仿射变换:缩放和旋转。

随机的规模

创建一个缩放转换,使用从范围[1.5,1.8]中随机选择的缩放因子来调整输入图像和包围框的大小。这种变换在水平方向和垂直方向上应用相同的比例因子。

tform = randomAffine2d(“规模”[1.5 - 1.8]);

为仿射转换创建一个输出视图。

rout = affineOutputView(size(I),tform);

使用重新缩放图像imwarp并重新缩放边界框使用bboxwarp.指定一个OverlapThreshold0.5的值。

J = imwarp(I,tform,“OutputView”,溃败);bboxScaled = bboxwarp(bbox,tform,rout,“OverlapThreshold”, 0.5);

显示缩放图像和包围框。

annotatedImage = insertShape(J,“矩形”bboxScaled,“线宽”8);imshow (annotatedImage)标题(缩放图像和包围框

图中包含一个轴对象。标题为Scaled Image和Bounding Box的axis对象包含一个Image类型的对象。

随机旋转

创建一个随机旋转转换,以从范围[-15,15]度中随机选择的角度旋转图像和框标签。

tform = randomAffine2d(“旋转”[-15] 15日);

为创建输出视图imwarp而且bboxwarp

rout = affineOutputView(size(I),tform);

使用以下命令旋转图像imwarp和旋转包围框使用bboxwarp.指定一个OverlapThreshold0.5的值。

J = imwarp(I,tform,“OutputView”,溃败);bboxrotate = bboxwarp(bbox,tform,rout,“OverlapThreshold”, 0.5);

显示裁剪图像和包围框。注意由返回的边界框bboxwarp始终与图像轴对齐。边界框的大小和纵横比会发生变化,以适应旋转的对象。

annotatedImage = insertShape(J,“矩形”bboxRotated,“线宽”8);imshow (annotatedImage)标题(旋转图像和包围框

图中包含一个轴对象。标题为“旋转图像和包围框”的axis对象包含一个图像类型的对象。

对数据存储中的训练数据应用增强

数据存储是读取和增加数据集合的一种方便方法。创建一个存储图像和边界框数据的数据存储,并使用一系列多重操作扩充数据。

创建包含图像和包围框数据的数据存储

要增加样例数据存储的大小,请复制映像的文件名以及包围框和标签。

numObservations = 4;images = repelem({filenameImage},numObservations,1);bboxes = repelem({bbox},numObservations,1);标签= repelem({label},numObservations,1);

创建一个imageDatastore从训练图像文件。组合表中的包围框和标签数据,然后创建boxLabelDatastore从桌子上。

imds = imageDatastore(图像);TBL =表(箱子,标签);blds = boxLabelDatastore(tbl);

通过组合图像数据存储和框标签数据存储来关联图像和框标签对。

trainingData = combine(imds,blds);

从组合数据存储中读取第一个映像及其关联框标签。

data = read(trainingData);I =数据{1};数据{2};标签=数据{3};

显示图像和盒标数据。

注释dimage = insertObjectAnnotation(I,“矩形”bbox,标签,...“线宽”8“字形大小”, 40);imshow (annotatedImage)

图中包含一个轴对象。axis对象包含一个image类型的对象。

应用数据增强

方法对训练数据应用数据增强变换函数。这个例子对训练数据执行了两个独立的扩充。

第一个增强使图像的颜色抖动,然后在图像和框标签对上执行相同的随机水平反射和旋转。类中定义了这些操作jitterImageColorAndWarp本例末尾的Helper函数。

augmentedTrainingData = transform(trainingData,@jitterImageColorAndWarp);

读取所有增强数据。

data = readall(augmentedTrainingData);

显示增强图像和盒子标签数据。

rgb = cell(numObservations,1);k = 1:numObservations I = data{k,1};Bbox = data{k,2};标签=数据{k,3};rgb{k} = insertObjectAnnotation(I,“矩形”bbox,标签,“线宽”8“字形大小”, 40);结束蒙太奇(rgb)

图中包含一个轴对象。axis对象包含一个image类型的对象。

第二个增强将图像和框标签重新缩放到目标大小。类中定义了这些操作resizeImageAndLabel本例末尾的Helper函数。

targetSize = [300 300];preprocessedTrainingData = transform(augmentedTrainingData,...@(数据)resizeImageAndLabel(数据、targetSize));

读取所有预处理过的数据。

data = readall(预处理训练数据);

显示预处理图像和盒标数据。

rgb = cell(numObservations,1);k = 1:numObservations I = data{k,1};Bbox = data{k,2};标签=数据{k,3};rgb{k} = insertObjectAnnotation(I,“矩形”bbox,标签,...“线宽”8“字形大小”15);结束蒙太奇(rgb)

图中包含一个轴对象。axis对象包含一个image类型的对象。

用于增强的辅助函数

jitterImageColorAndWarpHelper函数对图像数据应用随机颜色抖动,然后对图像和框标数据应用相同的仿射变换。变换由随机水平反射和旋转组成。输入数据和输出是两元单元格数组,其中第一个元素是图像数据,第二个元素是框标签数据。

函数输出= jitterImageColorAndWarp(数据)解包原始数据。I =数据{1};盒子=数据{2};标签=数据{3};%应用随机颜色抖动。I = jitterColorHSV(I,“亮度”, 0.3,“对比”, 0.4,“饱和”, 0.2);定义随机仿射变换。tform = randomAffine2d(“XReflection”,真的,“旋转”[-30] 30日);rout = affineOutputView(size(I),tform);转换图像和包围框标签。augmentedImage = imwarp(I,tform,“OutputView”,溃败);[augmentedBoxes, valid] = bboxwarp(boxes,tform,rout,“OverlapThreshold”, 0.4);augmentedLabels =标签(有效);返回增强数据。out = {augmentedImage,augmentedBoxes,augmentedLabels};结束

resizeImageAndLabelHelper函数计算图像的缩放因子以匹配目标大小,然后使用imresize并将包装盒标签使用bboxresize.输入和输出数据是两元单元格数组,其中第一个元素是图像数据,第二个元素是框标签数据。

函数data = resizeImageAndLabel(data,targetSize) scale = targetSize。{1} /大小(数据,[1 - 2]);数据{1}= imresize(数据{1},targetSize);数据{2}= bboxresize(数据{2},规模);结束

另请参阅

(计算机视觉工具箱)|(计算机视觉工具箱)|(计算机视觉工具箱)||(图像处理工具箱)|(图像处理工具箱)|(图像处理工具箱)

相关的例子

更多关于