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()
文章来源地址https://uudwc.com/A/9d1AB
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的结果:
文章来源:https://uudwc.com/A/9d1AB