共计 2068 个字符,预计需要花费 6 分钟才能阅读完成。
背景:为什么需要 9 -mosaic
传统数据增强方法如旋转、翻转、色彩抖动等,虽然能增加数据多样性,但本质上仍是单图变换。当训练样本较少时,模型容易陷入局部最优。9-mosaic 通过将 9 张图片拼接成一张大图,实现了跨样本的特征混合,让模型在单次前向传播中就能学习更丰富的场景组合。

技术对比:从 4 -mosaic 到 CutMix
- 4-mosaic:经典 YOLOv4 方案,将 4 张图按 2×2 网格拼接,计算开销较小但多样性有限
- 9-mosaic:扩展为 3×3 网格,特征组合可能性指数级增长,尤其适合小目标检测
- CutMix:区域替换式增强,更适合分类任务,但对目标检测的 bbox 处理较复杂
性能对比矩阵:
| 方法 | 多样性 | 计算成本 | 目标检测适配性 |
|---|---|---|---|
| 单图增强 | ★★☆ | ★☆☆ | ★★★ |
| 4-mosaic | ★★★ | ★★☆ | ★★★ |
| 9-mosaic | ★★★★ | ★★☆ | ★★★★ |
| CutMix | ★★★☆ | ★★☆ | ★★☆ |
实现细节:数学原理与步骤拆解
- 图像选择策略 :
- 从数据集中随机抽取 9 张图片
-
确保至少包含 3 个不同类别(避免单一背景主导)
-
尺寸计算 :
输出图像尺寸 $S_{out} = 3 \times S_{base}$,其中 $S_{base}$ 是模型输入尺寸。每个子图实际分配区域为:
$$
S_{tile} = \left\lfloor \frac{S_{out} – 2\times padding}{3} \right\rfloor
$$ -
拼接逻辑 :
- 按 3×3 网格划分画布
- 对每张子图先进行随机缩放(0.5~1.5 倍)和长宽比扰动(0.8~1.2)
- 使用双线性插值调整到 $S_{tile}$ 尺寸
代码实现:PyTorch 完整示例
import albumentations as A
import cv2
import numpy as np
class Mosaic9:
def __init__(self, output_size=640):
self.output_size = output_size
self.tile_size = output_size // 3
# 子图增强管道
self.sub_aug = A.Compose([A.RandomResizedCrop(self.tile_size, self.tile_size, scale=(0.5, 1.5)),
A.HueSaturationValue(hue_shift_limit=10, sat_shift_limit=20, val_shift_limit=10),
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2),
], bbox_params=A.BboxParams(format='coco'))
def __call__(self, images, targets):
"""
images: 9 张输入图像的列表
targets: 对应的 9 组标注 (COCO 格式)
"""
canvas = np.zeros((self.output_size, self.output_size, 3), dtype=np.uint8)
new_targets = []
for i in range(3):
for j in range(3):
idx = i*3 + j
img = images[idx]
bboxes = targets[idx]
# 应用子图增强
augmented = self.sub_aug(image=img, bboxes=bboxes)
tile_img = augmented['image']
tile_boxes = augmented['bboxes']
# 计算粘贴位置
x1 = j * self.tile_size
y1 = i * self.tile_size
canvas[y1:y1+self.tile_size, x1:x1+self.tile_size] = tile_img
# 转换 bbox 坐标
for box in tile_boxes:
x, y, w, h = box
new_box = [x + x1, y + y1, w, h]
new_targets.append(new_box)
return canvas, new_targets
性能优化技巧
- 动态 batch 调整 :当启用 9 -mosaic 时,建议将 batch size 降至原来的 1 /4~1/3
- 混合精度训练 :使用 AMP 自动混合精度减少显存占用
- 标签过滤 :忽略面积小于 $S_{tile}/100$ 的 bbox 避免噪声
YOLOv5 实战案例
在 VisDrone 数据集上的测试表明:
- 使用 9 -mosaic 后,mAP@0.5 提升 4.2%
- 小目标检测召回率提升显著(+7.8%)
- 训练初期 loss 下降更快,说明模型更快捕捉到特征规律
避坑指南
- 验证集隔离 :
- 必须在数据加载阶段就分离验证集
-
绝对不能在验证集上应用 mosaic
-
边缘目标处理 :
- 对跨越 tile 边界的 bbox,建议拆分为两个独立标注
- 或直接舍弃面积损失超过 30% 的 bbox
思考与挑战
思考题 :当显存受限时,可以通过哪些手段平衡 mosaic 数量与计算开销?(提示:考虑分片加载策略)
挑战任务 :尝试在子图增强阶段加入更复杂的色彩扰动策略(如 CLAHE 或颜色迁移),并在评论区分享你的实验结果对比!
正文完
发表至: 未分类
近一天内
