news 2026/9/6 2:55:15

计算机视觉翻车实录:把检测当分类做,监督学习让我白标了5000张图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机视觉翻车实录:把检测当分类做,监督学习让我白标了5000张图

计算机视觉翻车实录:把检测当分类做,监督学习让我白标了5000张图

周一下午,我坐在工位上,看着标注平台里已经标到 4532 张的工业零件图片,手开始发抖。这些图片原本计划用监督学习训练一个分类模型,来检测计算机视觉中常见的表面划痕和凹陷。但我忽略了一个致命事实:生产线上随时可能出现从未见过的新型缺陷,分类模型根本兜不住。标注的成本已经烧掉了两个月的加班工时,模型召回率却还不到 60%。这时候我才想起团队老李说过的那句:“先把人工智能入门课程看完再选算法,比你闷头标图强十倍。”

这门人工智能入门我原以为是给纯小白看的,打开才发现它用一张问题类型决策树讲透了监督、无监督、强化学习的边界--正是我当时在计算机视觉项目里缺的那块拼图。如果早两个月看过,至少不会把需要无监督异常检测的任务,硬生生塞进监督学习的框里。

我以为所有图像问题都是分类问题

刚接手这条产线的缺陷检测项目时,我脑子里只有一个等式:计算机视觉= CNN + 大量标注。翻了两篇 ResNet 的论文,就认定一切问题都能抽象成“正常/划痕/凹陷”的多分类任务。

当时连机器学习基础都没吃透,只是看网上教程说用监督学习加 5000 张标注图,就能搞定工业检测。

我带着两个实习生连标了三周,把相机角度、光照变化、油污反光的情况都纳入了训练集。这个阶段我对计算机视觉的理解非常浅层:以为只要图片进网络、标签对齐,模型自然会学会“看”出缺陷。机器学习基础课程里反复强调的“假设前提”--训练集和真实分布一致--被我一扫而过。

# 最初的监督学习分类代码(过于天真) import torchvision.models as models model = models.resnet18(pretrained=True) num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, 3) # 正常、划痕、凹陷 criterion = torch.nn.CrossEntropyLoss() # 完全没考虑新类型缺陷出现时的泛化问题 optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

这套代码在验证集上跑到 97% 的准确率,上线头三天一切平静。直到第四天,一种从未标过的“涂层剥落”缺陷出现在摄像头上,模型把它稳稳地分进了“正常”。

混淆矩阵打脸:99%准确率全是假象

事故发生后我立刻拉了混淆矩阵来分析,发现“正常”类的精确率飙到 99%,但“划痕”和“凹陷”的召回率已经跌到 40% 以下。因为训练集中绝大部分是正常样本,模型只需把所有东西往“正常”里推,就能拿到漂亮的宏观指标。

没有混淆矩阵的逐类拆解,99% 这个数字差点让我错过产线停机的真正原因。

如果你正在用计算机视觉做质量检测,强烈建议把混淆矩阵的每一列都读一遍--机器学习课程里教过如何用热力图定位混淆最严重的类别,这种分析方法直接帮我锁定了数据不平衡的问题。但治标不治本,新缺陷永远在产生,监督学习的边标注边训练模式根本追不上产线变化。

这时我才开始正视另一个方向:深度学习中的无监督异常检测。深度学习入门课程里有一个用自编码器做重建误差检测的案例,我照着改了一版。

# 自编码器异常检测(重建误差过大视为缺陷) class Autoencoder(nn.Module): def __init__(self): super().__init__() self.encoder = nn.Sequential( nn.Conv2d(3, 16, 3, stride=2, padding=1), nn.ReLU(), nn.Conv2d(16, 32, 3, stride=2, padding=1), nn.ReLU(), ) self.decoder = nn.Sequential( nn.ConvTranspose2d(32, 16, 3, stride=2, padding=1, output_padding=1), nn.ReLU(), nn.ConvTranspose2d(16, 3, 3, stride=2, padding=1, output_padding=1), nn.Sigmoid() ) def forward(self, x): return self.decoder(self.encoder(x)) # 只用正常样本训练,重建误差阈值得反复调 anomaly_score = torch.mean((recon - input) ** 2, dim=[1,2,3])

这个模型不再依赖缺陷标签,理论上能揪出任何“不像正常样本”的图像。但数据预处理的坑又冒了出来:不同批次的零件表面反光程度不同,重建误差基线漂移严重,阈值一天一改。AWS 机器学习课程里专门有一节讲图像数据的标准化与增强,我照着把光照均衡化写进流水线后,误报率才从 23% 压到 8% 以内。

无监督学习怎么被我用到了真正的缺陷检测里

无监督学习最大的吸引力在于,它不需要成千上万张缺陷图就能启动。深度学习基础课程里反复强调的无监督学习两大武器--聚类与降维--被我搬到了计算机视觉的异常检测流水线中。

先用预训练 CNN 提取图像嵌入,再通过孤立森林对嵌入做异常评分,这是看完AWS深度学习课程中“模型组合”章节后的灵感。

具体流程是这样的:只用 800 张正常的零件图片训练一个轻量卷积网络作为特征提取器,不接分类头;然后将所有训练图像送入这个网络,得到 128 维的嵌入向量,导入 Scikit-learn 的 IsolationForest 做密度异常检测。上线后,新出现的涂层剥落、碎屑附着等未知缺陷,全部被高异常分拦截,召回率从之前分类模型的 58% 飙升到 92%。

# 使用特征提取 + 异常检测的无监督流水线 from sklearn.ensemble import IsolationForest import torch # 提取正常样本的嵌入 feature_model = torch.load('feature_extractor.pth') normal_embeddings = [] with torch.no_grad(): for img in normal_loader: emb = feature_model(img).numpy() normal_embeddings.append(emb) normal_embeddings = np.concatenate(normal_embeddings) # 训练孤立森林 clf = IsolationForest(contamination=0.05) clf.fit(normal_embeddings) # 推理时返回异常分数 scores = clf.decision_function(new_embeddings)

这次调整让计算机视觉检测流水线从“被动补标”变成了“主动发现”,标注量直接砍掉 70%--原来需要靠人眼从几千张图里找出缺陷,现在只需对异常分数高的图片复核即可。

画出问题类型决策树后,我再也没选错过算法

真正让我把概念吃透的,是回炉人工智能入门课程的那两个周末。课程里把机器学习问题按“是否有标签”“是否需要与环境交互”分成了清晰的三个大枝,我照这个思路给计算机视觉项目画了一张决策树:

  • 能用标签定义全部模式?→ 监督学习(如 OCR、已知缺陷分类)
  • 缺陷形态不可穷举、只有正常样本?→ 无监督学习(如表面异常检测)
  • 需要连续做决策(如自适应调参、动态跟踪)?→ 强化学习(如视觉伺服从调焦)

这张决策树后来挂在我们组的白板上,机器学习基础知识被压缩成一套可执行的选择逻辑,新人上手计算机视觉时先走一遍树,再决定用哪类算法。

同时我补了机器学习管道的完整流程:特征工程阶段,我会先用数据预处理把光照归一化,再用特征存储把中间嵌入固化,避免每次实验重新生成;模型上线后定期检查数据漂移,一旦重建误差基线偏移超过 15%,就触发重训。亚马逊云科技机器学习的课程案例里,把这些步骤串成了一个端到端的 MLOps 流水线,看完我才意识到,之前边标边练、无日志无版本的作坊式搞法,在任何正式计算机视觉系统里都是灾难。

给类似处境的人的建议

如果你也在计算机视觉里踩过算法选型的坑,下面 6 条建议或许能帮你省下几百小时:

  1. 先画问题类型决策树再动手--完整拆一遍人工智能基础里的监督/无监督/强化适用边界,每接到新的计算机视觉需求,先做问题分类。
  2. 别只盯混淆矩阵的准确率--把混淆矩阵的每一类召回、精确都拆开看,机器学习课程里这点强调过无数次。
  3. 用无监督学习兜底未知模式--在计算机视觉任务里,只要存在“你说不清楚的长尾缺陷”,就值得并行一套无监督方案;AWS深度学习课程的自编码器案例可以直接改。
  4. 把特征提取流水线固化,减少重复标注--用特征工程特征存储保存中间嵌入,避免每次换算法都重新处理图像,这是机器学习管道的核心思想。
  5. 数据预处理对抗光照和背景漂移--图像直方图均衡化、高斯模糊去噪,这些在AWS机器学习实验环境里都有现成模板。
  6. 定期检查数据漂移,别让模型悄悄地坏掉--这是机器学习基础里最容易忽视的一节,但恰好是计算机视觉系统长期稳定的命门。

回看最初那个白标 5000 张图的自己,问题不是不会写代码,而是压根没建立起“算法选型要先于模型调参”的认知。如果你也准备踏入计算机视觉这个方向,或者已经被监督、无监督、强化学习搞得一头雾水,人工智能入门课程里的那张决策树,可能就是让你节省两个月试错成本的第一步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 2:49:50

初中生停吃神经酸会反弹吗,回落了咋办?8款神经酸深度对比

一、停吃神经酸会不会回落,先弄清它是什么性质 吃了几个月,中间停了一阵,家长开始担心:是不是停了就掉回去、之前白吃了。有人问停吃后会不会回落。我把八款用脑营养产品按四个硬指标横评一遍,顺带把「停」这件事讲清&…

作者头像 李华
网站建设 2026/9/6 2:49:32

Godot GDScript初学者遇到的问题记录

添加全局单例设置时,不要在脚本中设置类名如果在脚本中定义了类名,类本身就是一个全局的类Godot中class_name与class 定义类的区别 两个都是定义类,但**注册范围、访问方式完全不一样: class_name是全局注册指令,把这个…

作者头像 李华
网站建设 2026/9/6 2:48:30

评科研 LLM/Agent:从读论文抽检到 ERA 树搜索写可计分实证软件

千笔-AIWritePaper https://www.aiwritepaper.com 「模型会不会做科学」很容易停在聊天印象:答对几道题、复述几段摘要。Google Research 在 ICTS 相关公开分享里强调另一条路:先评测模型在真实科研工作流上的缺口,再把算力花在可计分的实证…

作者头像 李华
网站建设 2026/9/6 2:43:40

ACM算法模板整理指南:从入门到实战的完整方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 2:37:19

基于中南大学FYT视觉24赛季自瞄开源的考核题

(AI辅助生成)1. 从图像到装甲板消息的完整链路题目:请结合本项目,说明一帧图像如何最终变成 armor_detector/armors 消息。每一步可能产生什么误检或漏检?追问:- binary_thres 调大或调小分别有什么影响?- 灯条颜色判断…

作者头像 李华