transforms的操作

一、transforms的操作

1、transforms.RandomChoice

transforms.RandomChoice 是一个数据转换操作,用于从一系列的转换方法中随机选择一个进行数据增强。
参数:

  • transforms:一个包含多个转换方法的列表或元组。

示例:

import torchvision.transforms as transforms# 定义数据转换操作
transform = transforms.Compose([# 从以下转换方法中随机选择一个进行数据增强transforms.RandomChoice([transforms.RandomHorizontalFlip(),  # 随机水平翻转transforms.RandomVerticalFlip(),    # 随机垂直翻转transforms.RandomRotation(45),      # 随机旋转(角度为45度)])
])# 对图像进行数据增强
augmented_image = transform(image)

在上面的示例中,transforms.RandomChoice 从一个包含三个转换方法的列表中随机选择一个转换方法进行数据增强。可以选择的转换方法包括随机水平翻转、随机垂直翻转和随机旋转。最后,使用 transform 对图像进行数据增强,得到增强后的图像 augmented_image

通过使用 transforms.RandomChoice,可以在一系列的数据转换方法中随机选择一个,从而增加数据的多样性和随机性。这有助于提高模型的鲁棒性和泛化能力。

2、transforms.RandomApply

transforms.RandomApply 是一个数据转换操作,根据给定的概率依次应用一组转换方法。

参数:

  • transforms:一个包含多个转换方法的列表或元组。
  • p:应用转换方法的概率,默认为 0.5。
    示例:
import torchvision.transforms as transforms
transform = transforms.Compose([transforms.RandomApply([transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.RandomRotation(45),], p=0.5)
])
# 根据概率应用一组转换方法进行数据增强
augmented_image = transform(image)

在上面的示例中,transforms.RandomApply 接受一个包含三个转换方法的列表,以及一个概率值 p=0.5。这意味着在每次应用转换方法时,有 50% 的概率应用其中的一个转换方法。可以选择的转换方法包括随机水平翻转、随机垂直翻转和随机旋转。最后,使用 transform 对图像进行数据增强,得到增强后的图像 augmented_image

通过使用 transforms.RandomApply,可以根据给定的概率依次应用一组转换方法。这有助于增加数据的多样性和随机性,提高模型的鲁棒性和泛化能力。


3、transforms.RandomOrder

transforms.RandomOrder 是一个数据转换操作,用于对一组转换方法进行随机顺序打乱。
参数:

  • transforms:一个包含多个转换方法的列表或元组。
    示例:
import torchvision.transforms as transforms
transform = transforms.Compose([transforms.RandomOrder([transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.RandomRotation(45),])
])
# 随机打乱一组转换方法的顺序进行数据增强
augmented_image = transform(image)

在上面的示例中,transforms.RandomOrder 接受一个包含三个转换方法的列表。这些转换方法包括随机水平翻转、随机垂直翻转和随机旋转。使用 transform 对图像进行数据增强时,会随机打乱转换方法的顺序,从而生成增强后的图像 augmented_image
通过使用 transforms.RandomOrder,可以对一组转换方法进行随机顺序打乱。这有助于增加数据的多样性和随机性,提高模型的鲁棒性和泛化能力。

二、自定义transforms

自定义transforms要素:

  1. 仅接收一个参数,返回一个参数
  2. 注意上下游的输出与输入

以下是一个示例代码,展示了如何通过类实现自定义的转换方法,接收多个参数并返回一个参数:

class YourTransforms(object):def __init__(self, param1, param2, ...):# 初始化参数self.param1 = param1self.param2 = param2...def __call__(self, img):# 在这里实现您的转换逻辑# 可以使用 self.param1, self.param2 等参数# img 是输入的图像# 转换操作# ...return img

在上面的示例中,YourTransforms 类接收多个参数 param1, param2, ... 并在 __init__ 方法中进行初始化。您可以根据需要定义和初始化自己的参数。
然后,在 __call__ 方法中实现您的转换逻辑。在这个方法中,您可以使用 self.param1, self.param2 等参数,并对输入的图像 img 进行转换操作。最后,返回转换后的图像。

使用自定义的转换方法时,您可以将其与其他转换方法一起使用,例如 torchvision.transforms.Compose。通过将自定义的转换方法添加到 Compose 中,可以按照指定的顺序应用多个转换方法。

transform = transforms.Compose([transforms.RandomHorizontalFlip(),YourTransforms(param1, param2, ...),...
])

在上述代码中,我们将 YourTransforms 添加到 Compose 中,并在需要的位置传递所需的参数。这样,您就可以将自定义的转换方法与其他转换方法组合在一起,应用于图像数据的预处理或增强过程中。

椒盐噪声

椒盐噪声又称为脉冲噪声,是一种随机出现的白点或者黑点, 白点称为盐噪声,黑色为椒噪声
信噪比(Signal-Noise Rate, SNR)是衡量噪声的比例,图像中为图像像素的占比

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

要实现添加椒盐噪声的转换方法,可以使用以下代码:

import random
import numpy as np
import torchvision.transforms as transforms
class AddPepperNoise(object):def __init__(self, snr, p):self.snr = snrself.p = pdef __call__(self, img):img_array = np.array(img)  # 将图像转换为 numpy 数组h, w, c = img_array.shape  # 获取图像的高度、宽度和通道数# 计算噪声点的数量noise_num = int(h * w * self.p)# 生成随机的噪声点的坐标noise_coords = [(random.randint(0, h-1), random.randint(0, w-1)) for _ in range(noise_num)]# 添加椒盐噪声for coord in noise_coords:if random.random() < 0.5:  # 50%的概率生成盐噪声(白色)img_array[coord[0], coord[1], :] = 255else:  # 50%的概率生成椒噪声(黑色)img_array[coord[0], coord[1], :] = 0# 计算信噪比signal_power = np.mean(img_array)  # 计算信号的平均值noise_power = signal_power / self.snr  # 计算噪声的平均值noise_std = np.sqrt(noise_power)  # 计算噪声的标准差# 添加高斯噪声noise = np.random.normal(0, noise_std, size=(h, w, c))img_array = np.clip(img_array + noise, 0, 255).astype(np.uint8)# 将 numpy 数组转换为图像img = transforms.ToPILImage()(img_array)return img

在上述代码中,我们定义了一个名为 AddPepperNoise 的类,该类接收两个参数 snrp,分别表示信噪比和噪声点的概率。

__call__ 方法中,我们首先将输入的图像转换为 numpy 数组,并获取图像的高度、宽度和通道数。

然后,我们根据噪声点的概率 p 计算噪声点的数量,并生成随机的噪声点的坐标。
接下来,我们遍历噪声点的坐标,根据 50% 的概率生成盐噪声(白色)或椒噪声(黑色)。

计算信噪比时,我们首先计算信号的平均值 signal_power,然后根据信噪比 snr 计算噪声的平均值 noise_power,最后计算噪声的标准差 noise_std

最后,我们使用 numpy.random.normal 生成高斯噪声,并将其添加到图像上。然后,我们使用 numpy.clip 将图像像素值限制在 0 到 255 之间,并将其转换为 uint8 类型的数组。最后,我们将数组转换回图像格式,并返回添加了椒盐噪声的图像。

您可以将 AddPepperNoise 类与其他转换方法一起使用,例如 torchvision.transforms.Compose,将其添加到数据转换操作的组合中,以应用该转换方法。

transform = transforms.Compose([transforms.ToTensor(),AddPepperNoise(snr, p),...
])

在上述代码中,我们将 AddPepperNoise 添加到 Compose 中,并在需要的位置传递信噪比 snr 和噪声点的概率 p。这样,您就可以将添加椒盐噪声的转换方法与其他转换方法组合在一起,应用于图像数据的预处理过程中。


class Compose(object):def __call__(self, img):for t in self.transforms:  # 遍历转换方法列表img = t(img)  # 应用当前转换方法到图像return img  # 返回处理后的图像

上述代码定义了一个名为 Compose 的类,用于组合多个图像转换方法。

__call__ 方法中,我们遍历 self.transforms 列表中的每个转换方法 t,并将当前的图像 img 作为参数传递给转换方法。然后,将转换后的图像赋值给 img,继续应用下一个转换方法。

最后,返回经过所有转换方法处理后的图像 img

通过使用 Compose 类,可以将多个图像转换方法组合在一起,并在预处理过程中依次应用这些转换方法,以实现更复杂的图像处理操作。

例如,可以使用以下代码将两个转换方法 transform1transform2 组合在一起:

transform = Compose([transform1,transform2
])

然后,可以通过调用 transform(img) 方法来应用这两个转换方法到图像 img 上,得到处理后的图像。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Javaweb/LayUI/上机考试作业/开源]学生/图书/课程/仓库等管理系统六合一基础功能通用模板

展示 考试要求 给定用户表和六张图书/教师/顾客/仓库....的表&#xff08;随机给每人抽选&#xff09;&#xff0c;要求实现用户登录注册&#xff0c;异步更新&#xff0c;对物品增删改查&#xff0c;精确/模糊查询等。 环境 tomcat 9 mysql 8 java 17 项目结构 项目类图 写前…

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

JDK 11:崭新特性解析

JDK 11&#xff1a;崭新特性解析 JDK 11&#xff1a;崭新特性解析1. HTTP Client&#xff08;标准化&#xff09;示例代码 2. 局部变量类型推断的扩展示例代码 3. 新的字符串方法示例代码 4. 动态类文件常量示例代码 5. Epsilon 垃圾收集器使用方式 结语 JDK 11&#xff1a;崭新…

Redis(一)

1、redis Redis是一个完全开源免费的高性能&#xff08;NOSQL&#xff09;的key-value数据库。它遵守BSD协议&#xff0c;使用ANSI C语言编写&#xff0c;并支持网络和持久化。Redis拥有极高的性能&#xff0c;每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数…

el-select下拉框 change事件返回该项所有数据

主要代码 value-key <template><div><el-selectv-model"value"value-key"label"placeholder"请选择"change"selectChange"><el-optionv-for"item in options":key"item.label":label"…

分布式锁3: zk实现分布式锁2 使用临时节点(需要自旋)

一 使用临时节点实现分布式锁 1.1 代码截图 1.2 代码如下 由于zookeeper获取链接是一个耗时过程&#xff0c;这里可以在项目启动时&#xff0c;初始化链接&#xff0c;并且只初始化一次。借助于spring特性&#xff0c;代码实现如下&#xff1a; package com.atguigu.distri…

labelme的json转mask,实测有效

1、创建一个conda的虚拟环境 conda creat -n labelme python3.82、转到你的标注文件夹&#xff08;包括json和图片&#xff09; cd C:/Users/Administrator/Desktop/json3、你需要在标注文件夹下用txt写下以下代码&#xff0c;并保存bat文件。 放在最后一个就可以了 echo of…

Fiber Golang 中的路由和中间件

掌握 GoLang Fiber 中的路由和中间件艺术&#xff0c;以进行高效的 Web 开发 在网络开发领域中&#xff0c;创建一个有效地路由和管理各种任务的 Web 应用程序至关重要。路由决定了如何处理传入的请求&#xff0c;而中间件在执行任务&#xff0c;如身份验证、日志记录和请求解…

PyTorch|构建自己的卷积神经网络——卷积层

在构建我们的网络时&#xff0c;我们需要用到卷积层提取特征&#xff0c;来看到一些特别的东西&#xff0c;当图片经过卷积层&#xff0c;图片尺寸一般会变化。 当我们构建网络时&#xff0c;我们需要确定各个层的参数&#xff0c;而这些参数&#xff0c;则是要提前计算的&…

Jmeter二次开发实操问题汇总(JDK问题,jar包问题)

前提 之前写过一篇文章&#xff1a;https://qa-lsq.blog.csdn.net/article/details/119782694 只是简单尝试了一下生成一个随机手机号码。 但是如果在工作中一个实际场景要用的二次开发&#xff0c;可能会遇到一些问题。 比如这样一个场景&#xff1a; Mobile或者前端调用部分…

OpenSource - 基于Netty的网络扩展库HServer

文章目录 概述官网Hserver的理念特点原理图代码案例HelloWorld 概述 HServer是一个基于Netty开发网络扩展库.使用插件方式来扩展我们的业务 HServer提供 web,gateway,rpc 等插件 同时用户也可以自定义插件&#xff0c;来完成各种各样的业务场景。 官网 https://gitee.com/HSe…

Golang leetcode707 设计链表 (链表大成)

文章目录 设计链表 Leetcode707不使用头节点使用头节点 推荐** 设计链表 Leetcode707 题目要求我们通过实现几个方法来完成对链表的各个操作 由于在go语言中都为值传递&#xff0c;&#xff08;注意这里与值类型、引用类型的而区别&#xff09;&#xff0c;所以即使我们直接在…

Python如何生成个性二维码

Python-生成个性二维码 一、问题描述 通过调用MyQR模块来实现生成个人所需二维码。 安装&#xff1a; pip install myqr 二、代码实现 1.普通二维码 from MyQR import myqr # 普通二维码 myqr.run(wordshttp://www.csdn.net/mayi0312,save_nameqrcode.png ) 效果图&#…

Python库学习(十四):ORM框架-SQLAlchemy

1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#xff09;库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互&#xff0c;支持多种数据库后端&#xff0c;如 P…

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

Milvus启动和调试 0 前言1 Milvus启动【问题描述】出现Aborted问题【问题分析】【解决方法】安装Pulsar服务执行单机启动命令解决监听端口号 2 Milvus调试编写launch.json验证单例调试成功 3 遇到的问题汇总问题1问题2:Permission denied 0 前言 由于Milvus官方文档只提及如何…

web期末作业动态时钟UI界面毛玻璃版

效果图 html代码奉上 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

数据结构实验1:栈和队列的应用

目录 一、实验目的 二、实验原理 1.1栈的基本操作 1.1.1 栈的定义 1.1.2 初始化栈 1.1.3 压栈&#xff08;Push&#xff09; 1.1.4 出栈&#xff08;Pop&#xff09; 1.1.5 判空&#xff08;isEmpty&#xff09; 1.1.6 查看栈顶元素&#xff08;Top&#xff09; 1.1…

DNS安全与访问控制

一、DNS安全 1、DNSSEC原理 DNSSEC依靠数字签名保证DNS应答报文的真实性和完整性。权威域名服务器用自己的私有密钥对资源记录&#xff08;Resource Record, RR&#xff09;进行签名&#xff0c;解析服务器用权威服务器的公开密钥对收到的应答信息进行验证。如果验证失败&…

【LeetCode】150. 逆波兰表达式求值(ASCII码)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;150. 逆波兰表达式求值 代码随想录题解地址&#xff1a;代码随想录 题目简介 即将后缀表达式转换成中缀表达式并计算。 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 …

Spring学习之——AOP(面向切面)

AOP 概念 AOP&#xff1a;全称是Aspect Oriented Programming即&#xff1a;面向切面编程。 简单的说它就是把我们程序重复的代码抽取出来&#xff0c;在需要执行的时候&#xff0c;使用动态代理的技术&#xff0c;在不修改源码的基础上&#xff0c;对程序进行增强&#xff…