transforms图像增强(一)

一、数据增强

数据增强(Data Augmentation)是一种常用的数据预处理技术,通过对训练集进行各种变换和扩增操作,可以增加训练数据的多样性和丰富性,从而提高模型的泛化能力。

数据增强的目的是通过对训练集中的图像进行随机变换,生成更多样的图像样本,以模拟真实世界中的各种场景和变化。这样可以帮助模型学习到更多不同的特征和模式,提高模型对于不同样本的适应能力,减少过拟合的风险。

常见的数据增强操作包括图像翻转、旋转、缩放、裁剪、平移、变换色彩空间、添加噪声等。这些操作可以通过图像处理库(如PIL、OpenCV)或深度学习框架中的数据增强模块(如torchvision.transforms)来实现。

数据增强是深度学习中的一项重要技术,可以有效提升模型的性能和鲁棒性(模型对于输入数据的扰动、噪声、异常值等干扰的抵抗能力),尤其在数据量有限的情况下,通过增加样本的多样性,可以更好地训练出泛化能力强的模型。

在这里插入图片描述

二、transforms——裁剪

transforms.CenterCrop(size)

transforms.CenterCrop(size)

transforms.CenterCrop是一个数据转换操作,用于从图像中心裁剪图片。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
    使用transforms.CenterCrop可以将输入图像从中心位置裁剪为指定尺寸的图片。裁剪后的图片将保持图像的中心部分,并且其尺寸将与指定的尺寸相匹配。

示例:

import torchvision.transforms as transforms

# 定义数据转换操作
transform = transforms.Compose([
    transforms.CenterCrop(256)  # 中心裁剪为256x256像素
])

# 对图像进行中心裁剪为256x256像素
cropped_image = transform(image)

在上面的示例中,transforms.CenterCrop(256)将输入图像裁剪为256x256像素的图片。裁剪后的图片将保留图像的中心部分,并且尺寸将调整为256x256像素。

在这里插入图片描述
在这里插入图片描述

transforms.RandomCrop

transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')

transforms.RandomCrop是一个数据转换操作,用于从图片中随机裁剪出指定尺寸的图片。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
  • padding:填充大小,可以是一个整数、一个元组或一个列表。当为整数时,表示上下左右均填充相同数量的像素;当为元组或列表时,分别表示左、上、右、下的填充数量。
  • pad_if_needed:若图像小于设定的尺寸,则是否进行填充,默认为False。
  • fill:填充的像素值,默认为0。
  • padding_mode:填充模式,有4种模式
    1、constant:像素值由 fill 设定
    2、edge:像素值由图像边缘像素决定
    3、reflect:镜像填充,最后一个像素不镜像,eg:[1,2,3,4] → [3,2,1,2,3,4,3,2]
    4、symmetric:镜像填充,最后一个像素镜像,eg:[1,2,3,4] → [2,1,1,2,3,4,4,3]

使用transforms.RandomCrop可以在保持图像比例的情况下,随机裁剪出指定尺寸的图片。裁剪时会随机选择裁剪的起始位置,并保证裁剪后的图片尺寸与指定的尺寸相匹配。如果需要进行填充,则会根据填充大小和填充模式进行填充操作。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomCrop(256, padding=(10, 20, 30, 40), pad_if_needed=True, fill=255, padding_mode='constant')
])
# 对图像进行随机裁剪为256x256像素,若图像小于256x256则进行填充,填充大小为(10, 20, 30, 40),填充像素值为255
cropped_image = transform(image)

在上面的示例中,transforms.RandomCrop(256, padding=(10, 20, 30, 40), pad_if_needed=True, fill=255, padding_mode='constant')将输入图像随机裁剪为256x256像素的图片。如果输入图像的尺寸小于256x256,则会进行填充,填充大小为(10, 20, 30, 40),填充像素值为255,填充模式为常数填充。

注意:在使用transforms.RandomCrop进行随机裁剪时,如果输入图像的尺寸小于指定的裁剪尺寸,且pad_if_needed参数为False,则裁剪操作将不会进行,而是抛出异常。因此,建议在应用随机裁剪之前,先对图像进行适当的缩放或填充操作,以确保图像尺寸满足裁剪要求。

transforms.RandomResizedCrop

transforms.RandomResizedCrop是一个数据转换操作,用于随机裁剪图片,并按照指定的尺寸进行缩放。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
  • scale:随机裁剪面积比例,默认为(0.08, 1.0)。裁剪面积比例是指裁剪区域相对于原始图像的面积比例范围。
  • ratio:随机长宽比,默认为(3/4, 4/3)。长宽比是指裁剪区域的宽度与高度之比的范围。
  • interpolation:插值方法,默认为PIL.Image.BILINEAR。可选的插值方法有PIL.Image.NEAREST(最近邻插值)、PIL.Image.BILINEAR(双线性插值)和PIL.Image.BICUBIC(双三次插值)。

使用transforms.RandomResizedCrop可以在保持图像比例的情况下,随机裁剪出指定尺寸的图片,并按照指定的插值方法进行缩放。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomResizedCrop(256, scale=(0.5, 1.0), ratio=(3/4, 4/3), interpolation=Image.BICUBIC)
])
# 对图像进行随机裁剪为256x256像素,并按照指定的缩放比例和长宽比进行裁剪,使用双三次插值进行缩放
cropped_image = transform(image)

在上面的示例中,transforms.RandomResizedCrop(256, scale=(0.5, 1.0), ratio=(3/4, 4/3), interpolation=Image.BICUBIC)将输入图像随机裁剪为256x256像素的图片。裁剪时,会随机选择裁剪的面积比例和长宽比,并按照指定的插值方法进行缩放。

注意:在使用transforms.RandomResizedCrop进行随机裁剪时,裁剪区域的面积比例和长宽比是随机选择的,可以通过调整scaleratio参数来控制裁剪的范围。同时,建议在应用随机裁剪之前,先对图像进行适当的缩放或填充操作,以确保图像尺寸满足裁剪要求。

transforms.FiveCrop

transforms.FiveCrop是数据转换操作,用于在图像的不同位置进行裁剪。
transforms.FiveCrop功能是在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
    使用transforms.FiveCrop可以在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片。
    示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.FiveCrop(256)
])
# 对图像进行上下左右以及中心位置裁剪为256x256像素的5张图片
cropped_images = transform(image)

在上面的示例中,transforms.FiveCrop(256)将输入图像在上下左右以及中心位置裁剪为尺寸为256x256像素的5张图片。

transforms.TenCrop

transforms.TenCrop是数据转换操作,功能是在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片,并对这5张图片进行水平或者垂直镜像,从而得到10张图片。

参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
  • vertical_flip:是否进行垂直翻转,默认为False。如果设置为True,则对裁剪出的图片进行垂直翻转。

使用transforms.TenCrop可以在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片,并对这5张图片进行水平或者垂直镜像,从而得到10张图片。
示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.TenCrop(256, vertical_flip=True)
])
# 对图像进行上下左右以及中心位置裁剪为256x256像素的5张图片,并进行垂直翻转,得到10张图片
cropped_images = transform(image)

在上面的示例中,transforms.TenCrop(256, vertical_flip=True)将输入图像在上下左右以及中心位置裁剪为尺寸为256x256像素的5张图片,并对这5张图片进行垂直翻转,从而得到10张图片。

注意:在使用transforms.FiveCroptransforms.TenCrop进行裁剪时,返回的是一个包含裁剪出的多张图片的列表。要获取这些裁剪图片,可以通过索引访问列表中的元素。

三、transforms——翻转、旋转

transforms----Flip

transforms.RandomHorizontalFliptransforms.RandomVerticalFlip是数据转换操作,用于以一定的概率对图像进行水平或垂直翻转。

transforms.RandomHorizontalFlip功能是以概率p对图像进行水平翻转(左右翻转)。

参数:

  • p:翻转概率,取值范围为0到1之间,默认为0.5。即有50%的概率对图像进行水平翻转。
    使用transforms.RandomHorizontalFlip可以以一定的概率对图像进行水平翻转。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomHorizontalFlip(p=0.5)
])
# 以50%的概率对图像进行水平翻转
flipped_image = transform(image)

在上面的示例中,transforms.RandomHorizontalFlip(p=0.5)将以50%的概率对输入图像进行水平翻转。


transforms.RandomVerticalFlip功能是以概率p对图像进行垂直翻转(上下翻转)。
参数:

  • p:翻转概率,取值范围为0到1之间,默认为0.5。即有50%的概率对图像进行垂直翻转。
    使用transforms.RandomVerticalFlip可以以一定的概率对图像进行垂直翻转。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomVerticalFlip(p=0.5)
])
# 以50%的概率对图像进行垂直翻转
flipped_image = transform(image)

在上面的示例中,transforms.RandomVerticalFlip(p=0.5)将以50%的概率对输入图像进行垂直翻转。

注意:在使用transforms.RandomHorizontalFliptransforms.RandomVerticalFlip进行翻转时,每次应用这些转换操作时,都会根据给定的概率进行翻转。因此,每次应用这些转换操作时,得到的结果可能不同。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

transforms.RandomRotation

transforms.RandomRotation是一种数据转换操作,用于以随机的角度对图像进行旋转。
transforms.RandomRotation功能是随机选择一个角度对图像进行旋转。

参数:

  • degrees:旋转角度。可以是单个角度 a,表示在 (-a, a) 范围内选择旋转角度;也可以是一个范围 (a, b),表示在 (a, b) 范围内选择旋转角度。
  • resample:重采样方法。默认为 False,表示不进行重采样。
  • expand:是否扩大图片。默认为 False,表示不扩大图片。
    使用transforms.RandomRotation可以对图像进行随机角度的旋转。
    示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomRotation(degrees=30)
])
# 随机选择一个角度在 (-30, 30) 范围内对图像进行旋转
rotated_image = transform(image)

在上面的示例中,transforms.RandomRotation(degrees=30)将在 (-30, 30) 范围内随机选择一个角度对输入图像进行旋转。
transforms.RandomRotation还可以设置重采样方法和是否扩大图片,具体使用方法可参考官方文档。

注意:每次应用transforms.RandomRotation时,都会随机选择一个角度对图像进行旋转,因此每次应用这个转换操作时,得到的结果可能不同。


transforms.Lambda

transforms.Lambda是一个数据转换操作,它允许你使用自定义的函数来对数据进行转换。
transforms.Lambda功能是将自定义的函数应用于输入数据。
参数:

  • lambd:自定义函数。这个函数接受一个参数,并返回转换后的结果。
    使用transforms.Lambda可以使用自定义的函数对数据进行转换。
    示例:
import torchvision.transforms as transforms
def custom_transform(x):
    # 自定义转换函数
    # 在这里对输入数据 x 进行处理,并返回转换后的结果
    transformed_data = ...
    return transformed_data
transform = transforms.Compose([
    transforms.Lambda(custom_transform)
])
# 使用自定义的函数对输入数据进行转换
transformed_data = transform(data)

在上面的示例中,transforms.Lambda(custom_transform)将使用自定义的函数 custom_transform 对输入数据进行转换。
你可以根据自己的需求编写自定义的转换函数,并在transforms.Lambda中使用它来对数据进行转换。
注意:自定义函数的输入和输出可以是任意类型,但请确保函数的输入和输出类型与你的数据相匹配。


transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),

冒号之前lambda crops是函数的输入,冒号之后torch.stack([(transforms.ToTensor()(crop)) for crop in crops])是函数的返回值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在Ubuntu安装SVN服务并结合cpolar实现公网TCP地址远程访问本地服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

locust 快速入门--程序调试

背景 对测试的api引入locust后,不在使用requests库进行http请求了,而是通过client属性发送请求,实质是使用HttpSession。 问题:如果对locust程序进行调试 解决方案: 因为locust使用协程,需要开启pych…

剧本杀小程序/APP搭建,增加玩家游戏体验

近年来,剧本杀游戏成为了年轻人娱乐的新方式,受到了年轻人的追捧。 剧本杀是一种新型的社交游戏,在游戏中,玩家不仅可以进行角色扮演,也能够交到好友,符合当下年轻人的生活模式。 小程序、app是当下剧本杀…

微服务-java spi 与 dubbo spi

Java SPI 通过一个案例来看SPI public interface DemoSPI {void echo(); } public class FirstImpl implements DemoSPI{Overridepublic void echo() {System.out.println("first echo");} } public class SecondImpl implements DemoSPI{Overridepublic void ech…

C++ 类的内存分布

文章目录 1 . 前言2 . 无继承,无虚函数3 . 无继承,有虚函数4 . 单一继承,无虚函数5 . 单一继承,有虚函数,虚析构6 . 多重继承7 . 菱形继承8 . 虚拟继承9 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_…

Vue框架底层

一、前端框架的由来 1、服务端渲染 sequenceDiagram 浏览器->>服务器: https://www.bilibili.com/ Note right of 服务器: 组装页面(服务端渲染) 服务器->>-浏览器: 完整页面2、前后端分离 sequenceDiagram 浏览器->>服务器: https://www.bilibili.com/ 服务…

算法基础之合并果子

合并果子 核心思想&#xff1a; 贪心 Huffman树(算法): 每次将两个最小的堆合并 然后不断向上合并 #include<iostream>#include<algorithm>#include<queue> //用小根堆实现找最小堆using namespace std;int main(){int n;cin>>n;priority_queue&l…

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数&#xff0c;即支持用户输的在线 python 运行环境。效果如下图…

查询json数组

步骤一&#xff1a;创建表格 首先&#xff0c;我们需要创建一个表格来存储包含JSON对象数组的数据。可以使用以下代码创建一个名为 my_table 的表格&#xff1a; CREATE TABLE my_table (id INT PRIMARY KEY AUTO_INCREMENT,json_data JSON ); 上述代码创建了一个包含两个列的…

算法实验T15——POJ1636 Prison rearrangement

题目描述 Prison rearrangement Time Limit: 3000MSMemory Limit: 10000KTotal Submissions: 6415Accepted: 2718 Description&#xff1a; In order to lower the risk of riots and escape attempts, the boards of two nearby prisons of equal prisoner capacity, have dec…

计算机毕业设计 SpringBoot的中小型制造企业质量管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Kafka安全认证机制详解之SASL_PLAIN

一、概述 官方文档&#xff1a; https://kafka.apache.org/documentation/#security 在官方文档中&#xff0c;kafka有五种加密认证方式&#xff0c;分别如下&#xff1a; SSL&#xff1a;用于测试环境SASL/GSSAPI (Kerberos) &#xff1a;使用kerberos认证&#xff0c;密码是…

Ubuntu 本地部署 ChatGPT-Next-Web

Ubuntu 本地部署 ChatGPT-Next-Web 文章目录 Ubuntu 本地部署 ChatGPT-Next-Web ChatGPT-Next-Web 项目地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 本文主要演示如何在 Ubuntu 本地&#xff08;默认是端口 3000&#xff09;部署 ChatGPT-Next-Web&am…

差分约束算法

差分约束 差分约束系统包含 m m m个涉及 n n n个变量的差额限制条件&#xff0c;这些差额限制条件每个都是形式为 x i − x j ≤ b ∈ [ 1 , m ] x_i-x_j\leq b_{\in[1,m]} xi​−xj​≤b∈[1,m]​的简单线性不等式。 通常我们要求解出一组可行解。 最短路差分约束 如果我们…

ejs默认配置 造成原型链污染

文章目录 ejs默认配置 造成原型链污染漏洞背景漏洞分析漏洞利用 例题 [SEETF 2023]Express JavaScript Security ejs默认配置 造成原型链污染 参考文章 漏洞背景 EJS维护者对原型链污染的问题有着很好的理解&#xff0c;并使用非常安全的函数清理他们创建的每个对象 利用Re…

苹果macOS 14.3开发者预览版Beta 2发布 修复API会意外失败的问题

1 月 4 日消息&#xff0c;苹果向 Mac 电脑用户推送了 macOS 14.3 开发者预览版 Beta 2 更新&#xff08;内部版本号&#xff1a;23D5043d&#xff09;&#xff0c;本次更新距离上次发布隔了 22 天。 macOS Sonoma 14.3 Beta 2 主要以修复 BUG、提高安全性为主。根据苹果官方更…

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库&#xff0c;将其配置好&#xff0c;具体不在此展开说明。 2、文件结构如下图&#xff1a; 3、绘制棋盘代码&#xff0c;如下&#xff1a; void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…

线性代数第一课+第二课总结

第一课 第一课是简单的行列式计算&#xff0c;主要就是要把左下角的数字全部转换为0&#xff0c;通过减去其他行的式子即可实现&#xff0c;最后把对角线的所有数字相乘&#xff0c;得到的结果是最后行列式的答案 第二课 例题1 硬算理论上其实也是可行的&#xff0c;但是使…

遇见狂神说 Spring学习笔记(完整笔记+代码)

简介 Spring是一个开源的免费的框架&#xff08;容器&#xff09;Spring是一个轻量级的、非入侵式的框架控制反转(IOC&#xff09;&#xff0c;面向切面编程 (AOP)支持事务的处理&#xff0c;支持对框架进行整合 Spring就是一个轻量级的控制反转&#xff08;IOC&#xff09;和…

亚马逊云科技基于 listmonk 的电子邮件营销解决方案

本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 背景 电子邮件营销&#xff08;EDM&#xff09;在广告、电商、供应链物流等行业应用…