在 PyTorch 的 `torchvision.transforms` 中,大多数变换都是设计为应用于 PIL 图像格式的。
from PIL import Image
import torchvision.transforms as transforms
# 打开一张图像(PIL格式)
image = Image.open("path_to_image.jpg")
# 创建一个变换的组合
transform = transforms.Compose([
transforms.ColorJitter(brightness=0.5, contrast=0.5),
transforms.RandomGrayscale(p=0.2),
transforms.RandomApply([GaussianBlur([0.1, 2.0])], p=0.5),
transforms.ToTensor()
])
# 应用变换
transformed_image = transform(image)
处理步骤:
- 读取图像:首先使用 PIL 或其他库读取图像,此时图像通常是 PIL 格式。
- 应用变换:接着应用一系列的
transforms
,如ColorJitter
、Resize
、RandomCrop
等。这些变换通常都是在 PIL 图像上进行的。 - 转换为 Tensor:最后,使用
transforms.ToTensor()
将 PIL 图像转换为 PyTorch 的 Tensor 格式,以便能够输入到神经网络中。
裁剪
transforms.CenterCrop
- 用途:从图像的中心裁剪出一个给定大小的正方形或矩形。
- 参数:接受一个整数(正方形裁剪)或一个
(height, width)
元组(矩形裁剪)。 - transforms.CenterCrop(size=(100, 100))
transforms.RandomCrop
- 用途:从图像中随机裁剪出一个给定大小的正方形或矩形。
- 参数:与
CenterCrop
相似,但裁剪的位置是随机的。 - transforms.RandomCrop(size=(100, 100))
transforms.RandomResizedCrop
- 用途:随机裁剪并调整图像大小。
- 参数:裁剪后的大小,以及可选的缩放比例和长宽比范围。
- transforms.RandomResizedCrop(size=100, scale=(0.8, 1.0), ratio=(0.75, 1.33))
transforms.ColorJitter
brightness
:亮度调整因子。如果是单个数字b
,则从[max(0, 1 - b), 1 + b]
中随机选择一个因子。如果是形如[b_min, b_max]
的元组,则从该范围内随机选择。contrast
:对比度调整因子,其设置方法与亮度类似。saturation
:饱和度调整因子,其设置方法与亮度类似。hue
:色调调整因子。这是一个取值在[-0.5, 0.5]
之间的数字,表示从原始色调中偏移的程度。
import torchvision.transforms as transforms
# 创建一个 ColorJitter 变换
transform = transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.05)
# 应用这个变换到 PIL 图像上
transformed_image = transform(image)
transforms.RandomGrayscale
以一定的概率将整张图像随机转换为灰度图像。这通常用于数据增强,帮助模型学习在不依赖于颜色信息的情况下进行预测,从而提高模型的泛化能力。
torchvision.transforms.RandomGrayscale(p=0.1)
p
:一个 [0, 1]
范围内的值,表示图像被转换为灰度的概率。默认值为 0.1
。
transforms.RandomErasing
以一定的概率随机选择图像中的一个矩形区域并将其像素值设置为随机值。这种数据增强技术有助于提高模型对遮挡物的鲁棒性,特别是在图像识别和分类任务中。
torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
p
:执行随机擦除操作的概率。scale
:擦除区域的比例范围相对于输入图像的面积。ratio
:擦除区域的宽高比范围。value
:擦除区域的像素值。可以是单个整数或浮点数(灰度值),也可以是一个长度为3的元组(颜色值)。默认值 0 表示黑色。inplace
:是否在原地修改图像。
transforms.RandomApply
`transforms.RandomApply` 是 PyTorch `torchvision.transforms` 模块中的一个函数,它用于以一定的概率随机应用一组预定义的转换(transforms)到图像上。这个函数允许在图像数据增强过程中引入更多的随机性,有助于提高模型对输入变化的鲁棒性。
torchvision.transforms.RandomApply(transforms, p=0.5)
- `transforms`:要随机应用的转换列表。
- `p`:应用这些转换的概率。
import torchvision.transforms as transforms
from PIL import Image
# 定义一组要随机应用的转换
random_transforms = [
transforms.ColorJitter(brightness=0.5),
transforms.RandomRotation(degrees=45)
]
# 创建 RandomApply 转换器,有 50% 的概率应用上述转换
random_apply_transform = transforms.RandomApply(random_transforms, p=0.5)
# 将 RandomApply 转换器包含到更广泛的预处理流程中
transform = transforms.Compose([
transforms.Resize((256, 256)),
random_apply_transform,
transforms.ToTensor()
])
# 加载图像
image = Image.open("path_to_image.jpg")
# 应用转换
transformed_image = transform(image)
在这个例子中,`random_transforms` 包含了两个转换:`ColorJitter` 和 `RandomRotation`。`RandomApply` 转换器会以 50% 的概率随机选择是否应用这些转换。如果应用,这两个转换都会按顺序应用于图像;如果不应用,图像将保持不变并继续通过转换流程。
GaussianBlur
对图像应用高斯模糊(Gaussian Blur)。高斯模糊是一种图像滤波技术,它通过使用高斯函数对图像进行平滑处理来减少图像噪声和细节。
radius
:高斯模糊的半径。半径越大,图像模糊得越严重。
class GaussianBlur:
"""
Gaussian blur augmentation in SimCLR https://arxiv.org/abs/2002.05709
Adapted from MoCo:
https://github.com/facebookresearch/moco/blob/master/moco/loader.py
Note that this implementation does not seem to be exactly the same as
described in SimCLR.
"""
def __init__(self, sigma=[0.1, 2.0]):
self.sigma = sigma
def __call__(self, x):
sigma = random.uniform(self.sigma[0], self.sigma[1])
x = x.filter(ImageFilter.GaussianBlur(radius=sigma))
return x