训练 Segmenter
本指南演示如何设置和配置 OV80i 的分割功能,以自动检测、测量和分析零件中的特定特征或缺陷。当需要识别不规则形状、测量面积,或检测无法通过简单分类处理的特定模式时,请使用分割。
在开始之前
需要的条件
- OV80i 摄像机系统已设置并连接
- 具有要进行分割特征的测试零件(例如带铅笔痕迹的薄片)
- 适用于您特定应用的良好照明条件
- 15-20 张用于训练的样本图像
步骤 1:创建 Segmentation 配方
1.1 开始新配方
- 导航到 All Recipes 页面
- 点击
+ New Recipe
(右上角) - 输入配方名称: 使用描述性名称,例如 "Pencil_Mark_Detection" 或 "Surface_Defect_Segmentation"
- 选择配方类型: 从下拉菜单中选择 "Segmentation"
- 点击
OK
以创建
1.2 激活配方
- 在列表中找到您的配方(显示为 "Inactive")
- 点击
Actions > Activate
- 点击
Activate
以确认
✅ 结果: 配方现已激活,准备进行配置。
Step 2: 进入配方编辑器
- 点击已激活配方旁的
Edit
- **点击
Open Editor
以确认
您现在将看到包含分割相关选项的配方编辑器。
Step 3: 配置相机设置
3.1 打开 Imaging 配置
- 点击
Configure Imaging
(左下角)
3.2 为分割优化对焦
对焦对于准确边缘检测至关重要:
- 将待测件放置在相机视图中
- 调整对焦,直到边缘清晰锋利
- 使用不同零件进行测试,以确保在您的范围内对焦一致
提示
- 将焦点放在缺陷/特征将出现的表面
- 确保感兴趣区域的整个区域都处于清晰焦点
- 略微过度锐化比软焦更有利于分割
3.3 设置最佳曝光
适当的曝光可确保特征检测的一致性:
- 调整曝光以实现均衡照明
- 避免过曝区域(纯白区域)
- 确保特征在良好对比度下可见
分割曝光指南:
- 特征应与背景具有清晰对比
- 避免可能被误认为缺陷的阴影
- 使用各种零件条件进行测试(干净、脏、磨损)
3.4 配置 LED 照明模式
根据要分割的对象选择照明:
特征类型 | 推荐照明 | 原因 |
---|---|---|
表面缺陷 | 亮场 | 均匀照明显示表面不规则性 |
划痕/裂纹 | 侧光照明 | 投射阴影以突出线性缺陷 |
凸起特征 | 暗场 | 使凸起区域从背景中突出 |
液体溅洒 | 侧光照明 | 显示表面纹理差异 |
3.5 调整 Gamma 以增强特征
- 增大 Gamma 值 以提升特征与背景之间的对比度
- 在查看目标特征时测试不同取值
- 找到使特征最易分辨的设置
3.6 保存配置
- 在实时预览中查看设置
- 点击
Save Imaging Settings
✅ 检查点: 当对比度良好时,特征应清晰可见。
Step 4: Set Up Template and Alignment
4.1 转到 Template Section
在面包屑导航中点击 "Template Image and Alignment"
4.2 配置对齐(可选)
对于本示例,我们将跳过对齐:
- 选择
Skip Aligner
若零件位置一致 - 点击
Save
何时使用对齐器: 当零件以不同的位置或方向到达,可能影响分割精度时启用。
Step 5: Define Inspection Region
5.1 转到 Inspection Setup
在面包屑导航中点击 "Inspection Setup"
5.2 设置感兴趣区域(ROI)
ROI 定义分割将在哪里进行:
- 在摄像头视图中放置测试部件
- 拖动 ROI 的角点 以框定检查区域
- 适当调整 ROI 大小:
- 包含可能出现特征的所有区域
- 排除不必要的背景区域
- 在预期特征位置周围留出小缓冲区
5.3 ROI 最佳实践用于分割
应做 | 不应做 |
---|---|
覆盖整个检测表面 | 包含无关背景对象 |
在边缘留出缓冲空间 | 使 ROI 太小以致于无法覆盖特征变化 |
考虑零件定位的变化 | 与夹具或工具的重叠 |
使用最大预期特征进行测试 | 包含具有永久标记的区域 |
5.4 保存 ROI 设置
- 验证 ROI 覆盖所有目标区域
- 点击
Save
Step 6: Label Training Data
6.1 导航到 Label And Train
在面包屑导航中点击 "Label And Train"
6.2 配置 Inspection Class
- 在 Inspection Types 下点击
Edit
- 将类别重命名以匹配您的特征(例如 "Pencil Mark"、"Surface Defect"、"Spill Area")
- 选择类别颜色以实现可视化识别
- 保存更改
6.3 捕获并标注训练图像
您需要至少 10 张带标签的图像,但建议 15-20 张:
图像捕获过程
- 在检测区域放置第一件测试部件
- 使用相机界面拍摄图像
- 使用画笔工具在目标特征上涂绘
- 准确涂绘:
- 覆盖整个特征区域
- 保持在特征边界内
- 不要涂绘背景区域
- 使用一致的标注方法
- 单击
Save Annotations
- 对下一个部件重复以上步骤
标注最佳实践
良好标注 | 不良标注 |
---|---|
精确的特征边界 | 边缘标注粗糙 |
一致的特征定义 | 标准不一致 |
完整的特征覆盖 | 缺失的特征区域 |
干净背景(未标注) | 背景被错误涂色 |
6.4 训练数据多样性
确保你的训练集包含:
- 不同特征尺寸
- 不同特征强度
- ROI 内的多个位置
- 不同照明条件(如适用)
- 边缘情况和临界示例
6.5 训练数据质量检查
- 检查所有标注图像
- 验证标注方法的一致性
- 删除任何标注错误的示例
- 如有需要,添加更多示例
步骤 7:训练分割模型
7.1 启动训练过程
- 当标注完成时,单击
返回实时
- 单击
训练分割模型
7.2 配置训练参数
- 设置迭代次数:
- 快速训练: 50-100 次迭代(5-10 分钟)
- 生产质量: 200-500 次迭代(15-30 分钟)
- 高精度: 500 次及以上迭代(30+ 分钟)
- 单击
开始训练
7.3 监控训练进度
训练进度显示:
- 当前迭代次数
- 训练准确率百分比
- 预计完成时间
训练控制:
- 中止训练: 如出现问题时停止
- 提前结束训练: 当准确率达到要求时停止
提示
- 85% 的准确率通常适用于生产环境
- 训练在达到目标准确度时自动停止
- 更多的训练数据通常比增加更多迭代更有效
步骤 8:测试分割性能
8.1 访问实时预览
- 在完成训练后,单击
实时预览
- 对不同部件进行测试:
- 已知良品(应显示无/极少分割)
- 已知缺陷部件(应突出显示缺陷)
- 边缘情况和临界示例
8.2 评估结果
检查分割质量:
指标 | 良好表现 | 需要改进 |
---|---|---|
准确度 | 能够持续正确检测真实特征 | 漏检明显特征 |
精确度 | 很少出现误报 | 大量背景区域被高亮 |
边缘质量 | 边界干净且准确 | 边缘粗糙或不准确 |
一致性 | 重复测试结果相似 | 结果高度可变 |
8.3 不良结果故障排除
问题 | 可能原因 | 解决方案 |
---|---|---|
缺失特征 | 训练数据不足 | 添加更多标注示例 |
误报 | 照明/对比度差 | 改善成像设置 |
边缘粗糙 | 图像质量差 | 提升对焦/照明 |
结果不一致 | 训练数据多样性不足 | 添加更多多样化示例 |
步骤 9:配置通过/失败逻辑
9.1 访问 IO Block
- 确保 AI 模型显示绿色(已训练状态)
- 通过面包屑导航进入 IO Block
9.2 移除默认逻辑
- 删除 Classification Block Logic 节点
- 准备构建自定义 segmentation 逻辑
9.3 构建分割流程
创建 Node-RED flow,包含以下组件:
- 从左侧面板拖拽节点:
- Function node(用于逻辑)
- Debug node(用于测试)
- Final Pass/Fail node
- 用连线将节点连接起来
9.4 根据需要配置逻辑
选项 A:若未检测到缺陷则通过
用例: 质量检测中,检测到的任一特征均视为不合格
Function Node Code:
const allBlobs = msg.payload.segmentation.blobs;
const results = allBlobs.length <1; // Pass if no features found
msg.payload = results;
return msg;
选项 B:仅对较小缺陷通过
用例: 接受低于阈值的微小缺陷
Function Node Code:
const threshold = 500; // Adjust pixel count threshold
const allBlobs = msg.payload.segmentation.blobs;
const allUnderThreshold = allBlobs.every(blob => blob.pixel_count < threshold);
msg.payload = allUnderThreshold;
return msg;
选项 C:总缺陷面积较小时通过
用例: 接受总缺陷面积有限的零件
Function Node Code:
const threshold = 5000; // Adjust total pixel threshold
const allBlobs = msg.payload.segmentation.blobs;
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel_count, 0);
msg.payload = totalArea < threshold;
return msg;
9.5 配置 Function Node
- 双击 Function node
- 从上述示例复制相应代码
- 粘贴到 "On Message" 选项卡
- 为您的应用调整阈值
- 点击
Done
9.6 部署并测试逻辑
- 点击
Deploy
以激活逻辑 - 导航至 HMI 进行测试
- 使用已知良品和不良品进行测试
- 验证通过/失败结果是否符合预期
步骤 10:生产验证
10.1 全面测试
对分割系统进行测试,包含:
测试用例 | 预期结果 | 失败时的处理措施 |
---|---|---|
干净零件 | 通过(无分割) | 调整阈值或重新训练 |
微小缺陷 | 根据您的标准通过/不通过 | 细化逻辑参数 |
重大缺陷 | 失败(清晰分割) | 检查模型准确性 |
边缘情况 | 行为一致 | 添加训练数据 |
10.2 性能验证
监控以下指标:
- 每次检测的处理时间
- 多次测试的一致性
- 在生产照明条件下的准确性
- 长时间运行中的可靠性
10.3 最后调整
若性能不令人满意:
- 为边缘情况添加更多训练数据
- 在逻辑中调整阈值
- 改善成像条件
- 使用额外迭代进行重新训练
成功!您的 segmentation 系统已就绪
您现在拥有一个可运行的 segmentation 系统,能够:
- 自动检测 特定特征或缺陷
- 以像素级精度测量面积
- 根据您的需求应用自定义通过/失败逻辑
- 通过 I/O 控制与生产系统集成
高级配置选项
自定义阈值逻辑
对于复杂的验收标准,将多个条件组合起来:
const smallThreshold = 200;
const largeThreshold = 1000;
const maxTotalArea = 3000;
const allBlobs = msg.payload.segmentation.blobs;
const smallBlobs = allBlobs.filter(blob => blob.pixel_count < smallThreshold);
const largeBlobs = allBlobs.filter(blob => blob.pixel_count > largeThreshold);
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel_c