python扩展库提供了图像处理功能,python树状图可视化
本文主要带你了解Python中三个图像增强库的使用:Imgaug、Albumentations和SOLT。文章通过实例详细介绍了它们,有需要的可以参考。
00-1010 imgaugalbumentationsolt结论简介
目录
本文探讨了三个流行的Python图像增强库。
图像分类器通常在训练更多图像时表现更好。在图像分类模型中,一个常见的问题是模型不能正确的对图像进行分类,只是因为它没有针对同一幅图像的不同方向进行训练。这可以通过为模型提供各种可能的图像方向和变换来克服。
然而,在现实中,收集这些不同的数据可能需要更多的时间、资源和专业知识,对于公司来说,成本可能非常高。在这种情况下,图像数据增强是一种流行的选择,它可以通过使用一种或多种增强技术来生成用于训练的各种图像,从而增加现有数据集的多样性。
虽然有些Python库支持多种增强技术,但并不是所有的都适合训练模型。用户需要知道哪些增强技术可以帮助为训练模型生成实际的附加数据。
我们可以使用各种技术来增强图像数据。它可以包括:
使用几何变换(如翻转、裁剪、旋转、缩放等)增强图像数据。).通过颜色转换增强图像数据,例如,通过调整亮度、暗度、锐度、饱和度等。通过随机擦除、混合图像等来增强图像数据。
介绍
Imgaug是一个开源的python包,可以让你在机器学习实验中增强图像。它适用于各种增强技术。它有一个简单但强大的界面,可以增强图像,地标,边界框,热图和分割图。
让我们首先使用pip安装这个库。
pip安装imgaug
接下来,我们将使用pip命令在命令提示符下安装名为“IPyPlot”的python包:
pip安装ipyplot
IPyPlot是一个Python工具,允许在Python笔记本单元格中快速高效地显示图像。这个包将IPython和HTML结合起来,提供了一种更快、更丰富和更具交互性的方式来显示图像。这个包的 plot_images 命令将用于绘制网格状结构中的所有图像。
此外,我们将导入扩展数据所需的所有必需的包。
导入图像
将imgaug作为ia导入
将imgaug.augmenters作为iaa导入
这里定义了增强的图像路径。我们将以鸟的图像为例。
input_img=imageio.imread(./input/image-bird/bird . jpg’)
图像翻转
我们可以使用下面的命令水平和垂直翻转图像。以下代码中的“Fliplr”关键字水平翻转图像。类似地,关键字“Flipud”垂直翻转图像。
#水平翻转
hflip=iaa。Fliplr(p=1.0)
input _ HF=HF lip . augment _ image(input _ img)
#垂直翻转
vflip=iaa。Flipud(p=1.0)
input _ VF=v flip . augment _ image(input _ img)
images _ list=[输入图像,输入高频,输入高频]
标签=[原始,水平翻转,垂直翻转]
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, BoundingBoxesOnImagebbs = BoundingBoxesOnImage([
BoundingBox(x1=40, x2=550, y1=40, y2=780)
], shape=input_img.shape)
ia.imshow(bbs.draw_on_image(input_img))
Albumentations
Albumentations 是一个快速且知名的库,它与流行的深度学习框架(如 PyTorch 和 TensorFlow)集成。它也是 PyTorch 生态系统的一部分。
Albumentations 可以执行所有典型的计算机视觉任务,包括分类、语义分割、实例分割、对象识别和姿势估计。该库包含 70 多种不同的增强功能,用于从现有数据创建新的训练样本。它通常用于工业、深度学习研究、机器学习竞赛和开源项目。
让我们首先使用 pip 命令安装库。
pip install Albumentations
我们将导入使用 Albumentations 扩充数据所需的所有必要包:
import albumentations as Aimport cv2
除了 Albumentations 包之外,我们还使用 OpenCV 包,这是一个支持多种图像格式的开源计算机视觉库。Albumentations 依赖于 OpenCV;因此,你已经安装了它。
图像翻转
'A.HorizontalFlip' 和 'A.VerticalFlip' 函数用于水平和垂直翻转图像。p 是一个独特的参数,几乎所有的扩充都支持。它控制使用增强的概率。
#HorizontalFliptransform = A.HorizontalFlip(p=0.5)
augmented_image = transform(image=input_img)[image]
plt.figure(figsize=(4, 4))
plt.axis(off)
plt.imshow(augmented_image)
#VerticalFlip
transform = A.VerticalFlip(p=1)
augmented_image = transform(image=input_img)[image]
plt.figure(figsize=(4, 4))
plt.axis(off)
plt.imshow(augmented_image)
图像缩放和旋转
该增强器随机使用仿射变换来平移、缩放和旋转输入图像。
transform = A.ShiftScaleRotate(p=0.5)random.seed(7)
augmented_image = transform(image=input_img)[image]
plt.figure(figsize=(4, 4))
plt.axis(off)
plt.imshow(augmented_image)
图像 ChannelShuffle
该增强器随机重新排列输入图像的 RGB 通道。
from albumentations.augmentations.transforms import ChannelShuffletransform = ChannelShuffle(p=1.0)
random.seed(7)
augmented_image = transform(image=input_img)[image]
plt.figure(figsize=(4, 4))
plt.axis(off)
plt.imshow(augmented_image)
图像曝光
该增强器反转输入图像中大于某个阈值的所有像素值。
from albumentations.augmentations.transforms import Solarizetransform = Solarize(threshold=200, p=1.0)
augmented_image = transform(image=input_img)[image]
plt.figure(figsize=(4, 4))
plt.axis(off)
plt.imshow(augmented_image)
反转图像
通过从 255 中减去像素值,此增强器反转输入图像。
from albumentations.augmentations.transforms import InvertImgtransform = InvertImg(p=1.0)
augmented_image = transform(image=input_img)[image]
plt.figure(figsize=(4, 4))
plt.axis(off)
plt.imshow(augmented_image)
使用 Compose 增强管道
要定义一个扩展管道,首先,创建一个 Compose 实例。你必须提供扩充列表作为 Compose 类的参数。在此示例中,我们将使用各种增强功能,例如转置、模糊、失真等。
调用 Compose 将导致返回一个将进行图像增强的转换函数。
transform = A.Compose([A.RandomRotate90(),
A.Transpose(),
A.ShiftScaleRotate(shift_limit=0.08, scale_limit=0.5, rotate_limit=5, p=.8),
A.Blur(blur_limit=7),
A.GridDistortion(),
])
random.seed(2)
augmented_image = transform(image=input_img)[image]
plt.figure(figsize=(4, 4))
plt.axis(off)
plt.imshow(augmented_image)
SOLT
SOLT 是一个深度学习数据增强库,支持图像、分割掩码、标签和关键点。SOLT 也很快,并且在其后端有 OpenCV。
我们将从使用 pip 命令安装 SOLT 开始
pip install solt
然后我们将导入增强图像数据所需的所有必要的 SOLT 包。
import soltimport solt.transforms as slt
h, w, c = input_img.shape
img = input_img[:w]
在这里,我们将为扩充管道创建一个 Stream 实例。你必须提供扩充列表作为流类的参数。
stream = solt.Stream([slt.Rotate(angle_range=(-90, 90), p=1, padding=r),
slt.Flip(axis=1, p=0.5),
slt.Flip(axis=0, p=0.5),
slt.Shear(range_x=0.3, range_y=0.8, p=0.5, padding=r),
slt.Scale(range_x=(0.8, 1.3), padding=r, range_y=(0.8, 1.3), same=False, p=0.5),
slt.Pad((w, h), r),
slt.Crop((w, w), r),
slt.Blur(k_size=7, blur_type=m),
solt.SelectiveStream([
slt.CutOut(40, p=1),
slt.CutOut(50, p=1),
slt.CutOut(10, p=1),
solt.Stream(),
solt.Stream(),
], n=3),
], ignore_fast_mode=True)
fig = plt.figure(figsize=(17,17))
n_augs = 10
random.seed(2)
for i in range(n_augs):
img_aug = stream({image: img}, return_torch=False, ).data[0].squeeze()
ax = fig.add_subplot(1,n_augs,i+1)
if i == 0:
ax.imshow(img)
else:
ax.imshow(img_aug)
ax.set_xticks([])
ax.set_yticks([])
plt.show()
结论
图像增强可以帮助增加现有数据集。目前有几个 Python 库可用于图像增强。在本文中,我们使用三个 Python 库——Imgaug、Albalentations和Solt探索了不同的图像增强技术。
到此这篇关于深入浅出Python中三个图像增强库的使用的文章就介绍到这了,更多相关Python图像增强库内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。