图像预处理——transforms

一、transforms 运行机制

torchvision是PyTorch的一个扩展库,提供了许多计算机视觉相关的工具和功能。下面是关于torchvision中常用模块的介绍:

  1. torchvision.transforms:提供了一系列常用的图像预处理方法,用于对图像进行变换、缩放、裁剪、旋转、翻转等操作。例如,ToTensor将PIL图像或numpy数组转换为Tensor,Normalize对图像进行标准化处理,RandomCrop随机裁剪图像等。
  2. torchvision.datasets:包含了一些常用的数据集的dataset实现,方便用户加载和使用。例如,MNIST是一个手写数字数据集,CIFAR-10是一个包含10个类别的彩色图像数据集,ImageNet是一个大规模的图像数据集等。这些数据集可以方便地用于训练和评估模型。
  3. torchvision.models:提供了一些常用的预训练模型,可以用于图像分类、目标检测、图像分割等任务。这些模型包括了经典的网络结构,如AlexNetVGGResNetGoogLeNet等。用户可以通过加载预训练模型,快速搭建和使用这些模型。
  4. torchvision.utils:提供了一些辅助函数和工具,用于计算机视觉任务中的常见操作。例如,make_grid可以将多张图像拼接成一个网格显示,save_image可以将Tensor保存为图像文件,draw_bounding_boxes可以在图像上绘制边界框等。

torchvision.transforms

torchvision.transforms模块提供了一系列常用的图像预处理方法,用于对图像进行各种变换和操作。以下是一些常用的图像预处理方法:

  1. 数据中心化(Data normalization):
    • Normalize(mean, std):对图像进行均值和标准差的归一化处理。
  2. 数据标准化(Data standardization):
    • ToTensor():将PIL图像或numpy数组转换为Tensor,并将像素值缩放到[0, 1]范围内。
  3. 缩放(Resizing):
    • Resize(size):将图像的大小调整为指定的尺寸。
    • RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.333)):随机裁剪并缩放图像到指定的尺寸。
  4. 裁剪(Cropping):
    • CenterCrop(size):从图像的中心裁剪出指定大小的区域。
    • RandomCrop(size):随机裁剪图像的一部分。
  5. 旋转(Rotation):
    • RandomRotation(degrees):随机旋转图像一定角度。
  6. 翻转(Flipping):
    • RandomHorizontalFlip(p=0.5):以给定的概率随机水平翻转图像。
    • RandomVerticalFlip(p=0.5):以给定的概率随机垂直翻转图像。
  7. 填充(Padding):
    • Pad(padding):在图像周围填充指定数量的像素。
  8. 噪声添加(Noise adding):
    • RandomNoise():向图像中添加随机噪声。
  9. 灰度变换(Grayscale transformation):
    • Grayscale(num_output_channels=1):将图像转换为灰度图像。
  10. 线性变换(Linear transformation):
    • RandomAffine(degrees, translate=None, scale=None, shear=None):随机仿射变换图像。
  11. 亮度、饱和度及对比度变换(Brightness, saturation, and contrast transformation):
    • AdjustBrightness(brightness_factor):调整图像的亮度。
    • AdjustSaturation(saturation_factor):调整图像的饱和度。
    • AdjustContrast(contrast_factor):调整图像的对比度。
      这些方法可以根据需要组合使用,以实现对图像进行预处理和增强的目的。

在这里插入图片描述

transforms.Normalize

功能:逐channel的对图像进行标准化

output = (input - mean) / std

• mean:各通道的均值
• std:各通道的标准差
• inplace:是否原地操作

transforms.Normalize(mean, std, inplace=False)torchvision.transforms模块中的一个图像预处理方法,用于对图像进行数据中心化(data normalization)的操作。
参数说明:

  • mean:用于数据中心化的均值,可以是一个标量或一个长度为图像通道数的列表/元组。如果图像是灰度图像,只需要提供一个标量;如果图像是彩色图像,需要提供每个通道的均值。
  • std:用于数据中心化的标准差,可以是一个标量或一个长度为图像通道数的列表/元组。如果图像是灰度图像,只需要提供一个标量;如果图像是彩色图像,需要提供每个通道的标准差。
  • inplace:是否原地操作,默认为False。如果设置为True,则会直接修改输入的Tensor,否则会返回一个新的Tensor。
    数据中心化(data normalization)是一种常用的图像预处理操作,通过将图像的每个像素减去均值并除以标准差,将图像的像素值归一化到均值为0、标准差为1的范围内。这样做的目的是消除不同图像之间的亮度差异,使得图像在训练过程中更容易收敛。
    使用示例:
import torchvision.transforms as transforms
# 定义均值和标准差
mean = [0.5, 0.5, 0.5]  # RGB图像的均值
std = [0.5, 0.5, 0.5]  # RGB图像的标准差
# 定义Normalize变换
normalize = transforms.Normalize(mean=mean, std=std)
# 对图像进行数据中心化
normalized_image = normalize(image)

上述示例中,meanstd分别表示RGB图像的均值和标准差。normalize是一个Normalize对象,可以将其应用于图像数据,实现数据中心化的操作。最终得到的normalized_image是一个经过数据中心化处理后的图像。

代码示例

"""
# @file name  : transforms_methods_1.py
# @author     : siuser
# @brief      : transforms方法(一)
"""
import osBASE_DIR = os.path.dirname(os.path.abspath(__file__))
import numpy as np
import torch
import random
from torch.utils.data import DataLoader
import torchvision.transforms as transforms
from PIL import Image
from matplotlib import pyplot as pltpath_lenet = os.path.abspath(os.path.join(BASE_DIR, "..", "..", "model", "lenet.py"))
path_tools = os.path.abspath(os.path.join(BASE_DIR, "..", "..", "tools", "common_tools.py"))
assert os.path.exists(path_lenet), "{}不存在,请将lenet.py文件放到 {}".format(path_lenet, os.path.dirname(path_lenet))
assert os.path.exists(path_tools), "{}不存在,请将common_tools.py文件放到 {}".format(path_tools,os.path.dirname(path_tools))import sys# 获取当前文件所在目录的绝对路径
hello_pytorch_DIR = os.path.abspath(os.path.dirname(__file__) + os.path.sep + ".." + os.path.sep + "..")# 将hello_pytorch_DIR添加到sys.path中,以便可以导入该目录下的模块
sys.path.append(hello_pytorch_DIR)from tools.my_dataset import RMBDataset
from tools.common_tools import set_seed, transform_invertset_seed(1)  # 设置随机种子# 参数设置
MAX_EPOCH = 10
BATCH_SIZE = 1
LR = 0.01
log_interval = 10
val_interval = 1
rmb_label = {"1": 0, "100": 1}# ============================ step 1/5 数据 ============================
# 获取数据集划分的路径
split_dir = os.path.abspath(os.path.join("..", "..", "data", "rmb_split"))# 检查数据集划分路径是否存在,如果不存在则抛出异常
if not os.path.exists(split_dir):raise Exception(r"数据 {} 不存在, 回到lesson-06\1_split_dataset.py生成数据".format(split_dir))# 训练集路径
train_dir = os.path.join(split_dir, "train")# 验证集路径
valid_dir = os.path.join(split_dir, "valid")import torchvision.transforms as transformsnorm_mean = [0.485, 0.456, 0.406]  # RGB图像的均值
norm_std = [0.229, 0.224, 0.225]  # RGB图像的标准差# 定义训练集的数据预处理操作
train_transform = transforms.Compose([transforms.Resize((224, 224)),  # 调整图像大小为224x224# 1 CenterCrop# transforms.CenterCrop(512),     # 512,将图像从中心位置裁剪为指定的大小,即将图像的宽度和高度都调整为512像素# 2 RandomCrop# transforms.RandomCrop(224, padding=16),# transforms.RandomCrop(224, padding=(16, 64)),# transforms.RandomCrop(224, padding=16, fill=(255, 0, 0)),# transforms.RandomCrop(512, pad_if_needed=True),   # pad_if_needed=True# transforms.RandomCrop(224, padding=64, padding_mode='edge'),# transforms.RandomCrop(224, padding=64, padding_mode='reflect'),# transforms.RandomCrop(1024, padding=1024, padding_mode='symmetric'),# 3 RandomResizedCrop# transforms.RandomResizedCrop(size=224, scale=(0.5, 0.5)),# 4 FiveCrop# transforms.FiveCrop(112),# transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),# 5 TenCrop# transforms.TenCrop(112, vertical_flip=False),# transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),# 1 Horizontal Flip# transforms.RandomHorizontalFlip(p=1),# 2 Vertical Flip# transforms.RandomVerticalFlip(p=0.5),# 3 RandomRotation# transforms.RandomRotation(90),# transforms.RandomRotation((90), expand=True),# transforms.RandomRotation(30, center=(0, 0)),# transforms.RandomRotation(30, center=(0, 0), expand=True),   # expand only for center rotationtransforms.ToTensor(),  # 将图像转换为Tensor类型transforms.Normalize(mean=norm_mean, std=norm_std)  # 对图像进行数据中心化
])valid_transform = transforms.Compose([transforms.Resize((224, 224)),  # 调整图像大小为224x224像素transforms.ToTensor(),  # 将图像转换为张量格式,将像素值从0-255映射到0-1之间transforms.Normalize(norm_mean, norm_std)  # 对图像张量进行标准化处理,使用给定的均值和标准差进行归一化
])# 构建MyDataset实例
train_data = RMBDataset(data_dir=train_dir, transform=train_transform)  # 构建训练数据集实例
valid_data = RMBDataset(data_dir=valid_dir, transform=valid_transform)  # 构建验证数据集实例# 构建DataLoader
train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)  # 构建训练数据加载器
valid_loader = DataLoader(dataset=valid_data, batch_size=BATCH_SIZE)  # 构建验证数据加载器# ============================ step 5/5 训练 ============================
for epoch in range(MAX_EPOCH):for i, data in enumerate(train_loader):inputs, labels = data  # 获取输入数据和标签img_tensor = inputs[0, ...]  # 获取第一个样本的图像张量img = transform_invert(img_tensor, train_transform)  # 将图像张量转换为图像plt.imshow(img)  # 显示图像plt.show()  # 显示图像窗口plt.pause(0.5)  # 暂停0.5秒plt.close()  # 关闭图像窗口# bs, ncrops, c, h, w = inputs.shape# for n in range(ncrops):#     img_tensor = inputs[0, n, ...]  # C H W#     img = transform_invert(img_tensor, train_transform)#     plt.imshow(img)#     plt.show()#     plt.pause(1)

os.path.abspath(file)

os.path.abspath(__file__)用于获取当前文件的绝对路径。
__file__是Python中的一个内置变量,表示当前文件的路径。os.path.abspath()函数可以将相对路径转换为绝对路径。
以下是一个示例代码,展示了如何使用os.path.abspath(__file__)获取当前文件的绝对路径:

import os
# 获取当前文件的绝对路径
file_path = os.path.abspath(__file__)
print(file_path)

在这个示例中,os.path.abspath(__file__)会返回当前文件的绝对路径,并将其赋值给file_path变量。然后,通过print()函数打印出file_path的值,即当前文件的绝对路径。

assert os.path.exists(path_lenet)

assert是Python中的一个关键字,用于在程序中进行断言(assertion)。断言是一种用于检查程序中的假设条件是否成立的方法。它是一种声明,用于确保在程序执行过程中某个特定的条件为真。如果断言条件为真,则程序继续执行;如果断言条件为假,则断言语句会抛出AssertionError异常,并中断程序的执行。

os.path.exists()os.path模块中的一个函数,用于检查指定路径的文件或目录是否存在。它接受一个路径作为参数,并返回一个布尔值,表示指定路径是否存在。如果路径存在,则返回True;如果路径不存在,则返回False

sys.path.append和os.path.join的区别

sys.path.append()os.path.join()都是Python中用于处理路径的函数,但它们的作用和用法有所不同。

sys.path.append()是用于将路径添加到Python解释器搜索模块的路径列表中。在Python中,当你导入一个模块时,解释器会按照一定的顺序搜索模块所在的路径。sys.path是一个包含搜索路径的列表,sys.path.append()可以将指定的路径添加到这个列表的末尾,使得解释器能够搜索到该路径下的模块。

例如,如果你有一个自定义的模块,放在/path/to/my_module/目录下,你可以使用sys.path.append('/path/to/my_module/')将该路径添加到搜索路径中,然后就可以通过import my_module来导入该模块了。

os.path.join()是用于将多个路径组合成一个完整的路径。它接受多个路径作为参数,并根据当前操作系统的规则将它们连接起来。这个函数会自动处理不同操作系统的路径分隔符,确保生成的路径是正确的。

例如,假设你有两个路径'/path/to/directory/''file.txt',你可以使用os.path.join('/path/to/directory/', 'file.txt')来将它们连接起来,生成完整的路径'/path/to/directory/file.txt'

总结一下:

  • sys.path.append()用于将路径添加到Python解释器搜索模块的路径列表中,以便能够导入该路径下的模块。
  • os.path.join()用于将多个路径组合成一个完整的路径,确保生成的路径是正确的。

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

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

相关文章

基于springboot+vue网吧管理系统(程序+数据库+文档)

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅摘 要 随着信息技术和网络技术的…

STM32CubeMX教程19 I2C - MPU6050驱动

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

医院信息系统集成平台—后台运维管理系统

随着信息化建设的推进,为了让凝聚了巨大人力物力投入的信息基础设施发挥出其效益,保障整个信息系统的平稳可靠运行,需要有一个可从整体上对包括服务器、网络,存储,安全等组件在内的IT基础设施环境进行综合管理的平台,并能够提供业务系统运行异常的实时告警和进行图形化问…

【Leetcode 209】长度最小的子数组 —— 滑动窗口|双指针

209. 长度最小的子数组 给定一个含有n个正整数的数组和一个正整数target。 找出该数组中满足其总和大于等于target的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回0。 示例 1&#xff…

可狱可囚的爬虫系列课程 09:通过 API 接口抓取数据

前面已经讲解过 Requests 结合 BeautifulSoup4 库抓取数据,这种方式在抓取数据时还是比较方便快捷的,但是这并不意味着所有的网站都适合这种方式,并且这也不是抓取数据的最快方式,今天我们来讲一种更快速的获取数据的方式&#xf…

02 Deep learning algorithm

Neural Networks target: inference(prediction)training my own modelpractical advice for building machine learning systemdecision Tress application: speech(语音识别) ----> images(计算机视觉)—> t…

无心剑七绝《译园杏花村》

七绝译园杏花村 鼓诗捣译醉乾坤 字句推敲忘晓昏 技艺精微佳作舞 春秋共赏杏花村 2024年1月5日 平水韵十三元平韵 回首译诗路,转眼二十四载,译诗两三千首,感慨良多。一路走来,结识了不少译友诗朋,切磋的快乐&#x…

【揭秘】单例模式DCL导致无法访问对象?

前两天,在审查团队成员的代码时,我发现了一个错误的单例模式写法。 在Java中,单例模式是一种非常常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例,但是,如果不正…

vue项目报错RangeError: Maximum call stack size exceeded

我的代码–> <script> import groupSettings from ./groupSetting.vue export default {name: groupSettings,components: {groupSettings}, </script>答应我&#xff0c;你的子组件引入名称一定不能和name一样&#xff01;&#xff01;&#xff01;

运算放大器(六):I-V 转换

1、跨阻放大器 放大器类型是根据其输入-输出信号的类型定义。假设放大器增益 &#xff08;X&#xff1a;输入&#xff0c;Y&#xff1a;输出&#xff09;。在电学范畴&#xff0c;由于用电压或电流表征一个信号&#xff0c;当输入信号为电流&#xff0c;输出信号为电压时&#…

数字孪生在虚拟现实(VR)中的应用

数字孪生在虚拟现实&#xff08;VR&#xff09;中的应用为用户提供了更深入、沉浸式的体验&#xff0c;同时通过数字孪生技术模拟真实世界的物理实体。以下是数字孪生在VR中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

mariadb配置慢sql查询

Mariadb和Mysql配置相同 这里配置的事mariadb 修改配置文件 vi /etc/my.cnf.d/server.cnf[mysqld] slow_query_logon slow_query_log_file/data/mysql_data/slow_query_log.log long_query_time2slow_query_logon 开启慢sql查询slow_query_log_file/data/mysql_data/slow_que…

kubectl 源码分析

Cobra库 k8s各组件的cli部分都使用Cobra库实现&#xff0c;Cobra 中文文档 - 掘金 (juejin.cn)&#xff0c;获取方式如下&#xff1a; go get -u github.com/spf13/cobralatest cobra库中的Command结构体的字段&#xff0c;用于定义命令行工具的行为和选项。它们的作用如下&…

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷&#xff0c;各路开发大神可以说是各出绝招&#xff0c;我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用&#xff0c;在GitHub超过56K Star的开源项目&#xff1a;ChatGPT-Next-Web。 ChatGP…

一创聚宽停止服务,散户可以选择它!

第一创业和聚宽停止合作&#xff01;还有什么量化平台可选&#xff1f; 先了解背景&#xff1a; 从2023年9月25日起&#xff0c;一创聚宽的量化交易平台暂停开通交易权限&#xff0c;到2023年12月29日&#xff0c;一创聚宽量化交易平台将停止提供所有服务。这一消息对于之前使…

Python基础入门第七课笔记(自定义函数 define)

函数 函数必须先定义再调用 函数必须先定义再调用 函数必须先定义再调用 定义函数&#xff1a; def 函数名&#xff08;形参&#xff09;&#xff1a; 代码1 代码2 ………. 调用函数&#xff1a; 函数名&#xff08;实参&#xff09; 形参&…

Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!

响应与Rest风格 1.11.1.1 环境准备步骤1:设置返回页面步骤2:启动程序测试 1.1.2 返回文本数据步骤1:设置返回文本内容步骤2:启动程序测试 1.1.3 响应JSON数据响应POJO对象响应POJO集合对象 知识点1&#xff1a;ResponseBody 2&#xff0c;Rest风格2.1 REST简介2.2 RESTful入门案…

技术概述:ARMv8体系结构

John Goodacre, Director Program Management ARM Processor Division, November 2011 背景&#xff1a;ARM体系结构 从ARM精简指令集体系结构提出到现在已经有20多年了&#xff1b;ARMv7系列处理器是在ARMv4基础上设计的&#xff0c;随着ARMv7系列处理器大量应用&#xff0…

争做智驾“第一阵营”,锚定“全球前五”,小米汽车底气何在?

“官宣”造车超1000天后&#xff0c;低调行事的小米终于进行了首次“军火展示”。 2023年12月28日&#xff0c;小米集团&#xff08;HK:01810&#xff0c;下称“小米”&#xff09;在北京举办小米汽车技术发布会&#xff0c;公布了小米汽车核心技术及首款产品小米SU7。按照规划…

对话新七天创始人&CEO左英杰:品牌直播电商出圈“五步法”

整理 | 飞族 编辑 | 渔舟 出品&#xff5c;极新&#xff06;北京电子商务协会 AI、AIGC、VR等数智化新技术发展日新月异&#xff0c;在直播电商领域的应用和探索逐渐深入&#xff0c;从内容生成、创意优化、购物体验、智能客服、精准营销等方面提供全方位全链路的赋能&#…