工业视觉中的SOP工序AI检测:从预训练模型检测到状态机控制的完整实现
工业视觉中的SOP工序AI检测:从预训练模型检测到状态机控制的完整实现
摘要:本文介绍苏州华镁莱电子科技有限公司开发的HML-Vision工业视觉检测系统中的SOP工序AI检测模块。该模块基于预训练模型+状态机技术,解决传统机器视觉无法处理"工序顺序"和"动作验证"的痛点。系统支持多步骤工序定义、连续帧确认防误判、动作验证模式、条件跳转等高级功能,已在电子制造产线实际部署,误判率<0.5%。
一、背景与痛点
在电子制造、食品加工、医药生产等行业,工序合规性检测是质量控制的核心环节。
传统方案的局限
| 方案 | 优点 | 缺点 |
|---|---|---|
| 人工巡检 | 灵活 | 成本高、易疲劳、难追溯 |
| 传统机器视觉 | 速度快 | 只能做"有无"检测,无法理解工序逻辑 |
| 普通目标检测 | 能识别物体 | 无法判断"先A后B"的工序顺序 |
典型场景
手机组装产线,工人需要按顺序执行:
- 取壳体 → 2. 安装主板 → 3. 连接电池 → 4. 拧紧螺丝 → 5. 盖上后盖
如果工人跳过了步骤2(忘记装主板),传统视觉系统无法发现,但SOP AI可以!
二、系统架构设计
整体架构
技术栈
- 前端:PyQt5 5.15.9(GPU指示灯、操作引导覆盖层)
- 推理:预训练模型 + PyTorch 2.0.1(支持.pt/.onnx/.hml加密格式)
- 状态机:自研SOPEngine(轻量级,无第三方依赖)
- 部署:Windows 10 + Python 3.10 + NVIDIA RTX 3060
三、核心算法详解
3.1 工序状态机设计
这是系统的核心,用三状态机精确控制工序流程:
python
复制
class StepStatus(Enum):
PENDING = "pending" # 等待执行
IN_PROGRESS = "active" # 执行中
COMPLETED = "completed" # 已完成
FAILED = "failed" # 失败(超时/违规)
class SOPEngine:
def __init__(self):
self.steps: List[SOPStep] = []
self.current_step_idx: int = 0
self.status = StepStatus.PENDING
def update(self, detections: List[Dict]) -> Tuple[str, Dict]:
"""
核心逻辑:根据检测结果更新工序状态
参数:
detections: AI模型检测结果 [{"class": "手", "bbox": [...], "conf": 0.95}, ...]
返回:
(status, info): 当前状态 + 详细信息
"""
current_step = self.steps[self.current_step_idx]
if current_step.step_mode == "normal":
# 普通模式:检测目标物体是否出现
target_detected = self._check_target(detections, current_step)
if target_detected:
self._hit_count += 1
# 连续帧确认(防误判)
if self._hit_count >= current_step.confirm_frames:
return self._advance_to_next_step()
else:
self._hit_count = 0 # 重置计数
elif current_step.step_mode == "action":
# 动作验证模式:检测"手"是否进入ROI区域
return self._verify_action(detections, current_step)
return ("in_progress", {})
创新点:
- 连续帧确认:
confirm_frames参数(默认1=即时确认,可设5=连续5帧确认),防单帧误判 - 动作验证模式:检测"手"的位置(而非目标物体),适用于目标被遮挡的场景
- 多ROI支持:
action_roi_list: [[x,y,w,h], ...],多区域分别验证
3.2 动作验证模式实现
这是本文的核心创新,解决"目标物体被手遮挡无法检测"的问题。
算法流程
1. AI模型检测出"手"的位置(bbox中心坐标)
2. 判断"手"是否进入预设ROI区域
3. 如果在ROI内,标记"动作已执行"
4. 连续N帧确认后,完成当前步骤
代码实现
python
复制
def _verify_action(self, detections: List[Dict], step: SOPStep) -> Tuple[str, Dict]:
"""
动作验证模式:检测"手"是否完成指定动作
适用场景:
- 目标物体被手遮挡(如"按按钮",按钮被手指挡住)
- 需要验证"人"的动作(而非物体状态)
"""
# 1. 找出检测到的"手"
hand_detections = [d for d in detections if d["class"] == step.action_class]
if not hand_detections:
return ("waiting", {"reason": "未检测到手"})
# 2. 获取手的重心坐标
hand_center = self._get_hand_center(hand_detections[0])
# 3. 检查是否在ROI内(支持多ROI)
for roi_idx, roi in enumerate(step.action_roi_list):
if self._point_in_roi(hand_center, roi):
self._action_roi_completed[roi_idx] = True
break
# 4. 所有ROI都完成?
if all(self._action_roi_completed):
self._hit_count += 1
if self._hit_count >= step.confirm_frames:
return self._advance_to_next_step()
return ("in_progress", {"completed_rois": self._action_roi_completed})
技术优势:
- 不依赖目标物体检测:即使按钮被手指完全遮挡,也能通过"手的位置"判断动作
- 多ROI支持:可定义多个区域(如"先按按钮A,再按按钮B")
- 可配置验证目标:
action_verify_target=False时,只验证动作,不验证结果
3.3 条件跳转(智能工序)
支持根据检测结果动态跳转到不同步骤:
python
复制
# 步骤配置示例
{
"step_id": "step_3",
"name": "安装电池",
"condition_goto": {
"电池_类型A": "step_4a", # 如果检测到"电池_类型A",跳到步骤4a
"电池_类型B": "step_4b", # 如果检测到"电池_类型B",跳到步骤4b
}
}
实现原理:
python
复制
def _check_condition_goto(self, detections: List[Dict]) -> Optional[str]:
"""检查是否满足 condition_goto 条件"""
current_step = self.steps[self.current_step_idx]
if not current_step.condition_goto:
return None
for det in detections:
class_name = det["class"]
if class_name in current_step.condition_goto:
target_step_id = current_step.condition_goto[class_name]
get_logger().info(f"条件跳转: {class_name} → {target_step_id}")
return target_step_id
return None
应用场景:
- 多产品混线生产:根据型号自动跳转不同工序
- 异常处理:检测到NG品时,跳转到"返工"步骤
3.4 操作时长基线自学习
系统可自动学习每个步骤的正常操作时长,偏离基线时预警:
python
复制
def _update_baseline(self, step_idx: int, duration: float):
"""
更新操作时长的基线(前3轮学习,后续预警)
算法:
1. 前3次执行:收集数据
2. 计算均值 ± 2σ(95%置信区间)
3. 后续执行:如果 duration > mean + 2σ,预警"操作过慢"
"""
if step_idx not in self._baseline_data:
self._baseline_data[step_idx] = []
self._baseline_data[step_idx].append(duration)
# 至少3次数据才计算基线
if len(self._baseline_data[step_idx]) >= 3:
data = np.array(self._baseline_data[step_idx])
mean = np.mean(data)
std = np.std(data)
self._baseline_mean[step_idx] = mean
self._baseline_warn_threshold[step_idx] = mean + 2 * std
get_logger().info(f"步骤{step_idx}基线更新: 均值={mean:.1f}s, 预警阈值={mean+2*std:.1f}s")
价值:
- 工艺优化:发现哪个步骤耗时最长
- 异常预警:操作时间过长可能是"工人不熟练"或"工装设计不合理"
四、创新点总结
| 创新点 | 技术实现 | 价值 |
|---|---|---|
| 连续帧确认 | confirm_frames参数 + _hit_count计数器 | 误判率降低80% |
| 动作验证模式 | 检测"手"的位置(而非目标物体) | 解决遮挡问题 |
| 多ROI支持 | action_roi_list + _action_roi_completed字典 | 支持复杂工序 |
| 条件跳转 | condition_goto字典 + 动态步骤切换 | 支持柔性产线 |
| 基线自学习 | 前3轮学习 + 均值±2σ预警 | 工艺优化依据 |
| 视频证据保存 | 环形缓冲区60帧 + NG自动保存 | 质量追溯 |
五、实际部署效果
案例:某电子厂手机组装产线
部署配置:
- 相机:海康威视MV-CE200-10GC(200万像素,10fps)
- 算力:NVIDIA RTX 3060(6GB显存)
- 模型:预训练模型(检测"手"、"主板"、"电池"、"螺丝"等8类)
效果数据:
| 指标 | 数值 |
|---|---|
| 检测精度 | 99.2% |
| 误判率 | <0.5% |
| 单帧推理时间 | 15ms(GPU) |
| 支持工序步骤数 | 最多20步 |
| 报警响应时间 | <200ms |
客户反馈:
"以前每个月有3-5起漏检事故,用了SOP AI后,半年零漏检。" —— 产线经理
六、代码开源(核心片段)
6.1 SOP引擎状态机
python
复制
# sop_engine.py(核心代码片段)
class SOPEngine:
"""SOP工序检测引擎(状态机实现)"""
def __init__(self, steps: List[Dict]):
self.steps = [SOPStep.from_dict(s) for s in steps]
self.current_step_idx = 0
self._hit_count = 0
self._action_roi_completed = {}
def process_frame(self, detections: List[Dict]) -> Dict[str, Any]:
"""
处理单帧检测结果
返回:
{
"status": "ok" | "ng" | "waiting" | "in_progress",
"current_step": 步骤名称,
"progress": "3/5" (第3步/共5步),
"alert": "超时预警" | None
}
"""
if self.current_step_idx >= len(self.steps):
return {"status": "completed", "progress": "完成"}
current_step = self.steps[self.current_step_idx]
# 检查超时
if self._is_timeout(current_step):
return {"status": "ng", "reason": "步骤超时"}
# 更新状态
status, info = self._update_step(detections, current_step)
return {
"status": status,
"current_step": current_step.name,
"progress": f"{self.current_step_idx + 1}/{len(self.steps)}",
"hit_count": self._hit_count,
"confirm_frames": current_step.confirm_frames
}
6.2 操作引导覆盖层(PyQt5实现)
python
复制
# sop_image_viewer.py(操作引导覆盖层)
class SOPImageViewer(QLabel):
"""SOP图像控件(带操作引导覆盖层)"""
def paintEvent(self, event):
"""重写paintEvent,绘制操作引导"""
super().paintEvent(event)
if not self._show_guidance:
return
painter = QPainter(self)
# 1. 绘制ROI区域(闪烁高亮)
if self._current_roi:
color = QColor(255, 0, 0, 100) # 红色,半透明
if int(time.time() * 2) % 2 == 0: # 每秒闪烁2次
color = QColor(255, 0, 0, 200)
painter.fillRect(self._current_roi, color)
# 2. 绘制箭头(引导工人操作)
if self._guidance_arrow:
self._draw_arrow(painter, self._guidance_arrow)
# 3. 绘制已完成步骤(绿色✓)
for idx, completed in self._step_completed.items():
if completed:
self._draw_checkmark(painter, idx)
七、总结与展望
本文贡献
- 提出一种基于预训练模型+状态机的SOP工序检测方法
- 创新动作验证模式,解决目标遮挡问题
- 实现条件跳转和基线自学习,支持柔性产线
未来工作
- 3D视觉融合:用深度相机检测"手"的Z坐标(判断是否"按下"动作)
- 边缘部署:用TensorRT优化预训练模型,部署到Jetson Orin
- 数字孪生:将工序数据实时同步到MES系统
八、参考资料
- 深度学习目标检测综述: https://github.com/ultralytics/ultralytics
- PyQt5官方文档: https://www.riverbankcomputing.com/static/Docs/PyQt5/
- 工业视觉检测综述: 《机器视觉与自动化》, 2023
作者: 韩青松
单位: 苏州华镁莱电子科技有限公司
关键词:工业视觉检测、SOP工序检测、AI视觉检测、预训练模型、状态机、工序合规性、智能制造,工业4.0视觉检测方案、SOP工序AI检测系统、预训练模型工业应用、工序合规性检测、电子制造视觉检测、柔性产线AI检测、操作工序智能化、工业AI视觉方案,PyQt5工业应用、状态机控制、连续帧确认、动作验证模式、条件跳转、基线自学习、实时视频检测、PLC通信、工业相机集成,HML-Vision、华镁莱电子、工业视觉检测系统、SOP AI检测、智能制造解决方案
更多推荐
所有评论(0)