主要内容

增加目标检测的边界框

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

对象检测器训练相关的图像和数据由边界框标签。增加训练数据时,您必须申请相同的转换相关的图像和边界框。这个案例展示了三种常见类型的转换:

然后示例展示了如何增加适用于训练数据在数据存储使用多种类型的转换的结合。

您可以使用增强训练数据训练网络。为一个例子,演示如何训练对象检测网络,看到的对象检测使用更快R-CNN深度学习(计算机视觉工具箱)

读取和显示一个示例图像和边界框。比较不同类型的增加的影响,每一个转换都在这个例子中使用相同的输入图像和边界框。

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

显示图像和边界框。

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

图包含一个坐标轴对象。标题原始图像和边界框的坐标轴对象包含一个类型的对象的形象。

调整图像和边界框

使用imresize缩减图像的2倍。

规模= 1/2;J = imresize(我、规模);

使用bboxresize相同的扩展应用于相关的边界框。

bboxResized = bboxresize (bbox,规模);

显示缩放图像和边界框。

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

图包含一个坐标轴对象。坐标轴对象标题调整图像和边界框包含一个类型的对象的形象。

作物图像和边界框

种植是一种常见的预处理步骤,使数据输入网络的大小相匹配。要创建的输出图像所需的大小,首先指定作物窗口的大小和位置使用randomWindow2d(图像处理工具箱)centerCropWindow2d(图像处理工具箱)函数。确保你选择一个裁剪窗口在图像,包括所需的内容。然后,作物图像和像素标签图像通过使用相同的窗口imcrop

指定所需的大小裁剪区域的双元素向量的形式高度,宽度]。

targetSize = (1024 - 1024);

作物图像到目标图像通过使用中心的大小imcrop

赢得= centerCropWindow2d(大小(I), targetSize);J = imcrop(我,赢);

作物边界框使用相同的作物利用的窗口bboxcrop。指定OverlapThreshold值小于1,函数剪辑边界框作物窗口而不是丢弃他们当作物窗口不完全封闭边界框。重叠阈值允许您控制的剪裁图像为对象所接受。例如,剪切超过一半人不是有用的培训人探测器,而剪切半车将是可以接受的。

[bboxCropped,有效]= bboxcrop (bbox,赢了,“OverlapThreshold”,0.7);

保持在裁剪窗口的标签。

标签=标签(有效);

裁剪的图像显示和边界框。

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

图包含一个坐标轴对象。坐标轴对象标题裁剪图像和边界框包含一个类型的对象的形象。

作物和调整图像和边界框

裁剪和调整是经常在一起执行。您可以使用bboxcropbboxresize实现常用的串联“作物和调整”转换。

创建一个作物图像窗口从一个随机的位置。作物图像和边界框相同的作物窗口。

cropSize = (1024 - 1024);赢得= randomWindow2d(大小(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)标题(作物和图像大小和边界框)

图包含一个坐标轴对象。坐标轴对象标题作物和缩放图像和边界框包含一个类型的对象的形象。

经形象和边界框

randomAffine2d(图像处理工具箱)函数创建一个随机二维仿射变换的旋转、平移、缩放(调整),反射和剪切。经图像通过使用imwarp(图像处理工具箱)。经边界框使用bboxwarp。控制的空间范围和分辨率输出通过扭曲affineOutputView(图像处理工具箱)函数。

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

随机的规模

创建一个转换,调整输入图像的大小和规模边界框使用比例因子随机选择的范围[1.5,1.8]。这个变换适用相同的比例因子在水平和垂直方向。

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

创建一个输出视图的仿射变换。

溃败= affineOutputView(大小(I), tform);

重新调节图像使用imwarp并重新调节限位框使用bboxwarp。指定一个OverlapThreshold值为0.5。

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

显示缩放图像和边界框。

annotatedImage = insertShape (J,“矩形”bboxScaled,“线宽”8);imshow (annotatedImage)标题(按比例缩小的图像和边界框)

图包含一个坐标轴对象。坐标轴对象标题缩放图像和边界框包含一个类型的对象的形象。

随机旋转

创建一个随机旋转变换,旋转图像和盒标签的随机选取一个角度范围-15,15度。

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

创建一个输出视图imwarpbboxwarp

溃败= affineOutputView(大小(I), tform);

旋转图像使用imwarp和旋转限位框使用bboxwarp。指定一个OverlapThreshold值为0.5。

J = imwarp (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);标签= repelem({标签}numObservations 1);

创建一个imageDatastore从训练图像文件。结合边界框和标签数据表中,然后创建一个boxLabelDatastore从表中。

imd = imageDatastore(图片);台=表(bboxes、标签);建筑物= boxLabelDatastore(台);

副标签对相结合的图像和框标签数据存储图像数据存储和盒子。

trainingData =结合(imd,建筑物);

阅读第一个图像及其相关框标签合并后的数据存储。

data =阅读(trainingData);我={1}数据;bboxes ={2}数据;标签={3}数据;

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

annotatedImage = insertObjectAnnotation(我“矩形”bbox,标签,“线宽”8“字形大小”,40);imshow (annotatedImage)

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的形象。

应用数据增加

应用数据增加训练数据使用变换函数。本例中执行两个单独的训练数据对应。

第一个增加紧张的颜色图像,然后执行相同的随机水平反射和旋转图像和双箱标签。这些操作中定义jitterImageColorAndWarphelper函数结束时,这个例子。

augmentedTrainingData =变换(trainingData @jitterImageColorAndWarp);

阅读所有的增广数据。

data = readall (augmentedTrainingData);

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

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

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的形象。

第二增加重新调节图像和盒子标签到目标的大小。这些操作中定义resizeImageAndLabelhelper函数结束时,这个例子。

targetSize = (300 - 300);preprocessedTrainingData =变换(augmentedTrainingData,@(数据)resizeImageAndLabel(数据、targetSize));

阅读所有的数据预处理。

data = readall (preprocessedTrainingData);

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

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

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的形象。

辅助功能增强

jitterImageColorAndWarphelper函数随机抖动颜色适用于图像数据,然后一个相同的仿射变换适用于图像和盒子标签数据。转换由随机水平反射和旋转。输入数据和输出双元素细胞阵列,其中第一个元素是图像数据和第二个元素是盒子标签数据。

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

resizeImageAndLabelhelper函数计算图像匹配目标的比例因子大小,然后调整图像的大小使用imresize和盒子标签使用bboxresize。双元素细胞阵列的输入和输出数据,其中第一个元素是图像数据和第二个元素是盒子标签数据。

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

另请参阅

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

相关的例子

更多关于