torchvision中的transforms

发布时间 2023-08-10 21:27:00作者: ydky

torchvision是图像处理库,计算机视觉工具包。

在pycharm中使用镜像下载包时在命令行输入(以cv2为例):

#使用国内镜像下载
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

transforms 集成了随机翻转、旋转、增强对比度、转化为tensor、转化为图像等功能,用于数据增强。(transforms更多的指的是transforms.py文件,其中包含很多类)

1.Transforms的使用

NumPy是一个功能强大的Python库,主要用于对多维数组执行计算,它极大地简化了向量和矩阵的操作处理。

Tensor,即“张量”。实际上跟numpy数组、向量、矩阵的格式基本一样。但是是专门针对GPU来设计的,可以运行在GPU上来加快计算效率。

在PyTorch中,张量Tensor是最基础的运算单位,与NumPy中的NDArray类似,张量表示的是一个多维矩阵。不同的是,PyTorch中的Tensor可以运行在GPU上,而NumPy的NDArray只能运行在CPU上。由于Tensor能在GPU上运行,因此大大加快了运算速度。

在使用 transforms.ToTensor() 进行图片数据转换过程中会对图像的像素值进行正则化,即一般读取的图片像素值都是8 bit 的二进制,那么它的十进制的范围为 [0, 255],而正则化会对每个像素值除以255,也就是把像素值正则化成 [0.0, 1.0]的范围。

利用ToTensor()实现图像类型转换:

 

import cv2
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

# 绝对路径 C:\MyApp\Pycharm\pyproject\dataset\train\ants\0013035.jpg
# 相对路径 dataset/train/ants/0013035.jpg
img_path = "dataset/train/ants/0013035.jpg"
img = Image.open(img_path)#得到的是PIL Image类型
cv_img = cv2.imread(img_path)#得到的是ndarray类型

writer = SummaryWriter("logs")

# transforms在python中的使用
#将PIL Image或numpy.ndarray类型转换为tensor类型
tensor_trans = transforms.ToTensor()#实例化ToTensor类
tensor_img = tensor_trans(img)

writer.add_image("Tensor_img", tensor_img)

writer.close()

 

 

2.常见的Transforms类

关注点:

输入类型(PIL-Image.open() tensor-ToTensor() narrays-cv.imread() ),输出类型,类的作用,参数个数和类型,(当不知道变量类型时可以通过print()或print(type())或设置断点进行debug来了解其返回类型,多看官方文档)

 

python中内置函数__call__的用法:在实例化对象后直接加上()使用方法,不需要用点来调用方法。

class Person:
   def __call__(self, name):
       print("__call__ "+"Hello "+name)

   def hello(self, name):
       print("hello "+name)

person = Person()
person("hahaha")
person.hello("wuhu")

2.1.ToTensor()的使用

将PIL Image或numpy.ndarray类型转换为tensor类型

2.2.Normalize()的使用

将tensor图像进行归一化,得到的仍是tensor类型

Normalize归一化的计算:output[channel] = (input[channel] - mean[channel]) / std[channel]

2.3.Resize()的使用

将PIL Image对象的尺寸调整为指定大小,类型不变

2.4.Compose()的使用

串联多个图片变换的操作。Compose()中的参数需要是一个列表,Python中列表的表示形式为[数据1,数据2,...],在Compose中数据需要是transforms类型,所以得到Compose([transforms参数1,transforms参数1,...])

2.5.RandomCrop的使用

实现对PIL Image图片随机裁剪,裁剪的尺寸根据给定的参数进行,如果给定的是1个参数,则裁剪成正方形,如果是两个参数(一个序列),则裁剪成两个参数指定的长和宽。

代码如下:

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

writer = SummaryWriter("logs")
img = Image.open("dataset/train/ants/0013035.jpg")
print(img)

# ToTensor的使用
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)

# Normalize的使用:归一化Tensor图像
# 三通道需要三个均值和标准差
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([0.1, 0.2, 0.3], [0.3, 0.2, 0.1])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm, 2)

# Resize的使用
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_reisze -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)
print((img_resize))

# Compose -resize -2 等比缩放
trans_resize_2 = transforms.Resize(52)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

# RandomCrop
trans_random = transforms.RandomCrop(512)
# trans_random = transforms.RandomCrop((100, 200))
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
   img_crop = trans_compose_2(img)
   writer.add_image("RandomCrop", img_crop, i)
# for i in range(10):
#     img_crop = trans_compose_2(img)
#     writer.add_image("RandomCropHW", img_crop, i)

writer.close()

 

归一化的图像结果:

Resize结果:

RandomCrop的结果: