ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

图像增广让验证准确率飙到96%,上线后漏检了一半,补完机器学习入门才看懂过拟合陷阱

图像增广让验证准确率飙到96%,上线后漏检了一半,补完机器学习入门才看懂过拟合陷阱 图像增广让验证准确率飙到96%,上线后漏检了一半,补完机器学习入门才看懂过拟合陷阱上周二下午,运维组的聊天框突然弹出十几张监控截图,每一张都是画面正中央站着人,系统却赫然标注“无人”。我盯着那个自己训练了两周的计算机视觉模型,后背发凉--它用一套精心设计的图像增广方案,把验证集准确率刷到了96%,可一上线,对着真实画面漏检率直接超过50%。那种感觉就像考试刷到了满分,一毕业才发现全是假分。事后复盘到凌晨,我才确认问题不在代码框架,也不在算力,而是一个被很多计算机视觉入门者忽略的细节:数据增强被用成了过拟合加速器。最后让我把整条链路理清楚的,是亚马逊云科技机器学习平台上配套的机器学习入门课--它把特征工程一致性与泛化误差的关系讲透了,我照着课程里的诊断方法,一步步定位到增强策略与真实场景失配,才把模型从线上抢救回来。如果你也在自己搭图像分类、目标检测的模型,这篇文章会把我的翻车过程、排查思路和最终的学习资源全部摆出来,看完或许能少挨一次线上事故。为什么非要把计算机视觉模型做到“能上线”我们团队本来做的是后端服务,去年被要求在一个老旧园区改造项目里加上人员闯入检测。预算几乎没有,硬件就是几台退役的工控机加 USB 摄像头。方案调研了一圈,最后决定用开源模型做微调,跑个轻量的计算机视觉模型。说白了,这事从一开始就顶着两条绳子:一条是成本--SageMaker 免费额度早被同事用完,GPU 实例根本不可能批;另一条是效果--白天黑夜、雨天晴天,画面质量一塌糊涂。当时我心想,图像分类又不是大语言模型,用 ResNet 加点数据增强,在 CPU 上迭代几版总能凑合用。于是照着 GitHub 上几个 star 很高的深度学习入门项目搭了一套 pipeline,把训练脚本挂到一台 4 核云主机上就开始跑。那会儿我对计算机视觉的理解,还停留在“多给模型看变形的图,它就会变强”的朴素层面,完全没意识到数据增强里藏着一个巨大的陷阱。我把数据增强当万能药,结果训练 loss 一路向下,泛化能力却崩了最初的训练配置是这样的:from torchvision import transforms train_transform transforms.Compose([ transforms.RandomHorizontalFlip(p0.5), transforms.RandomRotation(degrees30), transforms.ColorJitter(brightness0.4, contrast0.4, saturation0.4, hue0.2), transforms.RandomResizedCrop(size224, scale(0.6, 1.0)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])而验证集的变换器只做了缩放和归一化:val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])跑了 30 个 epoch,训练 loss 降得顺滑,验证集上的准确率从 78% 冲到 96%。我当时还截图发群,觉得这个计算机视觉任务已经搞定。但很快现实就甩了我一巴掌:在实际场景拍到的图片里,模型要么把穿深色衣服的人当成背景,要么在画面有阴影时完全没反应。踩坑笔记:训练时加了随机裁剪、色彩抖动和大幅旋转,而真实场景的摄像头角度固定、画面中心区域几乎不变,增强后的分布与线上数据出现了严重偏移。模型学到的是“通过某种色块模式和几何变形来判断是否有人”,而不是真正理解“人”的特征。这其实是典型的过拟合,只是我被那个漂亮的96%迷惑了。如果当时学过机器学习基础,看一眼训练和验证的 loss 曲线就能提前发现:训练 loss 一直降,验证 loss 在第 12 个 epoch 后就不再下降,反而轻微上扬--典型的强过拟合征兆。可惜那会儿我连混淆矩阵的评估思路都没建立,更别说数据漂移的概念了。两天的紧急排查,我把错误缩小到了这三个改动线上事故不能拖,我立刻停了原模型,开始一条条排查增强参数的影响。增强操作原配置线上效果影响调整后RandomResizedCropscale(0.6, 1.0),随机裁剪并缩放把人的部分区域裁掉或拉得太小,模型学到不完整特征scale(0.9, 1.0),限制裁切幅度ColorJitterbrightness0.4,对比度0.4,饱和度0.4,色相0.2光线变化过于剧烈,把阴影区直接变成全黑,丢失轮廓brightness0.15,降低抖动幅度RandomRotationdegrees30摄像头视角固定,大角度旋转不存在于真实输入degrees5,仅模拟微小偏移同时我重写了数据加载代码,让训练和验证使用完全一致的统计信息:# 修正后:训练和验证共用同一套归一化参数,避免分布不一致 def get_dataloader(data_dir, batch_size32, is_trainTrue): base_transforms [ transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ] if is_train: aug_transforms [ transforms.RandomHorizontalFlip(p0.5), transforms.RandomRotation(degrees5), transforms.ColorJitter(brightness0.15, contrast0.15, saturation0.15), transforms.RandomResizedCrop(size224, scale(0.9, 1.0)), ] transform transforms.Compose(aug_transforms base_transforms) else: transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), ] base_transforms) ...调整之后,验证准确率从96%掉到了87%,但线上实测的召回率从原先不到50%一下子升到了82%。这个反差让我彻底明白:在计算机视觉工程落地中,指标不能只看验证集那一亩三分地,每一个预处理操作都必须对照真实场景去校准。AWS 的机器学习入门课,用三章内容帮我补上了最关键的理论短板虽然线上模型稳住了,但我心里其实很虚--下次再碰到类似问题,我还能不能自己定位,而不是靠运气一项项试?我决定不再照着零散的博客修修补补,而是系统补一下基础。在同事推荐下,我找到了亚马逊云科技机器学习官方提供的机器学习入门课程,里面专门有一个模块讲特征工程与数据预处理,正好击中我的盲区。这门机器学习入门是面向零基础开发者的,不用啃公式,直接用项目案例把偏差-方差分解、过拟合诊断、交叉验证这些概念讲明白。学的时候我才发现,自己之前犯的错误被它当成反面教材讲了好几次:比如用随机裁剪改变目标尺度,却不保证验证集和测试集分布一致;再比如色彩抖动幅度过大导致模型过度依赖颜色而非形状。课程里还给出了一个检查清单--每次做计算机视觉的数据增强,要先列出真实场景的物理约束(摄像头是否移动、光照变化范围、目标在画面中的尺度范围),再反过来约束变换参数。这个清单我现在每次训练前都会过一遍。课程价值笔记:如果你正在学计算机视觉或准备把图像模型落地,机器学习入门里关于数据预处理和过拟合诊断的两个小时内容,比在 Stack Overflow 上翻几十个帖子都管用。它不教你怎么调参,而是教你怎么建立一套“模型出错时不慌”的诊断框架。同时,课程配套的实验环境还给了免费的 CPU 算力资源,哪怕不用 GPU 也能跑通完整的数据管道和模型训练示例。这对我们这种预算紧张的小团队来说,简直是机器学习基础知识补课的最佳入口--不需要额外申请云资源,在课程内置的 Jupyter 里就能一遍遍修复自己犯过的错误。学完课程后的变化:从“试到对”变成“知道为什么对”补完这两门课后,最大的变化不是模型又涨了几个点,而是排查问题的速度从几天变成了几小时。上周团队在另一个计算机视觉场景里测试物体检测模型,线上突然出现某类标签置信度异常下降。换成以前,我大概率又要对着增强参数表一个个开关试。但这次我先用课程里教的机器学习基础诊断流程,拉出训练集和测试集上同一类别的特征分布,发现是训练数据里该类目标的尺度集中在 0.3~0.5,而线上场景里尺度多在 0.7 以上,属于典型的数据漂移。定位只用了 40 分钟,修改训练集的 mixup 策略和裁切范围后,模型恢复。实战心得:在计算机视觉项目中,八成以上的落地问题不是模型架构太旧,而是预处理与真实场景的鸿沟。补齐机器学习入门里的特征工程一致性思维,比盲目换更大的 backbone 更见效。另外,我还顺手学了亚马逊云科技的深度学习入门课程,里面用 PyTorch 从零搭建卷积神经网络的章节,让我终于搞懂了之前用 ResNet 时那些默认参数背后的含义。现在再看 torchvision 的预训练模型,不再是黑盒调参,而是能根据计算机视觉任务去调整输入尺寸和归一化方式,模型的收敛速度快了接近一倍。如果你也在折腾计算机视觉模型,这几条建议或许能帮你省几周时间把这次翻车和后续学习的过程总结成七条可执行清单,适合正在用计算机视觉做项目的初学者:数据增强永远从“最小必要”开始:先不加旋转、色彩抖动,等基线收敛后再逐项打开,每开一项就检查验证集和真实场景的指标偏差。训练和验证的归一化与缩放必须用同一套策略:任何裁剪、缩放操作,都要保证验证时的中心区域和关键特征不被破坏,否则指标全是幻觉。记录每次实验的增强参数和线上反馈:建一个实验表,把ColorJitter的brightness范围、裁切scale区间和最终召回率写在一起,几轮下来就能看出哪些是无效增强。补一门系统化的机器学习基础课:像亚马逊云科技的机器学习入门,把偏差-方差、过拟合、混淆矩阵、ROC 这些概念用项目串起来,遇到问题时能快速定位是数据问题还是模型问题,而不是拍脑袋试参数。学一点深度学习基础:深度学习入门课程里的 PyTorch 实践章节,可以帮助你理解卷积核、特征图、迁移学习的内部机制,未来调整 backbone 或裁剪通道时才有底气。用低成本资源反复练习:如果公司没有 GPU 预算,可以先在课程提供的 CPU 环境里跑小规模数据实验,把预处理和评估的流程走通,再上生产实例,这样每一分算力都花在刀刃上。定期复盘“模型失败现场”:每一次线上误判都是一份免费教材。对照机器学习基础里的过拟合诊断列表去分析,积累三五个案例后,直觉会比你预期的准很多。最后多说一句:如果你和我一样,学计算机视觉是半路出家,被逼着用最低成本搞定落地模型,那千万不要跳过机器学习入门这些基础课。我当初以为自己在 GitHub 上跑通 demo 就算懂了,结果被现实狠狠上了一课。系统补完基础之后,再看那些增强参数,不再是一串要猜测的数字,而是一套可以推导出结果的工程决策。这种掌控感,比模型涨几个点踏实得多。
返回列表