3、AI识别结果的数据结构:分类、检测、分割等模型输出格式,置信度、坐标、类别标签等关键字段解析

在智慧工厂的AI+PLC联动场景中,AI视觉模型的输出并非“告诉PLC有没有问题”这么简单。PLC需要根据AI返回的结构化数据来决定执行何种控制逻辑——是停机、报警、剔除,还是仅记录。如果PLC工程师不理解AI输出的数据结构,就无法正确解析坐标、置信度与类别标签,更无法设计出可靠的安全联锁策略。本章将系统拆解分类、检测、分割三大类模型的输出格式,深入解析置信度、边界框坐标、类别标签、掩码等关键字段的工程含义,并给出从AI输出到PLC控制信号的映射方法。

AI识别结果数据结构与PLC联动映射 模型输出层 分类:类别ID + 置信度 检测:类别 + 坐标 + 置信度 分割:掩码 + 类别 + 置信度 关键字段解析 置信度阈值过滤 坐标归一化与反算 类别标签映射表 PLC控制层 信号映射:BOOL/INT 安全联锁:急停/剔除 数据记录:JSON→DB 典型联动流程(以检测模型为例) ① 相机采集图像 ② AI推理输出JSON ③ 解析类别/坐标/置信度 ④ 阈值判断与坐标映射 ⑤ 生成PLC控制字 输出示例: {"detections":[ {"class":"scratch","conf":0.92, "bbox":[120,45,180,90]}]} → PLC地址 DB10.DBW0 := 1 (剔除)

上图展示了从AI模型输出到PLC控制信号的完整链路。实际工程中,AI推理结果通常以JSON或Protobuf格式传输,PLC无法直接解析复杂嵌套结构,因此需要中间层(如工控机或边缘网关)完成数据解析、阈值过滤和信号映射。下面逐一剖析三类模型的输出格式。

3.1 分类模型输出:类别ID与置信度的工程解读

核心原理:分类模型解决“这是什么”的问题,输出为概率分布向量。以ResNet-50为例,最后一层全连接输出N个类别的logits,经Softmax归一化后得到每个类别的概率值。工程中通常取最大概率对应的类别作为预测结果,该概率即为置信度。

// 分类模型输出示例(JSON格式)
{
  "task": "classification",
  "timestamp": 1698765432,
  "class_id": 3,
  "class_name": "surface_scratch",
  "confidence": 0.967,
  "all_probs": [0.001, 0.002, 0.03, 0.967, 0.0]
}

关键字段解析:

  • class_id:整数索引,对应训练时的类别编号。PLC侧需维护一张ID-含义映射表,例如0=正常、1=划痕、2=污渍、3=裂纹。
  • confidence:0~1之间的浮点数,表示模型对该预测的把握程度。工程中常设置双阈值:报警阈值(如0.8)和安全阈值(如0.95),低于报警阈值视为“不确定”,需人工复核。
  • all_probs:完整概率向量,用于调试和异常分析。若最高概率与次高概率接近(如0.45 vs 0.40),说明模型对输入图像存在歧义。
工程经验:不要直接使用原始置信度作为PLC联锁条件。建议在中间层做滞后比较——连续3帧均判定为同一缺陷且置信度均超阈值,才触发PLC报警,避免单帧误检导致频繁停机。

3.2 检测模型输出:边界框坐标与多目标处理

核心原理:目标检测模型(YOLO、Faster R-CNN等)输出多个目标的边界框(Bounding Box)、类别和置信度。每个检测结果包含4个坐标值,通常为归一化坐标(0~1之间)或像素坐标。YOLO系列默认输出归一化坐标(中心点x、中心点y、宽度w、高度h),需乘以图像宽高还原为像素值。

// 检测模型输出示例(YOLOv8格式)
{
  "task": "detection",
  "image_size": [1280, 960],
  "detections": [
    {
      "class_id": 2,
      "class_name": "missing_screw",
      "confidence": 0.93,
      "bbox": [0.45, 0.32, 0.12, 0.08],  // cx, cy, w, h (归一化)
      "bbox_pixel": [576, 307, 154, 77]   // 中间层换算后的像素坐标
    },
    {
      "class_id": 1,
      "class_name": "scratch",
      "confidence": 0.87,
      "bbox": [0.21, 0.65, 0.05, 0.15],
      "bbox_pixel": [269, 624, 64, 144]
    }
  ]
}

坐标字段的两种表达方式:

格式字段含义PLC侧处理典型应用
归一化坐标cx, cy, w, h ∈ [0,1]需乘以图像宽高,增加计算量模型原始输出,适合跨分辨率部署
像素坐标x_min, y_min, x_max, y_max可直接与ROI区域比较PLC区域判断,如是否在安全区域内
中心点+宽高cx, cy, w, h(像素)需换算为左上角坐标计算缺陷面积、中心偏移量

多目标处理策略:当一帧图像中出现多个缺陷时,PLC需要根据业务规则决定优先级。例如:

  1. 最高置信度优先:取置信度最高的检测结果作为主报警信号。
  2. 区域优先级:若缺陷位于关键安全区域(如齿轮啮合处),即使置信度较低也优先报警。
  3. 数量统计:统计缺陷总数,超过设定阈值(如5个)触发批量剔除。
风险提示:YOLO等模型默认使用NMS(非极大值抑制)去除重叠框,但NMS阈值设置不当会导致漏检。若PLC控制要求“一个缺陷都不能漏”,建议将NMS的IoU阈值从默认的0.45调低至0.3,并适当降低置信度阈值,以召回更多候选框。

3.3 分割模型输出:掩码数据与区域面积计算

核心原理:实例分割模型(Mask R-CNN、YOLOv8-seg)不仅输出边界框,还输出像素级掩码(Mask)。掩码通常以二值图像或多边形顶点形式表示。对于PLC控制,掩码的主要价值在于精确计算缺陷面积、形状和位置,而不仅仅是“有没有缺陷”。

// 分割模型输出示例(RLE编码掩码)
{
  "task": "segmentation",
  "image_size": [800, 600],
  "segments": [
    {
      "class_id": 4,
      "class_name": "oil_leak",
      "confidence": 0.91,
      "bbox": [200, 150, 350, 280],
      "mask_rle": "5J2e3g...",  // 游程编码,需解码
      "area_pixel": 12500,
      "area_ratio": 0.026  // 面积占比
    }
  ]
}

掩码的两种工程表达:

  • RLE(游程编码):压缩格式,适合网络传输,但PLC无法直接解析。需在中间层解码为二值数组。
  • 多边形顶点:以轮廓点集表示,适合计算几何特征(如最小外接矩形、圆度)。

面积计算与PLC联动:PLC通常不直接处理掩码,而是接收中间层计算后的标量特征:

特征计算方式PLC用途
缺陷面积掩码像素数 × 像素物理尺寸²超过设定面积阈值则停机
缺陷中心掩码质心坐标判断是否在安全区域外
缺陷长宽比最小外接矩形的宽高比区分裂纹(细长)与污渍(圆形)
缺陷方向角主惯性轴角度判断裂纹是否沿应力方向
实战场景:某汽车零部件厂使用分割模型检测密封圈表面缺陷。原始输出为RLE掩码,中间层解码后计算缺陷面积。PLC设定两级阈值:面积>5mm²触发报警,面积>20mm²触发紧急停机。通过将面积计算放在中间层,PLC仅需比较一个浮点数,响应时间从原来的120ms降至15ms。

3.4 从AI输出到PLC信号的映射方法

核心原理:PLC无法直接消费JSON或数组,需要将AI输出转换为基本数据类型(BOOL、INT、REAL)写入PLC的DB块或M区。映射过程包括三个步骤:数据解析→阈值判断→信号生成。

标准映射流程:

  1. 数据解析:中间层(如C++/Python程序)接收AI推理结果,提取类别、置信度、坐标等字段。
  2. 阈值判断:根据业务规则生成布尔信号。例如:is_defect = (confidence > 0.85) AND (class_id != 0)。
  3. 信号生成:将布尔信号写入PLC地址。常用方式包括:
    • Modbus TCP:写入保持寄存器,如HR1 = 1表示有缺陷。
    • Profinet IO:直接映射到PLC输入映像区。
    • OPC UA:写入节点变量,适合复杂数据结构。
// 中间层映射代码示例(Python伪代码)
def map_to_plc(detections, plc_writer):
    # 1. 过滤低置信度检测
    valid = [d for d in detections if d['confidence'] > 0.85]
    
    # 2. 生成控制信号
    has_critical_defect = any(d['class_id'] in [2, 3] for d in valid)
    defect_count = len(valid)
    max_conf = max([d['confidence'] for d in valid], default=0)
    
    # 3. 写入PLC(示例:DB10.DBW0=缺陷计数,DB10.DBX2.0=关键缺陷标志)
    plc_writer.write_int('DB10.DBW0', defect_count)
    plc_writer.write_bool('DB10.DBX2.0', has_critical_defect)
    plc_writer.write_real('DB10.DBD4', max_conf)

信号映射表设计:

PLC地址数据类型含义AI输出来源
DB10.DBX0.0BOOL有缺陷(任意类别)检测列表非空
DB10.DBW2INT缺陷总数len(detections)
DB10.DBD4REAL最高置信度max(confidence)
DB10.DBD8REAL最大缺陷面积分割掩码面积
DB11.DBX0.0BOOL紧急停机信号关键缺陷且面积超阈值
常见误区:直接将AI输出的浮点置信度写入PLC的REAL变量,然后在PLC中做比较。这会导致两个问题:一是PLC的浮点运算周期较长(约10ms),影响响应速度;二是PLC程序复杂化,不利于维护。正确做法是在中间层完成所有判断,PLC只接收最终布尔或整型信号。

3.5 案例拆解:PCB缺陷检测的完整数据链路

背景与约束:某电子制造厂需要检测PCB板上的焊点缺陷,包括漏焊、桥连、虚焊三类。产线速度1.2m/s,相机采集频率30fps,PLC扫描周期5ms。要求从图像采集到PLC执行剔除动作的总延迟不超过200ms。

初始现象与目标:初期直接使用YOLOv5输出原始JSON,PLC通过以太网接收后解析,实测延迟达450ms,无法满足产线速度。目标是将延迟压缩至200ms以内,并确保缺陷漏检率<0.1%。

关键输入数据:

  • 模型输出:每帧约3~8个检测结果,每个结果含class_id、confidence、bbox(归一化)。
  • 图像分辨率:1280×960,像素物理尺寸0.05mm/pixel。
  • PLC型号:西门子S7-1500,支持Profinet IRT。

分析判断过程:

  1. 瓶颈定位:延迟主要消耗在JSON解析(约80ms)和PLC浮点运算(约50ms)。
  2. 优化方案:将中间层改为C++实现,使用Protobuf替代JSON,解析时间降至15ms;同时将阈值判断和坐标换算全部放在中间层,PLC仅接收3个BOOL信号(漏焊、桥连、虚焊)和1个INT信号(缺陷总数)。
  3. 安全策略:对于“虚焊”这类低置信度缺陷(通常0.7~0.85),采用连续2帧确认机制,避免单帧误报。

实际操作步骤:

// 中间层核心逻辑(C++伪代码)
struct PlcOutput {
    bool missing_solder;
    bool bridge;
    bool cold_solder;
    int total_defects;
};

PlcOutput process(const DetectionResult& result) {
    PlcOutput out = {};
    for (const auto& det : result.detections) {
        if (det.confidence < 0.75) continue;  // 低置信度过滤
        switch (det.class_id) {
            case 1: out.missing_solder = true; break;
            case 2: out.bridge = true; break;
            case 3: 
                if (det.confidence > 0.85) out.cold_solder = true;
                break;  // 虚焊需更高阈值
        }
        out.total_defects++;
    }
    return out;
}

结果对比:

指标优化前优化后提升幅度
端到端延迟450ms165ms63%↓
PLC程序复杂度高(需解析JSON)低(仅读BOOL)—
漏检率0.3%0.08%73%↓
CPU占用率(中间层)85%32%—

风险与代价:中间层C++开发周期约2周,需额外维护一套代码库。但换来的是系统稳定性和响应速度的显著提升。复盘经验:AI+PLC联动的核心不是AI模型本身,而是数据转换层的设计——将复杂的AI输出“降维”为PLC能快速响应的简单信号,是工程落地的关键。

3.6 常见误区与总结复盘

误区一:忽略坐标系的统一。相机安装位置、图像坐标系、PLC坐标系(如传送带位置)三者若不统一,会导致缺陷定位偏差。例如,图像中心点坐标需转换为传送带上的物理位置,需考虑相机标定参数和传送带编码器读数。

误区二:置信度阈值设置不当。阈值过高导致漏检,过低导致频繁误报。建议使用动态阈值:根据当前生产批次的质量要求调整。例如,新品试产阶段阈值设为0.9,量产稳定后降至0.8。

误区三:忽视时间戳同步。AI推理结果与PLC执行动作之间有时间差,若传送带速度波动,可能导致剔除位置偏移。解决方案是在AI输出中附带图像采集时间戳,PLC根据编码器位置计算补偿量。

误区四:将所有数据都传给PLC。PLC的存储和通信带宽有限,应只传输控制所需的必要字段。例如,分割掩码的完整数据应保存在中间层或数据库,PLC仅接收面积、中心点等标量特征。

总结复盘:AI识别结果的数据结构设计直接影响PLC联动的可靠性。分类模型关注类别ID与置信度;检测模型需处理坐标归一化与多目标优先级;分割模型则要提取面积等几何特征。工程实践中,务必在中间层完成数据解析、阈值过滤和信号映射,让PLC只处理简单、确定的控制信号。同时,建立完善的日志记录机制,将AI原始输出、中间层处理结果和PLC动作全部关联存储,便于事后追溯和模型迭代。