简介:面向工业视觉与自动化质检工程师的康耐视ViDi红色工具监督模式缺陷检测操作文档,系统性梳理训练图片分OK/NG整理与重命名、新建项目与布局调整、添加红色工具及图片、ROI设置、图片标签与显示过滤筛选、参数配置、缺陷标注、模型训练及切换量产模式的完整工作流。资源包为1个docx格式文档,大小1.57MB,以分步骤图文说明的形式呈现,重点涵盖样本标注要点、英文单引号过滤操作、训练完成后的模型检验与运行库创建,以及供C#调用部署衔接等实操细节,适合正在推进深度学习视觉项目落地、需要明确操作路径的技术人员按步骤复现。已有365人学习下载,文档脉络清晰,便于快速建立对ViDi红色工具监督模式从数据准备到模型封装全流程的认知。通过该文档还可掌握量产模式下用新图片验证检测效果、导出运行库供C#二次调用等关键操作,减少上手的试错成本。
1. 为什么监督模式下的红色工具,才是缺陷检测的关键
很多人第一次接触康耐视ViDi时,习惯直接拖一个红色工具(Red Tool)到流程里,丢几十张图点训练,然后就开始抱怨“检出率不行”或者“误检太多”。实际上,红色工具本身只是一台像素级分割引擎,它能不能在缺陷检测里站稳脚跟,起决定性作用的是监督模式下的训练数据质量和标注一致性。换句话讲,缺陷检不出来,多半不是算法不行,而是你在数据准备阶段就把结果锁死了。
这篇文章说的“监督模式”,是指每个训练样本都要给出像素级标签——也就是说,你在图上把缺陷区域精确涂出来,告诉算法“这里有缺陷,位置就在这些像素上”。这和蓝色工具做整图分类、绿色工具做无监督异常定位有本质区别。红色工具的输出是一张概率图,每个像素属于哪个缺陷类别、属于背景的概率是多少,都会明确算给你。正因为输出是像素级的,它能把缺陷的形状、面积、边缘信息完整保留下来,后续无论是做面积筛选还是连通域分析,都有充足的余地。
这篇内容不卖概念,我按一线实施的习惯,把从标注、训练、参数调试到部署上线的完整步骤拆开讲,每个环节都给到可以直接复制的命令和配置参数。适合正在用ViDi做工业视觉项目、或者准备把ViDi引入产线的工程师。
2. ViDi红色工具监督模式的数据集准备与标注规范
2.1 监督模式到底“监督”什么:像素级标签的意义
红色工具在监督模式下做的事情,本质上是一个图像分割任务:输入一张图,输出每个像素的类别概率。你给它的标签图(Ground Truth,GT)上,每一个像素要么属于某个缺陷类别,要么属于背景。训练时,网络逐像素计算分类损失,把“缺陷像素”和“背景像素”在特征空间里划出边界来。所以说,监督模式的质量下限不取决于模型,取决于GT图上缺陷区域画得准不准、边界贴不贴合。
现实中常见的错误是把GT画成方形框,把所有缺陷框在里面。这样画,网络会默认矩形框内全是缺陷,训练出来的模型对真实缺陷的形状根本没有任何认知。真正合理的方式是沿着缺陷的实际轮廓逐点描边,把缺陷的真实形状贴出来。比如焊锡桥连、划痕、凹坑这一类不规则缺陷,精准的边缘标注直接决定最终缺陷边缘的锐利程度。因为红色工具推理时依赖轮廓特征,如果训练时边缘就很含糊,推理时轮廓必然发虚。
另外,监督模式下GT图的类别数量不宜过多。我一般建议控制在3~5个缺陷类别以内,每类做独立的标签值。类别太多会让网络在特征空间里难以区分相近外观的缺陷,也会显著增加标注工作量。如果某个缺陷类型外观差异很大,比如既有线性划痕又有片状脏污,就拆成两个类别分别标注,而不是硬塞进同一个类。
2.2 自建数据集的目录结构与样本量估算
康耐视ViDi Studio对数据集的组织方式有具体要求。在ViDi Studio中创建红色工具训练集,常见的做法是建立一个根目录,下辖每个类别一个子目录,每个子目录里放好该类别对应的原图和标签图。标签图命名与原图一致,后缀不同。例如:
dataset ├── defect_class_A │ ├── 001.png │ ├── 001_label.png │ ├── 002.png │ └── 002_label.png ├── defect_class_B │ ├── 003.png │ └── 003_label.png代码说明:这里的标签图001_label.png是同尺寸的单通道灰度图,缺陷区域的像素值等于类别ID,比如defect_class_A的所有缺陷像素值设为1,defect_class_B设为2,背景像素值全部为0。为什么要这样组织而不是把所有图放在一个大目录里?因为ViDi在导入数据集时会按子目录区分语义类别,后续在工具配置里选择类别名称时直接对应目录名,省去手动映射的麻烦。
标注工具方面,ViDi Studio自带标注功能,可以直接在图像上用画笔工具涂抹缺陷区域。更精细的标注我会用LabelMe或者像素标注工具导出多边形,再通过脚本转成ViDi要求的标签图。标注时建议先做一轮预标注,把所有缺陷按视觉外观粗分类别,再逐类别精修边缘。这样能保证同一类别内标注风格一致。
2.3 标注规范与一致性检查脚本
标注一致性是红色工具监督模式最容易翻车的地方。同一个缺陷,不同的人去标,或者同一个人不同批次标,如果边界差异超过2~3个像素,训练出来的模型就会在边缘上产生不确定性。这种不确定性在复杂背景下会放大成误检或漏检。
我一般在标注完成后,会跑一遍简单的一致性检查脚本,验证标签图的数量、尺寸、类别值和覆盖率。脚本如下:
import cv2 import os import numpy as np img_dir = 'dataset' classes = {0: 'background', 1: 'defect_A', '2': 'defect_B'} for cls_name in os.listdir(img_dir): cls_path = os.path.join(img_dir, cls_name) if not os.path.isdir(cls_path): continue for fname in os.listdir(cls_path): if fname.endswith('_label.png'): label_path = os.path.join(cls_path, fname) label = cv2.imread(label_path, cv2.IMREAD_GRAYSCALE) unique_values = np.unique(label) invalid = [v for v in unique_values if v not in classes.keys()] if invalid: print(f'非法像素值: {label_path} -> {invalid}') if label.max() == 0: print(f'空标注: {label_path}')代码说明:这段脚本遍历数据集目录,对每一张标签图检查两件事——像素值是否落在合法的类别范围内,以及图像是否全为背景值。出现非法像素值时说明标注工具导出时引入了噪点,比如抗锯齿边缘产生的中间灰度值,需要重新二值化;出现空标注则要检查是不是导出时漏掉了缺陷区域。这个步骤虽然简单,但能避免训练时因为标签数据不干净导致模型收敛困难。
关于样本量,经验值是每个类别至少包含150~300张含有缺陷的图。如果产线条件允许,缺陷形态变化很大的类别可以加到500张以上。这个量级对于ViDi红色工具来说足够学到稳定的特征表达。另外,同一批次的数据要尽量覆盖不同光照、不同角度、不同产品型号。工业现场的光照变化是模型鲁棒性最大的敌人,数据里没有覆盖到的情况,算法在线上无论如何都扛不住。
3. 红色工具训练参数配置与模型训练流程
3.1 ViDi Studio中创建红色工具任务的完整流程
在ViDi Studio中新建工具时,工具类型选择Red Tool,然后挂载上一步准备好的数据集。挂载后,ViDi会自动扫描子目录结构,并将类别列在类别管理器中。此时可以手动确认类别映射是否正确,然后把类别分配到训练集、验证集和测试集。划分比例我一般用70%训练、20%验证、10%测试。测试集是训练过程中模型完全没见过的,用来做最终的能力评估,不能参与任何调参决策。
红色工具在监督模式下有“Structured”和“Unstructured”两种训练模式,这个选项需要在创建工具时选定。Structured模式适用于表面纹理具有规律性、周期性或方向性的场景,比如拉丝金属表面、纹理布面、木纹面板;Unstructured模式适用于背景纹理随机、无规律的场景,比如纯色塑料件、玻璃表面、PCB板基材。选错了模式,训练曲线会表现得很挣扎,模型收敛速度慢且最终精度明显偏低。我自己经常遇到有人拿Unstructured去训练木材表面缺陷,结果模型对木纹本身产生了大量误检。木材纹理是典型的有方向性周期纹理,应该用Structured模式。
3.2 Patch Size、Epochs与类别均衡的调参要点
ViDi红色工具训练时,最关键的三个参数是Patch Size、Epochs和裁剪策略。Patch Size决定了网络每次看到的图像区域大小,直接影响网络能感知的最小缺陷尺寸和上下文信息量。Patch Size设置得越小,网络看到的视野越窄,能感知到的细节越小,但上下文信息不足,容易把纹理变化误判成缺陷;Patch Size越大,上下文信息充足,但小缺陷在patch中占比变小,容易漏检。常规经验如下:
| 缺陷尺寸 | 推荐Patch Size | 说明 |
|---|---|---|
| 小于5×5像素 | 32×32或64×64 | 网络必须看到足够大的缺陷占比 |
| 5×5到20×20像素 | 64×64或128×128 | 平衡细节与上下文 |
| 大于20×20像素或细长形缺陷 | 128×128或192×192 | 兼顾长条形缺陷的连续性 |
如果产线上同时存在大缺陷和小缺陷,一般的做法是训练多个红色工具,大缺陷用大Patch,小缺陷用小Patch,最后在ViDi流程里把多个工具的检测结果做叠加。一个工具想同时干所有事,通常会两头不讨好。
Epochs方面,ViDi默认是50个epoch起步。我一般在数据质量确认无误后,先把Epochs设为100,打开训练曲线实时观察损失值变化。如果损失值在最后20个epoch内还在明显下降,就继续加训练轮数;如果验证集损失已经出现上升趋势,说明开始过拟合,需要停止或者增加数据增强。ViDi内部自带数据增强策略,训练时默认会对图像做平移、旋转、缩放等变换,这些增强逻辑是内置的,不需要额外配置。
类别均衡方面,需要特别关注缺陷类别之间的样本量差异过大问题。假如缺陷A有500张图,缺陷B只有50张图,训练时网络会倾向于把B类缺陷预测成A类。处理方式有两种:一是尽量扩充B类数据量;二是在类别管理器中为B类设置更高的损失权重。ViDi支持为每个类别单独配置权重系数,我一般会把样本量少的类别权重调到1.5~2.0。这个数值现场调整即可,观察验证集的混淆矩阵来确认是否还有类别倾向性。
3.3 开始训练与训练曲线判读
配置完成后,点击训练按钮,ViDi会首先做数据预处理,把图像缩放到内部统一尺寸,随后进入训练流程。训练过程中,右侧面板会实时更新损失曲线和验证集准确率。判读训练曲线有一个实用的方法:
提示:如果训练损失曲线在最初10个epoch内快速下降然后趋于平缓,说明模型收敛正常。如果损失曲线呈锯齿状波动且不下降,优先检查标签图是否干净,再考虑降低学习率。
ViDi的训练学习率是内部自动适配的,用户侧能调的并不多。如果遇到收敛问题,优先排查数据的标注一致性和类别间样本量比例,这两项的杀伤力远大于任何超参数。
训练完毕后,ViDi会为每个类别输出验证集上的准确率和IoU(Intersection over Union)指标。IoU是衡量分割精度的核心指标,它计算的是预测缺陷区域和真实缺陷区域的交集除以并集。IoU高于0.7说明分割质量可以接受,高于0.85说明模型对该类别已经学得很扎实。如果某个类别IoU低于0.5,基本可以判定“这个类别没学会”,需要回到数据层面补样本或重标。
4. 模型验证、部署推理与VisionPro集成
4.1 在ViDi Studio中运行验证集评估
训练完成后,先不要急着导出模型。把本轮训练保留的测试集样本逐张跑一遍推理,重点看三类情况:漏检、误检、边缘质量。在ViDi Studio中,打开工具的“Evaluate”选项卡,选择测试集图像列表,ViDi会逐张显示原图、GT标签、预测结果三者的叠加视图。颜色编码上,绿色区域表示正确预测的缺陷像素,红色区域表示误检,蓝色区域表示漏检。
这一步的观察要点是什么?如果误检区域集中在背景纹理复杂的位置,就回到训练模式选择上去检查;如果漏检区域集中在缺陷边缘,大概率是标注边缘不够精确,需要重新精修GT;如果误检和漏检都很少但缺陷形状整体偏移,那要考虑是不是图像采集时光照不均匀导致缺陷位置在推理时产生了位移。
确认测试集表现稳定后,把测试结果导出为报告。报告中包含每张图的IoU值、误检率、漏检率。这些数据在生产验收时就是最直观的交付物。
4.2 使用Python SDK调用Red Tool完成推理
ViDi训练好的模型,最终是要脱离Studio环境部署到产线上的。康耐视提供ViDi Suite和独立运行时(ViDi Redistor),其中Redistor是免费分发许可的运行时组件,可以在不安装Studio的情况下加载训练好的模型做推理。常见做法是把训练好的工具导出为.vred或.vac格式的部署文件,部署到工控机上,通过ViDi的SDK远程调用。
一个典型的Python调用实现如下:
import vidi import cv2 import numpy as np # 连接到本地ViDi Redistor服务 session = vidi.connect('localhost', port=8070) # 加载已训练好的红色工具模型 tool = session.load_tool('C:/models/pcb_defect.vred') # 读取待检测图像 img = cv2.imread('C:/images/sample_001.png') img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 执行推理 result = tool.process(img_rgb) # 获取输出分割掩膜 mask = result.get_image('Red Tool')代码说明:这个脚本通过ViDi的Python SDK连接本地Redistor服务,加载模型后对单张图像执行推理。process方法内部完成了图像预处理、patch分割、模型前向计算和结果拼接,返回的分割掩膜就是每个缺陷类别的像素级分类结果。拿到掩膜后,可以直接用OpenCV对掩膜做连通域分析,计算每个缺陷闭合区域的面积、长宽比、位置坐标,从而根据产线标准做OK/NG判定。
SDK方式适合自研上位机逻辑的集成场景。如果现场用的是康耐视自家的VisionPro平台,更省事的做法是在VisionPro QuickBuild环境中直接添加ViDi工具组件,把图像源接到ViDi Red Tool上,输出端接面积筛选脚本。VisionPro里的ViDi工具封装了与Studio相同的推理内核,两者使用同一套模型文件,不需要额外写胶水代码。我在焊锡检测项目里就是用的这套组合:相机采集图像,VisionPro做图像预处理,ViDi Red Tool检测焊锡桥连和虚焊区域,最后用面积阈值过滤掉微小噪点,整个流程在QuickBuild里连线完成,调试了不到半天就上了线。
4.3 推理速度评估与瓶颈定位
红色工具推理时,是把输入图像按Patch Size切块后逐一送入网络的,所以推理耗时和图像分辨率高度相关。一张1200×800的图像,如果Patch Size是128×128,大约需要80个patch的推理时间。实测在普通工控机(CPU)+少量GPU加速条件下,单张推理耗时通常在200~600毫秒之间。如果产线节拍要求小于300毫秒,需要重点关注推理耗时。
定位瓶颈的方式很简单:在SDK里对process调用做分段计时,统计图像预处理耗时、模型推理耗时、后处理耗时三个部分。模型推理耗时占比通常在70%以上,是主要优化对象。降低耗时的直接手段有:降低输入图像分辨率、增大Patch Size、开启GPU推理。注意增大Patch Size虽然减少了patch数量,但如果缺陷尺寸偏小,增大会直接牺牲检出率,所以这个参数要结合检测目标谨慎调整。
5. 现场维护的兜底技巧:用概率图定位误检根因
ViDi Red Tool部署到现场之后,一定会在某个时间点出现“训练时没见过的状况”。最常见的是产品型号更换后,背景纹理发生了微调,模型开始在某些区域产生连续误检。这时候一般不要直接重新训练整个模型,先做一次快速诊断。
在SDK接口中,可以通过参数获取到更富信息量的中间输出——每个像素的概率得分图。结合概率图做阈值后处理,是现场调误检最快的方法。默认情况下,ViDi会输出每个缺陷类别的二值掩膜,内部概率阈值通常在0.5附近。如果现场误检增多,查看误检区域的概率得分:如果误检区域的概率普遍在0.5~0.7之间,说明模型对这部分区域本来就不够确定,只需调高后处理阈值到0.7以上,大部分误检就会被滤掉,同时不会影响真正缺陷的检出。如果误检区域的概率得分超过了0.9,那就说明新样本和训练集之间的特征差异已经大到阈值不可调,需要把这类误检图加回训练集微调模型。
另一个预防性维护技巧是定期做数据回流。产线运行期间,按天收集误检图像和临界的NG图像,每周汇总一次,补充进训练集重新训练。这个习惯能让模型随产线变化持续进化,而不是上线即定型。ViDi支持增量训练,新数据加入后保留原有模型参数继续迭代,10~20张新图就能完成一次快速微调。
最后给所有使用ViDi红色工具的工程师一条我自己的经验法则:不要追求STUDIO里的训练精度拉到99%,真正上线后的表现是由数据覆盖度决定的。在测试集上做到IoU 0.85以上并且连续3天无误报,就已经具备上线条件了。剩下的交给产线数据回流,逐步逼近最优状态。
本文还有配套的精品资源,点击获取