1. 项目背景与业务痛点
在电子制造业中,PCB板的焊点质量直接决定了产品的可靠性和使用寿命。传统的人工目检方式存在效率低下、漏检率高、缺陷类型复杂等问题。以某年产100万块PCB板的电子厂为例,每个板子平均包含50个焊点,全年需要检测5000万个焊点。人工检测每块板耗时2分钟,日均产能仅240块,远低于500块的需求量。更严重的是,15%的漏检率导致每年售后返工成本超过800万元。
焊点缺陷类型复杂多样,主要包括虚焊(30%)、连锡(25%)、漏焊(20%)、偏移(15%)和多余焊(10%)五大类。这些缺陷在视觉特征上存在相似性,比如虚焊和偏移都表现为焊料不足,人工检测时容易混淆。此外,人工记录缺陷位置不精确,难以追溯产线设备问题,比如无法准确判断是贴片机偏移还是回流焊温度异常导致的批量缺陷。
2. 技术方案设计
2.1 整体架构
项目采用"算法团队+业务团队"的双团队协作模式。算法团队负责CNN模型的训练和优化,业务团队负责系统集成和产线部署。整个系统分为数据采集层、算法层、服务层和应用层:
- 数据采集层:产线500万像素工业相机拍摄PCB板高清图像(4096×2160),通过Kafka实时传输至MinIO数据湖
- 算法层:基于PyTorch实现的ResNet-18迁移学习模型,完成图像预处理、数据增强、模型训练和评估
- 服务层:Go语言实现的缺陷检测API服务,加载TensorRT加速后的模型进行实时推理
- 应用层:React前端展示检测结果,PLC控制系统实现自动分拣,Prometheus监控系统跟踪关键指标
2.2 CNN模型选型
选择ResNet-18作为基础模型主要基于以下考虑:
- 深度适中:18层网络在计算资源和模型性能间取得平衡,适合工业场景的实时性要求
- 残差连接:有效缓解深层网络的梯度消失问题,提升训练稳定性
- 预训练优势:ImageNet预训练权重已学习通用图像特征,适合迁移学习
- 工业验证:在多个工业视觉检测项目中表现稳定,社区支持完善
针对焊点检测任务,我们对原始ResNet-18做了三点改进:
- 冻结前4层卷积参数,保留通用边缘检测能力
- 替换最后的全连接层,输出6个类别(5种缺陷+正常)
- 在倒数第二层添加Dropout(0.5)防止过拟合
3. 数据准备与处理
3.1 原始数据特点
原始数据来自产线实际生产,包含两部分:
- PCB板图像:JPG/PNG格式,分辨率4096×2160,命名规范为"PCB_日期_序列号.jpg"
- 缺陷标注:CSV文件记录每张图像的缺陷类型、边界框坐标和是否缺陷标记
数据存在三大问题:
- 噪声干扰:灰尘、反光、阴影等影响图像质量
- 尺寸不一:不同产线相机拍摄的图像分辨率不一致
- 标注缺失:部分缺陷样本未正确标注,尤其是虚焊这类不明显缺陷
3.2 数据清洗流程
清洗流程通过image_cleaning.py脚本实现,关键步骤包括:
- 图像质量过滤:计算拉普拉斯方差,剔除方差<100的模糊图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) laplacian_var = cv2.Laplacian(gray, cv2.CV_64F).var() if laplacian_var < 100: logger.warning(f"图像模糊(方差={laplacian_var}):{img_path},跳过")- 尺寸归一化:将所有图像resize到1024×768,统一为RGB格式
img_resized = cv2.resize(img, (1024, 768)) img_rgb = cv2.cvtColor(img_resized, cv2.COLOR_BGR2RGB)- 标注修正:检查边界框是否超出图像范围,进行截断处理
x = max(0, min(x, w-1)) y = max(0, min(y, h-1)) bw = min(bw, w-x) bh = min(bh, h-y)3.3 数据增强策略
针对小样本缺陷(如虚焊),采用多种增强方式扩充样本:
- 几何变换:随机旋转(±15°)、水平翻转、小尺度平移缩放
- 光度变换:亮度调整(±20%)、对比度变化
- 噪声注入:高斯噪声(σ=0.01~0.05)
使用Albumentations库实现增强管道:
transform = A.Compose([ A.RandomRotate90(p=0.5), A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(brightness_limit=0.2, p=0.5), A.GaussNoise(var_limit=(0.01, 0.05), p=0.3), A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.1, rotate_limit=15, p=0.5) ])增强后数据集扩大3倍,各类缺陷样本数量趋于平衡。数据按7:2:1划分训练集、验证集和测试集。
4. 模型训练与优化
4.1 模型架构实现
基于PyTorch实现自定义PCBDefectCNN类,核心结构如下:
- 加载预训练ResNet-18:
self.base_model = resnet18(weights=ResNet18_Weights.DEFAULT)- 冻结浅层参数:
for param in list(self.base_model.parameters())[:-10]: param.requires_grad = False- 替换全连接层:
self.base_model.fc = nn.Sequential( nn.Linear(in_features, 256), nn.ReLU(), nn.Dropout(0.5), nn.Linear(256, num_classes) )4.2 训练配置
- 损失函数:加权交叉熵损失,给缺陷类更高权重(正常:缺陷=1:2)
criterion = nn.CrossEntropyLoss(weight=torch.tensor([1.0, 2.0, 2.0, 2.0, 2.0, 1.0]))- 优化器:AdamW(lr=0.001,weight_decay=1e-4)
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=1e-4)- 数据加载:batch_size=32,图像resize到224×224并归一化
transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])4.3 训练过程监控
使用MLflow跟踪训练指标,关键策略包括:
- 早停机制:当验证集准确率连续5个epoch不提升时停止训练
- 模型保存:只保留在验证集上表现最好的模型权重
- 指标记录:每epoch记录训练loss和验证准确率
训练曲线显示,模型在30个epoch后收敛,最佳验证准确率达到98.7%。各类缺陷的召回率如下:
- 虚焊:96.5%
- 连锡:98.2%
- 漏焊:97.8%
- 偏移:95.3%
- 多余焊:98.6%
5. 系统部署与集成
5.1 模型服务化
将训练好的.pt模型转换为TensorRT引擎,通过Go语言实现高性能API服务:
- 模型加载:
modelPath := "s3://pcb-factory-models/pcb_defect_cnn_best.pt" loadedModel, err := torchscript.Load(modelPath)- 图像预处理:
// 伪代码:实际使用OpenCV实现 inputTensor := preprocessImage(img) // 输出3×224×224张量- API接口设计:
type DefectResponse struct { ImagePath string `json:"image_path"` DefectType string `json:"defect_type"` Confidence float64 `json:"confidence"` Bbox []int `json:"bbox"` IsDefective bool `json:"is_defective"` }5.2 产线集成方案
- 图像采集:工业相机触发拍照,通过Kafka传输图像到MinIO
- 检测流程:质检系统调用检测API,平均响应时间<200ms
- 结果展示:React前端实时显示检测结果和缺陷位置
- 自动分拣:PLC接收is_defective信号,控制机械臂剔除缺陷板
5.3 监控与迭代
- 实时监控:Prometheus采集漏检率、检测耗时等指标
- 告警规则:连续3天漏检率>2%触发模型重训
- 持续迭代:每月分析缺陷分布,针对性补充训练数据
6. 实施效果与经验总结
6.1 效果对比
| 指标 | 人工检测 | CNN检测 |
|---|---|---|
| 检测速度 | 2分钟/板 | 5秒/板 |
| 日均产能 | 240块 | 1200块 |
| 漏检率 | 15% | 1.8% |
| 年返工成本 | 800万元 | 96万元 |
6.2 关键经验
- 数据质量决定上限:清洗环节剔除30%的低质量图像,提升模型鲁棒性
- 小样本增强技巧:对虚焊这类难样本,采用更高强度的几何变换
- 工业部署要点:模型转换为TensorRT引擎,推理速度提升4倍
- 持续迭代机制:建立漏检样本自动收集流程,每月更新模型
6.3 常见问题解决
- 误检问题:通过调整缺陷类别的损失权重,平衡精确率和召回率
- 推理延迟:使用TensorRT优化模型,batch_size=32时延迟<50ms
- 设备差异:对不同产线相机单独做白平衡校准,消除色偏影响
在实际部署中,我们发现模型对反光较强的焊点容易出现误判。通过增加镜面反射样本的训练数据,并将输入图像从RGB转为HSV色彩空间,该问题得到显著改善。另一个实用技巧是在模型输出层添加温度缩放(Temperature Scaling),使预测置信度更准确,减少低置信度误报。