Python中的数据增强技术

news2024/11/17 17:47:54

使用imgaug快速观察Python中的数据增强技术

在本文中,我们将使用imgaug库来探索Python中不同的数据增强技术

什么是图像增强

图像增强是一种强大的技术,用于在现有图像中人为地创建变化以扩展图像数据集。这是通过应用不同的变换技术来实现的,例如缩放、旋转、剪切或裁剪现有图像。目标是创建一组全面的可能图像,代表各种变化。

为什么需要图像增强

图像增强在深度学习卷积神经网络 (CNN) 背景下至关重要,因为它有助于满足有效模型训练对大型且多样化数据集的需求。 CNN 需要大量图像才能有效训练,而图像增强提供了一种人为扩展现有数据集的方法。通过缩放、旋转、剪切或裁剪等技术创建图像变化,图像增强有助于生成更全面的可能图像集。这种多样化的数据集使模型能够更好地泛化,减少过度拟合,并在测试或验证过程中对以前未见过的数据进行评估时提高其性能。因此,图像增强对于提高训练数据的质量和数量至关重要,最终导致更强大和更准确的 CNN 模型。

什么时候使用图像增强

图像增强可以作为训练模型之前的预处理步骤,也可以在训练过程中实时应用。当用作预处理步骤时,应用增强来增加数据集的大小,特别是在处理需要扩展的小型训练数据集时。这种方法称为离线或预处理增强,涉及生成现有图像的变体以创建更多样化的数据集。应用图像增强时仔细考虑问题领域非常重要,因为某些增强策略可能与特定任务无关或无用。例如,在对不同类型的汽车进行分类时,垂直翻转汽车可能不会为数据集增加价值。因此,图像增强的应用应根据问题领域的具体要求进行定制。

离线或预处理增强

离线或预处理增强是指应用图像增强作为预处理步骤来增加数据集的大小。这种方法通常在处理需要扩展的小型训练数据集时使用。通过生成现有图像的变化(例如翻转、旋转或缩放),离线增强可以为训练机器学习模型创建更加多样化的数据集。应用离线增强时,特别是在处理较大的数据集时,考虑磁盘空间非常重要。这种方法允许在训练过程开始之前创建一组全面的可能图像,最终提高训练数据的质量和数量。

在线或实时增强

在线或实时增强涉及在训练过程中实时应用增强技术。这种方法通常用于较大的数据集,因为它不需要将增强图像保存在磁盘上。通过实时应用增强,模型在每个时期看到不同的图像,从而有助于训练数据的多样性。实时增强在处理较大的数据集时特别有用,因为它减少了与保存增强图像相关的存储要求。这种方法允许在训练过程中动态应用增强技术,有助于模型从各种图像变化中学习的能力。

我们将使用imgaug类来演示图像增强。imgaug支持广泛的数据增强技术

基本数据增强技术

  • 翻转(Flipping):垂直或水平翻转图像

  • 旋转(Rotation):按指定的程度旋转图像

  • 剪切(Shearing):像平行四边形一样移动图像的一部分

  • 裁剪(Cropping):对象在图像中以不同的比例出现在不同的位置上

  • 放大缩小(Zoom in, Zoom out)

  • 改变亮度或对比度

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

实践Imgaug

imgaug是一个用于图像增强的库,包括关键点/地标、边界框、热图和分割图。

  • git项目地址:https://github.com/aleju/imgaug
  • 项目文档地址:https://imgaug.readthedocs.io/en/latest

examples

安装
pip install imageio imgaug 
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
展示原有图像
image = imageio.v2.imread('./Lenna.jpg')
ia.imshow(image)

Lenna.png

旋转图像Rotating

可以通过指定旋转度来旋转图像,随机将图像旋转-50度到30度之间,旋转角度可以是负值,表示逆时针旋转,也可以是正值,表示顺时针旋转

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

rotate.png

图像添加噪声Noise

将不同的从高斯分布元素采样的噪声值添加到图像中,参数1020分别表示噪声的均值和标准差。高斯噪声是一种常见的随机噪声,它的数值符合高斯分布(也称为正态分布)。均值参数决定了噪声的中心位置,标准差参数决定了噪声的强度。

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

noise.png

图像裁剪Cropping

裁剪将删除图像两侧的列/行像素。在下面的例子中,将图像的一侧随机裁剪0~30%, 随机的裁剪,使图像具有更多的多样性和变化。裁剪操作可以用于去除图像边缘的无用信息、调整图像的组成或者创建更密集的图像副本等。

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

crop.png

图像剪切Shearing

剪切图像随机0到40度,错切变换会将图像的一部分按照一定角度进行平移,从而改变图像的形状和内容。可以用于创建透视效果、扭曲图像的形状或者模拟某些特定场景下的形变。

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

shearing.png

图像翻转Flipping

可以垂直地或水平地翻转图像, 这里展示Fliplr水平翻转图像。水平翻转可以用于纠正图像的方向、增加训练数据的多样性或者模拟镜像对称的场景。

#flipping image horizontally
flip_hr = iaa.Fliplr(p=1.0)  # 翻转概率100%, 小于1.0时候是随机翻转,可能不翻转
flip_hr_image = flip_hr.augment_image(image)
ia.imshow(flip_hr_image)

fliplr.png

Filpud垂直翻转图像

flip_vr = iaa.Flipud(p=1.0)  # 翻转概率为100%
flip_vr_image = flip_vr.augment_image(image)
ia.imshow(flip_vr_image)

flipud.png

图像改变亮度brightness

通过缩放像素值来调整图像的亮度。在Gamma=(0.5, 2.0)范围内的值是合理的。也可以使用符号对比度或线性对比度来改变图像的亮度。伽马对比度增强器会应用一个伽马变换到图像上,通过调整图像的亮度和对比度来改变图像的外观。伽马值决定了变换的强度,较高的伽马值会增加图像的对比度,使得图像的暗部更暗,亮部更亮。

contrast = iaa.GammaContrast(gamma=2.0)
contrast_image =contrast.augment_image(image)
ia.imshow(contrast_image)

brightness.png

图像缩放Scale

可以使用比例尺放大或缩小图像。下面的图像缩放到图像高度/宽度的150%到80%。此外也可以独立地缩放每个轴。函数会随机选择一个缩放比例,范围在1.0到1.5之间,并分别应用于图像的x和y方向。较小的缩放比例会使图像变小,而较大的缩放比例会使图像变大。缩放变换可以用于调整图像的尺寸、改变物体的比例或者模拟不同距离下的图像。

scale_im = iaa.Affine(scale={"x": (1.5, 1.0), "y": (1.5, 1.0)})
scale_image = scale_im.augment_image(image)
ia.imshow(scale_image)

scale.png

对目标检测的增强

为目标检测绘制边界框。当增强图像时,希望边界框也被相应地更新。imgaug为边界框提供了支持。当旋转、剪切或裁剪图像时,对象周围的边界框也会相应地更新。

导入边界框
from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
原图画出框
bbs = BoundingBoxesOnImage([BoundingBox(x1=80, x2=140, y1=70, y2=150)], shape=image.shape)
ia.imshow(bbs.draw_on_image(image, size=2))

detection.png

在下面的代码中,使用平移百分比来移动图像,扩大边界框,并将其应用到图像上

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

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

rotate.png

边界框的某些部分都在图像的外部。在下面的代码中,会看到这些问题:

  • 完全或部分删除图像外部的边界框
  • 剪切部分在外部的边界框,使它们完全在图像内部

创建一个填充功能,用1像素白色和1像素黑色边框填充图像:

# 填充
def pad(image, by):
    image_border1 = iaa.size.pad(image, top=1, right=1, bottom=1, left=1, mode="constant", cval=255)
    image_border2 = iaa.size.pad(image_border1, top=by-1, right=by-1, bottom=by-1, left=by-1, mode="constant", cval=0)
    return image_border2

然后,在图像上绘制边界框。首先通过边界像素扩展图像平面,然后在图像平面内标记边界框

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)

pad-rotate.png

参考

  • https://imgaug.readthedocs.io/en/latest/index.html
  • https://towardsdatascience.com/data-augmentation-techniques-in-python-f216ef5eed69
  • https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html
  • https://nanonets.com/blog/data-augmentation-how-to-use-deep-learning-when-you-have-limited-data-part-2/
  • https://github.com/Lexie88rus/augmentation-packages-overview/blob/master/data-augmentation-packages-overview.ipynb
  • A survey on Image Data Augmentation for deep learning.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1205308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 SQL 中,当复合主键成为外键时应该如何被其它表引用

文章目录 当研究一个问题慢慢深入时,一个看起来简单的问题也暗藏玄机。在 SQL 中,主键成为外键这是一个很平常的问题,乍一看没啥值得注意的。但如果这个主键是一种复合主键,而另一个表又引用这个键作为它的复合主键,问…

Android R.fraction

来源 我是在看Android10原生代码&#xff0c;绘制状态栏蓝牙电量相关类中第一次看到R.fraction的&#xff0c;如类BatteryMeterDrawable <fraction name"battery_button_height_fraction">10%</fraction> mButtonHeightFraction context.getResources(…

Jenkins入门——安装docker版的Jenkins 配置mvn,jdk等 使用案例初步 遇到的问题及解决

前言 Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插件来支持构建、部署、自动化&#xff0c; 满足任何项目的需要。 官网&#xff1a;https://www.jenkins.io/zh/ 本篇博客介绍docker版的jenkins的安装和使用&#xff0c;maven、jdk&#xff0c;汉语的配置…

Oracle数据库、实例、用户、表空间和表之间的关系

一、Oracle数据库中数据库、实例、用户、表空间和表&#xff08;索引、视图、存储过程、函数、对象等对象&#xff09;之间的关系。 1、Oracle的数据库是由一些物理文件组成&#xff1a;数据文件控制文件重做日志文件归档日志文件参数文件报警和跟踪日志文件备份文件。 2、实…

2023.11.11通过html内置“required-star“添加一个红色的星号来表示必填项

2023.11.11通过html内置"required-star"添加一个红色的星号来表示必填项 在HTML中&#xff0c;可以使用标签来为元素添加说明。同时可以通过添加一个红色的星号来表示必填项。 <!DOCTYPE html> <html lang"en"> <head><meta charse…

Java整合Redis实现坐标附近查询

目录 一、GEO用法引入 二、引入依赖 三、实体类 四、添加位置信息 五、查询位置信息 一、GEO用法引入 GEO&#xff0c;全称Geolocation&#xff0c;代表地理坐标。可以在其中存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a;GEOADD&…

东莞松山湖数据中心|莞服务器托管的优势

东莞位于珠江三角洲经济圈&#xff0c;交通便利&#xff0c;与广州、深圳等大城市相邻&#xff0c;而且东莞是中国重要的制造业基地&#xff0c;有众多的制造业和科技企业集聚于此&#xff0c;随着互联网和数字化时代的到来&#xff0c;企业都向数字化转型&#xff0c;对于信息…

CSS特效009:音频波纹加载律动

总第 009 篇文章&#xff0c; 查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花…

Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)

目录 一、从空白系统中克隆Centos7系统 二、使用xshell连接docker_tigerhhzz虚拟机​编辑 三、在CentOS7基础上安装Docker容器 四、在Docker中进行安装Portainer 4.1、在Docker中安装MySQL 4.2、在Docker中安装JDK8&#xff0c;安装Java环境 4.3、Docker安装redis&#…

华为笔记本电脑原装win10/win11系统恢复安装教程方法

华为电脑matebook 14原装Win11系统带F10智能还原 安装恢复教程&#xff1a; 1.安装方法有两种&#xff0c;一种是用PE安装&#xff0c;一种是华为工厂包安装&#xff08;安装完成自带F10智能还原&#xff09; 若没有原装系统文件&#xff0c;请在这里获取&#xff1a;https:…

RabbitMQ传统数据持久化和Lazy queue的区别

问题引出&#xff1a; 在了解这个问题前我们需要一些前置知识&#xff1a; 关于MQ可靠性&#xff0c;在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。这样会导致两个问题&#xff1a; 一旦MQ宕机&#xff0c;内存中的信息会丢失 内存空…

list复制出新的list后修改元素,也更改了旧的list?

例子 addAll() Testpublic void CopyListTest(){Student student Student.builder().id(1).name("张三").age(23).classId(1).build();Student student2 Student.builder().id(2).name("李四").age(22).classId(1).build();List<Student> student…

uniapp的实战总结大全

&#x1f642;博主&#xff1a;冰海恋雨 &#x1f642;文章核心&#xff1a;uniapp部分总结 目录 ​编辑 目录 前言&#xff1a; 解决方案 1. 跨平台开发 2. Vue.js生态 3. 组件库 4. 自定义组件 5. Native能力 6. 插件生态 7. 性能优化 写法 1. 模板&#xf…

[100天算法】-球会落何处(day 76)

题目描述 用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。箱子中的每个单元格都有一个对角线挡板&#xff0c;跨过单元格的两个角&#xff0c;可以将球导向左侧或者右侧。将球导向右侧的挡板跨过左上角和右下角&#xff0c;在网…

【嵌入式设计】Main Memory:SPM 便签存储器 | 缓存锁定 | 读取 DRAM 内存 | DREM 猝发(Brust)

目录 0x00 便签存储器&#xff08;Scratchpad memory&#xff09; 0x01 缓存锁定&#xff08;Cache lockdown&#xff09; 0x02 读取 DRAM 内存 0x03 DREM Banking 0x04 DRAM 猝发&#xff08;DRAM Burst&#xff09; 0x00 便签存储器&#xff08;Scratchpad memory&#…

数据结构:红黑树的原理和实现

文章目录 红黑树的概念红黑树的性质红黑树的模拟实现红黑树的平衡问题 整体实现和测试 本篇用于进行红黑树的拆解和模拟实现&#xff0c;为之后的map和set的封装奠定基础 红黑树的概念 红黑树也是一种二叉搜索树&#xff0c;但是在每一个节点的内部新增了一个用以表示该节点颜…

计算机毕业设计选题推荐-公共浴池微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

ubuntu操作系统的docker更换存储目录

前言 要将Docker的存储目录更改为/home/docker&#xff0c;你需要进行以下步骤&#xff1a; 目录 前言1、停止Docker服务2、创建新的存储目录3、编辑Docker配置文件4、启动Docker服务5、验证更改 1、停止Docker服务 首先停止Docker守护进程&#xff0c;可以使用以下命令&…

asp.net图书管理系统

asp.net图书管理系统 基本操作图书管理 读者管理 借书 修改资料 修改密码 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 图书管理 读者管理 借书 修改资料 修改…

【Vue】过滤器Filters

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue系列持续发放&#xff0c;涵盖大量的经验和示例&#xff0c;如对您有用&#xff0c;可以点赞收藏哈 过滤器 filters过滤器已从Vue 3.0中删除&#xff0c;不再支持了&#xff0c;这里可以作为了解进行学习 vue3要精简代码&…