transforms主要是对图片进行变换处理,相比PIL Image和numpy.array的图片格式包含了反向传播的一些信息,便于进行神经网络的学习。
一些编程技巧:
1、在函数括号内点击ctrl+p可以显示函数所需参数
2、在红色报错位置点击alt+enter会出现解决方案
3、常见的图片类型和打开(生成)方式(传入变量为文件地址)
类型:PIL Image 打开方式:Image.open()
类型:numpy.array 打开方式:cv.imread()
类型:tensor 打开方式:ToTensor()
4、python类中内置的__call__(self, *para)函数可以让实例化的类对象直接调用参数:
class cat():
def __call__(self, name): # 内置函数即私有函数一般在函数名前加__
print('My cat name is ' + name)
def set_name(self, name):
print('My cat name is ' + name)
if __name__ == '__main__':
Mycat = cat()
# 使用内置__call__函数
Mycat('Diandian') # 直接在实例化的类后面跟上参数
# 使用共有函数
Mycat.set_name('Buding')
即:在实例化类时看__init__()函数,而在对实例化类直接接受参数时(不用class.fun())可看__call__()函数
5、有时候在让Pycharm联想函数和变量时,需要匹配大小写,此时若第一个字母是大写则无法联想小写的函数或变量。为了减轻记忆量,可以让Pycharm不匹配大小写,可在File->Settings->Editor->General->Code completion中进行设置,把Match case勾选掉。
以下为Transform常用功能的用法代码,包括ToTensor, Normalize, Resize,Compose,和RandomCrop
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
file_path = 'hymenoptera_data/train/ants/0013035.jpg'
img = Image.open(file_path) # img为PIL Image类型的图片
# transforms的使用
# 功能一:以tensor的方式打开图片,用到的函数是ToTensor()
tensor_trans = transforms.ToTensor() # 这里ToTensor是一个类,这里创建实例化一个类对象tensor_trans
img_tensor = tensor_trans(img) # tensor_trans接收一个图片,可以是PIL Image类型也可以是numpy.array类型
writer = SummaryWriter('logs')
writer.add_image('image', img_tensor) # 这里dataformats为默认即可
# 功能二: 对tensor类型图片进行正则化,用到的函数是Normalize()
tensor_normalize = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 例如图片为3通道,因此均值方差以3元素数组传入
img_norm = tensor_normalize(img_tensor) # 传入tensor打开的图片类型
writer.add_image('norm_image', img_norm)
# 功能三: 对PIL类型图片进行尺寸调整,用到的函数为Resize
tensor_Resize = transforms.Resize((512, 512)) # 接收2参数元祖为设置(H,W),单参数为整体缩放
img_PIL_Resize = tensor_Resize(img)
img_tensor_Resize = tensor_trans(img_PIL_Resize) # 将PIL转换为tensor类型
writer.add_image('Resize_image', img_tensor_Resize)
# 功能四: 用compose对多个实例化操作进行组合拳实现功能三,用到的函数为compose
tensor_compose = transforms.Compose([tensor_Resize, tensor_trans]) # 多个实例化transform以列表传递
img_tensor_compose = tensor_compose(img)
writer.add_image('Compose_image', img_tensor_compose)
# 功能五: 对图片进行随机裁剪,用到的函数为RandomCrop
tensor_RandomCrop = transforms.RandomCrop((100, 100)) # 每次裁剪100*100(H*W)范围的
tensor_compose_2 = transforms.Compose([tensor_RandomCrop, tensor_trans]) # 多个实例化transform以列表传递
for i in range(10): # 随机裁剪10次
img_tensor_compose_2 = tensor_compose_2(img)
writer.add_image('RandomCrop_Compose_image', img_tensor_compose_2, i)
writer.close() # 使用完后记得关闭 在命令行用tensorboard --logdir logs 打开结果