Python图像增强imgaug详解
作者:hanscal 发布时间:2022-02-07 17:07:40
介绍
图像分类器通常在训练更多的图像时表现得更好。在图像分类模型中,一个常见的问题是,模型不能正确地对图像进行分类,只是因为它没有针对同一图像的不同方向进行训练。这可以通过向模型提供多种可能的图像方向和转换来克服。
然而,在现实中,收集这些不同的数据可能需要更多的时间、资源和专业知识,而且对公司来说成本可能很高。在这种情况下,图像数据增强是一个流行的选择,通过使用一个或多个增强技术来生成用于训练的各种图像,从而为现有数据集增加多样性。
尽管一些Python库支持多种增强技术,但并不是所有的技术都适合训练模型。用户需要知道哪些增强技术可以帮助生成用于训练模型的实际附加数据。
可以使用各种技术来增强图像数据。它可以包括:
使用几何变换(例如翻转、裁剪、旋转、缩放等)增强图像数据。
通过使用颜色转换来增强图像数据,例如通过调整亮度、暗度、锐度、饱和度等。
通过随机擦除、混合图像等来增强图像数据。
Imgaug
Imgaug 是一个开源 python 包,可让你在机器学习实验中增强图像。它适用于各种增强技术。它有一个简单而强大的界面,可以增强图像、地标、边界框、热图和分割图。
首先使用 pip 安装这个库。
pip install imgaug
接下来,使用 pip 命令在命令提示符下安装名为“IPyPlot”的 python 包:
pip install ipyplot
IPyPlot 是一个 Python 工具,允许在 Python Notebook 单元格中快速高效地显示图像。这个包将 IPython 与 HTML 相结合,以提供一种更快、更丰富、更具交互性的方式来显示图像。这个包的 'plot_images' 命令将用于以网格状结构绘制所有图像。
此外,将导入扩充数据所需的所有必要包。
import imageio
import imgaug as ia
import imgaug.augmenters as iaa
增强的图像路径在此处定义。将使用鸟类图像作为示例。
input_img = imageio.imread('../input/image-bird/bird.jpg')
图像翻转
可以使用下面的命令水平和垂直翻转图像。以下代码中的“Fliplr”关键字水平翻转图像。同样,关键字“Flipud”垂直翻转图像。
#Horizontal Flip
hflip= iaa.Fliplr(p=1.0)
input_hf= hflip.augment_image(input_img)
#Vertical Flip
vflip= iaa.Flipud(p=1.0)
input_vf= vflip.augment_image(input_img)
images_list=[input_img, input_hf, input_vf]
labels = ['Original', 'Horizontally flipped', 'Vertically flipped']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
每个图像被翻转的概率由 p 表示。默认情况下,概率设置为 0.0。要水平翻转输入图像,请使用 Fliplr(1.0) 。同样,当垂直翻转图像时,使用 Flipud(1.0) 。
图像旋转
通过以度为单位定义旋转,可以旋转图像。
rot1 = iaa.Affine(rotate=(-50,20))
input_rot1 = rot1.augment_image(input_img)
images_list=[input_img, input_rot1]
labels = ['Original', 'Rotated Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
图像裁剪
裁剪图像包括从图像的侧面移除像素的列或行,可以从全尺寸输入图像中提取较小尺寸的子图像。要删除的像素数可以以绝对数或图像大小的一部分指定。
在这种情况下,使用从连续间隔 [0.0, 0.3] 中均匀获取的随机分数裁剪图像的每一侧,并在每个图像和每侧采样一次。在这里,为顶部取 0.3 的采样分数,这会将图像裁剪 0.3*H,其中 H 是输入图像的高度。
crop1 = iaa.Crop(percent=(0, 0.3))
input_crop1 = crop1.augment_image(input_img)
images_list=[input_img, input_crop1]
labels = ['Original', 'Cropped Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
图像噪声
该增强器将高斯噪声添加到输入图像。尺度值是产生噪声的正态分布的标准偏差。
noise=iaa.AdditiveGaussianNoise(10,40)
input_noise=noise.augment_image(input_img)
images_list=[input_img, input_noise]
labels = ['Original', 'Gaussian Noise Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
图像剪切
该增强器以 -40 到 40 度范围内的随机量剪切图像。
shear = iaa.Affine(shear=(-40,40))
input_shear=shear.augment_image(input_img)
images_list=[input_img, input_shear]
labels = ['Original', 'Image Shearing']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
图像对比度
该增强器通过缩放像素值来调整图像对比度。
contrast=iaa.GammaContrast((0.5, 2.0))
contrast_sig = iaa.SigmoidContrast(gain=(5, 10), cutoff=(0.4, 0.6))
contrast_lin = iaa.LinearContrast((0.6, 0.4))
input_contrast = contrast.augment_image(input_img)
sigmoid_contrast = contrast_sig.augment_image(input_img)
linear_contrast = contrast_lin.augment_image(input_img)
images_list=[input_img, input_contrast,sigmoid_contrast,linear_contrast]
labels = ['Original', 'Gamma Contrast','SigmoidContrast','LinearContrast']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
GammaContrast 函数使用公式 255*((v/255)**gamma 调整图像对比度,其中 v 是像素值,gamma 从范围 [0.5, 2.0] 中均匀采样。
SigmoidContrast 使用公式 255*1/(1+exp(gain*(cutoff-v/255)) 调整图像对比度 (其中v为像素值,gain 从区间[3, 10]开始均匀采样(每张图像一次),截断采样与区间 [0.4, 0.6] 一致。
LinearContrast 使用公式 127 + alpha*(v-127) 改变图像对比度,其中 v 是像素值,alpha 从 [0.4, 0.6] 范围内均匀采样。
图像转换
“ElasticTransformation”增强器通过使用位移场在局部移动像素来变换图像。增强器的参数是 alpha 和 sigma。位移的强度由 alpha 控制,其中较大的值表示像素移动得更远。位移的平滑度由 sigma 控制,其中较大的值会导致更平滑的图案。
elastic = iaa.ElasticTransformation(alpha=60.0, sigma=4.0)
polar = iaa.WithPolarWarping(iaa.CropAndPad(percent=(-0.2, 0.7)))
jigsaw = iaa.Jigsaw(nb_rows=20, nb_cols=15, max_steps=(3, 7))
input_elastic = elastic.augment_image(input_img)
input_polar = polar.augment_image(input_img)
input_jigsaw = jigsaw.augment_image(input_img)
images_list=[input_img, input_elastic,input_polar,input_jigsaw]
labels = ['Original', 'elastic','polar','jigsaw']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
在使用“Polar Warping”增强器时,首先在极坐标表示中应用裁剪和填充,然后再将其扭转回笛卡尔表示。这个增强器可以为图像添加额外的像素。这些将被黑色像素填充。此外,“Jigsaw”增强以类似于拼图模式的方式移动图片内的单元格。
图像边界框
Imgaug 还为图像提供边界框支持。如果在增强期间旋转,该库可以旋转图像上的所有边界框。
from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
bbs = BoundingBoxesOnImage([
BoundingBox(x1=40, x2=550, y1=40, y2=780)
], shape=input_img.shape)
ia.imshow(bbs.draw_on_image(input_img))
来源:https://blog.csdn.net/weixin_43145427/article/details/125078619


猜你喜欢
- raw# row方法:(掺杂着原生sql和orm来执行的操作)res = CookBook.objects.raw('select
- 前言最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录。涉及知识点:共享锁、排他锁、意向锁、间隙锁、插入意向锁
- 现状≠将来?程序员做设计本身就很悲哀,纠结于客户与坚持之间就更是如此。无论我今后的路会怎么走,我想始终不变的事情就是与客户博弈了。无论是放弃
- 1. 从键盘输入一个整数,求 100 除以它的商,并显示输出。要求对从键盘输入的数值进行异常处理。try: n=i
- 本文实例为大家分享了python实现某考试系统生成word试卷的具体代码,供大家参考,具体内容如下提示:写完文章后,目录可以自动生成,如何生
- 验证码制作#string模块自带数字、字母、特殊字符变量集合,不需要我们手写集合import stringimport randomimpo
- 如果您在试图打开一个.MDF数据库文件时,却发现自己没有安装SQL Server数据库,该怎么办呢?这时候,如果恰巧您的机子上装有Visua
- 目录1.python中的异常2.捕捉异常try-except多个except子句 一个except块捕捉多个异常 空ex
- 这篇文章主要介绍了python matplotlib拟合直线的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 使用全局路由守卫实现前端定义好路由,并且在路由上标记相应的权限信息const routerMap = [ { path: '/per
- 引言MySQL数据库读写分离,是提高服务质量的常用手段之一,而对于技术方案,有很多成熟开源框架或方案,例如:sharding-jdbc、sp
- 1、吃金币源码分享:import osimport cfgimport sysimport pygameimport randomfrom
- 其中用到urllib2模块和正则表达式模块。下面直接上代码:[/code]#!/usr/bin/env python#-*- coding:
- 昨天带伙伴萌学习python爬虫,准备了几个简单的入门实例涉及主要知识点:web是如何交互的requests库的get、post函数的应用r
- 如何把imagenet预训练的模型,输入层的通道数随心所欲的修改,从而来适应自己的任务#增加一个通道w = layers[0].weight
- 一、需求介绍该需求主要是分析彩票的历史数据客户的需求是根据彩票的前两期的情况,如果存在某个斜着的两个数字相等,那么就买第三期的同一个位置处的
- Go是一种静态类型的、并发的、垃圾收集的编程语言,由谷歌开发。近年来,由于它的简单性、性能和对并发的强大支持,它已经获得了普及。尽管它很简单
- 前言将Selenium程序编写为 .bat 可执行文件,从此一键启动封装好的Selenium程序,省时省力还可以复用,岂不美哉应用场景写好
- 一、前言在程序中,有很多高效率的字符串处理方式,如果开发者能够完全掌握这些高效的字符串处理,往往在开发者也能事半功倍。比如针对于字符串的处理
- 前言变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的 “有