torchvision.transforms.Compose():
torchvision是torch中处理计算机视觉的工具包,主要包含torchvision.transforms:图形变换如剪裁,旋转等;torchvision.datasets:加载数据集的接口 ;torchvision.models:提供ResNet, AlexNet, VGG等模型。
torchvision.transforms.Compose():将多种变换组合在一起:
-----
from torchvision.transforms import transforms
train_transforms = transforms.Compose([
transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸
transforms.RandomRotation(degrees=(-10, 10)), # 随机旋转,-10到10度之间随机选
transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转 选择一个概率概率
transforms.RandomVerticalFlip(p=0.5), # 随机垂直翻转
transforms.RandomPerspective(distortion_scale=0.6, p=1.0), # 随机视角
transforms.GaussianBlur(kernel_size=(5, 9), sigma=(0.1, 5)), # 随机选择的高斯模糊模糊图像
transforms.ToTensor(), # 将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间
transforms.Normalize( # 正则化处理-->转换为标准正太分布(高斯分布),使模型更容易收敛
mean=[0.485, 0.456, 0.406],
std = [0.229, 0.224, 0.225]) # 其中 mean=[0.485,0.456,0.406]与std=[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。
])
transforms.Normalize(mean,std)的计算公式是:
大家可以看到, 为什么在一些深度学习图像预处理的时候,都是使用mean=[0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225]呢?pytorch官网之前曾解释过(All pre-trained models expect input images normalized in the same way, i.e. mini-batches of 3-channel RGB images of shape (3 x H x W), where H and W are expected to be at least 224. The images have to be loaded in to a range of [0, 1] and then normalized using mean = [0.485, 0.456, 0.406] and std = [0.229, 0.224, 0.225]"),不过这段文字已经不在了:所有预训练模型都期望输入的图像已相同的方式进行归一化,所以采用mean = [0.485, 0.456, 0.406] ,std = [0.229, 0.224, 0.225],将图像转换为标准正太分布(高斯分布),使得模型更容易收敛。
在stackoverflow上的解释是ImageNet对输入图像处理都是采用上述mean和std,他们是基于上百万张图像计算而得到的。https://stackoverflow.com/questions/58151507/why-pytorch-officially-use-mean-0-485-0-456-0-406-and-std-0-229-0-224-0-2。
是否使用ImageNet的mean和std,取决于你的图像数据,如果是一些自然风光、人文、动植物等可以使用,若是一些医疗影像、宇宙天文、手写体之类就不太适合,或是经过对比度经过调整、颜色经过过滤、非正常光照等也不适合。
因为在我的数据集是三维建模图像如长方体,圆柱体的RGB图像且是使用ResNet18模型,根据pytorch官网:https://pytorch.org/vision/stable/models/generated/torchvision.models.quantization.resnet18.html#torchvision.models.quantization.resnet18
进行normalize的时候需要使用mean = [0.485, 0.456, 0.406] and std = [0.229, 0.224, 0.225]