069、超分中的数据增强CutMix、Mixup 与退化模拟的实战技巧上周调试一个遥感图像超分模型训练集是DIV2K验证集是自采的高分卫星图。模型在DIV2K上PSNR飙到38.5一上卫星图直接掉到31.2。我盯着loss曲线看了半小时发现训练集里全是干净的下采样图像而真实场景的退化路径——模糊、噪声、压缩伪影——一个都没学到。这就是典型的“实验室王者实战青铜”现象。数据增强在超分里不是锦上添花是保命手段。今天聊三个我踩过坑后觉得最实用的技巧CutMix、Mixup以及退化模拟的工程化实现。CutMix别让模型学会“偷懒”先讲一个血泪教训。早期做人脸超分我直接用随机裁剪水平翻转做增强。模型训练完遇到半张脸被遮挡的测试图直接崩了——它学会了“只看局部就能猜”而不是真正理解结构。CutMix的核心思路是强迫模型在混合区域里做推理。具体实现时我习惯这样写defcutmix_patch(lr,hr,patch_size32,alpha1.0):# 这里踩过坑patch_size不能太小否则退化区域太小模型学不到# 建议至少是下采样倍率的4倍以上batch_size,c,h,wlr.shape lamnp.random.beta(alpha,alpha)# 随机选一个矩形区域cx,cynp.random.randint(0,w),np.random.randint(0,h)pw,phpatch_size,patch_size x1np.clip(cx-pw//2,0,w)x2np.clip(cxpw//2,0,w)y1np.clip(cy-ph//2,0,h)y2np.clip(cyph//2,0,h)# 别这样写直接对LR和HR分别做cut会导致空间不对齐# 正确做法先对LR做cut再对HR做对应区域的cutlr[:,:,y1:y2,x1:x2]lr[idx,:,y1:y2,x1:x2]hr[:,:,y1*scale:y2*scale,x1*scale:x2*scale]hr[idx,:,y1*scale:y2*scale,x1*scale:x2*scale]returnlr,hr,lam注意那个scale参数——LR和HR的空间对应关系必须严格保持。我见过有人直接在HR上随机切一块然后下采样到LR结果边缘出现锯齿模型直接学歪了。CutMix的alpha参数我一般设0.5-1.0太大比如2.0会导致混合区域太小模型还是能“偷懒”只看干净区域。实际训练时我每张图有30%概率做CutMix剩下的70%做常规增强。这个比例是我在Urban100上试出来的不同数据集可能需要微调。Mixup软标签比硬标签更抗噪Mixup在分类任务里很常见但超分里用的人不多。我试过之后发现它对噪声退化特别有效。原理很简单把两张图按比例混合对应的HR也按同样比例混合。defmixup_sr(lr1,hr1,lr2,hr2,alpha0.2):# 这里踩过坑alpha太大比如1.0会导致混合后图像模糊模型学不到高频细节lamnp.random.beta(alpha,alpha)lr_mixlam*lr1(1-lam)*lr2 hr_mixlam*hr1(1-lam)*hr2# 别这样写直接对LR和HR分别用不同lam会破坏一致性returnlr_mix,hr_mix,lam关键点是lam必须对LR和HR一致。我见过有人对LR用lam1对HR用lam2结果模型学到的映射关系是错的训练loss降不下去。Mixup的alpha我习惯设0.1-0.3。太小比如0.05等于没做太大比如0.5会让图像变得太模糊。实际效果上Mixup对高斯噪声和JPEG压缩的鲁棒性提升最明显PSNR能涨0.3-0.5dB。但对模糊退化效果一般因为模糊本身已经是一种“混合”了。退化模拟从理论到工程的三个坑退化模拟是超分数据增强的终极武器。但理论上的“bicubic下采样高斯噪声”在工程里根本不够用。我踩过三个大坑坑一噪声类型要多样。只用高斯噪声模型遇到椒盐噪声直接崩。我现在的退化pipeline包含高斯噪声sigma 0-30、泊松噪声lambda 5-50、椒盐噪声密度0.01-0.05。每个batch随机选一种概率均等。坑二模糊核要随机。固定用高斯模糊核模型会学会“反卷积”而不是“超分”。我改用各向异性高斯核长轴和短轴比例随机1:1到1:3角度随机0-180度。这样模型必须学会处理不同方向的模糊。坑三退化顺序有讲究。先模糊再下采样还是先下采样再模糊我试过两种发现先模糊再下采样更接近真实相机成像过程。但注意模糊核的尺寸必须根据下采样倍率调整否则会引入混叠。defrandom_degradation(lr,scale4):# 这里踩过坑退化参数必须和scale联动# 比如scale4时模糊核尺寸至少是4x4否则下采样后模糊效果消失kernel_sizescale*21# 经验公式保证模糊效果# 随机生成各向异性高斯核sigma_xnp.random.uniform(0.5,2.0)*scale sigma_ynp.random.uniform(0.5,2.0)*scale anglenp.random.uniform(0,180)kernelanisotropic_gaussian_kernel(kernel_size,sigma_x,sigma_y,angle)# 别这样写直接对LR做模糊然后下采样会导致分辨率不对# 正确做法先对HR做模糊再下采样到LRhr_blurconvolve(hr,kernel)lr_degradedimresize(hr_blur,1/scale)returnlr_degraded,hr这个函数里kernel_size和sigma都跟scale挂钩。我一开始没注意scale2时用3x3核scale4时还用3x3核结果模型在scale4时完全学不到模糊信息。实战组合拳三种增强的协同单独用CutMix、Mixup或退化模拟效果都有限。我现在的训练pipeline是每个batch有50%概率做退化模拟随机选择退化类型和参数剩下的50%做常规增强随机翻转、旋转90度对增强后的数据有30%概率做CutMix20%概率做MixupCutMix和Mixup互斥不同时用这个组合在Set5、Set14、Urban100、Manga109上都验证过比只用退化模拟高0.2-0.4dB。特别是Manga109这种线条密集的数据集CutMix的效果最明显。个人经验性建议别迷信“数据增强越多越好”。我试过把CutMix、Mixup、退化模拟、随机裁剪、颜色抖动全加上结果模型训练了三天PSNR反而比只用退化模拟低0.1dB。增强太多模型学不到稳定的映射关系。退化模拟的参数范围要跟实际应用场景对齐。做卫星图像超分退化参数就按卫星相机的MTF曲线来做手机图像超分就按手机ISP的退化模型来。别拿DIV2K的参数直接套。最后数据增强的代码一定要写单元测试。我吃过亏退化模拟里一个坐标计算错误导致LR和HR不对齐模型训练了两天验证集PSNR死活上不去。后来发现是imresize的边界处理跟卷积的边界处理不一致。这种bug肉眼根本看不出来只有写测试才能发现。超分的数据增强本质上是让模型见过足够多的“坏图”。CutMix和Mixup是让模型学会在局部信息缺失时做推理退化模拟是让模型学会真实世界的退化路径。三者结合才能让模型从实验室走向实战。