去年年底,一家华南的浮法玻璃厂找到我们。他们的生产线3.6米宽,日产玻璃约600吨,气泡、结石、锡缺陷是长期困扰的质量问题。但最头疼的不是缺陷本身——是质检。
他们的质检工段有8个灯检工,24小时三班倒,站在生产线的冷端用肉眼盯着玻璃看。玻璃以每分钟20多米的速度划过,人要盯着一个3.6米宽的透明平面找微小的气泡和结石。我试了一下,盯了5分钟眼睛就酸得不行。
结果是:出厂后客户投诉缺陷的频率一直降不下来,部分批次退货率到过8%。老板说了一句话让我印象很深——"同样的缺陷,客户那边用强光一看就发现了,我们这边就是看不出来。"
这篇文章记录我们怎么一步步把AI视觉检测方案装上去的。光学方案折腾了比较久,模型调了也有几轮,中间踩了不少坑。
一、现场情况摸底
先去生产线上看了两天。浮法玻璃的生产流程大致是:原料熔化→锡槽成型→退火窑→冷端切割→堆垛包装。我们做检测的位置在冷端,也就是玻璃已经冷却到接近室温、准备切割之前。
到现场后发现几个关键约束条件:
- 玻璃是透明的——这意味着传统的不透明表面打光方案完全不能用。气泡和结石在透射光下才能看清楚,但又要避免玻璃表面的反射光干扰
- 玻璃在持续运动——生产线速度约18-22米/分钟,不能停
- 缺陷尺寸差异大——气泡可以小到0.1mm,结石可以从0.3mm到几毫米不等,锡缺陷(锡沾在玻璃表面形成的光学畸变)更大一些但更难分辨
- 现场环境——玻璃生产线温度很高(即使冷端也有40多度),有玻璃粉尘,振动机架有一定的振动
- IT能力有限——工厂有一个IT兼设备维护师傅,懂一点网络但不了解AI
这些条件决定了:方案不能太贵(老板说先投十几万试水)、不能依赖人工调参、检测速度要跟上产线速度、设备要能适应高温粉尘环境。
二、方案设计
最终方案分三部分:光学采集系统、边缘AI推理、云端可视化管理。
光学方案——花时间最长的一环
玻璃缺陷检测的光学设计比普通视觉检测复杂得多。我们试了好几种方案:
第一次尝试:反射光方案。在玻璃上方打光,相机也朝下。结果玻璃表面反射太强,缺陷根本看不清,只能看到灯光倒影。否决。
第二次尝试:单侧透射光方案。把光源放在玻璃下方,相机在上方拍摄。气泡和结石在透射光下能看到了,但玻璃上下表面都有反射,形成伪影干扰。另外,3.6米宽的玻璃,要实现均匀的背光照明非常困难——LED面板做到这个宽度成本太高,而且热量大。
最终方案:暗场透射光 + 线阵相机。用特制的线光源从玻璃下方以一定角度打光,4K线阵相机在玻璃上方拍摄。线光源和相机同步运动(通过编码器),一行一行地扫描整个玻璃宽度。这个方案的优点是:
- 线阵相机分辨率高(单行约4096像素),3.6米宽的玻璃理论精度可达约0.1mm/像素
- 暗场设计:光线只在遇到缺陷(折射率变化)时才进入相机,背景是暗的,缺陷是亮的——信噪比高
- 线光源功率集中,比大面积LED面板功耗低很多,散热好处理
// 相机参数配置示例
camera_config = {
"sensor": "CMOS 4K line-scan",
"resolution": "4096 px",
"line_rate": "30 kHz",
"pixel_depth": "8-bit",
"trigger": "encoder quadrature A+B",
"exposure": "adaptive (10-50μs based on line rate)"
}
光源选型也试了几种。一开始用红色LED线光源(波长660nm),发现玻璃内部微小的气泡在红光下对比度不够高。换成了蓝色LED(470nm),短波长对微小缺陷的散射更敏感,气泡和结石的对比度明显好了。
边缘端——本地推理
在产线现场部署了一台边缘AI网关(自带NPU加速),承担:
- 接收线阵相机的图像流(每秒约30,000行,拼接成连续的图像条带)
- 实时运行缺陷检测模型(YOLOv8n,量化到INT8)
- 缺陷分类(气泡/结石/锡缺陷/划伤/其他)和位置标注
- 本地存储7天的检测记录
- 将检测结果摘要(缺陷坐标、分类、尺寸)上传云端
选择本地推理而非云端有两个原因:一是产线速度太快,云方案的网络延迟不可控;二是图像数据量太大(单条产线每天产生约2TB的原始图像数据),全传云端不现实。
云端——质检看板和数据分析
一个轻量级的Web看板,展示:
- 实时缺陷分布图(用玻璃平面图标注每个缺陷的位置和类型)
- 缺陷统计趋势(每班/每日的缺陷数量和分类占比)
- 质量日报自动生成
- 缺陷位置热力图(帮助工艺人员判断是哪个工位出的问题)
告警通过企业微信推送到质检主管和工艺工程师的手机。
三、实施过程
第一周:现场安装和打光调试
安装花了大概3天。最麻烦的是机械固定——线阵相机需要稳定的支架,而产线现有的机架有振动。我们做了一个独立的龙门架,把相机固定在龙门架上,与产线机架物理隔离。光源装在玻璃下方,同样独立支架。
编码器安装也折腾了一下。产线驱动辊的编码器信号不稳定,脉冲有抖动,导致图像拼接出现拉伸/压缩。解决方案是在从动辊(无滑差)上加装编码器,信号稳了很多。
// 编码器信号处理
# 原始编码器脉冲有约±3%的抖动
# 用滑动平均滤波器平滑
import numpy as np
class EncoderFilter:
def __init__(self, window_size=10):
self.buffer = []
self.window_size = window_size
def update(self, pulse):
self.buffer.append(pulse)
if len(self.buffer) > self.window_size:
self.buffer.pop(0)
return int(np.mean(self.buffer))
第二周:数据采集和标注
花了一周时间采集数据。生产线正常运行时采集了大约5000个带有缺陷的玻璃图像片段,另外采集了约2000个无缺陷的片段作为负样本。
标注是个苦活。让我印象比较深的一件事:有一个缺陷区域,我看着像气泡,工艺师傅看了一眼说"这是结石,不是气泡"。我问怎么区别,他说"气泡边缘是圆的亮的,结石边缘不规则而且偏暗"。后来我把这些细节写成标注规范,还拍了对比照片。
不同缺陷类型在图像上的特征总结:
- 气泡:圆形或椭圆形,边缘有亮环(折射光晕),内部较暗
- 结石:形状不规则,边缘模糊,内部有不透明颗粒感
- 锡缺陷:薄膜状,低对比度,呈现浅灰色雾状区域
- 划伤:细长的亮线,方向沿玻璃行进方向
标了大概3天,我眼都快花了。后来用了一个半自动标注工具——先跑一轮模型初筛,人工修正误检——效率高了不少。
第三周:模型训练和调优
选型上纠结了一下。一开始想用YOLOv8s(大一点精度更高),但在边缘AI网关的NPU上跑不到实时(目标:30fps以上)。换成YOLOv8n(nano版本),量化到INT8后单帧推理约15ms,可以达到约60fps的吞吐,满足产线的实时需求。
训练过程本身还算顺利,但有两个难题:
第一个:小目标检测。0.1mm的气泡在4096像素宽的图像中只占几个像素。YOLOv8n在这种极小目标上的召回率不高。我们加了两个改进:一是在预处理阶段用图像切片(将大图切成多个重叠的patch,每个patch单独检测然后合并结果),二是在训练时用了Mosaic增强和Copy-Paste增强来增加小目标的样本量。
第二个:缺陷种类不均衡。气泡占了约70%的缺陷样本,结石不到15%,锡缺陷更少。模型训练出来对气泡的召回率很高,但结石经常漏掉。我们用了Focal Loss替换默认的损失函数,同时对稀有类别的样本过采样。
# 训练配置要点
model: YOLOv8n
input_size: 640x640 (patches from 4096xN strips)
quantization: INT8 (RKNN)
loss: FocalLoss(alpha=0.25, gamma=2.0)
augmentation:
- Mosaic (scale 0.5-1.5)
- Copy-Paste (rare classes only)
- HSV jitter (hue=0.015, sat=0.7, val=0.4)
- Random perspective (strength 0.1)
第四周:现场联调和上线
把训练好的模型部署到边缘AI网关上,开始试运行。结果第一个小时就出了状况——误报率太高了,每分钟弹十几个告警。
排查发现两个原因:第一,玻璃表面有灰尘,模型把灰尘当成了缺陷;第二,玻璃边缘区域的照明不均匀,导致边缘部分有大量伪影。解决方案是在后处理阶段加了过滤逻辑——太小的检测框(小于3x3像素)直接过滤掉;玻璃边缘30mm区域降低检测灵敏度。
调整后误报率从每分钟十几个降到了每小时几个,基本可以接受。
教训:模型在实验室数据上表现好不等于在现场好用。环境光变化、玻璃厚度波动、表面脏污——这些在训练集里不可能完全覆盖,必须在现场边跑边调。
四、实际效果
系统上线跑了3个月后,我们统计了几个关键数据:
气泡检出率约98%,结石约88%,锡缺陷约82%。锡缺陷的检出率偏低,因为它对比度太低,后续我们换了更高分辨率的相机(6K线阵)来做锡缺陷的专项检测。
通过与客户退货数据的对比验证——过去每月平均收到3-4起缺陷投诉,系统上线3个月内只收到1起投诉(经核实是一个2mm的气泡,位于玻璃边缘的检测盲区)。
原来8个灯检工三班倒,现在只需要3个人做抽检复核。调整下来的员工转到了其他岗位,没有裁员。质检主管说"以前他们站着看8小时,现在坐着看屏幕,轻松多了"。
五、遇到的问题和解决办法
踩坑不少,挑几个印象深的:
1. 光源老化——蓝色LED衰减快
上线后第6周,发现检出率开始下降,调了模型也没用。排查了2天才找到原因——蓝色LED线光源的光强下降了约40%。蓝色LED本身的光衰比红色/白色快,加上产线环境温度高(40多度),加速了老化。解决办法:换成了更高等级的工业级LED线光源(恒流驱动+散热风扇+温度保护),并在系统中加入光源强度自动校准——每天开机时用一个标准反射板检测光强,低于阈值自动报警。
2. 玻璃品种变化导致误报
浮法玻璃有不同厚度(3mm、5mm、8mm、12mm),厚度不同,透光率和折射都不一样。换品种后,模型的误报率会短期升高。解决办法是给每个厚度规格单独建基线(在边缘AI网关上存了4套模型参数),在生产排程变更时自动切换。
3. 编码器打滑导致图像畸变
有一次生产速度从20米/分突然降到12米/分(工艺调整),从动辊编码器发生了轻微打滑,图像出现压缩。后来加了速度传感器做双重校验——如果编码器速度和测速轮速度偏差超过5%,自动做图像校正。
4. 操作工"不信机器"
刚开始质检主管不相信AI检测的结果。有一次系统检出一个小气泡,灯检工复核了3分钟才在半透明区域勉强看到。主管说"这东西比人眼还尖,那以后还要我们干嘛?"后来我们设计了一个"人机复核"流程——系统检出的缺陷在屏幕上标记出来,人工确认后才算正式记录。这样操作工从"被替代"变成"被辅助",态度转变了很多。
六、我的思考
这个项目做完,有几个感触比较深:
光学方案比模型重要。在很多AI视觉项目里,大家花大量时间调模型,但其实光学设计才是上限。光源角度不对,再好的模型也看不出缺陷。这个项目中,光学方案花了接近一半的时间。
透明物体的AI检测是个被低估的难题。玻璃、塑料薄膜、液体——这些透明介质的缺陷检测与不透明表面完全不是一回事。人眼尚且看不清,机器也不容易。但一旦光学方案对路了,AI反而比人眼稳定。
现场环境对设备的考验远超预期。高温、粉尘、振动、光源老化——这些问题在实验室里根本想不到。工业现场是设备和设备、设备和环境的博弈,AI只是其中一环。
信任比技术更难建立。操作工从怀疑到接受,花了大概两个月。不是靠讲道理,而是靠一次一次的实际验证——系统检出缺陷后,人工复核确认,不断积累信任。到第三个月,质检主管主动说"这个系统开一天的成本多少?能不能24小时开着?"
七、给你的建议
如果你也在考虑类似的项目:
- 先花时间把光学方案想清楚。透射光/反射光/暗场/明场——试错成本低的是方案,不是采购设备后才发现不对
- 留出足够的数据采集和标注时间。玻璃缺陷的种类多、特征差异大,标注质量直接影响模型效果
- 边缘端推理必须做量化,否则NPU发挥不了优势
- 光源老化是长期运行的常见问题,预留光强校准机制
- 别想着让AI完全替代人,先做"AI初筛+人工复核"的渐进模式,信任建立后再逐步自动化
- 玻璃厚度变化会导致模型性能波动,提前做多厚度适配