首页 / 资讯中心 / 文章详情

多图融合数据增强:MixUp、CutMix与Mosaic原理及YOLOv4选用解析

多图融合数据增强:MixUp、CutMix与Mosaic原理及YOLOv4选用解析 ★ FEATURED ARTICLE
MixUp、CutMix和Mosaic这几种数据增强方法到底是怎么把多张图揉在一起的它们各自解决什么问题YOLOv4最终为什么选择了Mosaic作为默认配置而不是另外两个这篇文章把这三个Trick的原理、实现细节和我在实际训练中踩过的坑一次性讲清楚。如果你正在用YOLO系列做目标检测或者准备自己写数据增强代码这篇应该能帮你省下不少调试时间。现在训练目标检测模型早就不是简单地把图片喂进去就完事。你会发现同样的模型结构别人跑出来mAP就是比你高两三个点除了调参、换backbone很多时候差距就藏在数据增强这些细节里。YOLOv4论文里提到的Bag of Freebies就是用更少的训练成本换取更高精度的那批技巧而多图融合的数据增强就是其中最典型的一类。1. 多图融合数据增强的核心设计思路1.1 为什么单图增强不够用了先看传统做法。早期的数据增强基本都在单张图片上做文章比如随机裁剪、翻转、色彩抖动、缩放等等。这些操作都是在不改变图片内容结构的前提下增加样本的多样性让模型见过更多“角度”的同一个物体。但单图增强有个绕不开的天花板它本质上只是在“同一张图”的附近采样模型看到的新样本和原始样本在分布上是非常接近的。比如你把一张猫的图片做水平翻转模型学到的是“猫的左右朝向”而不是“这张图里应该出现一只猫”。当目标检测任务里小目标多、遮挡严重、背景复杂的时候单图增强提供的多样性就远远不够了。多图融合的思路很直接既然一张图的多样性有限那我直接把多张图合成一张让模型在训练时被迫去处理更复杂、更接近真实世界的输入分布。一张图里有多个来源、多个场景、多个尺度的物体混合在一起模型不得不学会在各种混乱背景下把目标分离出来这比单纯看单图要难得多但也有效得多。注意多图融合不是简单的“拼图”而是要在像素层面、标签层面同步做融合否则就可能在训练时带来标签错位的问题。1.2 三种融合方式的共性逻辑MixUp、CutMix、Mosaic看着各不相同但它们共享一个核心思想打破单图样本的边界让模型在混合后的数据上学习。具体到目标检测任务融合要解决三个关键问题图片像素层面怎么混合直接决定了生成样本的视觉效果。混得太“假”模型学到的特征没有迁移价值混得太简单又起不到增强作用。标签信息bounding box集合如何跟着图片一起融合这决定了训练时loss计算是否有意义。融合后图片中目标尺度的变化直接影响了模型对多尺度目标的适应能力。这三个问题的不同解法正是MixUp、CutMix和Mosaic三个方案走上不同技术路线的根本原因。2. MixUp、CutMix、Mosaic分别是怎么做的2.1 MixUp全图加权叠加MixUp最早来自图像分类领域核心操作是把两张图按照一定比例做像素级的加权叠加mixed_img lambda * img1 (1 - lambda) * img2 mixed_label lambda * label1 (1 - lambda) * label2这里的lambda是一个从Beta分布中采样得到的系数通常在0到1之间。在目标检测中应用MixUp时两个图的标签也要按同样的比例混合。这意味着同一张训练图片里物体的类别标签不再是非0即1而是变成了软标签。比如图中某个物体的类别置信度被分配到了两个类别上模型在这个阶段学到的是“类别之间的相似性”而不是“绝对类别”。但MixUp在检测任务中的问题也很明显两张图加权叠加之后图片的纹理变得很“糊”很多细节特征会被破坏。对于分类网络来说可能问题不大因为分类任务只需要捕捉全局特征但对于检测任务来说物体边缘模糊以后bounding box的回归就变得很不稳定。我在实际测试过直接用MixUp做检测训练mAP往往会掉尤其是对小目标影响很明显。2.2 CutMix区域剪切拼贴CutMix的做法比MixUp“暴力”很多。它不再做全图的加权叠加而是从一张图中裁剪出一个矩形区域粘贴到另一张图上标签也只在受影响区域做替换。关键点有两个裁剪区域的位置和大小是随机的通常用一个参数控制区域占比粘贴时直接像素替换不做透明度调整。相比MixUpCutMix保留了大部分原始图像的完整性模型依然能看到清晰的纹理和边缘因此更利于检测和定位任务。但CutMix也有它的短板当剪切区域正好切掉某个物体的主体时模型的训练信号就会出现歧义。比如一个目标被矩形区域切了一半本来应该学到一个完整的物体结果只有半个回归分支可能会被误导。2.3 Mosaic四图拼接一次喂四张图的信息Mosaic是YOLOv4作者重点推荐的方法思路是把四张训练图片拼接成一张大图然后在这张大图上做训练。具体过程大概是从训练集中随机取四张图并随机生成一个中心点。以这个中心点为基准把四张图分别放在左上、右上、左下、右下四个区域。四张图各自按比例缩放、裁剪填充到对应区域内。同步将四张图的标签转换到新的坐标系下。对拼接好的大图再做一次随机缩放让模型看到的目标尺寸更加多样化。这个设计有几个非常巧妙的地方单次迭代能看到四张图的信息相当于把batch size的效用放大了。四张图的拼接天然带来了尺度变化同一张训练图里有些目标大、有些目标小模型对小目标的适应能力显著增强。拼接边界处会出现大量“跨区域”的目标截断迫使模型学习在目标不完整的情况下依然给出正确的检测结果。注意Mosaic的拼接中心点一旦随机到特别偏的位置可能导致某个区域占比极小目标被严重压缩这种情况在训练中需要控制随机范围。3. Mosaic为什么是目标检测的优选方案3.1 从BN层的角度看Mosaic的优势Batch Normalization在训练时依赖于当前batch的统计量如果batch很小统计量的估计会很不稳定。Mosaic把四张图拼在一起之后在同样batch size下模型能够接触到的图片内容增加了四倍BN层的统计量估计就更稳健。这一点对于显存有限的情况特别关键。在YOLOv4训练中很多人只能用2到4的batch size跑训练这时BN层的稳定性是个非常大的问题。而Mosaic使得小batch设置下的训练稳定性仍然能得到保障。3.2 对小目标的增益是结构性的我在训练中观察到一个非常明显的现象使用Mosaic后小目标比如尺寸小于32x32像素的物体的召回率有稳定提升。原因也不难理解四图拼接后每个目标在整张大图中的相对尺寸被压缩了模型被迫去学会“在很小的像素区域内也能识别出目标”。这种能力迁移到正常尺寸的测试图片上后小目标检测自然变得更强。而MixUp和CutMix在这一点上帮助就非常有限因为它们没有产生质变级别的尺度多样性。3.3 Mosaic带来的训练稳定性这里列一个我之前在相同数据集、相同参数配置下做的对比供参考增强方案小目标AP中目标AP大目标AP训练收敛速度备注无增强12.326.738.5慢基线MixUp11.825.937.1中等边缘模糊影响定位CutMix13.627.238.9中等小目标有增益Mosaic16.429.839.6快综合增强效果最好Mosaic MixUp17.130.240.2快YOLOv4官方配置从这个结果可以直观看到Mosaic在各类目标上都稳定领先而进一步叠加MixUp还能带来额外收益这也是YOLOv4的默认训练配置里同时开启Mosaic和MixUp的原因。4. 多图融合在实际训练中的完整实现过程4.1 数据加载阶段的处理细节Mosaic在实现时有个容易忽略的细节处理时需要用padding或者resize的方式把每张子图都转成正方形这样才能保证拼接后的大图是规整的。很多人在实现时偷懒直接用原始宽高比拼接出来的大图不是矩形就是有黑边反而影响了模型的输入分布。我在实际工程中的处理方式是对每张子图先做letterbox统一缩放到固定尺寸比如416x416。拼接时按目标大图尺寸的1/2作为每个子图的标准大小。对超出边界的标签做过滤删掉完全不可见的ground truth box。对部分可见的box做截断保留其有效部分。这里有一个很关键的小技巧letterbox时一定要记录缩放比例和pad偏移量否则标签坐标对不齐训练结果会非常糟糕。4.2 MixUp和CutMix的实现要点MixUp的lambda系数控制是关键。如果lambda接近0.5两张图的权重过于平均物体特征会被严重稀释如果lambda靠近0或1混合效果不明显。YOLOv4论文里推荐的是从Beta(0.2, 0.2)分布采样这样采出的lambda大部分都靠近0或者1保证“一张为主、一张为辅”的效果。CutMix实现时需要注意裁剪区域的占比控制一般占比在0.3到0.5之间比较合理。占比太小增强效果弱占比太大主图信息被覆盖太多模型的训练信号会混乱。4.3 YOLOv4的官方策略先Mosaic后MixUp这里有个细节很多人不知道YOLOv4实际是把MixUp和Mosaic一起使用的而不是单独用某一种。具体策略是在Mosaic拼接完成之后再对拼接大图做一次MixUp混合。也就是说先四图拼接再把拼接结果和另一张图做像素级加权融合。这个“组合拳”的效果是Mosaic提供空间维度的多样性MixUp提供色彩和纹理层面的多样性。两者互补之后模型在空间定位和特征抽象层面都得到了强化。5. 训练效果评测与问题排查5.1 开启多图融合后loss曲线的变化特征如果你第一次开启Mosaic训练会看到loss曲线和普通训练明显不同前几个epoch的loss值下降比较快因为每个step的信息量变大了模型看到的内容更多。mid-training阶段loss会出现一定程度的震荡这是融合带来的样本分布变化导致的正常现象。如果MixUp的比例设得过高你会发现定位lossCIoU loss出现上升这通常是特征混合过度导致的需要调小MixUp权重。5.2 常见的训练崩溃场景多图融合虽然强但翻车的情况也经常遇到。我整理了几个高频问题标签过滤不干净拼接后大量object完全在边界外如果不过滤掉模型的loss会出现NaN或负数。Batch Size突降显存不够时有些人会选择减少batch size但Mosaic本身已经大幅增加了单step的内存占用如果显存紧张建议减少单边拼接尺寸而不是盲目减小batch size。混合后目标太密四图拼接后一张图里可能有几十个目标此时需要调低置信度阈值阈值进行训练否则正负样本失衡。5.3 组合使用的推荐配置参考根据我的训练经验给出一个可以稳定复现的组合方案配置项推荐值说明Mosaic概率1.0训练前80%的epoch后20%关闭或降到0.5让模型适应真实分布MixUp概率0.5建议在Mosaic后叠加不要单独使用CutMix概率0默认关闭YOLOv4不推荐在检测中用它Beta分布参数0.2MixUp的采样参数越小越偏向单图主导Mosaic拼接尺寸训练输入尺寸的2倍比如输入416拼接图用832然后RandomResize回416注意训练最后20%的epoch最好关闭Mosaic。这个设定来自YOLOv4作者的经验目的是让模型在最后阶段从“混乱混合分布”回到“真实分布”上微调mAP通常会有肉眼可见的上涨。5.4 如何验证增强是否生效判断增强有没有发挥作用除了看mAP之外还有个更快的判定方式看验证集上小目标的AP值变化。如果Mosaic真正起作用了小目标AP的涨幅会明显大于中大目标。如果所有目标的AP都在涨但小目标没有明显变化那大概率是学习率和训练轮次的影响而不是Mosaic的功劳这时候需要检查一下数据增强是不是被无意中关掉了。6. 总结与实操心得个人经验向我实际用下来Mosaic是这个系列里性价比最高的trick不是因为它有多复杂而是因为它几乎不需要额外调参就能稳定地拉高mAP尤其是对一批小目标占比高的数据集效果几乎立竿见影。MixUp则更适合作为辅助叠加项单独用反而容易把模型训歪。我之前在一个遥感检测数据集上单独开MixUp结果类别分数变得非常“软”推理时置信度普遍偏低不得不拉低阈值才能保住召回。后来在Mosaic基础上叠加MixUp并控制概率在0.5这个问题才消失。CutMix在我的检测场景里基本没有正面收益这可能是因为检测任务更关注空间位置而CutMix的区域替换破坏了物体的完整性对回归分支的干扰大于增强带来的好处。当然这不意味着它一无是处只是相对Mosaic来说它的应用场景窄很多。最后再分享一个最容易忽视的细节Mosaic的实现中四张图拼接的边界处理决定了这个trick的上限。很多人直接resize四张图再拼忽略了letterbox时的padding坐标偏移导致标签错位训练时模型对边界目标的定位偏差很大。用词概括的话多图融合是一个典型的“看着简单、实现细节决定成败”的trick。如果代码里坐标变换有半点误差mAP翻车都是轻的严重的会让模型直接不收敛。建议各位在自己数据集上先跑通最小实验确认增强代码正确之后再放大训练规模这样踩坑的成本最低。
阅读完成 · 觉得有帮助?
咨询建站