PyTorch 本身不提供独立的“图像增强库”,但其核心库 `torchvision` 内置了强大且高效的图像增强功能

PyTorch 本身不提供独立的“图像增强库”,但其核心库 `torchvision` 内置了强大且高效的图像增强功能 PyTorch 本身不提供独立的“图像增强库”但其核心库torchvision内置了强大且高效的图像增强功能主要通过torchvision.transforms模块实现。该模块支持链式、可组合的预处理操作适用于训练时的数据增强如随机裁剪、翻转、颜色抖动等和验证/测试时的标准化处理。常用增强变换示例基于torchvision.transforms.Composefromtorchvisionimporttransforms train_transformtransforms.Compose([transforms.Resize((256,256)),transforms.RandomHorizontalFlip(p0.5),transforms.RandomRotation(degrees15),transforms.ColorJitter(brightness0.2,contrast0.2,saturation0.2,hue0.1),transforms.ToTensor(),# 转为 [C, H, W] 张量并归一化到 [0,1]transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])# ImageNet 标准化])val_transformtransforms.Compose([transforms.Resize((256,256)),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])])此外社区还提供了更高级/自动化的增强库常与 PyTorch 配合使用Albumentations专为图像含 bbox/segmentation mask设计支持像素级几何变换性能优异需配合to_tensor()或自定义适配器用于 PyTorch。Kornia基于 PyTorch 张量的可微分图像增强库支持 GPU 加速与梯度传播适合对抗训练、自监督学习等场景。Timmtimm.data提供预设的训练/验证增强策略如create_transform适配多种模型架构。注意transforms中多数操作默认作用于 PIL Image 或 NumPy arrayAlbumentations默认输入为 NumPy (HWC)需转换Kornia全程基于torch.TensorCHW, float32, [0,1] 或 [0,255]。在 PyTorch 中对带语义分割掩码segmentation mask的图像同步增强关键在于图像和掩码必须使用完全相同的几何变换参数如旋转角度、裁剪坐标、翻转方向等否则像素级标签将与图像错位导致训练失效。以下是几种主流、可靠的方法✅ 方法一使用Albumentations推荐 —— 简洁、健壮、支持多目标Albumentations 原生支持同步增强图像 mask以及 bbox/keypoints且自动保持几何一致性。importalbumentationsasAfromalbumentations.pytorchimportToTensorV2importnumpyasnp# 定义同步增强mask 会自动应用相同几何变换transformA.Compose([A.Resize(256,256),A.HorizontalFlip(p0.5),A.RandomCrop(224,224),A.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225]),ToTensorV2(),# 自动将 image→C×H×W tensor, mask→H×W long tensor不归一化])# 应用image: H×W×3 uint8, mask: H×W uint8值为类别索引augmentedtransform(imageimage_np,maskmask_np)# 注意键名必须是 image 和 masktensor_imgaugmented[image]# torch.float32, [3, H, W]tensor_maskaugmented[mask]# torch.long, [H, W]类别值保持原样如 0,1,2...⚠️ 注意mask必须是uint8或int32类型的 NumPy 数组且值为离散类别标签非 one-hotToTensorV2默认不归一化 mask适合 CrossEntropyLoss。✅ 方法二使用torchvision.transforms 自定义RandomApply同参变换需手动控制随机种子torchvision本身不直接支持 mask 同步但可通过固定随机种子或共享参数实现确定性同步importtorchimporttorchvision.transformsasTfromtorchvision.transforms.functionalimportrotate,hflip,vflip,crop,resizedefsync_transform(image,mask,seedNone):ifseedisnotNone:torch.manual_seed(seed)# 共享随机种子# 随机水平翻转图像 掩码同时iftorch.rand(1)0.5:imagehflip(image)maskhflip(mask)# 随机旋转需统一角度angletorch.empty(1).uniform_(-15,15).item()imagerotate(image,angle,interpolationT.InterpolationMode.BILINEAR)maskrotate(mask,angle,interpolationT.InterpolationMode.NEAREST)# 分类掩码用 nearestreturnimage,mask# 使用示例PIL Image 或 Tensor 输入# image: PIL.Image or torch.Tensor [C,H,W], mask: PIL.Image or torch.Tensor [H,W]image_t,mask_tsync_transform(image,mask,seedtorch.randint(0,10000,(1,)).item())✅ 优势纯 torchvision无缝集成 DataLoader❗注意interpolation对 mask 必须用NEAREST避免插值产生非整数类别几何变换需显式复用参数如 angle、crop box。✅ 方法三使用KorniaGPU 加速 可微分 天然同步Kornia 所有几何变换均以张量参数化天然支持 batched 图像mask 同步增强且可 GPU 加速/求导importkorniaimporttorch# image: [B,3,H,W] float32 [0,1], mask: [B,1,H,W] long or float32类别索引# 注意kornia 几何变换默认作用于 [B,C,H,W]mask 需保持通道维度[B,1,H,W]img_tensortorch.randn(2,3,256,256)mask_tensortorch.randint(0,4,(2,1,256,256))# 4类分割# 随机水平翻转同步fliplrkornia.geometry.transform.RandomHorizontalFlip(p0.5)img_augfliplr(img_tensor)mask_augfliplr(mask_tensor)# 自动同步且 mask 插值用 nearest内部处理# 随机旋转需指定 same_on_batchTrue 保证 batch 内一致rotkornia.geometry.transform.RandomRotation(degrees15,same_on_batchTrue)img_augrot(img_tensor)mask_augrot(mask_tensor)# kornia 1.0 自动对 long mask 使用 nearest 插值✅ 优势端到端张量操作、支持 CUDA、可嵌入模型训练流程如对抗正则化⚠️ 注意mask 需为[B,1,H,W]形状dtype 推荐torch.longkornia 会自动适配 nearest 插值。 不推荐做法对 image 和 mask分别独立调用transforms.RandomXXX→ 参数不同必然错位将 mask 当作“第三通道”拼接后一起变换 → 插值污染类别标签尤其旋转/缩放时。✅ 最佳实践建议快速原型/学术实验→ 用Albumentations最省心、生态成熟生产部署/需 GPU 加速/可微分需求→ 用Kornia严格限制依赖仅 torchvision→ 手动 seed 共享参数方法二并封装为torch.utils.data.Dataset的__getitem__内部逻辑。