图像预处理——transforms

news2025/4/17 8:54:50

一、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 os

BASE_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 plt

path_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_invert

set_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 transforms

norm_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 rotation
    transforms.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.coloradmin.cn/o/1356188.html

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

相关文章

【生成人工智能】Ray如何解决生成人工智能基础设施的常见生产挑战

这是我们生成人工智能博客系列的第一部分。在这篇文章中,我们讨论了如何使用Ray来生产常见的生成模型工作负载。即将发布的一篇博客将深入探讨Alpa等项目为什么要使用Ray来扩展大型模型。 生成的图像和语言模型有望改变企业的设计、支持、开发等方式。本博客重点关…

Spring——Spring IOC(2)

1.Spring中的工厂类 1.1 ApplicationContext ApplicationContext的实现类,如下图: ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件 1.2 B…

基于Segformer实现PCB缺陷检测(步骤 + 代码)

导 读 本文主要介绍基于Segformer实现PCB缺陷检测 ,并给出步骤和代码。 背景介绍 PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性,还可以大大减少检测时间。传统方法涉及手动检查,无法扩展且容易出错…

体元法--体积计算

文章目录 环境:1.1 体元法介绍:2.1 python代码3.1 可视化 环境: Open3D 1.1 体元法介绍: 用一个个体素去占据点云,然后对所有体素求和 2.1 python代码 conda activete deeplabv3plus(环境名称–安装好open3D的) py…

python django 生鲜商城管理系统

python django 生鲜商城管理系统,包含用户端和管理端 功能: 用户端:商城主页展示,登录,注册,用户中心,购物车,我的订单,购物车结算 管理端:登录,商品&…

QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件

QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件 文章目录 QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件1、QT的坐标系统?2、对象模型…

顶帽运算在OpenCv中的应用

项目背景 假如我们拍了一张自拍,想为自己的照片添加一个酷炫的火星飞舞的效果,素材库中正好有一张火焰的照片,如果想去除图中的火焰,只保留火星效果,可以使用顶帽子算法 图片中的火星部分正好属于比周围亮一些的斑块…

知虾皮Shopee:东南亚最受欢迎的电子商务平台

在如今数字化时代,电子商务平台成为人们购物的首选方式。Shopee作为东南亚地区最受欢迎的电子商务平台,通过其多样化的商品、便捷的购物体验和创新的商业模式,迅速在该地区占据了重要地位。本文将详细介绍Shopee的特点和优势,以及…

《作家天地》期刊投稿邮箱投稿方式

《作家天地》是国家新闻出版总署批准的正规文学刊物。对各种流派的作品兼收并蓄,力求题材、形式、风格多样化,适用于发表高品质文学学术作品,科研机构的专家学者以及高等院校的师生等。具有原创性的学术理论、工作实践、科研成果和科研课题及…

spug发布问题汇总记录

问题导览 1. [vite]: Rollup failed to resolve import "element-plus" from "src/main.js". 项目框架简介 vue3viteelement-plus 解决方案 - 1. 配置淘宝镜像源:npm config set registry https://registry.npm.taobao.org/ - 2. npm inst…

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像 2024/1/4 13:23 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab Android1…

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…

Ubuntu 22.04/20.04 安装 SSH

OpenSSH 是安全远程通信的重要工具,提供了一种安全的方式来访问和管理服务器。对于那些计划在 Ubuntu 22.04 Jammy Jellyfish 或其较旧的稳定版本的 Ubuntu 20.04 Focal Fossa 上安装 SSH 并启用它的人来说,了解其功能和优势至关重要。 OpenSSH的主要特…

技术阅读周刊第十二期

年前最后一篇推送,提前祝大家新年快乐。 技术阅读周刊,每周更新。 历史更新 20231201:第八期20231215:第十期20231122:第十一期 Deno vs Go: Native hello world performance | Tech Tonic URL: https://medium.com/de…

TSINGSEE青犀智能分析网关V4视频智能分析在智慧幼儿园中的应用

一、背景需求 在科技浪潮的推动下,智慧化监管已然成为幼儿园管理发展的必然趋势。通过引入尖端技术手段,智慧幼儿园监管解决方案不仅显著提升了管理效率,更为孩子们的安全与健康筑起一道坚实的屏障。为了全方位守护幼儿的平安,幼…

java设计模式学习之【策略模式】

文章目录 引言策略模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用计算示例代码地址 引言 设想你正在玩一个策略游戏,每一个决策都会导致不同的游戏结局。同样地,在软件开发中,我们常常需要根据不同的场景或条件选择不同…

【c++————————构造函数和析构函数】

【c————————构造函数和析构函数】 欢迎阅读新一期的c模块————构造函数和析构函数 ✒️个人主页:-Joker- 🏷️专栏:C 📜代码仓库:c_code 🌹🌹欢迎大佬们的阅读和三连关注&#xff0c…

如何配置Zabbix告警邮件通知并基于GPT提供解决方案?

一、概述 时间来到2023年末,距离Open AI发布GPT-3.5,首次向公众推出ChatGPT已经整整过去了一年。如今,以ChatGPT为代表的人工智能模型已然被应用众多领域,当然也包括IT运维。在IT运维中,通过对接运维监控平台&#xff…

人生重开模拟器

前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…

【JAVA】深入了解 Java 中的 DelayQueue

🍎个人博客:个人主页 🏆个人专栏: JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 Java中的DelayQueue是一个强大的工具,常用于处理需要延迟执行的任务或具有过期时间的元素。通过实现Delayed接口&#x…