实战项目:工业缺陷检测
引言
你有没有想过,手机屏幕、汽车零件、药片这些产品在出厂前,是怎么被逐一检查有没有瑕疵的?靠人眼?一天看几万个零件,难免会眼花。更何况,有些缺陷比头发丝还细。
工业缺陷检测就是用机器代替人眼,24小时不间断地去“找茬”。它背后靠的不是魔法,而是计算机视觉和深度学习。这篇文章就是给开发者准备的“找茬指南”,重点解决一个特别常见的难题:正常样本多到用不完,缺陷样本却凤毛麟角。这种场景在行业里叫异常检测。
我们会从传统方法聊起,一直讲到卷积自编码器这种深度学习方案,还给出可以直接跑的 PyTorch 代码和部署思路。无论你是刚入门,还是正打算把模型跑在产线上,希望这篇文章都能帮到你。
📂 所属阶段:第二阶段 — 深度学习视觉基础(CNN 篇)
🔗 相关章节:实战项目一:智能人脸考勤系统 · 实战项目三:自动驾驶感知
1. 工业缺陷检测是什么
简单说,就是用摄像头拍下产品图像,然后用算法自动判断它是否合格。相比人工检测,机器不会累、标准统一,而且能留下完整的数据记录。
1.1 为什么工厂需要它?
- 质量更稳:人眼会有疲劳、情绪、经验差异,机器不会。算法一旦定好,对所有产品一视同仁。
- 省钱省时间:前期投入一笔开发成本,后期可以省下大量质检人力;更重要的是,能在早期截住次品,避免后续返工或者召回造成的更大损失。
- 守护安全与品牌:一颗有缺陷的螺丝可能毁掉一台设备,一批外观不良的产品可能砸了多年经营的招牌。
1.2 常见的缺陷长什么样?
在生产线上,缺陷五花八门,大致可以归为这几类:
- 表面缺陷:划痕、凹坑、污渍、裂纹、颜色不均。比如手机玻璃上的细微划痕。
- 结构/尺寸缺陷:尺寸超差、变形、缺料、内部气泡、材料分层。
- 装配缺陷:零件装错了位置、螺丝漏拧、焊点虚焊。
检测时最头疼的几个问题
- 光线和角度总在变:车间环境并不像实验室那样稳定,一天内亮度变化、产品摆放角度稍有不同,图像就可能差别很大。
- 缺陷太小、太像背景:比如带有木纹的地板上有一个小裂纹,肉眼都费劲,机器更难分辨。
- “次品”太少了:一条稳定产线上,可能 99.9% 都是正常品,缺陷样本一个月也攒不了几个。这让传统“看大量缺陷样本学习”的分类模型很难训练。
- 速度与精度要兼得:高速流水线上一秒钟过好几个产品,一张图的处理时间只有几毫秒,还得保持低误报率。
这些难点决定了我们不能用普通的“猫狗分类”思路去解决问题,而要采用异常检测的方法。
2. 核心技术:异常检测怎么玩?
核心逻辑其实不复杂:让模型只学习“正常产品长什么样”,然后凡是看起来不太对的,都归为异常。 就像我们只见过完整的苹果,突然出现一个带虫眼的,立刻就能意识到它不正常。
根据手头数据量的多少和产品图像的复杂程度,通常有两种做法。
2.1 传统方法:当数据不多、纹理简单时
如果你的产品纹理很规则(比如纯色金属片、简单图案的布料),而且正常样本只有几百或几千张,用传统的机器学习反而更省力,甚至不需要 GPU。
怎么做?
整体分三步:
- 提取特征:把每张图像转换成一串能描述“正常模样”的数字,比如纹理均匀度、颜色分布、边缘梯度等。
- 降维与标准化:把特征维度压一压,去掉冗余信息,并缩放到同一尺度。
- 训练异常检测模型:用“孤立森林”或“单类支持向量机”这类算法,在正常样本的特征空间中圈出一块“正常区域”。新来的样本如果掉到区域外,就是异常。
下面是一个可直接使用的 Python 实现,用到 scikit-image 和 scikit-learn:
💡 什么时候用它?
当你只有 CPU、数据量在几千张以内、产品纹理不复杂时,这套传统方案的性价比极高。你甚至可以不写深度学习框架的依赖,直接用打包工具部署。
2.2 深度学习方法:当数据多、纹理复杂时
如果产品表面本身就有复杂花纹(比如布面、印刷包装),传统人工设计的特征就很难覆盖所有“正常”变化。这时就需要卷积自编码器(Convolutional Autoencoder, CAE)出场了。
它为什么好用?
自编码器就像一个“记忆大师”,由两部分组成:
- 编码器:把输入图像一步一步压缩成一个浓缩的特征向量(好比只记关键信息)。
- 解码器:再从这个浓缩特征把图像“还原”出来。
如果只用正常品去训练它,那么解码器就只学会了“如何重建正常产品的样子”。当一个有缺陷的样本给进来时,解码器依旧会努力把它恢复成正常样貌,结果重建出来的图像和原图差别很大。我们只需要计算这个差别(重建误差),就可以判断是否存在缺陷。
用 PyTorch 从头实现
📌 训练小贴士:训练时只用正常图像,但最好留一小部分正常样本来设定阈值(如 95 分位数),这样误判率可控。
3. 从实验到产线:部署与优化
代码能跑只是第一步,真正上到流水线,还要考虑速度、稳定性和可维护性。
3.1 加速部署的实用技巧
- 量化模型:PyTorch 的
torch.quantization可以把模型从 32 位浮点数压缩到 8 位整数,体积缩小大约 4 倍,推理速度提升 2~3 倍,非常适合边缘设备。 - 缩小输入尺寸:如果 224×224 的细节对你分辨缺陷来说太“豪华”了,可以试试 128×128 甚至 96×96,速度会有肉眼可见的提升。
- 脱离 PyTorch 运行时:用
torch.onnx.export导出 ONNX 模型,再用 OpenCV DNN 或 ONNX Runtime 加载推理。这样一来,部署包只需要 OpenCV,干净利落。
3.2 一个简易的工业部署骨架
下面这个类演示了如何把训练好的检测器用在实际场景里:单张检测、数据库记录、实时视频流处理一应俱全。
4. 学习路线与总结
学习建议
- 先走通传统方案:不急着上深度学习,用孤立森林那套代码先看看你的产品图像能否被简单特征区分开。它可以帮助你快速理解异常检测的本质。
- CAE 是工业常用船票:当传统方法撑不住时,卷积自编码器通常是深度学习方案里最稳定、最易落地的起点。
- 数据质量比模型花哨更重要:尽可能收集不同光照、不同批次、不同角度的正常样本;少量缺陷样本只用来帮你验证阈值,不需要参与训练。
- 把鲁棒性当成第一指标:部署前一定要用强光、弱光、部分遮挡等极端图片反复测试。生产环境可不会跟你客气。
总结
工业缺陷检测的核心,其实就一句话:用最少的缺陷样本,解决最实际的生产问题。文中介绍的传统方法和卷积自编码器已经能覆盖大部分常见场景,而且实现和部署成本相对可控。搞定这些基础,你就有了快速出活的底气,之后再去挑战 VAE、GAN、PatchCore 等更高级的方法也不迟。

