torchvision.transforms是最省事的PyTorch在线增强方案,需用Compose封装并在Dataset.__getitem__中应用;顺序为先ToTensor()再数值增强,几何变换可在前;不可在collate_fn中做随机增强。

用 torchvision.transforms 做在线增强最省事
PyTorch 的 torchvision.transforms 是目前最常用、最稳定的在线增强方案,它在 DataLoader 的每个 batch 加载时动态执行,不占用额外磁盘空间,也避免预生成导致的存储膨胀。
关键点是:所有增强操作必须封装进 transforms.Compose,并在 Dataset 的 __getitem__ 中应用——不是在训练循环里手动调用。
-
RandomHorizontalFlip、ColorJitter、RandomRotation等类默认只对PIL.Image或torch.Tensor(C×H×W)生效,输入张量必须是 float 类型且值域为 [0, 1],否则ColorJitter可能报ValueError: expected float tensor - 顺序很重要:通常先
ToTensor()(把 PIL 转成 C×H×W + float),再做数值型增强;若先做几何变换(如RandomRotation),则应在ToTensor()之前 - 不要在
__init__里做增强初始化以外的图像加载或变换,否则会卡住 dataloader 多进程
用 albumentations 替代 torchvision 做更细粒度控制
当需要像素级 mask 同步增强(比如语义分割)、或想用 CoarseDropout、GridDistortion 这类 torchvision 没有的操作时,albumentations 是更好选择。
它要求输入是 numpy array(H×W×C,uint8),且必须显式声明哪些 key 是图像、哪些是 mask,否则会跳过 mask 变换。
立即学习“Python免费学习笔记(深入)”;
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
- 必须用
A.Compose(..., bbox_params=..., keypoint_params=...)显式指定辅助数据类型,否则mask默认不参与变换 - 传入字典格式数据,例如
transform(image=img_array, mask=mask_array),返回仍是字典,需手动取['image']和['mask'] - 和 torchvision 不兼容:不能直接塞进
torchvision.datasets.ImageFolder,得自己写Dataset子类,并在__getitem__里调用 - CPU 上性能略低于 torchvision(因涉及更多 numpy 拷贝),但支持 GPU 加速的
albumentations-gpu目前仍不稳定,不建议生产环境启用
别在 DataLoader 的 collate_fn 里做增强
常见误区:以为把增强逻辑挪到 collate_fn 能“统一处理 batch”,结果发现增强失效或 shape 报错。
原因很直接:collate_fn 接收的是已拼好的 list of tensors,此时单张图的独立随机性已丢失——比如你希望每张图独立 RandomHorizontalFlip,但在 collate 后再 flip,就变成整个 batch 被统一 flip 一次。
-
collate_fn只该做 padding、stack、type 转换等 batch 维度操作,绝不该包含任何带随机性的图像变换 - 如果真需要 batch-level 增强(如 MixUp、CutMix),必须在模型 forward 前、loss 计算前做,且要确保 label 也同步调整,不能依赖 dataloader
- 使用
torch.cuda.amp.autocast时,若在collate_fn里调用 GPU 操作,会触发 “CUDA operation outside stream” 类错误
实时增强的性能瓶颈往往不在 CPU,而在 I/O 和解码
很多人调大 num_workers 后发现 GPU 利用率上不去,一查 nvidia-smi 发现 GPU 空闲等待,其实卡点在图像读取和 JPEG 解码。
尤其当数据集放在机械硬盘或 NFS 上,PIL.Image.open().convert('RGB') 这一步会成为明显瓶颈。
- 优先用
cv2.imread()替代PIL.Image.open(),快约 2–3 倍(注意颜色通道顺序是 BGR,需cv2.cvtColor(..., cv2.COLOR_BGR2RGB)) - 开启
pin_memory=True+non_blocking=True加速 host→GPU 传输,但前提是你的增强输出已经是torch.Tensor且在 GPU 上(一般不建议,增强放 GPU 容易 OOM) - 小图(如 224×224)可考虑预解码缓存到内存(用
lru_cache包装__getitem__),但仅限内存充足且图像总数可控(
torchvision 期望 [0, 1] float,albumentations 期望 [0, 255] uint8,混用时图像会全黑或溢出。调试时先打印 tensor.min(), tensor.max(), tensor.dtype,比猜快得多。

















