工业质检与图像瑕疵检测概述
工业质检是制造业生产流程中保障产品合格率的关键环节,过去主要依赖人工目视检查,存在效率低、主观误差大、人力成本高等问题。随着计算机视觉技术的发展,基于Python的图像瑕疵检测模型逐渐替代传统人工质检,能够实现对产品表面划痕、凹陷、异色等瑕疵的自动化识别,大幅提升质检效率和准确率。

图像瑕疵检测模型训练核心流程
1. 数据集准备与预处理
首先需要采集工业场景下的产品图像,包含正常样本和各类瑕疵样本,样本数量建议每类不少于1000张以保证模型泛化能力。采集完成后使用标注工具对瑕疵区域进行框选标注,生成对应的标注文件。
预处理步骤包括图像尺寸统一、归一化、数据增强等操作,数据增强可以通过旋转、翻转、亮度调整等方式扩充数据集,降低模型过拟合风险。以下是使用OpenCV进行图像预处理的示例代码:
import cv2
import numpy as np
import os
def preprocess_image(img_path, target_size=(224, 224)):
# 读取图像
img = cv2.imread(img_path)
if img is None:
raise ValueError("无法读取图像文件")
# 转换颜色空间为RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 调整尺寸
img = cv2.resize(img, target_size)
# 归一化到0-1范围
img = img.astype(np.float32) / 255.0
return img
def augment_image(img):
# 随机水平翻转
if np.random.rand() > 0.5:
img = cv2.flip(img, 1)
# 随机亮度调整
brightness = np.random.uniform(0.8, 1.2)
img = np.clip(img * brightness, 0, 1)
return img
# 批量处理图像示例
data_dir = "./dataset/images"
processed_images = []
for img_name in os.listdir(data_dir):
img_path = os.path.join(data_dir, img_name)
img = preprocess_image(img_path)
img = augment_image(img)
processed_images.append(img)
2. 模型选择与搭建
工业瑕疵检测常用模型分为两类,一类是以YOLO、Faster R-CNN为代表的目标检测模型,适合需要定位瑕疵位置的场景;另一类是以ResNet、EfficientNet为基础的分类模型,适合只需要判断产品是否合格的场景。这里以YOLOv5为例演示模型搭建流程。
首先克隆YOLOv5官方仓库并安装依赖,然后修改配置文件适配自定义数据集。以下是自定义数据集的配置示例:
# 自定义数据集配置文件 custom_data.yaml # 训练集和验证集路径 train: ./dataset/train/images val: ./dataset/val/images # 类别数量 nc: 3 # 正常、划痕、凹陷三类 # 类别名称 names: ["normal", "scratch", "dent"]
3. 模型训练与参数调优
完成配置后启动模型训练,训练过程中需要关注损失值变化和验证集准确率,核心可调参数包括学习率、批次大小、训练轮次等。学习率建议初始设置为0.001,批次大小根据显卡显存调整,训练轮次一般设置为50-100轮。
以下是启动YOLOv5训练的命令行示例和对应的Python调用代码:
import torch
from yolov5 import train
# 训练参数配置
train.run(
data="custom_data.yaml", # 数据集配置文件
weights="yolov5s.pt", # 预训练权重
epochs=50, # 训练轮次
batch_size=16, # 批次大小
learning_rate=0.001, # 初始学习率
device="0" # 使用第一张显卡训练
)
4. 模型评估与优化
训练完成后使用验证集评估模型性能,核心指标包括精确率、召回率、mAP等。如果模型在验证集上表现不佳,可以通过增加训练数据、调整模型结构、优化超参数等方式改进。以下是使用PyTorch计算分类模型精确率和召回率的示例代码:
from sklearn.metrics import precision_score, recall_score
# 真实标签和预测标签
true_labels = [0, 1, 1, 0, 1, 0]
pred_labels = [0, 1, 0, 0, 1, 1]
# 计算精确率和召回率
precision = precision_score(true_labels, pred_labels, average="macro")
recall = recall_score(true_labels, pred_labels, average="macro")
print(f"模型精确率: {precision:.4f}")
print(f"模型召回率: {recall:.4f}")
5. 模型部署与落地
模型评估达标后,需要将其部署到工业质检现场的设备中,常见部署方式包括使用TensorRT加速推理、封装为API接口供上层系统调用、嵌入到边缘计算设备等。以下是使用OpenCV加载训练好的模型进行实时推理的示例代码:
import cv2
import torch
# 加载训练好的模型
model = torch.hub.load("ultralytics/yolov5", "custom", path="best.pt")
# 实时推理示例
cap = cv2.VideoCapture(0) # 调用摄像头
while True:
ret, frame = cap.read()
if not ret:
break
# 模型推理
results = model(frame)
# 绘制检测结果
results.render()
# 显示画面
cv2.imshow("工业瑕疵检测", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
常见问题与解决方案
- 样本不均衡问题:可以通过过采样少数类样本、欠采样多数类样本、使用加权损失函数等方式解决
- 小目标瑕疵检测效果差:可以调整模型输入尺寸、使用特征金字塔结构、增加小目标样本数量
- 推理速度不满足产线要求:可以使用模型量化、剪枝、TensorRT加速等方式提升推理效率