人工缺陷分类每天300片看花眼:我用CNN实现了自动分类
人工缺陷分类每天300片看花眼:我用CNN实现了自动分类
【摘要】缺陷分类原来靠人工看显微镜,每天300片晶圆,检验员眼睛都看花了,错误率高达8%。最严重的一次是漏检,整批退货。我花了3个月训练CNN缺陷分类模型,准确率95%,速度是人工的10倍,把检验员从繁重工作中解放出来。
一、痛点:检验员看缺陷看到怀疑人生
标注标准定义非常详细:颗粒污染是直径大于5微米的非晶态异物;划痕是长度超过100微米的线性痕迹;薄膜脱落是面积超过0.1平方毫米的膜层剥落;裂纹是穿透膜层的线性缺陷。每个标准都有参考图片对照,确保标注一致性。标准清晰是标注质量的基础。
类别不平衡是主要挑战:"颗粒污染"占50%以上样本,"针孔"只占5%。用了两种方法:一是SMOTE过采样对少数类增强,二是类别权重让模型更关注少数类。两种方法结合后,少数类召回率从60%提升到85%。不平衡数据的处理是CV项目的关键技术点。
建立了模型监控机制:每周跑混淆矩阵分析,某类缺陷准确率下降超过5%立即触发重新训练。保留人工标注员,从"全量标注"变为"模型质控",工作压力大幅降低。人机协作是最优解——让AI处理简单重复,人处理复杂疑难。
最意外的发现是模型的"超能力":它能识别出人类标注员都看不出的缺陷模式。分析发现是模型学到了特定光照条件下的微弱信号。帮助拦截了3批原本会被漏检的晶圆。AI能捕捉到人眼难以感知的细节,这是最让我兴奋的应用价值。
缺陷分类是FAB质量控制的关键环节。我厂原来靠人工看显微镜分类,每天300片晶圆、每片几百个缺陷,检验员眼睛都看花了,错误率高达8%。我花了3个月训练了一个CNN缺陷分类模型,准确率95%,速度是人工的10倍,把检验员从繁重工作中解放出来。
人工分类的三大问题:一是疲劳误判——连续看2小时后眼睛疲劳,误判率明显上升;二是标准不统一——不同检验员对同类缺陷的判断有差异;三是效率低——300片/天的分类量,检验员每天加班还是积压。
最严重的一次是漏检:某批次晶圆有一类特殊缺陷,检验员漏掉了,出货后被客户发现,整批退货。那次事件后我下定决心必须上AI分类系统。
二、技术:ResNet50迁移学习方案
技术方案:用迁移学习方法,基于预训练的ResNet50,在缺陷图像数据集上微调。数据集包含8类缺陷:颗粒污染、划痕、薄膜脱落、针孔、气泡、裂纹、残胶、异物,每类约2000张标注图片。模型在验证集上准确率95%,单张图片推理时间50ms,满足生产节拍要求。
数据标注是最大的工作量。我找了3名资深检验员组成标注小组,用两周时间标注了16000张图片。标注质量用交叉验证保证:每张图由2人分别标注,不一致的由第3人仲裁。标注过程也让我发现了问题:有些缺陷类型之间界限模糊,需要更细的分类标准。
训练策略:先用ImageNet预训练权重初始化,只训练最后一层(全连接层)2个epoch,再放开全部层训练5个epoch,学习率从1e-3逐步降到1e-5。数据增强用了随机翻转、随机旋转、颜色抖动,提升模型泛化能力。
三、落地:从模型到生产系统
部署过程的关键点:一是数据安全,缺陷图像是敏感数据,模型必须本地部署,不能上云;二是实时性,检验节拍要求推理时间<100ms;三是可解释性,工程师需要知道模型为什么这么分类,不能是黑箱。
我选择把模型部署在检验机台的工控机上(Intel i5 CPU,无需GPU),用ONNX Runtime加速推理。50ms/张的速度意味着每分钟可以处理1200张图片,完全满足300片/天的检验量(每片平均400个缺陷点)。

上线后检验员的工作方式改变了:原来做全量检验,现在做异常复核——AI判断没问题的直接过,AI标记异常的才需要人工复核。检验员从每天盯显微镜8小时,变成每天复核AI标出的异常2小时。检验效率提升10倍,误判率从8%降到2%。
四、模型优化:从95%到98%的实战经验
上线3个月后,模型准确率从95%提升到了98%,主要靠三招:
第一招:持续学习。把每次人工复核的结果作为新的训练样本,每周重新训练一次模型。模型越训越准,特别是对于那些容易混淆的缺陷类型(比如划痕和裂纹),随着样本增多区分能力明显提升。
第二招:难例挖掘(Hard Example Mining)。每周跑一次混淆矩阵分析,找出错误率最高的缺陷类型组合(比如颗粒误判为异物),然后针对性地补充这类样本。用了这个方法后,模型在困难类别上的准确率从88%提升到了95%。
第三招:模型集成。训练了3个不同架构的模型(ResNet50、EfficientNet-B0、ConvNeXt-Tiny),推理时用投票机制综合三个模型的预测结果。集成后准确率比单个模型提升了1.5%,而且对不确定样本的识别能力更强——当三个模型预测不一致时,系统自动标记为需要人工复核。
【效果对比】
【实战代码】
import torch, torchvision
# Load pretrained ResNet50
model = torchvision.models.resnet50(pretrained=True)
model.fc = torch.nn.Linear(2048, 8) # 8 defect classes
# Phase 1: freeze backbone, train classifier
for param in model.parameters():
param.requires_grad = False
model.fc.weight.requires_grad = True
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)

# Training loop - phase 1
for epoch in range(2):
for images, labels in train_loader:
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
==================================================
讨论
你们FAB的缺陷分类是怎么做的?
AI缺陷分类落地有哪些坑?
==================================================
==================================================
VIP资源
更多半导体FAB工具在博客VIP专区免费下载
==================================================
关注我,获取更多半导体智能制造实战笔记!





