Python中的图像增强技术

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 图像增强是一种非常强大的技术,针对现有图像人为创建各种变化以扩展图像数据集,例如缩放现有图像、将现有图像旋转几度、剪切或裁剪图像等等。在本文中,我们将使用 imgaug 库探索 Python 中的图像增强技术。

翻译 | 王文刚

我们为什么需要图像增强?

深度学习卷积神经网络(CNN)需要大量图像才能有效训练模型。通过更好的增强有助于提高模型的性能,从而减少过度拟合。可用于分类和对象检测数据集的最流行的数据集具有数千到数百万个图像。
归纳是指在模型训练期间根据以前从未见过的数据进行评估模型的性能测试或验证。由于 CNN 具有不变性,即使在不同大小,方向或不同照明下可见时,它也可以对对象进行分类。因此,我们可以获取图像的小型数据集,并通过放大或缩小,垂直或水平翻转它们或更改亮度来改变对象的大小。这样,我们可以创建丰富、多样化的图像数据集。

图像增强可以从一小组图像中创建丰富多样的图像集,以进行图像分类,目标检测或图像分割。在仔细了解问题域之后,需要采用增加训练数据集大小的增强策略。

什么时候需要应用图像增强?

在我们训练模型之前,可以将图像增强用作预处理。

  • 离线或预处理增强

增强被用作预处理步骤,以增加数据集的大小。通常,当我们有一个小的训练数据集要扩展时,便可以完成此操作。
在较小的数据集上生成扩充很有帮助,但在应用于较大的数据集时,我们需要考虑磁盘空间。

  • 在线或实时增强

顾名思义,增强是实时应用的。这通常适用于较大的数据集,因为我们不需要将增强的映像保存在磁盘上。
在这种情况下,我们在小批量中应用转换,然后将其输入模型。
在线增强模型将在每个时期看到不同的图像。在“离线增强”中,增强图像是训练集的一部分,它会根据时期数多次查看增强图像。
该模型可通过在线增强更好地推广,因为它在通过在线数据增强进行训练期间会看到更多样本。
我们将使用 imgaug 类来演示图像增强。

基本图像处理技术

  • 翻转:垂直或水平翻转图像
  • 旋转:将图像旋转指定的角度。
  • 剪切:像平行四边形一样移动图像的一部分
  • 裁剪:对象以不同比例出现在图像中的不同位置
  • 放大,缩小
  • 改变亮度或对比度

现在,我们将使用 imgaug 库探索这些数据增强技术

Imgaug

imgaug 是一个用于图像增强以及关键点 / 地标,边界框,热图和分段图的库。

pip install imgaug

在某些情况下,我们会遇到 Shapely 错误,在这种情况下,我们可以尝试使用以下命令

pip install imgaug — upgrade — no-deps

我们将拍摄一张图像,并使用基本的数据增强技术对其进行转换实践。

导入所需的库

import imageio
import imgaug as ia
import imgaug.augmenters as iaa
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib
%matplotlib inline

显示原始图像

我们使用 imageio 显示原始图像

image = imageio.imread(“.\\car2.jpeg”)
ia.imshow(image)

image.png

旋转影像

我们可以通过指定旋转角度来旋转图像。我们将图像旋转 -50 度到 30 度

rotate=iaa.Affine(rotate=(-50, 30))
rotated_image=rotate.augment_image(image)
ia.imshow(rotated_image)

image.png

给图像添加噪点

我们将从高斯分布采样的不同噪声值添加到图像。

gaussian_noise=iaa.AdditiveGaussianNoise(10,20)
noise_image=gaussian_noise.augment_image(image)
ia.imshow(noise_image)

image.png

裁剪图像

修剪会删除图像侧面的像素列 / 行。在下面的示例中,我们将图像的一侧裁剪了 30%

crop = iaa.Crop(percent=(0, 0.3)) # crop image
corp_image=crop.augment_image(image)
ia.imshow(corp_image)

image.png

扭曲图像

设置 0 到 40 度

shear = iaa.Affine(shear=(0,40))
shear_image=shear.augment_image(image)
ia.imshow(shear_image)

image.png

翻转图像

我们可以垂直或水平翻转图像。Fliplr 水平翻转图像

#flipping image horizontally
flip_hr=iaa.Fliplr(p=1.0)
flip_hr_image= flip_hr.augment_image(image)
ia.imshow(flip_hr_image)

image.png

垂直翻转图像

flip_vr=iaa.Flipud(p=1.0)
flip_vr_image= flip_vr.augment_image(image)
ia.imshow(flip_vr_image)

image.png

改变图像的亮度

我们使用 GammaContrast 通过缩放像素值来调整图像亮度。在 gamma =(0.5,2.0)范围内的值似乎是明智的。我们也可以使用 SigmoidContrast 或 LinearContrast 来更改图像的亮度

image = imageio.imread(“.\\img Aug\\car2.jpeg”)
contrast=iaa.GammaContrast(gamma=2.0)
contrast_image =contrast.augment_image(image)
ia.imshow(contrast_image)

image.png

缩放图像

我们可以使用缩放来放大或缩小图像。我们已将图像缩放到图像高度 / 宽度的 150%至 80%。我们可以独立缩放每个轴
image.png

增强物体检测

我们绘制边界框以进行对象检测。当我们放大图像时,我们希望包围盒也相应地更新。
imgaug 支持边界框。当我们旋转,剪切或裁剪图像时,对象周围的边界框也会相应更新。
从 imgaug 导入边界框

from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage

初始化原始图像周围的边界框

bbs = BoundingBoxesOnImage([
 BoundingBox(x1=10, x2=520, y1=10, y2=300)
], shape=image.shape)

在原始图像上方显示边框

ia.imshow(bbs.draw_on_image(image, size=2))

image.png

在下面的代码中,我们使用 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.png

应用图像增强后在图像外部处理边界框

边框有时可能会超出图像,因此我们需要其他代码来处理这种情况
我们旋转图像,并尝试在对象周围绘制边框

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))

image.png

边界框的部分在图像外部。在下面的代码中,我们将

  • 将边框完全或部分移出图像
  • 裁剪部分位于外部的边界框,使其完全位于图像内部

我们创建一个 padding 函数,以 1 像素的白色边框和 1 像素的黑色边框填充图像:

def pad(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)
    return image_border2

然后,我们在图像上绘制边界框。我们首先将图像平面扩展 BORDER 像素,然后标记图像平面内的边界框

def draw_bbs(image, bbs, border):
    GREEN = [0, 255, 0]
    ORANGE = [255, 140, 0]
    RED = [255, 0, 0]
    image_border = pad(image, border)
    for bb in bbs.bounding_boxes:
        if bb.is_fully_within_image(image.shape):
            color = GREEN
        elif bb.is_partly_within_image(image.shape):
            color = ORANGE
        else:
            color = RED
        image_border = bb.shift(left=border, top=border)\
                         .draw_on_image(image_border, size=2, color=color)
return image_border

现在,我们对图像应用相同的旋转并绘制边界

rotate=iaa.Affine(rotate=(-50, 30))
image_aug, bbs_aug = rotate(image=image, bounding_boxes=bbs)
image_after = draw_bbs(image_aug, bbs_aug.remove_out_of_image().clip_out_of_image(), 100)
ia.imshow(image_after)

image.png


阿里巴巴开源大数据技术团队成立Apache Spark中国技术社区,定期推送精彩案例,技术专家直播,问答区近万人Spark技术同学在线提问答疑,只为营造纯粹的Spark氛围,欢迎钉钉扫码加入!
image.png

对开源大数据和感兴趣的同学可以加小编微信(下图二维码,备注“进群”)进入技术交流微信群。
image.png

相关文章
|
17天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
99 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
3天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
17 2
|
29天前
|
数据可视化 图形学 Python
在圆的外面画一个正方形:Python实现与技术解析
本文介绍了如何使用Python的`matplotlib`库绘制一个圆,并在其外部绘制一个正方形。通过计算正方形的边长和顶点坐标,实现了圆和正方形的精确对齐。代码示例详细展示了绘制过程,适合初学者学习和实践。
42 9
|
25天前
|
数据可视化 数据处理 Python
Python编程中的数据可视化技术
在Python编程中,数据可视化是一项强大的工具,它能够将复杂的数据集转化为易于理解的图形。本文将介绍如何使用matplotlib和pandas这两个流行的Python库来实现数据可视化,并展示一些实用的代码示例。通过这些示例,读者将学会如何创建各种图表,包括折线图、柱状图和散点图等,以便更好地理解和呈现数据。
|
1月前
|
存储 数据挖掘 数据处理
Python中的计票技术
本文介绍了如何使用 Python 进行计票,包括使用字典、`collections.Counter` 和 `pandas` 等方法。通过多个示例详细展示了每种方法的具体应用,帮助读者掌握计票技巧。
28 1
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
59 3
|
1月前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
图论在数据结构与算法中占据重要地位,应用广泛。本文通过Python代码实现深度优先搜索(DFS)和广度优先搜索(BFS),帮助读者掌握图的遍历技巧。DFS沿路径深入搜索,BFS逐层向外扩展,两者各具优势。掌握这些技巧,为解决复杂问题打下坚实基础。
37 2
|
1月前
|
开发框架 开发者 Python
探索Python中的装饰器:技术感悟与实践
【10月更文挑战第31天】 在编程世界中,装饰器是Python中一种强大的工具,它允许我们在不修改函数代码的情况下增强函数的功能。本文将通过浅显易懂的方式,带你了解装饰器的概念、实现原理及其在实际开发中的应用。我们将一起探索如何利用装饰器简化代码、提高可读性和复用性,同时也会分享一些个人的技术感悟,帮助你更好地掌握这项技术。
33 2
|
24天前
|
数据采集 API 定位技术
Python技术进阶:动态代理IP的跨境电商解决方案
Python技术进阶:动态代理IP的跨境电商解决方案
|
1月前
|
数据采集 JavaScript 程序员
探索CSDN博客数据:使用Python爬虫技术
本文介绍了如何利用Python的requests和pyquery库爬取CSDN博客数据,包括环境准备、代码解析及注意事项,适合初学者学习。
76 0
下一篇
DataWorks