新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于X-AnyLabeling与Grounded-SAM的自动标注实战:从零构建数据飞轮

发布时间:2026/9/30 13:09:19来源:尧图网络
基于X-AnyLabeling与Grounded-SAM的自动标注实战:从零构建数据飞轮
1. 为什么我要折腾自动标注这套组合拳做视觉项目的人都有一个共同的痛模型结构调得再花哨最后卡住进度的往往不是网络设计而是数据标注。我手上这个工业质检项目一开始计划标两万张图三个人轮班干了两周才啃掉三千张而且漏标、框偏、类别标错的比例高得离谱。返工的成本比重新标还大。那段时间我一直在想能不能让模型先帮我标个七七八八人只做审核和修正把精力从画框转移到判断上。这套思路就是现在圈子里说的数据飞轮模型产出预标注人工修正后回流成训练数据模型再迭代标注效率一轮比一轮高。而要把这个飞轮真正转起来需要三块拼图——X-AnyLabeling负责交互式标注和 AI 辅助autodistill负责把大模型的知识蒸馏成可用的检测器Grounded-SAM负责用文本提示直接框出目标。三者串起来就是一条从零标注到可训练数据集的流水线。这篇文章适合谁看如果你正在做目标检测、实例分割手里有一堆原始图片但标注进度感人或者你已经听说过这几个工具但不知道怎么把它们拼成一条完整链路那这篇就是写给你的。我会把每个环节的选型理由、参数含义、踩过的坑都摊开讲代码和命令都能直接抄。整套流程我在 Ubuntu 22.04 RTX 3090 上跑通Windows 下 PyCharm 跑 X-AnyLabeling 源码的坑我也会单独说。先说结论性的判断这套组合不是一键出数据集的魔法它的定位是把人工标注的工作量压缩到原来的 20% 到 30%剩下的仍然需要人把关。想清楚这一点后面的预期就不会跑偏。2. 三件套各自的定位与选型逻辑2.1 X-AnyLabeling为什么选它做标注前端标注工具市面上不少LabelImg、Labelme、CVAT、Roboflow 各有拥趸。我最终选 X-AnyLabeling核心原因是它把AI 辅助标注做进了交互流程里而不是让你标完再跑一遍模型。它内置了 SAM、YOLO 系列、GroundingDINO 等模型的推理接口你点一下AI 标注它就能给出候选框你只需要删掉错的、补上漏的。另一个关键点是它的格式兼容性。X-AnyLabeling 原生支持导出 YOLO、COCO、VOC、Labelme 等多种格式这意味着上游用 Grounded-SAM 生成的预标注和下游训练框架需要的格式之间不需要我再写转换脚本。我试过用 Labelme 加一堆插件去凑这个流程脚本写到怀疑人生最后还是回到 X-AnyLabeling。它的快捷键设计也值得说一句因为标注效率很大程度取决于手不离键盘。常用的几个我列一下后面实操部分会再展开快捷键功能使用场景W创建矩形框目标检测主力操作E创建多边形实例分割精细标注CtrlI触发 AI 标注批量预标注D / A下一张 / 上一张快速翻页审核CtrlS保存阶段性存档Delete删除选中框清理误检2.2 autodistill把大模型能力蒸馏成小模型autodistill 解决的是一个很实际的问题Grounded-SAM 这类基础模型效果好但推理慢、显存吃得多不适合直接部署到产线。autodistill 的思路是——用基础模型它叫 base model去标注一批数据然后用这批数据训练一个轻量模型target model比如 YOLOv8。训练完的小模型速度快、体积小可以反复用来给新数据打预标注。这个教师-学生的蒸馏逻辑本质上是把大模型的泛化能力压缩进小模型。我在项目里的用法是先用 Grounded-SAM 标 500 张训练一个 YOLOv8s然后用这个 YOLOv8s 去标剩下的图人工只做修正。实测下来YOLOv8s 在这个特定品类上的召回能到 85% 左右比通用 Grounded-SAM 更贴合我的数据分布。autodistill 的另一个好处是接口统一。它把不同 base model 和 target model 的调用方式抽象成了一套 API换模型基本只改一行 import。这对做对比实验特别友好我经常同一批数据分别用 GroundingDINO 和 YOLO-World 标一遍看哪个更适合我的场景。2.3 Grounded-SAM文本提示直接出框Grounded-SAM 其实是两个模型的组合GroundingDINO负责根据文本提示比如 scratch、bolt检测出目标框SAM负责把这些框细化成精确的分割掩码。它的价值在于零样本——你不需要训练给个文本描述它就能框。这对冷启动阶段太重要了。项目刚开始一张标注都没有我直接输入 defect、crack、stain 这些词它就能给我一批候选框。虽然精度不如专门训练的模型但作为预标注的起点完全够用。而且它支持多类别同时检测一次推理能出好几种目标的框效率比一个个类别单独跑高得多。需要提醒的是Grounded-SAM 对文本提示的措辞很敏感。同一个目标你说 bolt 和说 metal screw 出来的结果可能差很多。这个我在实操部分会给出调优经验。3. 环境部署从零把三件套装起来3.1 基础环境与依赖版本锁定环境这块我踩过最大的坑就是版本冲突。这三个工具对 PyTorch、CUDA、transformers 的版本要求不完全一致随便 pip install 很容易装出一堆互相打架的包。我的建议是先用 conda 建一个干净环境然后按固定版本装。conda create -n autolabel python3.10 -y conda activate autolabel # PyTorch 按你的 CUDA 版本选我这里是 CUDA 11.8 pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 # 核心依赖 pip install transformers4.38.0 pip install segment-anything1.0 pip install supervision0.18.0 pip install opencv-python4.9.0.80版本锁定这件事我必须强调。transformers 4.40 之后的版本改了一些 APIGrounded-SAM 的示例代码会报错supervision 0.19 改了标注绘制的接口。我建议就按上面这套版本走能省掉大量调试时间。3.2 X-AnyLabeling 源码部署与 PyCharm 配置X-AnyLabeling 可以直接下 release 的可执行文件但如果你要改代码、加自定义模型就得跑源码。源码部署的坑主要集中在依赖和路径上。git clone https://github.com/CVHub520/X-AnyLabeling.git cd X-AnyLabeling pip install -r requirements.txt在 PyCharm 里跑源码有几个设置必须做对。第一把项目根目录标记为 Sources Root否则anylabeling这个包导入会失败。第二运行配置里的工作目录要设成项目根目录不能是anylabeling/app.py所在目录不然相对路径的资源文件找不到。第三如果报 Qt 相关的错检查一下 PyQt5 的版本我用的 5.15.9 是稳的。启动命令是python anylabeling/app.py第一次启动会下载默认模型如果网络慢可以手动把模型放到~/.anylabeling/models目录下。这个目录结构别搞错放错位置它认不出来。3.3 autodistill 与 Grounded-SAM 安装autodistill 的安装相对简单但要注意它是个元包具体模型要单独装。pip install autodistill pip install autodistill-grounded-sam pip install autodistill-yolov8Grounded-SAM 的权重需要手动下载包括 GroundingDINO 的groundingdino_swint_ogc.pth和 SAM 的sam_vit_h_4b8939.pth。这两个文件加起来好几个 G下载完放到指定目录代码里用绝对路径引用最稳妥别用相对路径换工作目录就找不到。注意SAM 的 vit_h 版本精度最高但显存占用大单张 1080p 图推理大概要 6-7G 显存。如果你显存紧张可以换 vit_b 或 vit_l精度会降一点但能跑起来。4. 全流程实操从原始图片到可训练数据集4.1 第一步用 Grounded-SAM 做零样本预标注冷启动阶段我手上只有一堆没标注的原始图。第一步是用 Grounded-SAM 批量生成候选框。核心代码不长但几个参数很关键。from autodistill_grounded_sam import GroundedSAM from autodistill.detection import CaptionOntology # 定义文本提示到类别的映射 ontology CaptionOntology({ metal scratch: scratch, surface crack: crack, oil stain: stain }) base_model GroundedSAM(ontologyontology) base_model.label( input_folder./raw_images, output_folder./prelabels )这里的CaptionOntology是整套流程的灵魂。它把文本提示和你的类别名绑定起来。左边是你喂给 GroundingDINO 的描述右边是最终数据集里的类别标签。描述写得越具体检测越准。我一开始图省事写 defect结果它把划痕、污渍、凹坑全框成一个类完全没法用。后来拆成三个具体描述效果立刻上来了。box_threshold和text_threshold这两个参数也值得调。box_threshold 控制框的置信度门槛默认 0.3 左右。我的经验是冷启动阶段调低到 0.25宁可多框一些反正后面人工要删等模型迭代几轮后再调高到 0.4减少误检。text_threshold 控制文本匹配的严格程度一般保持默认即可。4.2 第二步X-AnyLabeling 人工审核与修正预标注出来之后导入 X-AnyLabeling 做人工审核。这一步是整个流程里唯一重人工的环节但相比从零标注工作量已经小太多了。我的操作习惯是先按 D 快速翻一遍把明显误检的框删掉再回头逐张检查漏检和框偏。X-AnyLabeling 的 AI 辅助在这里能再帮一把。对于漏检的目标我不用手动画框直接框选一个大致区域按 CtrlI 触发 SAM它会自动把目标分割出来。这个框选AI 细化的操作比手动画多边形快好几倍尤其是对形状不规则的目标。审核阶段有几个经验值得分享。第一统一标注规范。框要不要包含阴影、边界贴多紧这些规则要提前定好否则不同人标出来的数据风格不一致训练时模型会学懵。第二难例单独存。遇到特别难判断的图我会单独放一个文件夹后面专门分析。第三定期保存。X-AnyLabeling 偶尔会崩CtrlS 要养成肌肉记忆。4.3 第三步用 autodistill 训练轻量模型审核完一批数据我一般攒够 300-500 张就可以训练轻量模型了。autodistill 把训练流程封装得很简洁。from autodistill_yolov8 import YOLOv8 target_model YOLOv8(yolov8s.pt) target_model.train(./prelabels/data.yaml, epochs100, imgsz640)训练参数里epochs和imgsz是两个大头。epochs 我一般设 100配合早停imgsz 设 640 是 YOLOv8 的默认如果你的目标特别小可以提到 1280但显存和速度都会受影响。batch size 根据显存调3090 上 yolov8s 跑 640 分辨率batch 16 没问题。训练完之后这个 YOLOv8s 就成了你的专属标注员。用它去标剩下的图速度比 Grounded-SAM 快一个数量级而且更贴合你的数据分布。这就是数据飞轮转起来的样子Grounded-SAM 冷启动 → 人工修正 → 训练 YOLOv8 → YOLOv8 标新数据 → 人工修正 → 再训练。4.4 第四步格式转换与数据集封装X-AnyLabeling 导出的格式和训练框架需要的格式往往不一致这一步别偷懒。我一般统一转成 YOLO 格式因为 autodistill 和大部分训练框架都吃这个。import os import json import yaml from sklearn.model_selection import train_test_split def convert_to_yolo(labelme_dir, output_dir, class_names): images [f for f in os.listdir(labelme_dir) if f.endswith(.jpg)] train_imgs, val_imgs train_test_split(images, test_size0.2, random_state42) for split, img_list in [(train, train_imgs), (val, val_imgs)]: img_out os.path.join(output_dir, images, split) lbl_out os.path.join(output_dir, labels, split) os.makedirs(img_out, exist_okTrue) os.makedirs(lbl_out, exist_okTrue) for img_name in img_list: # 复制图片 # 解析对应的 json 标注转成 YOLO 的 txt 格式 # 归一化坐标x_center, y_center, w, h 都除以图像宽高 pass # 生成 data.yaml data { path: output_dir, train: images/train, val: images/val, names: {i: n for i, n in enumerate(class_names)} } with open(os.path.join(output_dir, data.yaml), w) as f: yaml.dump(data, f)YOLO 格式的坐标是归一化的中心点 x、y 和宽高 w、h 都要除以图像宽高。这个转换最容易出错的地方是坐标越界——标注框超出图像边界时归一化后会大于 1训练时会报错。我一般会加一个 clip 操作把值限制在 0 到 1 之间。5. 参数调优与效果提升的实战经验5.1 文本提示词工程Grounded-SAM 的命门Grounded-SAM 的效果七成取决于你的文本提示写得好不好。我总结了几条经验。第一用具体名词别用抽象词。defect 这种词太泛模型不知道你要什么metal scratch 就具体得多。第二一个提示对应一个类别别想着一个提示覆盖多个类别。第三善用修饰词。如果目标有颜色、材质特征加进去能提升区分度比如 red rust spot 比 rust 更准。我还试过用同义词组合来提升召回。比如划痕我同时写 scratch 和 scuff让模型两个都试取并集。这样召回上去了代价是误检也多了点但冷启动阶段召回比精度重要误检后面人工删就行。5.2 阈值调优在召回和精度之间找平衡box_threshold 这个参数我做过一组对比实验数据很能说明问题box_threshold召回率误检率人工修正耗时每百张0.2092%45%35 分钟0.3085%28%25 分钟0.4074%15%22 分钟0.5060%8%30 分钟可以看到阈值太低误检爆炸人工删框删到手软阈值太高漏检严重人工补框更累。0.30 到 0.35 是甜点区综合人工耗时最低。这个结论只针对我的数据你的场景要自己测一遍但方法论是通用的找人工总耗时最低的那个点而不是单纯追求精度或召回。5.3 迭代节奏多久训练一次轻量模型数据飞轮的转速很关键。我的经验是每积累 300-500 张修正后的数据就重训一次。太频繁训练开销大且提升不明显太稀疏模型跟不上数据分布的变化。重训的时候我会把历史数据也带上避免模型只学新数据而遗忘旧类别。还有一个技巧是保留一个固定的验证集。这个验证集从头到尾不变用来横向对比每一轮模型的提升。我见过有人每轮都重新划分数据集结果指标忽高忽低根本看不出模型到底有没有进步。6. 常见问题排查与避坑清单6.1 环境与部署类问题问题一X-AnyLabeling 启动报 Qt 平台插件错误。这个在 Linux 上很常见通常是缺libxcb相关库。解决办法是装libxcb-xinerama0等依赖或者设置QT_QPA_PLATFORMxcb。Windows 上如果报这个检查 PyQt5 版本重装一遍通常能解决。问题二Grounded-SAM 推理报显存不足。先确认你用的是哪个 SAM 版本vit_h 最吃显存。如果显存不够换 vit_l 或 vit_b。另外推理时把图片 resize 到长边 1024 以内能显著降显存。批量推理时记得手动清缓存torch.cuda.empty_cache()该加就加。问题三autodistill 训练时找不到 data.yaml。这个多半是路径问题。autodistill 对相对路径的处理有点迷我建议统一用绝对路径。另外 data.yaml 里的path字段也要写绝对路径别写相对路径。6.2 标注质量类问题问题四预标注框普遍偏大或偏小。这是 GroundingDINO 的常见现象它给的框往往比真实目标松一些。我的处理方式是在 X-AnyLabeling 里统一微调或者写个脚本按比例收缩框。收缩比例要按类别调我这边划痕类收缩 5% 左右比较合适。问题五类别混淆。比如把污渍标成划痕。这个在文本提示阶段就要解决把描述写得更区分。如果已经标错了训练出来的模型会继承这个错误所以审核阶段一定要仔细。问题六漏检小目标。Grounded-SAM 对小目标召回一般。解决办法是把图片切块推理或者提高输入分辨率。我在项目里对关键区域做了裁剪单独推理召回提升明显。6.3 效率提升类技巧技巧一批量预处理。推理前统一把图片 resize、转 RGB、去重能省不少时间。我写了个预处理脚本把尺寸不一、格式混乱的原始图先规整一遍。技巧二并行推理。Grounded-SAM 单张推理慢可以用多进程并行。但要注意显存别开太多进程把显存撑爆。我一般开 2-3 个进程。技巧三难例挖掘。训练完的模型在验证集上表现差的样本单独拎出来重点标注。这些难例对模型提升的贡献远大于随机样本。技巧四标注规范文档化。团队协作时把标注规范写成文档新人上手快返工少。这个看起来是管理问题但实际对数据质量影响巨大。7. 我对这套流程的真实体会跑完整个项目最大的感受是自动标注的价值不在于完全替代人工而在于重新分配人的精力。以前人 80% 的时间在画框20% 在判断现在反过来人 20% 的时间在修正80% 在判断哪些是难例、哪些规范要调整。这个转变让标注这件事从体力活变成了脑力活效率和质量的提升都是实打实的。另一个体会是不要迷信任何一个模型。Grounded-SAM 强在零样本但对特定品类不如专门训练的模型YOLOv8 快且贴合数据但冷启动阶段没数据它也没辙。三者组合起来各取所长才是这套流程的精髓。我见过有人死磕 Grounded-SAM 想让它一步到位结果调参调到崩溃其实早点引入 autodistill 训练专属模型问题早就解决了。最后分享一个我踩过的坑别在预标注阶段追求完美。我一开始总想把 Grounded-SAM 的参数调到最优结果花了两天调参提升还不如多标 100 张图训练一轮来得实在。预标注的作用是给人工一个起点差不多就行真正的精度提升靠的是数据飞轮转起来之后的迭代。想通这一点整个流程就顺了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

H3C与华为交换机基础配置实战:从Console到三层互通 2026/9/30 14:04:32

H3C与华为交换机基础配置实战:从Console到三层互通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
双缝干涉:把两条缝的图样叠起来,光为什么自己跟自己打架 2026/9/30 14:04:17

双缝干涉:把两条缝的图样叠起来,光为什么自己跟自己打架

一块挡板上开两条平行细缝,单色光打过去,屏幕上映出的不是两条亮线,而是一排等间距的明暗条纹。把其中一条缝遮住,条纹立刻消失、只剩一团中间亮两边暗的光斑——同一束光,只因「知道不知道它走了哪条缝」,…

阅读更多 →
昇思 MindSpore 大模型单卡微调推理:自助搭建流程 2026/9/30 14:02:34

昇思 MindSpore 大模型单卡微调推理:自助搭建流程

一、摘要基于昇思 MindSpore 在单张昇腾 NPU(310P/910B)完成大模型微调 推理是轻量化落地常用方案。单卡流程包含:环境准备、权重加载、数据集构建、LoRA 微调、模型保存、离线推理全链路。相比于全参数微调,LoRA 低秩适配极大降…

阅读更多 →
前端敏感数据脱敏实战:手机号身份证号正则替换与Vue组件实现 2026/9/30 14:02:27

前端敏感数据脱敏实战:手机号身份证号正则替换与Vue组件实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
使用Filler4提取微信小程序视频:手把手实操与原理剖析 2026/9/30 14:02:26

使用Filler4提取微信小程序视频:手把手实操与原理剖析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
嵌入式驱动开发:从能跑到会崩的量产工程化鸿沟 2026/9/30 14:02:19

嵌入式驱动开发:从能跑到会崩的量产工程化鸿沟

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉