使用Albumentations进行数据增强时是否会改变数据集的图像数量?
数据增强的两类核心使用场景
你最初对数据增强的理解是正确的,但这只是数据增强的其中一种实现方式,你在Albumentations案例中看到的是另一种更主流的训练时用法,两者的差异如下:
- 离线数据增强(静态扩容模式)
就是你最开始了解的逻辑:提前对原始数据集的所有样本跑一遍增强流程,将生成的新样本和原始样本合并,直接扩大数据集的物理总规模。这种模式适合样本量极小的场景,提前处理完成后训练时直接读取即可,不需要额外占用训练时的计算资源。 - 在线数据增强(动态变换模式)
就是你在Albumentations案例中看到的用法:不会修改原始数据集,也不会新增存储的样本。它的逻辑是每一轮训练(epoch)读取原始样本时,实时按设置的概率对当前样本做随机变换,变换后的样本仅用于当前批次的训练,不会写入原始数据集。
这种模式的核心价值不是扩容数据集的物理大小,而是让模型每一轮训练看到的样本都存在随机差异,变相提升了训练样本的多样性,有效避免模型过拟合到原始样本的固定属性(比如固定拍摄角度、固定亮度),同时不会增加存储成本,训练时的额外计算开销对当前的GPU设备来说基本可以忽略。
Albumentations本身的设计就是优先适配在线增强的主流场景,所以默认调用后只会返回变换后的单张图像,不会保留原始样本。如果你需要实现离线扩容的效果,自己加一层循环逻辑即可,参考示例代码如下:
import albumentations as A import cv2 # 定义增强管线 transform_pipeline = A.Compose([ A.RandomRotate90(p=0.7), A.RandomResizedCrop(height=224, width=224, scale=(0.8, 1.0), p=0.6), A.HorizontalFlip(p=0.5), A.ColorJitter(p=0.3) ]) # 离线增强示例:单张原图生成4张增强样本,加上原图共5张,实现5倍扩容 original_img = cv2.imread("sample.jpg") original_img = cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB) # 保存原始图 cv2.imwrite("aug_dataset/original.jpg", cv2.cvtColor(original_img, cv2.COLOR_RGB2BGR)) # 生成增强样本 for idx in range(4): aug_result = transform_pipeline(image=original_img) aug_img = aug_result["image"] cv2.imwrite(f"aug_dataset/aug_{idx}.jpg", cv2.cvtColor(aug_img, cv2.COLOR_RGB2BGR))
两种用法都属于标准的数据增强实现,只是适用场景不同,你之前的认知没有问题,只是接触到的案例用的是现在更常用的在线增强模式而已。
内容的提问来源于stack exchange,提问作者Petr_ov__
相关产品推荐
相关产品推荐

