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

YOLOv4数据增强:MixUp、CutMix与Mosaic多图融合实战解析

YOLOv4数据增强:MixUp、CutMix与Mosaic多图融合实战解析 ★ FEATURED ARTICLE
做目标检测的碰上数据增强大概都绕不开这几个词MixUp、CutMix、Mosaic。尤其YOLOv4出来之后Mosaic几乎成了训练标配后来很多框架都把多图融合写进了默认训练流程。这篇是YOLOv4 Tricks解读的第一篇专门聊多图融合这一类增强手段说清楚它们各自怎么运作、为什么有效、实际使用时的参数怎么选以及在目标检测任务里会踩到哪些坑。这一类增强和传统的单图增强有个本质区别单图增强是在一张图里做变换再怎么换花样语义信息还是那一张图的而多图融合是把多张样本的像素和标签一起混合等于在训练样本空间里做插值和拼接让模型见到的分布更“广义”。听起来很朴素真正落到检测任务上细节不少。我们从最简单的MixUp讲起一路看到YOLOv4默认强推的Mosaic最后聊聊训练安排和排查经验。1. 为什么偏偏是“多图融合”1.1 从单图增强到样本外推先说说传统单图增强。翻转、随机裁剪、色彩抖动、灰度化、仿射变换这些东西本质上都是在“一张图”的范围内做扰动。模型看到的是同一个真实场景的不同视角或不同光照版本语义主体没有变背景没有变物体之间的空间关系也没有变。这在数据量充足时够用但一旦数据量少、类别不均衡、小目标特别多单图增强就暴露出一个明显问题它只会让模型把已有分布吃得更透却很难让模型应对“从未见过”的布局。多图融合解决的就是这个“样本外推”问题。把两张图按比例叠加或者从一张图里切一块贴到另一张图上甚至把四张图拼成一张得到的是一张全新的训练样本。里面可能同时出现两个完全不相干的场景物体之间的相对位置、尺度比例、遮挡关系都发生了真实世界里不太常见、但逻辑上说得通的变化。模型必须学会从局部线索识别目标而不是依赖整张图的全局记忆。用一句大家常说的话这就像给训练数据做了“膨胀”让模型在更大范围的分布空间里拟合。我个人的体会是多图融合的优势不是单纯“增加样本数量”而是增加“样本组合的多样性”。同样是1000张图单图增强可能产出的有效变化是有限的而MixUp、CutMix、Mosaic这类方法每张训练图都可能是不同原图的组合模型每轮看到的都是新的排列组合。数据量小的时候这种组合多样性比数量提升更解渴。1.2 YOLOv4 训练面临的现实痛点YOLOv4出来时单阶段检测器已经被各种结构优化推到了性能边界但训练层面还留了不少问题。最典型的就是小目标漏检和过拟合。小目标占的像素少特征提取过程中容易被高层语义掩盖如果训练集里小目标本身就不多模型很容易“看不见”。增加小目标样本不是简单复制粘贴就能解决的因为复制粘贴会带来重复样本容易让模型把某个具体小目标背下来而不是学会泛化。另一个痛点是标注成本。检测数据集的标注比分类数据集贵得多一个框一个类别地标动不动就要人工审几遍。很多人实际能拿到的标注数据可能只有几百张到几千张这种情况下过拟合几乎是必然的。多图融合相当于用算法把有限标注“合成”出更大覆盖的训练分布尤其是Mosaic把四张图拼在一起一张图里可能包含几十个小目标等于在单次迭代里让模型看到更丰富的小目标样本。还有一个硬件层面的痛点大batch训练。检测模型输入分辨率高动不动608、640显存不够的时候大batch根本跑不起来。而像Mosaic这种多图拼接相当于在同样的内存占用下把有效样本的信息量放大四倍训练时可以把batch调小一些同时还能保持BN统计的稳定性。这一点后面讲细节时再展开。2. MixUp最简单的线性混合2.1 核心公式与分布参数MixUp最早是分类任务里提出来的思想简单得惊人从训练集里随机抽两张图按一个权重把它们逐像素叠加标签也按同样权重做线性组合。公式可以写成x λ * x_a (1 - λ) * x_b y λ * y_a (1 - λ) * y_b其中λ从Beta分布里采样Beta(α, α)。α控制λ的分布形状α0.2的时候λ往往接近0或1意味着混合图更偏向某一张原图α1的时候λ近似均匀分布两张图叠得都比较多α越大λ越集中在0.5附近两张图几乎“透明对半叠”。在检测任务里常用的α范围一般是0.2到1.0之间具体数值跟数据集和任务难度关系很大。很多人第一次看到MixUp会嘀咕两张图直接叠加模型能学到个啥其实它学到的是“平滑的决策边界”。分类模型如果只见过清晰的猫和清晰的狗学到的边界可能是尖锐的混合之后模型见过“60%的猫加40%的狗”这种中间状态决策边界就会被拉平对噪声和对抗扰动的鲁棒性更好。这个混合的思想放到检测里最大的区别在于标签的结构。分类的标签是一个标量或向量直接按λ加权就行。检测的标签是“框类别”的集合不能简单乘一个系数得先做组合再对每个目标的损失权重做处理。很多实现会有意无意忽略这一步导致MixUp在检测上的收益打折。2.2 检测任务里的标签加权处理检测任务里做MixUp常见的做法是拿两张图的正样本标签同时参与计算但每张图的损失贡献按混合比例缩放。假设一张混合图的λ0.6那么来自图A的每个匹配正样本的objectness损失和分类损失乘以0.6来自图B的乘以0.4。框的坐标回归损失也是一样加权参与。实际操作时要注意一个细节如果是先分别算两张图的损失再把损失加权求和其效果和先混合图像、再在混合图上做前向推理、最后按标签权重统计是等价的。但检测框的匹配关系会受混合影响因为混合图上的目标位置还是原图坐标没有平移只是像素叠加。所以大多数实现是直接在混合图上推理然后同时用两组标签计算匹配最后把两个来源的损失按权重合并。这里有个坑MixUp之后图A的某个目标和图B的某个目标可能在空间上重叠同一个anchor可能同时匹配到两个目标。处理不好就会导致梯度相互拉扯。我在实践中的做法是把匹配阈值适当放宽减少重叠目标的匹配冲突另一个更粗暴的做法是当两个目标高度重叠时只保留权重更大的那一个参与回归分类损失仍然两边都算。这样可以稳定收敛。还有一种实现上的选择是控制混合权重下限。某些框架里MixUp的权重会设置一个下限比如λ不要低于0.3避免一张图被另一张图完全“吃掉”。想一想如果λ0.02图B的信息几乎全是噪声模型还要为图B的标签付出极大权重这显然是不合理的。所以实际训练时建议采样λclip(Beta(α,α), low, 1-low)low取0.1到0.3之间都有人用。2.3 MixUp的效果边界与参数选择我做过一组对比实验数据量大约一千张的矽肺结节检测场景样本类别极少、背景高度相似。单独开MixUpmAP只涨了不到1个点而Mosaic涨了接近3个点。但这不代表MixUp没用换到类别多、背景复杂的自然场景数据集上MixUp和Mosaic组合使用效果比单独Mosaic更稳尤其表现在对误检的抑制上。MixUp最大的问题是它会产生“透明叠影”。模型需要从混合像素中区分出主体这个能力是好的但训练早期如果混合比例太重模型可能迟迟找不到清晰的梯度方向。所以MixUp通常适合在训练中期开启或者在训练全程使用但把α调得让混合更偏极端比如α0.2。反过来如果你发现训练损失下降很慢查看一下增强预览图是不是过度混合了适当调小α或者减小混合概率往往比调整学习率更管用。从公式本身看MixUp对目标检测的正样本扩充效果不如CutMix和Mosaic因为它没有改变目标的空间布局只是让每个目标变“淡”了。但它的优势是计算代价极低两张图一叠就好连坐标变换都不用做。所以现在主流做法不是“要不要MixUp”而是“在哪个阶段、以多大概率MixUp”。YOLOv4里的MixUp也被设计成了可配置项用在部分训练阶段和Mosaic互为补充。3. CutMix断开线性改为区域粘贴3.1 从像素插值到掩码贴片CutMix是对MixUp的一个直接升级不再把两张图线性叠加而是从图B中切出一个矩形区域粘贴到图A的对应位置。公式上可以写成M ⊙ x_a (1 - M) ⊙ x_b y λ * y_a (1 - λ) * y_b这里的M是一张和二值掩码尺寸和图像一样在粘贴区域内值为1其他区域为0。λ是粘贴区域面积占整张图面积的比例通常从Beta(1,1)里采样也就是接近均匀分布保证各种遮挡比例都有覆盖。CutMix最早在分类任务上提出时目标很明确MixUp虽然能提升鲁棒性但它把所有像素都混合了导致模型学到的局部特征混乱尤其当模型要判断“图片里是否存在某个小物体”时透明叠影会让特征变得无法定位。CutMix则保留了大部分原始像素只在一小块区域做替换。模型依然能清晰看到图A的主体同时被迫利用图B粘贴区域的局部特征。这种“区域粘贴”的语义和单图裁剪很像但区别在于CutMix的目标有两组模型学到的是“局部损坏仍然可以识别目标”的能力。从数据增强角度看它模拟了遮挡目标被另一张图的无关区域挡住一部分模型需要根据其余部分判断目标类别和位置。这是检测任务里非常关键的一种泛化能力因为真实场景里遮挡几乎无处不在。3.2 CutMix在目标检测里的标签变换检测任务里用CutMix不像MixUp那样什么都不动。因为粘贴区域是图B的一部分图B的目标框也要跟着平移才能保持空间一致性。具体来说从图B里裁出一块区域把它贴到图A的指定坐标那么图B所有GT框的坐标也要减去裁剪区域的左上角偏移再映射到图A坐标系里。图A原本的GT框坐标不变。标签的组合权重是另一个细节。通常做法是图A的所有标签权重设为λ图B的所有标签权重设为(1-λ)。看起来和MixUp一致但实际上两个来源的目标在空间上几乎不重叠图B被裁剪进来的目标只出现在粘贴区域内所以anchor冲突比MixUp少得多。这算是CutMix在检测方向上的一个天然优势。但这里需要明确一个取舍如果图B的目标框被剪了一半这个目标到底是保留还是丢弃我的处理策略是保留中心点落在粘贴区域内的框中心点不在就不参与计算。为什么用中心点而不是IoU因为YOLO系检测器在分配正样本时核心依据是中心点距离和anchor尺度目标中心点如果已经被切出画面强行参与训练只会引入噪声。如果你用的是两阶段检测器对标签的要求不太一样可以考虑用“与裁剪区域IoU0.3则保留”的策略。3.3 CutMix和MixUp的差别以及检测里的适配如果把MixUp和CutMix放在一起看区别可以概括为三点。第一破坏程度不同。MixUp把所有像素都“污染”了CutMix只污染局部因此CutMix训练出来的模型在保持原始分布拟合上更稳。第二空间关系不同。MixUp不改变目标坐标CutMix会引入空间平移的GT模型需要学习跨区域的目标定位。第三标签置信度不同。MixUp里两个目标都“半透明”置信度天然较低CutMix里两个目标大部分都是清晰的置信度更高不易造成检测头的置信度退化。我在实际项目里CutMix用得比MixUp多尤其在类别不平衡比较严重的数据集上。如果某个类别目标密集出现通过CutMix把它们“贴”到其他场景里相当于给稀有类别增加了位置多样性。比如工业质检场景某种缺陷只在特定位置出现模型很容易把位置和缺陷绑定CutMix把缺陷块随机贴到其他位置后位置偏移的泛化能力立马上来了。CutMix也有自己的问题。如果粘贴区域过大会把图A的大目标完全遮住导致该目标虽然还有标签但视觉特征完全丢失模型只能靠周围上下文瞎猜。所以有些框架会把粘贴区域的大小限制在图面积的0.1到0.5之间而不是完全按Beta采样。我个人建议在检测任务里给粘贴框的宽高加上一个上限比如不超过原图短边的60%能明显减少训练初期loss震荡。4. Mosaic把四张图塞进一张4.1 四图拼接的完整流程Mosaic是YOLOv4里最出彩的数据增强之一思路就是取四张训练图按一定规则裁剪拼接成一张图然后统一缩放到网络输入尺寸。流程可以拆成四步第一步随机决定拼接中心点(cx, cy)。这个中心点决定了四张图的分界线位置。如果中心点偏左上左上角区域就小其他三个区域就大如果中心点居中四块区域接近相等。第二步把四张图分别分配给左上、右上、左下、右下四个位置计算每个位置对应原图的裁剪区域。以左上角为例它对应原图左上角到中心点(cx, cy)的矩形区域右上角对应右上角到中心点的区域依此类推。每张图先做随机缩放缩放到比目标区域略大一点再从目标区域对应的位置裁剪像素这样能保证拼接后不留黑边。第三步把四个区域的像素拼接到一张图中得到一张尺寸不定、但大致围绕输入尺寸的拼接图。随后统一缩放到网络输入尺寸比如608×608或640×640。第四步标签变换。所有四张图的GT框都要经过对应的“缩放、裁剪、平移”变换映射到拼接图坐标系然后再跟着拼接图统一缩放。这里插一个容易忽略的细节四张图各自的缩放因子是独立随机采样的所以四个区域里的物体尺度可能完全不同。左上区域的小猫可能缩成了很小的目标右下区域的汽车可能被放大成接近整图的大目标。这种尺度多样性正是Mosaic厉害的地方。单阶段检测器往往在特定的特征层上负责特定尺度的目标如果训练数据里尺度分布不平衡模型对某些尺度的目标就学不好。Mosaic相当于在每次迭代里都人为制造一个尺度分布极不均衡的输入逼着网络把所有尺度的特征都学扎实。4.2 随机因素和插桩位置Mosaic的随机因素不止中心点还包括每个区域的图像选择、缩放倍数、是否翻转、色域变化。不同实现略有差异但核心随机项基本一致我用表格列一下。随机因素常见范围作用拼接中心点整张图尺寸内随机改变区域分配和物体布局单图缩放倍数0.5到1.5左右制造尺度多样性是否水平翻转概率0.5增加布局多样性色域扰动HSV随机偏移增强光照鲁棒性四图采样顺序随机乱序避免位置和内容绑定为什么YOLOv4要用Mosaic一个很重要的原因是它可以在同等显存下变相降低BatchNorm对大batch的依赖。一张Mosaic图由四张图拼接而成BN统计量同时混合了四个场景的分布相比之下普通训练方式要四张完全不同的图分别过网络BN才会统计到四个场景。Mosaic让输入数据在一个样本内就“大杂烩”了所以可以把batch size调小在单卡训练时也能稳住BN统计。如果你仔细看YOLOv4的配置会发现它常配合小批量训练这也是多图融合带来的实际收益。还有一点值得展开为什么Mosaic适合小目标。常规训练时小目标的绝对像素少一张图里就算有小目标数量也有限。Mosaic四图拼接后统一缩放四个区域里原本就有的小目标会被进一步压缩相当于在一张图里集中出现大量微型目标。模型在单次前向中就能看到很多小目标样本小目标的正样本数量成倍上升。这对提高小目标召回率帮助非常大。4.3 GT坐标变换与框过滤机制Mosaic的标签变换比MixUp和CutMix都复杂因为它同时涉及四组独立的变换。伪代码我简化一下def transform_bbox(bbox, crop_offset, scale_factor, new_size): x1, y1, x2, y2 bbox x1 (x1 * scale_factor - crop_offset[0]) y1 (y1 * scale_factor - crop_offset[1]) x2 (x2 * scale_factor - crop_offset[0]) y2 (y2 * scale_factor - crop_offset[1]) # 统一缩放到网络输入尺寸 x1 x1 / old_w * new_w x2 x2 / old_w * new_w y1 y1 / old_h * new_h y2 y2 / old_h * new_h return x1, y1, x2, y2 def filter_bbox(tx1, ty1, tx2, ty2): # 过滤规则中心点必须落在新图内 cx (tx1 tx2) / 2 cy (ty1 ty2) / 2 if cx 0 or cx new_w or cy 0 or cy new_h: return False if (tx2 - tx1) * (ty2 - ty1) min_area: return False return True框过滤这一步特别关键。裁剪过程中一部分GT框可能只露出一条边甚至完全被切掉如果直接保留会给检测器送一堆残缺标签。用什么规则过滤不同框架不太一样。我常用的规则是中心点必须在新图内。中心点在说明目标主体还在即使边缘有裁剪依然是个可学习样本中心点不在目标大概率只剩碎片或者完全消失留着只会让模型困惑。除了中心点规则还要过滤面积过小的框。拼接后统一缩放到输入尺寸原本的小目标可能缩到几个像素比如小于2×2像素这种框已经失去学习意义强行保留反而会增加匹配噪声。实践建议把过滤规则打得宽松一点宁可多留、不可全扔。最怕的情况是Mosaic增强后有效GT框数量骤减一个batch里全是负样本损失会剧烈震荡。所以如果发现加了Mosaic后训练不稳定先检查是不是过滤太狠了。4.4 Mosaic为什么能成为默认项YOLOv4之后的很多框架几乎默认启用了Mosaic。这不是没有道理的。它同时解决了好几个问题。一是尺度均衡。四张图的随机缩放天然制造了从极小目标到极大目标的连续尺度分布检测器在训练阶段就能适应多尺度变化。二是背景多样性。一张Mosaic图里有四个不同背景BN统计更加平稳。三是遮挡模拟。拼接缝附近的物体经常被切掉一部分模型必须学会从不完整外观中识别目标。四是显存效率。batch size减半甚至减到四分之一也能保住BN的有效性这对算力不充裕的团队太重要了。但Mosaic不是没有代价。最明显的问题是拼接缝。四张图的光照条件、色调如果差异很大拼接图会有明显的“补丁感”。模型短期内会把部分注意力放在缝边缘的伪特征上。解决方法是配合色域扰动尽量让四个区域在色调上接近一些。另外训练后期如果一直开着Mosaic模型始终在见过多的“假图”容易忽略真实的整图分布所以就有了“最后若干轮关闭Mosaic”的通行做法下一节细说。5. 训练安排与超参数什么时候开、什么时候关5.1 分阶段启停的经验值多图融合增强不是从头到尾全开就好。我的习惯是分三段安排。训练前20%的迭代里不开Mosaic和MixUp让模型先用正常分布把基础特征学稳中间60%到80%的阶段全开Mosaic和MixUp充分扩充分布最后大约10到15个epoch关闭Mosaic和MixUp只用常规增强让模型重新收敛到真实数据分布。为什么要留最后的“关闭期”因为Mosaic拼接图和真实单图之间始终存在分布差异。如果一直到训练结束都开Mosaic模型在验证集上的表现可能不差但推理时面对的是真实的完整单图分布不匹配的负面影响会在最终mAP上体现出来。最后关掉增强相当于给模型做一轮“分布校准”。这个“关闭期”的epoch数不是固定的。数据量大、训练epoch多时比如120个epoch至少留10个epoch数据量小、epoch少时可以按总训练迭代数的5%到10%来留。我有一次只留了5个epochmAP掉了0.6个点后来加到10个epoch才回到正常水平。MixUp的启停安排稍有不同。它不像Mosaic那样有强烈的分布偏移但它对初期的收敛有干扰。我倾向于在训练中期开MixUp概率设置在50%左右到了最后关闭期一并关掉。如果数据集本身就很小可以全程开MixUp但把α调小一些降低混合强度。5.2 与BN、学习率warmup的配合多图融合和BN之间存在一个容易忽略的耦合关系。Mosaic通过一个输入样本混合多个分布BN统计量会被“平均”掉一部分。这看起来是好事但如果batch size本身很小比如2或4这一强平均反而可能让BN统计变得过于平滑丢失单图的方差信息。这个问题在最后关闭Mosaic的阶段会自动纠偏因为BN会重新适应真实单图分布。学习率warmup也要配合调整。Mosaic图在一开始就会给模型比较大的输入信息量如果此时学习率过大很容易把初始权重冲乱。我一般先用线性warmup从0.1倍学习率慢慢升到目标学习率warmup迭代数至少占训练总量的5%。开了多图融合以后不建议把warmup做得太短否则BN统计和特征提取器还没站稳就被混合过的样本带偏。另外多图融合本质上是一种正则化正则化增强的力度越大模型能承受的学习率上限通常也越高。如果你发现加入Mosaic后训练损失收敛变慢可以先试着把学习率往上调10%到20%而不是急着降低增强强度。这方面有时会比调α更有效。5.3 多尺度训练和Mosaic的叠加YOLO家族一直喜欢多尺度训练每若干轮随机切换输入尺寸。Mosaic和多尺度天然兼容因为Mosaic拼接图本身就要缩放到输入尺寸你只是把目标尺寸换成随机值而已。两者的叠加效果比单独使用更强因为Mosaic在单图尺度上制造了区域间的尺度差异多尺度训练又在整体输入上增加了尺度变化相当于两次尺度扰动叠加。不过要留意一个副作用叠加后正样本的尺度分布会更分散对anchor匹配策略是个考验。我遇到过这样 的情况Mosaic多尺度训练以后小目标正样本还是特别多但中等尺度的正样本变少导致模型中等目标召回率下降。排查后发现是Mosaic的缩放因子采样偏向了小值把很多中等目标压成了小目标。解决办法是限制单图缩放因子的下限比如把0.5的下限抬到0.7或者给缩放因子增加一个中间偏置。更重要的一点是匹配时关注anchor与GT的宽高比尺度分散加剧时宽高比阈值可以适当放宽从默认的4放宽到5或6。这个参数直接影响Mosaic场景下的小目标召回率。6. 踩坑与排查多图融合的常见问题6.1 加了MosaicmAP反而下降这是新手最容易遇到的情况。开着Mosaic训练训练损失下降很漂亮结果验证集mAP反而比纯单图增强还低。究其原因大概率是“关闭期”没做或者关闭期太短。前面说过Mosaic和单图分布有差异最后不关掉模型在验证集上永远处于分布漂移状态。解决方法很简单把最后关闭Mosaic的epoch数拉长同时配合低学习率做精调。另一个常见原因是Mosaic的过滤规则太严导致有效正样本大幅减少。尤其在类别不平衡的数据集上某一类目标本来就少再被过滤掉一部分该类别的学习样本更少mAP自然往下走。我建议把过滤规则先放开看看训练集里每个类别的平均GT数量是增是减再决定收紧过滤条件。mAP下降还有一种隐蔽情况验证时用固定输入尺寸而训练时Mosaic多尺度让模型习惯了各种尺度验证尺寸刚好落在模型较弱的尺度上。排查方法是梯度式的先把验证尺度改成训练中常见的一组尺寸取平均mAP再对比如果平均mAP正常说明是尺度偏好问题不是增强本身的问题。6.2 Mosaic后标签框大量丢失有几次我在调试时发现Mosaic增强后的训练图里GT框数量比预期少很多。追踪下来问题出在拼接区域的采样逻辑上。如果中心点过于偏向某个角落比如左上角左上区域的面积就特别小原图被裁剪出来的部分极少该图的GT框经变换后几乎全被中心点过滤规则剔除。解决方式有两个方向。一是限制中心点的采样范围不要让中心点落在图片边缘附近比如中心点坐标限制在图像宽高的0.2到0.8之间。二是对GT框少的子图进行重复采样四图里某一组GT数量为0时重新抽一张该类别分布更丰富的图来替代。很多框架内部已经做了这类校验但自己实现时容易漏掉。另外过滤面积阈值设得太高也会造成框丢失。比如把min_area设成16像素平方而拼图里有大量小目标只有10像素左右就会被全部过滤。我记得曾经把min_area从16改到4小目标mAP直接涨了0.8个点效果非常明显。6.3 MixUp训练不稳定时的处置顺序MixUp导致的训练不稳定通常表现为两种一种是一开始loss就下不去一种是训练中途突然震荡。遇到前者首先降低α比如从1.0降到0.2让混合更接近原始图分布。其次检查是否在warmup阶段就开了MixUp如果是把MixUp的启动点后移到warmup结束。遇到后者优先看学习率是否过高因为MixUp的软标签让梯度不再指向一个明确的目标过大的学习率容易在多个目标之间来回横跳。还有一个小细节MixUp和CutMix同时启用时要注意两者产生的新标签权重是否叠加合理。有些框架把MixUp得到的混合图再送去CutMix这时候标签权重会被两层混合累积压得很低很多目标可能只有0.1的权重对损失贡献微弱等于在白白丢失正样本。我的做法是同一轮增强里只启用一种空间混合方式要么MixUp要么CutMix加Mosaic不要在数据流里把MixUp和CutMix串行叠加。6.4 快速排查清单如果多图融合增强后效果不理想我一般按这个顺序排查现象第一步检查第二步检查mAP全面下降最后是否关闭Mosaic并精调过滤规则是否丢失正样本小目标mAP差缩放因子下限是否太低anchor宽高比阈值是否过严损失震荡是否多图融合叠加层数过多学习率和warmup是否匹配训练初期不收敛是否warmup阶段就开了MixUpα是否设得过大类别不平衡加剧CutMix粘贴区域是否集中在头部类别采样权重是否按类别均衡排查这种事最忌讳拍脑袋调参。把增强后的训练图片和标签框实际渲染出来看一遍再决定调整方向比瞎试快得多。我几乎每个项目都会写一个可视化脚本把MixUp/CutMix/Mosaic后的图和GT统一画出来确认标签没有错位、没有丢失再开始正式训练。7. 结合数据规模、场景和资源的选择建议7.1 按数据量选方案数据规模决定增强策略的偏重。数据极少时比如只有几百张Mosaic几乎必开因为它把有限数据组合出更多样本MixUp也可以开但α要小以减小建模干扰。数据中等时比如三五千张CutMix往往比MixUp更好用因为数据量够支撑区域粘贴带来的空间多样性学习。数据量很大时比如几万张以上多图融合的边际收益会下降这时候反而应该关注关闭期的长度帮助模型收敛到真实分布。我可以按优先级给一个参考几百张Mosaic CutMix MixUp三千到一万张Mosaic CutMix 组合谨慎使用MixUp数万张以上以Mosaic为主MixUp概率控制在30%以下这个排序不是绝对的但它符合我踩过坑之后的规律。数据量越少越需要“组合增强”来撑分布数据量越充足越要防止增强过度污染原始分布。7.2 按目标尺度分布选方案如果你的数据集里小目标占比高Mosaic带来的收益最明显因为它把多个场景压缩到一起小目标密度大幅提升。如果数据集里大目标很多MixUp的收益反而可能比Mosaic高因为线性叠加让大目标的边缘变得模糊模型被迫学习更鲁棒的整体特征。有个项目里我遇到过中尺度目标占主导的数据集Mosaic和CutMix同时开效果反而比单独Mosaic低。原因可能是中尺度目标被Mosaic的缩放因子拉成了小目标而CutMix又把一部分目标粘贴遮挡双重扰动让中尺度目标的特征不稳定。后来我把CutMix概率降了一半关掉Mosaic中缩放因子的极端取值中尺度mAP就恢复了。所以不要迷信组合越多越好多图融合的本质是制造多样性但如果模型连某类尺度都还没学好多样性的干扰就大于收益。7.3 关于计算开销和落地组合经验多图融合对训练时间的增加是可控的。MixUp几乎不增加开销CutMix增加一次区域裁剪Mosaic增加四次图像的缩放填充和标签变换。整段训练时间相比纯单图增强大概多10%到20%对大多数项目都可以接受。真正要注意的是数据加载管线不要让Mosaic的拼接操作把GPU利用率拖下来。四张图的随机读入、缩放、裁剪最好放在多进程增强流水线里做而不是在CPU上串行处理。我自己的组合习惯是这样的基础增强开翻转、颜色抖动、随机裁剪空间混合以Mosaic为主概率60%CutMix概率30%MixUp只在训练中期开20%概率最后10到15个epoch全部关掉空间混合只保留轻量基础增强。这套配置在多个检测数据集上表现稳定虽然没有针对某个数据集做到极致但作为起点再微调效率很高。以它为基线再去单变量搜索α、关闭期长度、缩放因子范围每个变量试一两组基本就能摸到当前数据集的甜点。多图融合本身不算复杂复杂的是它和检测任务的标签结构、训练调度、BN行为之间的耦合。把这些耦合关系理清楚了Mosaic、CutMix、MixUp就能成为稳定可靠的性能杠杆。第一篇先写到这从实现细节到使用经验都拉通了一遍后面再找时间聊聊YOLOv4训练里其他更有趣的tricks。
阅读完成 · 觉得有帮助?
咨询建站