3、AI识别结果的数据结构:分类、检测、分割等模型输出格式,置信度、坐标、类别标签等关键字段解析
在智慧工厂的AI+PLC联动场景中,AI视觉模型的输出并非“告诉PLC有没有问题”这么简单。PLC需要根据AI返回的结构化数据来决定执行何种控制逻辑——是停机、报警、剔除,还是仅记录。如果PLC工程师不理解AI输出的数据结构,就无法正确解析坐标、置信度与类别标签,更无法设计出可靠的安全联锁策略。本章将系统拆解分类、检测、分割三大类模型的输出格式,深入解析置信度、边界框坐标、类别标签、掩码等关键字段的工程含义,并给出从AI输出到PLC控制信号的映射方法。
上图展示了从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),说明模型对输入图像存在歧义。
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需要根据业务规则决定优先级。例如:
- 最高置信度优先:取置信度最高的检测结果作为主报警信号。
- 区域优先级:若缺陷位于关键安全区域(如齿轮啮合处),即使置信度较低也优先报警。
- 数量统计:统计缺陷总数,超过设定阈值(如5个)触发批量剔除。
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用途 |
|---|---|---|
| 缺陷面积 | 掩码像素数 × 像素物理尺寸² | 超过设定面积阈值则停机 |
| 缺陷中心 | 掩码质心坐标 | 判断是否在安全区域外 |
| 缺陷长宽比 | 最小外接矩形的宽高比 | 区分裂纹(细长)与污渍(圆形) |
| 缺陷方向角 | 主惯性轴角度 | 判断裂纹是否沿应力方向 |
3.4 从AI输出到PLC信号的映射方法
核心原理:PLC无法直接消费JSON或数组,需要将AI输出转换为基本数据类型(BOOL、INT、REAL)写入PLC的DB块或M区。映射过程包括三个步骤:数据解析→阈值判断→信号生成。
标准映射流程:
- 数据解析:中间层(如C++/Python程序)接收AI推理结果,提取类别、置信度、坐标等字段。
- 阈值判断:根据业务规则生成布尔信号。例如:
is_defect = (confidence > 0.85) AND (class_id != 0)。 - 信号生成:将布尔信号写入PLC地址。常用方式包括:
- Modbus TCP:写入保持寄存器,如
HR1 = 1表示有缺陷。 - Profinet IO:直接映射到PLC输入映像区。
- OPC UA:写入节点变量,适合复杂数据结构。
- Modbus TCP:写入保持寄存器,如
// 中间层映射代码示例(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.0 | BOOL | 有缺陷(任意类别) | 检测列表非空 |
| DB10.DBW2 | INT | 缺陷总数 | len(detections) |
| DB10.DBD4 | REAL | 最高置信度 | max(confidence) |
| DB10.DBD8 | REAL | 最大缺陷面积 | 分割掩码面积 |
| DB11.DBX0.0 | BOOL | 紧急停机信号 | 关键缺陷且面积超阈值 |
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。
分析判断过程:
- 瓶颈定位:延迟主要消耗在JSON解析(约80ms)和PLC浮点运算(约50ms)。
- 优化方案:将中间层改为C++实现,使用Protobuf替代JSON,解析时间降至15ms;同时将阈值判断和坐标换算全部放在中间层,PLC仅接收3个BOOL信号(漏焊、桥连、虚焊)和1个INT信号(缺陷总数)。
- 安全策略:对于“虚焊”这类低置信度缺陷(通常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;
}
结果对比:
| 指标 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 端到端延迟 | 450ms | 165ms | 63%↓ |
| 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仅接收面积、中心点等标量特征。