Data Augmentation
数据增强会让模型使用经过随机变换的现有图像副本进行训练,例如翻转、裁剪和颜色偏移,从而提升泛化能力。
数据增强通过对现有样本应用随机变换,例如翻转、裁剪、缩放、颜色偏移和图像混合,从而增加训练数据集的多样性。每个变换后的副本都会保留原始标签,因此模型能够学会:物体在视角、光照和位置变化后仍是同一个物体。收集并标注新图像既慢又昂贵,因此数据增强是防止过拟合成本最低的方法,几乎所有现代计算机视觉模型都会在训练时使用它。
数据增强的工作原理#
大多数训练流水线都会在线进行增强:数据加载器在构建批次时变换每张图像,并在每次处理时重新随机生成参数,因此每个训练轮次看到的图像版本都不同。离线增强则是在训练前将固定数量的变换副本写入磁盘,这会增加存储需求,也会让模型接触到的不同变体少得多。
有两条规则可以避免增强破坏数据。第一,标签必须随像素一起变化:在目标检测、实例分割和姿态估计中,几何变换必须更新每个边界框、掩码和关键点,水平翻转还必须交换左右关键点。第二,变换必须是现实世界中可能发生的变化:航拍图像和显微镜图像适合垂直翻转,而街景图像垂直翻转后会出现推理时不可能遇到的倒置汽车。Torchvision 的变换会在同时传入边界框和图像时自动遵循第一条规则:
from urllib.request import urlopen
from PIL import Image
from torchvision import tv_tensors
from torchvision.transforms import v2
image = Image.open(urlopen("https://ultralytics.com/images/bus.jpg")) # 810 x 1080 pixels
boxes = tv_tensors.BoundingBoxes([[50, 400, 250, 900]], format="XYXY", canvas_size=(1080, 810))
# Flip every time (p=1.0) and shift colors; the box must move with the pixels
augment = v2.Compose([v2.RandomHorizontalFlip(p=1.0), v2.ColorJitter(brightness=0.4, saturation=0.7)])
new_image, new_boxes = augment(image, boxes)
print(f"Original box: {boxes.tolist()}")
print(f"Flipped box: {new_boxes.tolist()}")图像左侧人物周围的边界框会从 [50, 400, 250, 900] 移动到 [560, 400, 760, 900],并沿 810 像素的宽度镜像翻转;颜色抖动则会改变像素,但不会影响边界框。
常见技术#
- 几何变换:翻转、旋转、缩放、平移、裁剪、错切和透视变形,用于模拟不同的相机位置和物体大小。
- 光度变换:调整亮度、对比度、饱和度和色调,以及模糊和噪声,用于模拟不同的光照、传感器和图像质量。
- 遮挡:随机擦除和 cutout 会清空矩形区域,使模型不能依赖物体的某个单一部分。
- 图像混合:MixUp会混合两张图像及其标签,CutMix会将一张图像的图块粘贴到另一张图像上;马赛克会将四张图像拼成一个训练样本,而复制粘贴则会把分割出的物体放到新的背景上。
- 自动化策略:RandAugment会应用一系列随机变换,只需两个参数来控制:变换数量和变换强度。这样就省去了早期学习式策略所需的高成本搜索。
目标检测的数据增强流水线#
检测流水线会串联多个变换,每个变换都有各自的应用概率,因此每张训练图像都会随机组合出不同的变换。
Ultralytics YOLO训练默认运行这套流水线:对每张图像执行马赛克增强(mosaic=1.0),以 50% 的概率进行水平翻转(fliplr=0.5),最多进行 ±50% 的缩放,并调整 HSV 颜色;最后 10 个训练轮次会关闭马赛克(close_mosaic=10),让模型最终使用完整且自然的图像进行训练。
from ultralytics import YOLO
# 加载预训练的 YOLO26n 模型
model = YOLO("yolo26n.pt")
# fliplr:水平翻转概率;scale:缩放范围 (+/- 70%);degrees:旋转范围 (+/- 5)
results = model.train(data="coco8.yaml", epochs=10, fliplr=0.5, scale=0.7, degrees=5.0)在本次运行期间,YOLO26训练器会将前三个增强批次保存为 train_batch0.jpg、train_batch1.jpg 和 train_batch2.jpg,并绘制边界框,以便在投入长时间训练前检查每项设置的效果。










