transforms图像增强(一)

news2024/9/24 11:23:12

一、数据增强

数据增强(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])是函数的返回值

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

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

相关文章

JVM工作原理与实战(七):类的生命周期-初始化阶段

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载(Loading) 2.连接(Linking) 3.初始化(Initialization) 4.使用(Using&…

面试算法96:字符串交织

题目 输入3个字符串s1、s2和s3,请判断字符串s3能不能由字符串s1和s2交织而成,即字符串s3的所有字符都是字符串s1或s2中的字符,字符串s1和s2中的字符都将出现在字符串s3中且相对位置不变。例如,字符串"aadbbcbcac"可以由…

使用 Kafka 和 CDC 将数据从 MongoDB Atlas 流式传输到 SingleStore Kai

SingleStore 提供了变更数据捕获 (CDC) 解决方案,可将数据从 MongoDB 流式传输到 SingleStore Kai。在本文中,我们将了解如何将 Apache Kafka 代理连接到 MongoDB Atlas,然后使用 CDC 解决方案将数据从 MongoDB Atlas 流式传输到 SingleStore…

SparkStreaming基础解析(四)

1、 Spark Streaming概述 1.1 Spark Streaming是什么 Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象原语如:map、…

网络调试 UDP1,开发板用静态地址-入门5

https://www.bilibili.com/video/BV1zx411d7eC?p11&vd_source109fb20ee1f39e5212cd7a443a0286c5 1, 开发板连接路由器 1.1,烧录无OS UDP例程 1.2,Mini USB连接电脑 1.3,开发板LAN接口连接路由器 2. Ping开发板与电脑之间通信* 2.1 根据…

Redis 教程

Redis 简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次…

智能分析网关V4太阳能风光互补远程视频智能监控方案

一、背景需求 在一些偏远地区,也具有视频监控的需求。但是这类场景中,一般无法就近获取市电,如果要长距离拉取市电,建设的成本非常高且长距离传输有安全隐患,因此风光互补远程视频监控方案的需求也较多。利用风光电转化…

Reids在Win下无法远程访问

1.将redis在windows上启动主要做了以下配置 1.1.在redis.windows.conf中修改一下 原:bind 127.0.0.1 改:# bind 127.0.0.1 bind 0.0.0.0 原:protected-mode yes 改:protected-mode no去掉了127.0.0.1,加入0.0.0.0后&…

[C#]winform部署PaddleDetection的yolo印章检测模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleDetection.git 【算法介绍】 PaddleDetection 是一个基于 PaddlePaddle(飞桨)深度学习框架的开源目标检测工具库。它提供了一系列先进的目标检测算法,包括但不限于 Faster R-CNN, …

C ++类

定义一个Person类,私有成员int age,string &name,定义一个Stu类,包含私有成员double *score,写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数,完成对Person的运算符重载(算术运算符、条件运算…

Linux———cat命令详解

目录 cat 命令是 Linux 中用于查看文件的内容或将多个文件合并输出。 基本语法: 常用选项: 示例用法: 查看文件的内容: ​编辑 将多个文件的内容合并输出: ​编辑 显示每一行的行号: ​编辑 显示非…

使用CentOS 7.6搭建HTTP隧道代理服务器

在现代网络环境中,HTTP隧道代理服务器因其灵活性和安全性而受到广泛关注。CentOS 7.6,作为一个稳定且功能强大的Linux发行版,为搭建此类服务器提供了坚实的基础。 首先,我们需要明确HTTP隧道代理的基本原理。HTTP隧道代理允许客户…

为什么云性能监控如此重要?

在当今数字化时代,企业越来越依赖云服务来支持其业务需求。为了确保云服务的可用性、性能和稳定性,云性能监控成为管理和优化云基础架构的关键一环。那么,为什么云性能监控如此重要?下面,就来看看具体介绍吧! 一、实时故障检测 云…

6 网关和配置服务器

文章目录 网关模式Spring Cloud网关Spring Cloud网关微服务其他项目的变更运行和测试小结 运行状况Spring Boot Actuator在微服务中包含Actuator 服务发现和负载均衡ConsulSpring Cloud ConsulSpring Cloud负载均衡器网关中的服务发现和负载均衡使用服务发现和负载均衡 环境配置…

c++ spdlog日志系统

非常好用的日志系统 最近用oatpp写webapi,但他的日志只是显示在控制台,并不记录到文件。 做接口的,肯定要记录错误日志,好查找问题 于是用spdlog,不用编译dll或lib, include 头文件就直接使用了&#x…

【六大排序详解】终篇 :冒泡排序 与 快速排序

终篇 :冒泡排序 与 快速排序 1 冒泡排序1.1 冒泡排序原理1.2 排序步骤1.3 代码实现 2 快速排序2.1 快速排序原理2.1.1 Hoare版本代码实现 2.1.2 hole版本代码实现 2.1.3 前后指针法代码实现 2.1.4 注意取中位数局部优化 2.1.5 非递归版本非递归原理代码实现 2.2 特性总结 谢谢阅…

springboot、spring-kafka、kafka-client的版本对应关系

在使用springboot集成kafka的时候需要注意springboot版本、引用的依赖spring-kafka版本和kafka中间件版本的对应关系,否则可能会因为版本不兼容导致出现错误。 1、含义说明(摘自官网) Spring Boot:是springboot的版本。Spring fo…

Element ui 改变el-transfer 穿梭框的大小

修改el-transfer 左右两个穿梭框的高度和宽度,具体效果如下正常大小的穿梭框修改之后的,主要在style中加上如下样式即可 /deep/ .el-transfer-panel{ width: 470px; /* 左右两个穿梭框的高度和宽度 */ height: 450px; } /deep/ .el-transfer-panel__li…

C语言编译器(C语言编程软件)完全攻略(第三十部分:Xcode简明教程(使用Xcode编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 三十、Xcode简明教程(使用Xcode编写C语言程序) 在 Mac OS X 下学习C语言使用 Xcode。Xcode 是由Apple官方开发的IDE,支持C、C、Objective-C、Swift等,可以用来开发 Mac OS X 和 iOS 上…

微信小程序使用mqtt开发可以,真机不行

以下可以解决我的问题,请一步一步跟着做,有可能版本不一样就失败了 一、下载mqtt.js 前往蓝奏云 https://wwue.lanzouo.com/iQPdc1k50hpe 下载好后将.txt改为.js 然后放入项目里 二、连接mqtt const mqtt require(../../utils/mqtt.min); let cli…