编程基础很弱,需要机器学习,学习记录,按自己理解写的,希望以后能学懂吧,要是有大神看到还请赐教。
常见的Transforms(一)
使用transforms.py内定义的那些类
关注三个点:1.输入 2.输出 3.作用
# 输入、输出涉及图片格式,比较容易错。
Image.open()处理的格式,PIL
ToTensor()处理的格式,tensor
cv.imread()处理的格式,narrays
基础语法:
__call__
class Person:
def __call__(self, name):
print("__call__" + "Hello" + name)
def hello(self, name):
print("hello" + name)
# 新建一个对象
person = Person()
# 两种方式调用
person("ZhangSan") # __call__方式建立的直接对象加括号调用
# 弹幕有种解释:__call__可以让对象当函数用
person.hello("Lisi")
ToTensor的使用
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
# 路径PIL读取
img_path = "D:\\Scientific_Research\\Pycharmproject\\Biji\\20230822144416.jpg"
img = Image.open(img_path)
# trans_totensor代表transforms里的ToTensor
# 由于帮助文档里ToTensor有__call__,可以直接输入?????????????????????
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img) # 将img变为tensor格式
# 将图片写入tensorboard
writer.add_image("小土堆P12、13",img_tensor,1)
#关闭
writer.close()
# 运行完在Terminal里边查看Tensorboard
Normalize的使用 :
将对应信道的Tensor图片归一化处理
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img_path = "D:\\Scientific_Research\\Pycharmproject\\Biji\\20230822144416.jpg"
img = Image.open(img_path)
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
# Normalize
print(img_tensor[0][0][0])#查看归一化之前元素
#__init__初始化???归一化处理
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])#查看归一化后元素
# 写入tensorboard看看啥样
writer.add_image("归一化",img_norm,2)
不常用的:
ToPILImage
常见的Transforms(二)
Resize的使用:
将输入的PIL图片resize为给定尺寸。
如果给定序列(sequen)例如(h,w)就是将图片resize成这个;
如果给定一个int,图片最小边会匹配这个int。(类似于等比缩放)
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img_path = "D:\\Scientific_Research\\Pycharmproject\\Biji\\20230822144416.jpg"
img = Image.open(img_path)
# Resize
print(img.size)
trans_resize = transforms.Resize((512,512))
img_resize = trans_resize(img)#此处帮助文档里并没有__call__也输入img,之前理解有问题。
print(img_resize.size)
Compose()的使用:
其中需要参数为列表,这个列表中包含transform的类型。如下列代码所示,Comepose内列表为transforms内的对象(描述可能不对,稍微想象一下)。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img_path = "D:\\Scientific_Research\\Pycharmproject\\Biji\\20230822144416.jpg"
img = Image.open(img_path)
# Compose Resize 2
# 输入PIL->改变大小->输出Tensor。
trans_resize_2 = transforms.Resize(512)
trans_totensor = transforms.ToTensor()
trans_compose = transforms.Compose([trans_resize_2,trans_totensor])# 注意列表内前后元素的数据类型需要对应
img_resize_2= trans_compose(img)
RandomCrop()的使用:
随即裁剪,输入size,若为sequence,裁剪为对应宽高;若为int,裁剪为对应正方形。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img_path = "D:\\Scientific_Research\\Pycharmproject\\Biji\\20230822144416.jpg"
img = Image.open(img_path)
# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
# RandomCrop
trans_random = transforms.RandomCrop(512)
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
# for循环随机裁剪10次输入tensorboard
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image("RamdCrop",img_crop,i)
使用方法总结:
1.使用transforms内的方式方法,需要关注他们的输入输出类型。
2.多看帮助文档。
3.关注方法需要什么参数。比如__init__。
4.一般输入类型给你说,但要是不知道输出类型,可以试出来。(print,print(type),debug等)