ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

YOLO+SAM+OpenClaw:工业缺陷检测自动标注流水线实战

YOLO+SAM+OpenClaw:工业缺陷检测自动标注流水线实战

做工业视觉这几年,我一直觉得真正卡脖子的环节往往不是模型精度,而是数据标注。尤其是缺陷检测这类场景,样本里的小划痕、凹坑、脏污在产线强光下都未必看得清,让标注员在电脑屏幕上一点点描轮廓,一天能出几百张已经算高效,而且不同人标出来的边界还不一样。后来我在一个结构件外观检测项目里,把 YOLO、OpenClaw 和 SAM 三个组件串成了一条自动标注流水线,思路很直接:让检测模型负责出候选框,让分割模型负责抠边界,再由低代码编排平台把中间步骤全部串起来。实测下来,一张缺陷图的平均初标时间从两分钟左右压到了十秒以内,人工只需要做最终复核和边缘修正。这篇文章就把这套方案的完整设计、参数选择和落地细节一次性讲清楚。

1. 组合思路:为什么是YOLO、OpenClaw与SAM

1.1 工业缺陷标注真正的痛点

很多刚入行的朋友以为,缺陷检测项目最难的是训练一个精准的检测模型。实际上,前期数据准备才是真正的无底洞。我接触过的几个工业项目里,缺陷类型少则五六类,多则十几类,每类都需要几百上千个实例。有些缺陷形态特别接近,比如拉痕和浅划伤,连老质检员也要反复比对才能确认。人工标注在这种场景下有几个绕不开的问题:

第一是效率低。画一个包围框大约几秒钟,但画一个贴合缺陷轮廓的多边形可能要半分钟到一分钟。如果遇到锯齿状裂纹、边缘模糊的脏污,反复调整锚点能让人崩溃。第二是标准不一致。同一个缺陷,不同标注员画出的边界可能差出十几个像素,后期训练出来的模型也会继承这种不一致。第三是样本覆盖难。产线上真正的不良率可能只有百分之几,想靠人工从海量图片里翻出足量缺陷样本,本身就是一件违背物理规律的事情。

所以我才开始认真考虑自动标注。所谓自动标注,不是完全不要人,而是把人的工作从“从零画标注”变成“检查修改机器生成的初标”。这个转变能让相同人力条件下的数据产量提升一个量级,同时只要机器生成的标注足够稳定,整体标注一致性反而会比纯人工更高。想做到这一点,单靠一个模型是不够的,必须让不同专长的模型分工协作,这也是 YOLO、SAM 和编排平台被组合到一起的根本原因。

1.2 三件套的职责边界

这三个组件各有各的看家本领,放到流水线里各管一段。

YOLO 的职责是“定位与粗分类”。它是成熟的目标检测器,能在毫秒级时间内从整张图里找出所有可疑缺陷,并给出每个候选框的类别和置信度。难点在于它只能给出矩形框,无法精确表达缺陷的真实形状,但这恰恰是下一步分割的输入条件。

SAM 的职责是“像素级分割”。它的全称是 Segment Anything Model,本质是一个基于海量自然图像训练的基础分割模型,给它一个框、一个点或者一句话,它就能把目标物体的轮廓从背景里抠出来。官方权重在自然图像上表现惊艳,但放到工业缺陷上往往不能直接用,因为工业成像模态、缺陷纹理和自然物体差异太大,所以需要针对性微调。这块后面专门展开。

OpenClaw 的职责是“流程调度”。我在方案里把它定位成低代码工作流平台,负责把图像读取、YOLO 推理、结果过滤、SAM 分割、质量评估、标注落盘这一整套过程编排成可视化节点。它的存在让整条流水线不再是一堆散落的 Python 脚本,而变成可以直接调整参数、随时切换模型、能对接产线触发信号的工作流。

用一句话概括分工:YOLO 是保安,负责报告“哪个区域有问题、大概是什么问题”;SAM 是裁缝,负责沿着真实边界把问题区域精确裁剪出来;OpenClaw 是生产主管,负责盯着整个流程按顺序跑完,并把最终产物归档。

1.3 低代码落地意味着什么

在聊低代码之前,先说实话:如果只是个人做实验,纯 Python 写流水线完全够用。但一旦落到工业项目里,情况就不一样了。产线上的图片输入可能来自多个相机工位,标注结果要进入数据库,还要定期触发模型重新训练,这些环节都需要和外部系统对接。每次改动模型路径、阈值参数、输出格式都要去翻代码改逻辑,对非开发岗的同事非常不友好。

低代码平台解决的就是这个问题。它把整个流程拆成一个个可配置的节点,比如“HTTP触发”“图像预处理”“模型推理”“条件判断”“数据存储”,每个节点只需要填写参数或者粘贴一小段自定义函数。业务侧同事也能看懂流程是从哪一步走到哪一步,参数想调就调,不需要等开发排期。

但我也要提醒一句,低代码不代表没门槛。模型服务本身的部署、微调、效果验证这些环节仍然需要懂算法的人来做。低代码解决的是流程编排的灵活性问题,而不是让你完全不需要工程师。一个合理预期是:算法工程师负责把模型服务封装好,项目实施人员用编排平台把服务串起来,质检人员负责在任务看板里复核标注结果。大家各干各擅长的部分,整个项目才转得起来。

2. 工具选型与参数原理

2.1 YOLO版本怎么挑

YOLO 这个名字现在已经代表一个庞大系列。工业项目里选型,不需要追求“最新最强”,更需要看生态成熟度、推理速度和部署便捷性。Ultralytics 发布的 YOLOv8 和后续版本是目前最主流的选项,优势很明显:训练代码、预训练权重、导出 ONNX/TensorRT 的工具链齐全,API 设计也简洁,适合快速集成到流水线里。

具体选哪个体积的模型,要看你的算力。如果缺陷在画面里占的比例不小、标注量又大,搞一个 YOLO11n 或者 YOLO11s 当候选框生成器就够用,推理快,显存占用低。如果缺陷非常小,需要更高的检出召回,那就换大一点的模型,或者保留原始分辨率做推理。我自己的习惯是先用官方 COCO 预训练权重直接跑一遍所有待标注图片,毕竟自动标注阶段的首要目标是“别漏”,而不是“框得准”。预训练模型虽然没见过工业缺陷,但它的底层特征提取能力能帮忙抓出很多疑似区域,后续再用自动标注生成的数据增量训练一轮,漏检率会明显下降。

这里有一个容易被忽略的细节:YOLO 推理时的输入尺寸。工业相机拍出来的原图分辨率经常是 1200 万、2000 万像素,直接缩到 640 输入会丢掉大量小目标。我在项目里一般设置imgsz=1280或更高,如果原图尺寸特别大,就先用 OpenClaw 的预处理节点做分块,每块重叠一点再分别推理。块的大小通常是 640 或 1024,重叠 20 到 50 像素,最后把跨块的重复检测用 NMS 合并掉。

2.2 SAM微调怎么选策略

SAM 目前公开的有 ViT-B、ViT-L、ViT-H 几个规格,通常说的默认权重是 ViT-H,效果最好但显存也最吓人。自动标注流水线里如果追求效率,我建议直接用 ViT-B 甚至 ViT-L,推理速度快不少,微调需要的显存也低。

关于微调策略,很多人一听到“微调”就觉得要把整个模型重新训练一遍。其实对于分割基础模型来说,完全没必要全参数微调。SAM 的架构大致分成三块:Image Encoder 负责把输入图像变成特征向量,Prompt Encoder 负责把框或点编码为提示,MaskDecoder 负责根据特征和提示解码出最终掩码。其中 Image Encoder 是花了巨大算力在大规模数据上预训练出来的通用视觉骨干,它对图像纹理、边缘、结构的理解已经很强。工业缺陷跟自然物体在形态上有差距,但大部分差距体现在“如何把提示和特征映射到掩码”这个环节,也就是 MaskDecoder 和 Prompt Encoder 的部分。

所以我的默认选择是:冻结 Image Encoder,只微调 Prompt Encoder 和 MaskDecoder。这种方案显存占用小、训练速度快、不容易过拟合,而且效果往往足够满足自动标注需求。如果你的场景里缺陷成像风格非常特殊,比如特殊的红外成像、超声 C-scan,冻结 Image Encoder 可能会吃亏,那再考虑用 LoRA 方式在 Image Encoder 上注入少量可训练参数。LoRA 的好处是只增加极少量参数就能适配新域,缺点是需要多调几个超参数,项目时间紧的话不建议一开始就上。

2.3 OpenClaw在流水线里的角色

OpenClaw 在我这套方案里承担两个层面的事情。第一个层面是流程编排:把图片输入、YOLO 推理、SAM 分割、质量筛选、格式转换、存储归档这些节点按顺序连起来,节点之间传递数据用 JSON 结构。第二个层面是触发和管理:它可以暴露一个 HTTP 接口接收产线推送的图片,也可以在标注任务完成后向钉钉或企业微信机器人推送通知,还能定时触发模型重训任务。

选用这类低代码编排方案而不是自己写脚本,最大的收益体现在“改流程不需要改代码”。举个真实例子:项目做到一半,甲方突然要求把输出格式从 COCO 改成某个私有训练框架的格式。如果流程是硬编码的 Python 脚本,至少要改三四处逻辑并重新部署;而在编排平台里,只需要在输出节点替换一段序列化函数,再把下游节点接上,重启一次任务就行。没有这次实践的话,我可能还会坚持“脚本也能改”,但真正经历过频繁需求变更之后,我承认低代码的可维护性在工业项目里的价值被严重低估了。

OpenClaw 里最核心的节点其实不是模型推理,而是条件分支和质量判断。模型推理只是把图片送进去拿结果,而质量判断决定了哪些标注可以直接入库、哪些需要送去人工复核。这个环节做不好,自动标注就会变成垃圾进垃圾出,后面训练出来的模型也会一起遭殃。

3. 自动标注流水线搭建全流程

3.1 整体数据流与部署形态

整条流水线的数据流可以概括为:原图进入系统之后,先做分辨率检查和必要的分块预处理;然后 YOLO 模型对每个图像块做推理,输出候选框、类别和置信度;接着候选框经过一层过滤,把置信度低于阈值或者尺寸过小的框丢掉;剩下的框作为提示传入 SAM 微调模型做分割,得到逐像素掩码;最后程序计算掩码的质量指标,决定标注是直接写入数据集、进入人工复核、还是直接丢弃。简单来说就是“检测出框、分割出轮廓、规则决定去留”。

部署形态上,我自己习惯把两个模型分别封装成独立服务。YOLO 用 Flask 或 FastAPI 起一个推理接口,输入图片路径,输出候选框 JSON;SAM 也起一个接口,输入图片和框坐标,输出掩码的 RLE 编码。这样做的理由是工业环境后续很可能要用 TensorRT 或 ONNX Runtime 做加速,独立部署可以各自优化,不会互相拖累。在 OpenClaw 里只需要对应地配置两个 HTTP 请求节点,调用方式完全一致。

3.2 候选框生成节点的实现

YOLO 推理这一节可以用 Ultralytics 的 Python API 直接写,代码如下:

from ultralytics import YOLO model = YOLO("yolo11n.pt") results = model.predict( source="imgs/part_001.jpg", imgsz=1280, conf=0.25, iou=0.5, max_det=100, device="cuda:0", ) for r in results: boxes = r.boxes.xyxy.cpu().numpy() # 原图坐标 classes = r.boxes.cls.cpu().numpy() # 类别索引 scores = r.boxes.conf.cpu().numpy() # 置信度

这里有几个参数值得解释。conf=0.25是置信度阈值,自动标注阶段可以放低一点,目的是提高召回;iou=0.5是 NMS 的 IoU 阈值,如果图上缺陷密集而且重叠多,可以考虑提高到 0.6 或 0.7,避免相互竞争导致漏检;max_det=100是单张图最多保留的检测框数量,防止某些异常图上突然冒出一堆误检把后续流程拖垮。

拿到候选框之后,我还会加一条尺寸过滤规则:图像宽度或者高度小于 10 像素的框直接丢弃。工业相机拆出来的小缺陷经常只有三五个像素,太小的话 SAM 即使分割出来意义也不大,因为这种尺度的掩码根本没法作为高质量训练标签。过滤规则放在 OpenClaw 的条件节点里,本质上是一个几行的 Python Function 节点,不需要额外写服务。

3.3 SAM分割节点的实现

SAM 的推理调用,核心是两段逻辑:先set_image把整张图编码成 Image Embedding,再对每个候选框调用predict得到掩码。示例代码如下:

from segment_anything import SamPredictor, sam_model_registry import numpy as np sam = sam_model_registry["vit_b"]( checkpoint="checkpoints/sam_vit_b_lora.pth" ).to("cuda") predictor = SamPredictor(sam) predictor.set_image(image_rgb) # 注意是 RGB 顺序 for box in candidate_boxes: # box 是 xyxy 的 numpy 数组 masks, scores, _ = predictor.predict( box=box, multimask_output=True, ) best_idx = int(scores.argmax()) best_mask = masks[best_idx]

这里容易踩坑的点是multimask_output。SAM 对于一个提示会输出多个候选掩码,官方默认multimask_output=True时返回 3 个,每个都带一个置信度分数。很多人直接拿第一个掩码,这是错误的,应该根据scores选最高的那一个。另外,工业图上如果有多个缺陷框,不需要为每个框重新set_image,整张图只编码一次,然后循环框进行预测,这样可以节省大量推理时间。

还有一种情况需要注意:有些缺陷形状很细长,SAM 默认输出的掩码往往把边界收得很平滑,导致漏掉细小分支。如果遇到这类问题,可以在分割之后做一个简单的形态学后处理,比如用 3×3 或者 5×5 的核做闭运算,把断裂的部分接回去。但后处理参数不要拉满,否则会把噪声区域也扩进来。这个分寸要靠实际效果来调。

3.4 标注质量筛选与格式输出

自动标注不能无脑入库,质量筛选是整套方案里真正的灵魂。我这里用的筛选指标主要有三个:

第一是填充率,也就是掩码面积占候选框面积的比例。正常情况下,缺陷掩码应该占框内一定比例,如果填充率只有 3%,说明这个框大概率是误检,SAM 只是在框内找了一块无关紧要的区域。第二是掩码连通域数量。一个真正的缺陷实例通常是单块连通区域,如果 SAM 在框内分割出七八块碎渣,多半是背景纹理被误分割了。第三是掩码边界是否贴近框边缘。如果掩码大量紧贴候选框边界,说明缺陷实际可能超出了检测框,这个样本需要人工确认。

筛选逻辑用 OpenClaw 里的一个 Python Function 节点就能实现。示例函数如下:

def quality_check(image, mask, box, conf): area = float(mask.sum()) box_w = box[2] - box[0] box_h = box[3] - box[1] box_area = box_w * box_h fill_ratio = area / box_area # 连通域过滤 num_labels = connected_components(mask) if conf < 0.5 or fill_ratio < 0.15 or num_labels > 3: return {"action": "reject"} return {"action": "accept"}

实际项目里,我一般把结果分成三档:高置信度高填充率直接入库;中度置信度或者形状可疑的进入人工复核队列;低置信度直接丢弃。人工复核队列在标注平台上打开之后,标起来很快,因为机器已经把大致的轮廓给出来了,人只需要确认或微调几个控制点。

格式输出方面,我强烈建议统一输出成 COCO JSON 加掩码 PNG 的组合。COCO JSON 里的segmentation字段可以存多边形,也可以存 RLE。多边形适合直接可视化,RLE 适合后续训练时做随机增强。从 SAM 输出的布尔掩码转成 RLE 有现成库,转多边形则需要用cv2.findContours外加轮廓近似,这一步容易出错,后面一节我会专门讲坑。

3.5 低代码节点的配置示例

OpenClaw 里的流程,大概长成下面这条节点链:Webhook 接收图片 → 图像预处理 → YOLO Detect 服务调用 → 候选框过滤 → SAM Segment 服务调用 → 掩码质量评估 → 格式转换 → 结果入库 → 发送通知。

我没法把每个节点的界面截图贴出来,但可以讲一下配置逻辑。YOLO 和 SAM 这两个节点本质上都是 HTTP Request 类型,节点参数里填模型服务的 URL、请求头、请求体模板。回调结果会解析成 JSON,后续节点再用“字段映射”的方式读取。比如我习惯把 YOLO 的输出定义成{"boxes": [[x1, y1, x2, y2], ...], "classes": [0, 1, ...], "scores": [0.9, 0.8, ...]},后面的过滤器节点直接遍历这个数组,把符合条件的框拼成一个新的candidate_boxes列表传给 SAM。

低代码平台最舒服的一点,是你可以把“人工复核队列”也做成一个节点。自动标注跑完之后,系统把所有待复核样本推送到标注平台的任务列表,同时带上“机器建议的掩码”。标注员只需要对着图像调整,不需要从头画。我第一次把这套流程搭完给客户演示的时候,客户现场最惊讶的也是这点,说这跟自己想象的“全自动标注”完全不一样,它更像一个“人工复核效率倍增器”,但这才是工业项目能落地的形态。

4. SAM微调实战与参数建议

4.1 微调数据从哪里来

这里很多人会陷入一个循环:你想微调 SAM 提升自动标注质量,但微调 SAM 又需要一批高质量标注数据,数据从哪来?我的做法是先用官方权重跑一轮粗糙的自动标注,只抽取其中置信度最高的一部分样本,比如置信度大于 0.8 且填充率介于 0.2 到 0.9 之间的,请标注员快速修正这批掩码,数量控制在 150 到 300 张左右。这个量级对微调分割模型完全够用了,质量远比数量重要。

微调数据的标注格式,建议直接用二值掩码 PNG 或者 COCO RLE。训练时只需要把原始图像和掩码一一配对。类别信息在这里可以先不管,因为 SAM 微调的目标是“把边界分割得更准”,而不是区分缺陷类别。多类别缺陷之间的区分仍然由 YOLO 负责,两个模型的职责边界从一开始就被分开了。

数据增强也要做,但不能乱做。随机翻转、轻微旋转、缩放这类几何增强没问题,但颜色类增强要小心。很多工业缺陷本身就跟背景的灰度或颜色差异极小,做过头的颜色抖动反而会让模型更分不清。我一般只做水平翻转和垂直翻转,再加 10% 以内的随机缩放,重点是把缺陷的位置多样性提上去,而不是改变它长什么样。

4.2 训练配置与代码要点

我用的是 MaskDecoder 微调方案,更具体地说,是只训练 SAM 的 Prompt Encoder 和 MaskDecoder 两个模块,Image Encoder 完全冻结。训练代码的骨架大致如下:

sam_model = sam_model_registry["vit_b"](checkpoint="./sam_vit_b_01ec64.pth") for name, param in sam_model.named_parameters(): if "image_encoder" in name: param.requires_grad = False optimizer = torch.optim.AdamW( filter(lambda p: p.requires_grad, sam_model.parameters()), lr=1e-4, weight_decay=1e-3, ) # 每个 batch: 图像 + 随机 box 提示 + GT mask # 训练循环里只前向 MaskDecoder,loss 用 mask BCE + dice loss

损失函数我用的是mask_bce_loss + dice_loss的经典组合,比例大概 1:1。训练步数不用多,1000 到 2000 步基本就能看到明显效果。初始学习率 1e-4,用余弦退火或者线性衰减都可以。Batch size 取决于显存,ViT-B 加冻结 Image Encoder 的情况下,8G 显存跑 batch size 2 到 4 问题不大。

为了构造 box 提示,训练时我直接在 GT 掩码的包围盒上做一点扰动,比如把包围盒随机扩张或收缩 5% 到 10%。这样模型不会过拟合到“box 刚好紧贴目标”这一种输入形态,推理时遇到 YOLO 给得有点偏移的框也能扛住。这个细节我建议一定要加,它有实际意义的提升。

4.3 微调前后的效果对比

微调前后最直观的变化,是掩码对缺陷边界的贴合程度。我用一个机加件表面的浅划痕数据集做过对比,微调前 SAM 输出的掩码要么只覆盖划痕中间一段,要么把周围磨砂纹理一起吞进来;微调之后,划痕两端和边缘明显收得更紧了。量化指标上,掩码 IoU 从 0.62 左右提升到 0.84 左右,边界上的平均像素偏移也降了一半。

有一点要提前说明:不要指望微调把 SAM 变成一个完全鲁棒的工业分割器。它的作用边界仍然受提示质量限制,如果 YOLO 给出的候选框本身就偏得离谱,SAM 微调得再好也没用。所以真正稳妥的策略是“双循环”:第一轮用预训练模型产出初标,人工修正少量高质量样本;第二轮用修正后的样本微调 SAM,再用微调后的 SAM 重新标注更大的数据集;之后还可以用这批更大的数据集去增量训练 YOLO,让候选框质量也跟着提升。每一轮迭代,自动标注的通过率都会往上走。

5. 常见问题与排障实录

5.1 故障速查表

自动标注流水线跑起来之后,最常见的问题不是模型精度,而是工程稳定性。我把实际踩过的一些坑整理成了一张表,方便遇到问题直接对照。

现象可能原因解决办法
YOLO 漏检大量小缺陷输入尺寸被缩得太小,小目标被压缩调高imgsz到 1280 以上,或做分块推理
SAM 分割结果碎片化缺陷与背景纹理太接近,或缺陷本身稀疏微调 SAM,加入形态学闭运算后处理
生成的多边形点数过多轮廓上万个点,训练框架直接卡死用轮廓近似算法抽样,把点数压到 50 以内
自动标注通过率低筛选阈值太严格或 YOLO 置信度阈值太高放宽conf,分档处理而不是一刀切
GPU 显存溢出SAM 用 ViT-H 同时跑大图换 ViT-B,开半精度,一次只处理一张图
流程偶发中断图片损坏、模型服务响应超时加异常重试节点,对输入做格式校验

这表里的每一条我都实际踩过。最离谱的一次是半夜批量标注跑了两小时,结果跑到一半有一张 JPEG 是损坏的,整个流程直接停住,前面几万张标注结果全白算。后来我学乖了,在预处理节点里先做一次图像完整性校验,确保真能cv2.imread读到数据再往下走。

5.2 自动标注偏差的闭环陷阱

自动标注有一个隐蔽风险:如果第一轮模型漏检了某一类缺陷,那被漏掉的那些样本根本不会出现在自动标注结果里,于是第二轮训练数据里这类缺陷继续缺失,模型越来越“看不见”这类缺陷。这是个典型的自证偏差循环。

应对办法是引入主动学习的思想。每一轮自动标注跑完之后,不要只保留高置信度检出样本,还要额外抽出一定比例的“低置信度检出”“接近阈值误检”“随机均匀抽样”图片,人工看一遍。这些样本里可能有模型没见过的缺陷形态,也可能有正常却长得像缺陷的背景,两种都对模型纠偏有帮助。每一轮新微调,都把这些“困难样本”加进去,比单纯堆数量有效得多。

实际操作中,我会把低置信度区间(比如 0.2 到 0.4)的检测结果单独存一个目录,每周集中让质检人员过一遍,挑出确实属于缺陷但之前漏掉的样本。这个过程叫“挖矿”,做几轮之后,模型对难例的召回会明显改善。

5.3 标注格式转换的细节坑

格式转换是自动标注里最容易出错但看着又很简单的环节。从 SAM 拿到布尔掩码之后,如果项目要训练 YOLO-seg 模型,需要的是归一化后的多边形坐标;如果要训练 Mask R-CNN 或 COCO 系模型,需要的是绝对坐标的多边形或者 RLE;如果只是可视化预览,又要转回 PNG。

这里有几个坑值得单独写出来。

第一,YOLO 格式的坐标是归一化的,基于图像的宽高,而 COCO 的bbox和segmentation使用绝对像素坐标。混用的时候很容易出现“看起来数字没问题,训练时却全画到角落”的情况。第二,多边形轮廓坐标在 COCO 里要求按顺序排列,而且不能有重复的闭合点。用cv2.findContours拿到的轮廓点顺序是 OK 的,但用approxPolyDP压缩后偶尔会出现轮廓自交,这种情况需要重新做一次简化。第三,Mask 转多边形时,如果掩码本身很小很小,比如只有三四个像素,轮廓提取出来可能连不成一个闭合环,直接转成空数组。所以我在转换之前会先判断掩码面积,小于 20 像素的样本干脆不进训练集,直接扔掉。

import cv2 contours, _ = cv2.findContours( mask.astype("uint8"), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE, ) poly = [] for c in contours: epsilon = 0.0005 * cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, epsilon, True) poly.append(approx.reshape(-1).tolist())

上面这段代码里,epsilon的取值直接影响多边形点数。工业项目里我一般控制在 30 到 60 个点以内,点数太多训练时增广效率低,点数太少又丢边界细节。具体数值可以用轮廓周长的比例来定,但最终还是要看训练效果。

6. 落地效果与扩展方向

6.1 人力与时间的变化

在之前提到的结构件外观检测项目里,我们用这套自动标注流水线重做了标注流程。原来标注员一个人一天做 200 到 300 张图,算上复核已经是非常理想的状态。引入自动标注后,同样一个人一天可以处理 1500 到 2000 张图的初标加复核,而且在复核环节里,因为机器已经把大部分轮廓画好了,标注员只需要点几下鼠标确认或者微调,疲劳感明显降低,错标率也比之前低。

时间账也很好算。1000 张图的标注任务,人工从零开始大概需要一周,自动标注加人工复核大概两天能完。如果数据集规模上万,节省的时间就非常可观了。当然,这个效率的前提是流水线本身已经调稳,如果每天都有一堆节点报错,那省下来的时间又会被工程问题吃回去。

6.2 更多可以玩的扩展

这套组合天然适合向后扩展。模型侧可以替换成更新的分割基础模型,只要推理接口保持兼容,OpenClaw 流程里对应的节点参数改一下就行。检测侧可以用半监督或者伪标签的思路,把自动标注产出的大规模弱标签数据用起来,YOLO 的精度每提高一点,候选框质量就提高一点,自动标注通过率也跟着提高,形成正向循环。

产线实时触发也是一个很自然的扩展方向。OpenClaw 的 Webhook 节点可以直接接入相机拍照事件,图片拍完立即进入自动标注流程,结果实时推送到质检看板。这种形态下,系统甚至可以在产线运转过程中不断积累新缺陷样本,模型越用越强。

我个人在实际操作中最深的体会是:自动标注项目成功的关键,在于把“人工复核”当成整个流程的一等公民,而不是事后补救措施。机器负责效率,人负责判断,两者之间的接口就是质量筛选规则。这个接口设计得越清晰,项目推进得越顺利。整套方案最终沉淀下来的不只是标注速度的提升,更是一套让数据、模型、流程持续滚起来的机制。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进