工业视觉中的SOP工序AI检测:从预训练模型检测到状态机控制的完整实现

摘要:本文介绍苏州华镁莱电子科技有限公司开发的HML-Vision工业视觉检测系统中的SOP工序AI检测模块。该模块基于预训练模型+状态机技术,解决传统机器视觉无法处理"工序顺序"和"动作验证"的痛点。系统支持多步骤工序定义、连续帧确认防误判、动作验证模式、条件跳转等高级功能,已在电子制造产线实际部署,误判率<0.5%。


一、背景与痛点

在电子制造、食品加工、医药生产等行业,工序合规性检测是质量控制的核心环节。

传统方案的局限

方案优点缺点
人工巡检灵活成本高、易疲劳、难追溯
传统机器视觉速度快只能做"有无"检测,无法理解工序逻辑
普通目标检测能识别物体无法判断"先A后B"的工序顺序

典型场景

手机组装产线,工人需要按顺序执行:

  1. 取壳体 → 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", {})

创新点

  1. 连续帧确认confirm_frames参数(默认1=即时确认,可设5=连续5帧确认),防单帧误判
  2. 动作验证模式:检测"手"的位置(而非目标物体),适用于目标被遮挡的场景
  3. 多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)

七、总结与展望

本文贡献

  1. 提出一种基于预训练模型+状态机的SOP工序检测方法
  2. 创新动作验证模式,解决目标遮挡问题
  3. 实现条件跳转基线自学习,支持柔性产线

未来工作

  • 3D视觉融合:用深度相机检测"手"的Z坐标(判断是否"按下"动作)
  • 边缘部署:用TensorRT优化预训练模型,部署到Jetson Orin
  • 数字孪生:将工序数据实时同步到MES系统

八、参考资料

  1. 深度学习目标检测综述: https://github.com/ultralytics/ultralytics
  2. PyQt5官方文档: https://www.riverbankcomputing.com/static/Docs/PyQt5/
  3. 工业视觉检测综述: 《机器视觉与自动化》, 2023

作者: 韩青松
单位: 苏州华镁莱电子科技有限公司
 


 

 

关键词:工业视觉检测、SOP工序检测、AI视觉检测、预训练模型、状态机、工序合规性、智能制造,工业4.0视觉检测方案、SOP工序AI检测系统、预训练模型工业应用、工序合规性检测、电子制造视觉检测、柔性产线AI检测、操作工序智能化、工业AI视觉方案,PyQt5工业应用、状态机控制、连续帧确认、动作验证模式、条件跳转、基线自学习、实时视频检测、PLC通信、工业相机集成,HML-Vision、华镁莱电子、工业视觉检测系统、SOP AI检测、智能制造解决方案

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐