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 打开结果