深度学习之图像数据集增强(Data Augmentation)
文章目录
- 一、 数据增强概述
- 二、python实现传统数据增强
- 参考文献
一、 数据增强概述
数据增强(Data Augmentation)是一种技术,通过对现有数据进行各种变换和处理来生成新的训练样本,从而增加数据集的多样性和数量。这些变换可以是几何变换、颜色变换、噪声添加等,使模型在训练过程中能够见到更多种类的数据,从而提升模型的泛化能力和鲁棒性。
在机器学习和深度学习中,数据的数量和质量对模型的性能至关重要。然而,获取大量标注数据通常既耗时又昂贵。数据增强通过对现有数据进行多种处理,模拟出更多样化 的训练样本,有效解决了数据稀缺的问题。这样不仅能防止模型过拟合(即模型在训练数据上表现很好,但在测试数据上表现不佳),还能够提升模型在不同情况下的表现,使其具有更强的泛化能力。
数据增强的方法多种多样,如下图所示:
这些方法各有优劣,可以根据具体任务和数据特点灵活选择和组合使用,以达到最佳的数据增强效果。通过数据增强,模型能够在有限的数据基础上获得更多的训练样本,提高训练效率和效果,最终在实际应用中表现得更加稳健和可靠。其中,传统数据增强方法比较常用且实现简单,因此本文主要实现传统数据增强的方法,其他数据增强方法后续有空再进行尝试。
二、python实现传统数据增强
import os
import random
from PIL import Image, ImageEnhance, ImageOps, ImageFilter# 翻转图像
def flip_image(image, mode='horizontal'):if mode == 'horizontal':return image.transpose(Image.FLIP_LEFT_RIGHT)elif mode == 'vertical':return image.transpose(Image.FLIP_TOP_BOTTOM)else:raise ValueError("Mode should be 'horizontal' or 'vertical'")# 旋转图像
def rotate_image(image, angle):return image.rotate(angle)# 缩放图像
def scale_image(image, scale_factor):width, height = image.sizereturn image.resize((int(width * scale_factor), int(height * scale_factor)))# 图像平移
def move(img): #平移,平移尺度为offoffset = ImageChops.offset(img, np.random.randint(1, 20), np.random.randint(1, 40))return offset# 裁剪图像
def crop_image(image, crop_box):return image.crop(crop_box)# 调整亮度、对比度、饱和度、色调
def adjust_color(image, brightness=1, contrast=1, saturation=1, hue=1):enhancer = ImageEnhance.Brightness(image)image = enhancer.enhance(brightness)enhancer = ImageEnhance.Contrast(image)image = enhancer.enhance(contrast)enhancer = ImageEnhance.Color(image)image = enhancer.enhance(saturation)# hue adjustment not directly available in PIL, skippedreturn image# 添加噪声
def add_noise(image, noise_type='gaussian', mean=0, std=1):# This function is a placeholder; PIL doesn't support direct noise additionreturn image# 模糊图像
def blur_image(image, blur_type='gaussian', radius=2):if blur_type == 'gaussian':return image.filter(ImageFilter.GaussianBlur(radius))elif blur_type == 'motion':return image.filter(ImageFilter.MotionBlur(radius)) # Pillow doesn't have MotionBlur, custom implementation neededelse:raise ValueError("Blur type should be 'gaussian' or 'motion'")# 仿射变换
def affine_transform(image, matrix):return image.transform(image.size, Image.AFFINE, matrix)def test():input_image_path = 'skadi.jpg' # 输入图像路径output_folder = 'output_path' # 输出文件夹if not os.path.exists(output_folder):os.makedirs(output_folder)image = Image.open(input_image_path)# 设置增强方法及其参数methods = [('flip', {'mode': 'horizontal'}),('rotate', {'angle': 45}),('scale', {'scale_factor': 1.5}),('translate', {'x': 10, 'y': 20}),('crop', {'crop_box': (10, 10, 200, 200)}),('adjust_color', {'brightness': 1.2, 'contrast': 1.5, 'saturation': 1.3}),('add_noise', {'noise_type': 'gaussian', 'mean': 0, 'std': 1}),('blur', {'blur_type': 'gaussian', 'radius': 2}),('affine', {'matrix': (1, 0.2, 0, 0.2, 1, 0)})]# 应用选择的增强方法for method_name, params in methods:if method_name == 'flip':result_image = flip_image(image, **params)elif method_name == 'rotate':result_image = rotate_image(image, **params)elif method_name == 'scale':result_image = scale_image(image, **params)elif method_name == 'translate':result_image = translate_image(image, **params)elif method_name == 'crop':result_image = crop_image(image, **params)elif method_name == 'adjust_color':result_image = adjust_color(image, **params)elif method_name == 'add_noise':result_image = add_noise(image, **params)elif method_name == 'blur':result_image = blur_image(image, **params)elif method_name == 'affine':result_image = affine_transform(image, **params)else:continueoutput_image_path = os.path.join(output_folder, f"{method_name}_output.jpg")result_image.save(output_image_path)if __name__ == '__main__':test()
例子:对图像进行随机翻转
def pair_flip_image(img, label):p = 0.5if np.random.random() < p:return flip_image(img), flip_image(label)return img, labeldef data_expand():image_dir = r"D:\test"image_list = os.listdir(os.path.join(image_dir, 'image'))expand_time = 10for idx in range(len(image_list)):if image_list[idx].endswith(('.png', '.jpg', '.tif')):print(image_list[idx])image = Image.open(os.path.join(image_dir, 'image', image_list[idx]))label = Image.open(os.path.join(image_dir, 'label', image_list[idx]))for k in range(expand_time):image, label = pair_flip_image(image, label)image.save("image.png")label.save("label.png") if __name__ == '__main__':data_expand()
参考文献
[1] 数据增强基本介绍和常用的数据增强方法
[2] 使用python及PIL库对图像分类数据图片进行数据增强扩充
相关文章:

深度学习之图像数据集增强(Data Augmentation)
文章目录 一、 数据增强概述二、python实现传统数据增强参考文献 一、 数据增强概述 数据增强(Data Augmentation)是一种技术,通过对现有数据进行各种变换和处理来生成新的训练样本,从而增加数据集的多样性和数量。这些变换可以是…...
小程序与APP的区别
目录 前言1. 开发方式与成本2. 运行环境与获取途径3. 功能复杂度与交互体验4. 更新与维护5. 推广与用户获取6. 占用空间与存储7. 可分享性总结 前言 小程序与APP作为两种不同类型的应用程序,它们在多个方面存在明显的区别。以下是对这些区别的详细阐述:…...
Linux Kernel Makefiles 编译标志详解
在Linux内核开发中,Makefile文件扮演着至关重要的角色,它指导make命令如何编译和链接内核源代码。Makefile中包含了多种编译标志(flags),这些标志控制着编译、汇编和链接过程的不同方面。本文将详细介绍几种关键的编译…...

数据可视化pyecharts——数据分析(柱状图、折线图、饼图)
安装 首先确保已经安装了pyecharts库,如果没有,可以通过pip install pyecharts进行安装。 柱状图 从pyecharts.charts导入Bar,从pyecharts导入options。准备数据(如类别数据x_data和对应的数值数据y_data)。创建Bar对…...

小程序构建npm失败
小程序构建npm失败 项目工程结构说明解决方法引入依赖导致的其他问题 今天在初始化后的小程序中引入TDesign组件库,构建npm时报错。 项目工程结构说明 初始化后的项目中,包含miniprogram文件夹和一些项目配置文件,在project.config.json文件中…...

计算机人工智能前沿进展-大语言模型方向-2024-09-20
计算机人工智能前沿进展-大语言模型方向-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Garc’ia, Kailan…...
cv环境设置
pytorch TensorFlow。。。 环境布置,库的安装顺序: 确定显卡可用的cuda上下限 (比如3090需要至少11.x以上的cuda参考: 一文理顺:pytorch、cuda版本,从此不再为兼容问题头疼! - 哔哩哔哩 (bilibili.com)&am…...

线性代数书中求解线性方程组的三种方法的实例
目录 一、克拉默法则(P45) 二、逆矩阵(P46) 三、高斯-约旦消元法(P65) 一、克拉默法则(P45) 二、逆矩阵(P46) 三、高斯-约旦消元法(P65)...
Linux容器化管理——Docker常见命令总结
创建镜像 docker build -t (镜像名) . 自动在当前目录下找dockerfile也可换成其他路径 查看本地镜像 docker images 登陆镜像服务器 docker login -u (登录名) -p (登陆密码) (镜像服务器…...

智慧校园建设解决方案建设系统简介
一、建设背景 1.1 政策背景 1.2 班牌的演变 1.3 建设愿景 二、 智慧班牌简介 三、智慧班牌系统 3.1 系统概述 3.2 软件平台功能交互简介 3.2.1 智慧班牌与管理平台间的功能关联 3.2.2 手机客户端(管理员、教师、家长端) 3.2.3 手机客户端&#x…...

用Python打造互动式中秋节庆祝小程序
中秋节,这个充满传统韵味的节日,不仅是家人团聚的时刻,也是程序员展示创意的好机会。本文将引导您使用Python创建一个互动式中秋节庆祝小程序,它不仅能够展示节日祝福,还能通过一些简单的特效增加节日气氛。 文章目录 …...
Linux 生成 git ssh 公钥
在Linux系统中生成SSH公钥以用于Git的步骤如下: 打开终端:首先,你需要打开你的Linux系统的终端。 检查SSH密钥:在生成新的SSH密钥之前,你可以检查是否已经存在SSH密钥。在终端中输入以下命令: ls -al ~/.s…...

CertiK因发现Apple Vision Pro眼动追踪技术漏洞,第6次获苹果认可
2024年9月20日,头部Web3.0安全机构CertiK自豪地宣布,CertiK的工程师因发现Apple Vision Pro MR(混合现实)头显设备中的关键漏洞而获得Apple公司认可,这已经是Apple公司第六次公开发布对CertiK的致谢,Cert…...
自动登录 RPA 的进阶:滑块验证的巧妙实现
在RPA的众多应用场景的探索中,自动登录是一个至关重要的环节,它为后续的自动化操作奠定了基础。然而,当我们面对滑块验证这一常见的挑战时,常常会感到困惑和无从下手。本文就来分享自动登录RPA的进阶----滑块验证如何实现。 在…...

Flask-WTF的使用
组织一个 Flask 项目通常需要遵循一定的结构,以便代码清晰、可维护。下面是一个典型的 Flask 项目结构: my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templat…...

Docker 进入容器并运行命令的方法
目录 理解 Docker 容器的基本概念 使用 docker exec 进入运行中的容器 基本用法 常用选项解析 选项详解 实际案例演示 1. 进入容器的交互式 Shell 2. 在容器中运行单个命令 3. 以指定用户运行命令 4. 设置环境变量并运行命令 5. 指定工作目录 使用 docker attach 附…...
2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析_数学建模完整过程+详细思路+代码全解析
问题1详细解答过程 (1) 交通流参数统计 数据预处理 数据读取: 从四个视频观测点提取交通流数据,包括每个时间段内的车流量、车速和车道占用率等。 交通流参数计算 3. 计算流量 (Q): Q ( t ) N ( t ) Δ t Q(t) \frac{N(t)}{\Delta t} Q…...

伊犁云计算22-1 apache 安装rhel8
1 局域网网络必须通 2 yum 必须搭建成功 3 apache 必须安装 开干 要用su 用户来访问 一看httpd 组件安装完毕 到这里就是测试成功了 如何修改主页的目录 网站目录默认保存在/var/WWW/HTML 我希望改变/home/www 122 127 167 行要改...
概率论原理精解【13】
文章目录 在度量空间中,连续映射概述一、度量空间与距离函数二、连续映射的定义三、连续映射的等价定义四、连续映射的性质五、应用与例子 球形邻域刻画一、球形邻域的定义二、连续映射的球形邻域刻画三、等价性证明四、应用与例子 将度量空间上的连续映射推广到拓扑…...

年度巨献 | OpenCSG开源最大中文合成数据集Chinese Cosmopedia
01 背景 近年来,生成式语言模型(GLM)的飞速发展正在重塑人工智能领域,尤其是在自然语言处理、内容创作和智能客服等领域展现出巨大潜力。然而,大多数领先的语言模型主要依赖于英文数据集进行训练,中文数据…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...