此示例显示如何使用MATLAB®,计算机Vision Toolbox™和图像处理工具箱™执行常用种类的图像和边界框增强作为对象检测工作流的一部分。
目标检测器训练数据由图像和相关的边界框标签组成。在扩充训练数据时,必须对图像和相关的边界框应用相同的转换。这个例子演示了三种常见的转换类型:
然后例子显示了如何将增强应用于数据存储中的训练数据使用多种转换类型的组合。
您可以使用增强培训数据来培训网络。有关用于培训对象检测网络的示例,请参阅使用更快的R-CNN深度学习的目标检测(计算机视觉工具箱).
读取并显示示例图像和边界框。要比较不同类型的增强的效果,此示例中的每个转换使用相同的输入图像和边界框。
filenameImage =“kobi.png”;i = imread(filenamemimage);bbox = [4 156 1212 830];标签=“狗”;
显示图像和边界框。
annotatedImage = insertShape(我“矩形”,bbox,“线宽”,8);imshow(AnnotateDimage)标题(“原始图像和边框”)
用imresize
将图像缩小到原来的2倍。
Scale = 1/2;j = imresize(i,scale);
用bboxresize.
将相同的缩放应用于相关边界框。
BboxResized = BboxResize(Bbox,Scale);
显示调整大小的图像和边界框。
annotatedImage = insertShape (J,“矩形”bboxResized,“线宽”,8);imshow(AnnotateDimage)标题('调整大小的图像和边界框')
裁剪是一种常见的预处理步骤,使数据与网络的输入大小匹配。要创建所需大小的输出图像,首先使用randomCropWindow2d
(图像处理工具箱)和CenterCropWindow2d.
(图像处理工具箱)功能。确保您选择的裁剪窗口包括所需的内容在图像。然后,将图像和像素标签图像裁剪到同一个窗口使用im
.
将裁剪区域的所需大小指定为表单的两个元素矢量[高度,宽度]。
targetsize = [1024 1024];
通过使用从图像的中心裁剪图像到目标大小im
.
赢得= centerCropWindow2d(大小(I), targetSize);J = imcrop(我,赢);
使用相同的裁剪窗口来裁剪边界框bboxcrop
.指定重叠
作为少于1的值,以便函数将边界框剪辑到裁剪窗口,而不是在裁剪窗口未完全包围边界框时丢弃它们。重叠阈值使您可以控制图像中对象可容忍的剪辑量。例如,剪切超过一半的人对于训练人探测器来说是不用的,而削减一半的车辆可能是可容忍的。
[bboxcropped,有效] = bboxcrop(bbox,win,“OverlapThreshold”, 0.7);
保留裁剪窗口内的标签。
标签=标签(有效);
显示裁剪后的图像和边框。
annotatedImage = insertShape (J,“矩形”,bboxcropped,“线宽”,8);imshow(AnnotateDimage)标题('裁剪图像和边界框')
裁剪和调整大小通常是一起执行的。您可以使用bboxcrop
和bboxresize.
串联实现常用“作物和调整”转换。
从图像中的随机位置创建一个裁切窗口。将图像和边界框裁剪到同一个裁剪窗口。
cropSize = [1024 1024];赢得= randomCropWindow2d(大小(I), cropSize);J = imcrop(我,赢);croppedBox = bboxcrop (bbox,赢了,“OverlapThreshold”,0.5);
调整图像和框的大小为目标大小。
targetSize = [512 512];J = imresize (J, targetSize);croppedAndResizedBox = bboxresize (croppedBox targetSize. / cropSize);
显示裁剪和调整大小的图像和边界框。
annotatedImage = insertShape (J,“矩形”croppedAndResizedBox,“线宽”,8);imshow(AnnotateDimage)标题(“裁剪和调整图像大小和边界框”)
的ronceaffine2d.
(图像处理工具箱)函数从旋转、平移、缩放(调整大小)、反射和剪切的组合创建一个随机的2-D仿射变换。通过使用扭曲图像imwarp.
(图像处理工具箱).通过使用经线边界框bboxwarp
.控件控制扭曲输出的空间边界和分辨率AffineOutputView.
(图像处理工具箱)功能。
此示例演示了两个随机仿射转换:缩放和旋转。
创建一个缩放变换,使用从范围[1.5,1.8]中随机选择的缩放因子来调整输入图像和边界框的大小。该转换在水平和垂直方向上应用相同的比例因子。
tform = randomAffine2d (“规模”[1.5 - 1.8]);
为仿射转换创建一个输出视图。
rut = AffineOutputView(大小(i),tform);
使用以下命令旋转图像imwarp.
并使用旋转边界盒bboxwarp
.指定A.重叠
值为0.5。
j = imwarp(i,tform,“outputView”,溃败);bboxScaled = bboxwarp (bbox, tform溃败,“OverlapThreshold”,0.5);
显示缩放的图像和边界框。
annotatedImage = insertShape (J,“矩形”bboxScaled,“线宽”,8);imshow(AnnotateDimage)标题(缩放图像和边框)
创建一个随机旋转变换,将图像和框标签旋转一个从范围[-15,15]度随机选择的角度。
tform = randomAffine2d (“回转”[-15] 15日);
创建一个输出视图imwarp.
和bboxwarp
.
rut = AffineOutputView(大小(i),tform);
使用以下命令旋转图像imwarp.
并使用旋转边界盒bboxwarp
.指定A.重叠
值为0.5。
j = imwarp(i,tform,“outputView”,溃败);bboxRotated = bboxwarp (bbox, tform溃败,“OverlapThreshold”,0.5);
显示裁剪后的图像和边框。请注意,返回的边界框bboxwarp
始终与图像轴对齐。包围盒的大小和长宽比改变以适应旋转的对象。
annotatedImage = insertShape (J,“矩形”,bboxrotated,“线宽”,8);imshow(AnnotateDimage)标题(旋转图像和包围框)
数据存储是读取和扩充数据集合的一种方便方式。创建存储图像和边框数据的数据存储,并使用一系列多个操作来扩充数据。
要增加样例数据存储的大小,请复制图像的文件名、边界框和标签。
numobservations = 4;图像= repelem({filenameImage},numobservations,1);Bboxes = Repelem({bbox},numobservations,1);Labels = Repelem({label},numobservations,1);
创建一个imageDatastore
从训练图像文件。将边界框组合在表中,然后创建一个boxLabelDatastore
来自桌子。
imd = imageDatastore(图片);台=表(bboxes、标签);建筑物= boxLabelDatastore(台);
通过组合图像数据存储和框标签数据存储来关联图像和框标签对。
TrainingData =联合(IMDS,BLD);
从组合数据存储中读取第一个图像及其相关联的框标签。
数据=读取(TrainingData);我={1}数据;bboxes = data {2};标签={3}数据;
显示图像和框标签数据。
annotatedImage = insertObjectAnnotation(我'长方形',bbox,labels,...'行宽'8'字体大小', 40);imshow (annotatedImage)
对训练数据应用数据扩充变换
功能。此示例对培训数据执行两个单独的增强。
第一个增强扼杀图像的颜色,然后在图像和框标签对上执行相同的随机水平反射和旋转。这些操作在其中定义jitterImageColorAndWarp
辅助功能在此示例结束时。
augmentedTrainingData =变换(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,labels,'行宽'8'字体大小', 40);结尾蒙太奇(rgb)
第二次放大将图像和框标签缩放到目标大小。这些操作在其中定义resizeimageandlabel.
辅助功能在此示例结束时。
targetSize = [300 300];preprocessedTrainingData =变换(augmentedTrainingData,...@(数据)resizeimageandlabel(数据,targetsize));
读取所有预处理数据。
data = readall (preprocessedTrainingData);
显示预处理后的图像和框标签数据。
RGB = Cell(numobservations,1);为了k = 1:numobservations i = data {k,1};bbox = data {k,2};标签=数据{k,3};RGB {k} = InsertObjectAnnotation(i,'长方形',bbox,labels,...'行宽'8'字体大小'15);结尾蒙太奇(rgb)
的jitterImageColorAndWarp
辅助函数对图像数据应用随机颜色抖动,然后对图像和框标签数据应用相同的仿射变换。变换由随机水平反射和旋转组成。输入数据
和产出出去
是两个元素单元阵列,其中第一元素是图像数据,第二个元素是盒子标签数据。
函数OUT = jitterimageColorandwarp(数据)%解压缩原始数据。我={1}数据;盒={2}数据;标签={3}数据;%应用随机颜色抖动。我= jittercolorhsv(我,“亮度”,0.3,“对比”, 0.4,“饱和”, 0.2);%定义随机仿射变换。tform = randomAffine2d (“XReflection”,真的,“旋转”[-30] 30日);rut = AffineOutputView(大小(i),tform);%变换图像和边界框标签。augmentedImage = imwarp (tform,我“outputView”,溃败);[AugmentedBoxes,有效] = BboxWarp(框,TForm,REAR,“OverlapThreshold”, 0.4);augmentedLabels =标签(有效);%返回扩充数据。= {augmentedImage, augmentedBoxes, augmentedLabels};结尾
的resizeimageandlabel.
辅助函数计算图像的比例因子以匹配目标大小,然后使用imresize
和盒子标签使用bboxresize.
.输入和输出数据是两元素单元数组,其中第一个元素是图像数据,第二个元素是框标签数据。
函数data = imageandlabel (data,targetSize) scale = targetSize。{1} /大小(数据,[1 - 2]);{1} = imresize数据(数据{1},targetSize);{2} = bboxresize数据(数据{2},规模);结尾
bboxcrop
(计算机视觉工具箱)|bboxresize.
(计算机视觉工具箱)|bboxwarp
(计算机视觉工具箱)|CenterCropWindow2d.
(图像处理工具箱)|im
(图像处理工具箱)|imresize
(图像处理工具箱)|randomCropWindow2d
(图像处理工具箱)