YOLO+OpenClaw缺陷检测智能体:低代码工业质检自动化方案,含模型训练/智能体集成/任务全流程
1. 工业质检的实时性困局为什么 YOLOOpenClaw 值得一试YOLO 在工业缺陷检测里几乎是默认选项单帧推理 0.1~0.5 秒划痕、凹坑、污渍、裂纹这些常见缺陷都能给出稳定的边界框。OpenClaw 这类开源智能体框架的价值在于它能把「检测」这件事从一次函数调用升级成一条可编排的任务链理解自然语言指令、调用工具、写文件、发通知、生成报表。把两者拼起来理论上就是一套低代码的工业质检自动化方案适合产线工程师、算法落地同学、以及想用最少代码跑通闭环的小团队。但真到车间里问题会立刻冒出来。OpenClaw 调用大模型做决策通常要 1~3 秒叠加 YOLO 的检测耗时端到端延迟轻松超过 5 秒。高速流水线一秒过好几件产品这个延迟根本没法做在线拦截。边缘端算力也不够本地跑 OpenClaw 加大模型至少需要 8GB 显存而现场常见的树莓派、Jetson Nano 这类低功耗设备扛不住。再加上 OpenClaw 具备文件读写和命令执行权限直接放在生产设备上安全边界很难说清楚。我试过的思路是不跟实时性硬碰把检测任务挪到非生产时段做离线批处理。白天产线正常跑相机把图片按批次落到指定目录凌晨由 OpenClaw 触发批量检测、生成日报、超阈值发预警、每周出趋势图。这样既绕开了延迟瓶颈又能用云端隔离部署解决算力和权限问题。下面这套配置骨架可以直接复制你按自己的目录和阈值改一改就能跑。2. TaoToken 前置把模型调用和 Key 管理先理顺这套方案里OpenClaw 的「大脑」需要稳定的模型接口。我建议先把模型调用层独立出来用 TaoToken 统一管理这样后面换模型、加并发、做成本核算都不用动业务代码。你需要先拿到 API Key。打开控制台创建密钥地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 创建后复制保存后面配置里会用到。接口基地址用 https://taotoken.net/api 注意这个地址不带任何查询参数直接填在配置里即可。如果你只是想先验证模型能不能正常对话、返回格式对不对可以用模型对话页面快速试一下 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。这一步能帮你排除「是模型问题还是智能体配置问题」的干扰。长期要跑编码类任务或者 Agent 编排建议直接上 Coding Plan配额和并发更省心 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 配置项和参数说明都在里面遇到报错先翻这里。注意Key 只放在服务端环境变量里不要写进前端代码或提交到仓库。离线批处理场景下建议给 OpenClaw 单独建一个受限账号只开放检测目录和报表目录的读写权限。3. 可复制配置YOLO 训练 OpenClaw 技能 任务编排3.1 YOLO 缺陷检测模型训练先建环境。Python 3.10 比较稳PyTorch 按你的显卡选版本。conda create -n yolo-defect python3.10 -y conda activate yolo-defect pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 pip install ultralytics opencv-python pandas matplotlib数据集按 YOLO 格式组织图片和标签目录结构要严格对应defect_dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/标签文件每行一个缺陷格式是类别ID 中心x 中心y 宽 高坐标都归一化到 0~1。比如一张图里有两个缺陷0 0.512 0.423 0.234 0.156 1 0.678 0.345 0.089 0.123data.yaml里写清楚路径和类别path: /data/defect_dataset train: images/train val: images/val nc: 4 names: - scratch - dent - stain - crack训练脚本直接用 ultralytics 的接口yolov8n速度最快适合边缘或批量场景from ultralytics import YOLO model YOLO(yolov8n.pt) results model.train( data/data/defect_dataset/data.yaml, epochs100, imgsz640, batch16, namedefect_v1, device0, patience20 )训练完最佳权重在runs/detect/defect_v1/weights/best.pt。先拿单张图验证一下确认类别和置信度正常from ultralytics import YOLO model YOLO(runs/detect/defect_v1/weights/best.pt) results model(/data/test/sample_001.jpg, conf0.25, saveTrue) for r in results: for box in r.boxes: print(int(box.cls[0]), float(box.conf[0]), box.xyxy[0].tolist())3.2 OpenClaw 技能骨架技能目录建议这样放工具模块和配置分离后面加新检测逻辑不用改主流程yolo-defect-skill/ ├── skill.json ├── prompt.md └── tools/ ├── detect_single.py ├── detect_batch.py └── analyze.pydetect_single.py负责单图检测并返回结构化结果from ultralytics import YOLO import json class YoloDefectDetector: def __init__(self, model_pathruns/detect/defect_v1/weights/best.pt): self.model YOLO(model_path) self.class_names [scratch, dent, stain, crack] def detect(self, image_path, conf_threshold0.25): results self.model(image_path, confconf_threshold) defects [] for result in results: for box in result.boxes: defects.append({ class_id: int(box.cls[0]), class_name: self.class_names[int(box.cls[0])], confidence: round(float(box.conf[0]), 4), bbox: [round(float(v), 2) for v in box.xyxy[0]] }) return { image_path: image_path, defects: defects, defect_count: len(defects) } if __name__ __main__: detector YoloDefectDetector() print(json.dumps(detector.detect(/data/test/sample_001.jpg), ensure_asciiFalse, indent2))detect_batch.py遍历目录把结果汇总成 JSON供后面的报表和预警脚本消费import os import json from detect_single import YoloDefectDetector class BatchDetector: def __init__(self, model_pathNone): self.detector YoloDefectDetector(model_path) if model_path else YoloDefectDetector() def detect_batch(self, directory, conf_threshold0.25): results [] for filename in sorted(os.listdir(directory)): if filename.lower().endswith((.png, .jpg, .jpeg)): image_path os.path.join(directory, filename) results.append(self.detector.detect(image_path, conf_threshold)) return results if __name__ __main__: batch BatchDetector() results batch.detect_batch(/data/products/daily/) with open(/data/results/batch_results.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(f检测完成共 {len(results)} 张图片)skill.json把工具暴露给 OpenClaw参数描述写清楚模型才能正确调用{ name: yolo_defect_detector, description: 检测工业产品表面缺陷包括划痕、凹坑、污渍和裂纹, tools: [ { name: detect_single, description: 检测单张图片中的缺陷, parameters: { image_path: {type: string, description: 图片完整路径}, conf_threshold: {type: float, description: 置信度阈值默认0.25} } }, { name: detect_batch, description: 批量检测目录下所有图片, parameters: { directory: {type: string, description: 图片目录完整路径}, conf_threshold: {type: float, description: 置信度阈值默认0.25} } } ] }注册技能openclaw skill register --skill-path ./yolo-defect-skill3.3 任务编排日报、预警、趋势OpenClaw 的任务用 cron 表达式调度。日报任务放在凌晨 2 点预警 4 点趋势分析每周日 0 点openclaw task create --name daily_defect_detect \ --schedule 0 2 * * * \ --command python /opt/skills/yolo-defect-skill/tools/detect_batch.py openclaw task create --name daily_defect_report \ --schedule 0 3 * * * \ --command python /opt/skills/yolo-defect-skill/tools/generate_report.py openclaw task create --name defect_alert \ --schedule 0 4 * * * \ --command python /opt/skills/yolo-defect-skill/tools/alert_handler.py openclaw task create --name defect_trend \ --schedule 0 0 * * 0 \ --command python /opt/skills/yolo-defect-skill/tools/trend_analyzer.py日报脚本读batch_results.json统计总数和类型分布输出 Markdownimport json from datetime import datetime from collections import Counter def generate_report(): with open(/data/results/batch_results.json, r, encodingutf-8) as f: results json.load(f) total sum(r[defect_count] for r in results) counter Counter() for r in results: for d in r[defects]: counter[d[class_name]] 1 date datetime.now().strftime(%Y-%m-%d) lines [ f# 缺陷检测日报 {date}, f- 检测图片数{len(results)}, f- 缺陷总数{total}, - 类型分布 ] for name, count in counter.most_common(): lines.append(f - {name}: {count}) path f/data/reports/defect_report_{date}.md with open(path, w, encodingutf-8) as f: f.write(\n.join(lines)) print(f日报已生成{path}) if __name__ __main__: generate_report()预警脚本设一个阈值超过就发邮件。这里用 SMTP 示例实际按你的通知渠道替换import json import smtplib from email.mime.text import MIMEText from collections import Counter ALERT_THRESHOLD 100 def main(): with open(/data/results/batch_results.json, r, encodingutf-8) as f: results json.load(f) total sum(r[defect_count] for r in results) if total ALERT_THRESHOLD: print(f缺陷数 {total} 未超阈值 {ALERT_THRESHOLD}不发送预警) return counter Counter() for r in results: for d in r[defects]: counter[d[class_name]] 1 body f缺陷总数 {total}超过阈值 {ALERT_THRESHOLD}\n \ \n.join(f{k}: {v} for k, v in counter.items()) msg MIMEText(body, plain, utf-8) msg[Subject] 工业质检缺陷预警 msg[From] alertexample.com msg[To] engineerexample.com with smtplib.SMTP(smtp.example.com, 587) as server: server.starttls() server.login(alertexample.com, your_password) server.send_message(msg) print(预警已发送) if __name__ __main__: main()趋势脚本读最近 7 天日报画折线图import os import re from datetime import datetime, timedelta import matplotlib.pyplot as plt def analyze_trend(): dates, counts [], [] for i in range(7): date (datetime.now() - timedelta(daysi)).strftime(%Y-%m-%d) path f/data/reports/defect_report_{date}.md if not os.path.exists(path): continue with open(path, r, encodingutf-8) as f: content f.read() match re.search(r缺陷总数(\d), content) if match: dates.append(date) counts.append(int(match.group(1))) if not dates: print(没有可用的日报数据) return plt.figure(figsize(10, 5)) plt.plot(dates, counts, markero) plt.xlabel(日期) plt.ylabel(缺陷数量) plt.title(最近7天缺陷趋势) plt.xticks(rotation45) plt.tight_layout() plt.savefig(/data/reports/defect_trend.png, dpi200) print(趋势图已生成) if __name__ __main__: analyze_trend()4. 验证请求与成功结果配置完先别急着上定时任务手动跑一遍确认链路通。第一步单独跑批量检测python /opt/skills/yolo-defect-skill/tools/detect_batch.py正常输出类似检测完成共 128 张图片同时/data/results/batch_results.json里能看到每张图的defect_count和defects数组。如果这个文件是空的先查图片目录路径和扩展名大小写。第二步跑日报脚本检查/data/reports/下有没有生成当天的 Markdown内容里缺陷总数和类型分布是否和 JSON 对得上。第三步用 OpenClaw 手动触发一次任务确认调度器能正确调用脚本openclaw task run --name daily_defect_report第四步验证模型接口。如果你在 OpenClaw 里配置了模型调用用模型对话页面发一条测试指令比如「统计今天检测结果里划痕的数量」看返回是否符合预期。这一步能确认 Key、基地址、模型名三者匹配。成功的结果是JSON 有数据、日报有内容、预警在超阈值时能发出、趋势图能生成。四个都过了再把定时任务打开。5. 本篇常见错排查报错ModuleNotFoundError: No module named ultralytics虚拟环境没激活或者 pip 装到了系统 Python。先conda activate yolo-defect再pip show ultralytics确认路径。检测结果全是空数组大概率是conf阈值太高或者模型权重路径不对。先把conf_threshold降到 0.1 试再确认best.pt文件存在且不是 0 字节。OpenClaw 注册技能时报skill.json parse errorJSON 里多了逗号或少了引号。用python -m json.tool skill.json校验一遍。定时任务不执行先看openclaw task list里任务状态再查 cron 表达式。注意服务器时区容器里默认可能是 UTC和你本地差 8 小时。模型接口返回 401 或 403Key 没填对或者环境变量没生效。检查TAOTOKEN_API_KEY是否导出基地址是否写成https://taotoken.net/api而不是带路径的地址。预警邮件发不出去SMTP 端口和加密方式要匹配。587 配starttls()465 要用SMTP_SSL。很多邮箱还需要单独申请授权码不是登录密码。趋势图中文乱码matplotlib 默认字体不含中文。加两行plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False6. 接入与排障入口这套方案的核心是把实时检测转成离线批处理用 OpenClaw 做任务编排YOLO 做检测执行TaoToken 做模型调用层。你落地时如果卡在 Key 配置或接口报错直接去 API Keys 页面重新生成一个对照接入文档逐项核对 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 和 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先验证模型返回格式再写智能体逻辑用模型对话页面最快 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。长期跑编码和 Agent 任务Coding Plan 的配额更稳 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。最后提醒一句离线方案不是万能药。如果产线要求实时拦截还是得把轻量模型下沉到边缘设备做初筛OpenClaw 只负责非实时的汇总和决策。两段式架构比硬扛延迟靠谱得多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →