图像增强是一种非常强大的技术,可以人为地对现有图像进行各种更改以扩展图像数据集,例如缩放现有图像、将现有图像旋转几度、裁剪或裁剪图像等等。在本文中,我们将使用imgaug库探索Python中的图像增强技术。为什么我们需要图像增强?深度学习卷积神经网络(CNN)需要大量图像才能有效地训练模型。它有助于通过更好的增强来提高模型的性能,从而减少过度拟合。可用于分类和对象检测数据集的最流行的数据集有数千到数百万张图像。归纳是指在模型训练期间对先前未见数据评估模型的性能测试或验证。由于CNN的不变性,它可以对物体进行分类,即使它们在不同大小、方向或不同光照下可见。所以我们可以获取一个小的图像数据集,并通过放大或缩小、垂直或水平翻转它们或改变亮度来改变对象的大小。通过这种方式,我们可以创建丰富多样的图像数据集。图像增强可以从一小组图像中创建丰富多样的图像集,用于图像分类、对象检测或图像分割。在仔细了解问题域后,需要采用增加训练数据集大小的增强策略。什么时候需要应用图像增强?在我们训练模型之前,图像增强可以用作预处理。离线或预处理增强增强用作预处理步骤以增加数据集的大小。通常,这是在我们有一个小的训练数据集要扩展时完成的。生成扩充对较小的数据集很有帮助,但在应用于较大的数据集时我们需要考虑磁盘空间。在线或实时增强顾名思义,增强是实时应用的。这通常适用于较大的数据集,因为我们不需要将增强图像保存在磁盘上。在这种情况下,我们以小批量应用转换,然后将其输入模型。在线增强模型将在每个时期看到不同的图像。在离线增强中,增强图像是训练集的一部分,它会根据epoch的数量多次查看增强图像。该模型通过在线数据扩充可以更好地泛化,因为它在使用在线数据扩充进行训练期间看到了更多样本。我们将使用imgaug类来演示图像增强。基本图像处理技术翻转:垂直或水平翻转图像旋转:将图像旋转指定角度。裁剪:像平行四边形一样移动图像的一部分裁剪:对象以不同的比例出现在图像的不同位置用于图像增强以及关键点/地标、边界框、热图和分割图的库。pipinstalllimgaug在某些情况下,我们会遇到Shapely错误,在这种情况下,我们可以尝试使用以下命令pipinstalllimgaug--upgrade--no-deps我们将拍摄一张图像并应用基本的数据增强技术对其进行变换练习。导入所需库:importimageioimportimgaugasiaimportimgaug.augmentersasiaimportnumpyasnpiimportpandasaspdimportmatplotlib.pyplotaspltimportmatplotlib.patchesapatchesimportmatplotlib%matplotlibinline显示原图我们使用imageio来显示原图image=imageio.imread(“.\car2.jpeg”)ia.imshow我们可以通过旋转图像指定(图像)旋转角度以旋转图像。我们将图像旋转-50度到30度rotate=iaa.Affine(rotate=(-50,30))rotated_image=rotate.augment_image(image)ia.imshow(rotated_image)以向我们将从中采样的图像添加噪声高斯分布在图像中加入了不同的噪声值。gaussian_noise=iaa.AdditiveGaussianNoise(10,20)noise_image=gaussian_noise.augment_image(image)ia.imshow(noise_image)裁剪图像修整移除图像两侧的像素列/行。在下面的示例中,我们将图像的一侧裁剪30%crop=iaa.Crop(percent=(0,0.3))#cropimagecorp_image=crop.augment_image(image)ia.imshow(corp_image)设置扭曲图像0到40度shear=iaa.Affine(shear=(0,40))shear_image=shear.augment_image(image)ia.imshow(shear_image)翻转图像我们可以垂直或水平翻转图像。Fliplr水平翻转图像#flippingimagehorizo??ntallyflip_hr=iaa.Fliplr(p=1.0)flip_hr_image=flip_hr.augment_image(image)ia.imshow(flip_hr_image)垂直翻转图像flip_vr=iaa.Flipud(p=1.0)flip_vr_image=flip_vr.augment_image(image)ia.imshow(flip_vr_image)改变图像的亮度我们使用GammaContrast通过缩放像素值来调整图像的亮度。gamma=(0.5,2.0)范围内的值似乎是合理的。我们还可以使用SigmoidContrast或LinearContrast来改变图像的亮度image=imageio.imread(“.\imgAug\car2.jpeg”)contrast=iaa.GammaContrast(gamma=2.0)contrast_image=contrast.augment_image(image)ia。imshow(contrast_image)缩放图像我们可以使用zoom来放大或缩小图像。我们已将图像缩放到图像高度/宽度的150%到80%。我们可以独立缩放每个轴以增强对象检测我们绘制边界框用于对象检测。当我们放大图像时,我们希望边界框相应地更新。imgaug支持边界框。当我们旋转、剪切或裁剪图像时,对象周围的边界框会相应更新。importboundingboxesfromimgaugfromimgaug.augmentables.bbsimportBoundingBox,BoundingBoxesOnImage初始化原始图像周围的边界框bbs=BoundingBoxesOnImage([BoundingBox(x1=10,x2=520,y1=10,y2=300)],shape=image.shape)在原始图像上显示边框ia.imshow(bbs.draw_on_image(image,size=2))在下面的代码中,我们使用translate_percentage移动图像,放大边界框并将其应用于图像move=iaa.Affine(translate_percent={"x":0.1},scale=0.8)image_aug,bbs_aug=move(image=image,bounding_boxes=bbs)ia.imshow(bbs_aug.draw_on_image(image_aug,size=2))应用图像增强和处理外image边界框边框有时会超出图像,所以我们需要额外的代码来处理这种情况我们旋转图像,并尝试在对象周围绘制边框rotate_bb=iaa.Affine(rotate=(-50,30))image_aug,bbs_aug=rotate_bb(image=image,bounding_boxes=bbs)ia.imshow(bbs_aug.draw_on_image(image_aug,size=2))boundi的部分ng框在图像之外。在下面的代码中,我们将边框完全或部分移到图像裁剪部分的边界框之外,使其完全位于图像内部。我们创建一个填充函数,用1像素的白色边框和1像素的黑色边框填充图像:defpad(image,by):image_border1=ia.pad(image,top=1,right=1,bottom=1,left=1,mode="constant",cval=255)image_border2=ia.pad(image_border1,top=by-1,right=by-1,bottom=by-1,left=by-1,mode="constant",cval=0)returnimage_border2然后,我们在图像上绘制边界框。我们首先将图像平面扩展BORDER像素,然后在图像平面中标记边界框defdraw_bbs(image,bbs,border):GREEN=[0,255,0]ORANGE=[255,140,??0]RED=[255,0,0]image_border=pad(image,border)forbbinbbs.bounding_boxes:ifbb.is_fully_within_image(image.shape):color=GREENelifbb.is_partly_within_image(image.shape):color=ORANGEelse:color=REDimage_border=bb.shift(left=border,top)=border).draw_on_image(image_border,size=2,color=color)returnimage_border现在,我们对图像应用相同的旋转并绘制边界框rotate=iaa.Affine(rotate=(-50,30))image_aug,bbs_aug=旋转(图像=图像,bounding_boxes=bbs)image_after=draw_bbs(image_aug,bbs_aug.remove_out_of_image()。clip_out_of_image(),100)ia.imshow(image_after)
