尧图精选

Grounded-SAM+autodistill+X-AnyLabeling:自动标注流水线实战

🕒 发布时间:2026/10/2 18:39:30 📁 来源:尧图网络
1. 自动标注这件事为什么值得认真做一遍做视觉模型的人都有一个共同的痛模型效果不好第一反应是调参、换 backbone、加数据增强折腾一圈发现真正卡脖子的其实是标注数据不够。请人标吧一张图几分钱到几毛钱几千张下来就是一笔不小的开销而且周期长、质量还参差不齐自己标吧标个两百张眼睛就花了标到五百张开始怀疑人生。更麻烦的是业务场景一变之前标的数据可能就废了又得重新来一轮。自动标注就是冲着这个痛点去的。它的核心逻辑不复杂先用一个能力足够强的通用模型比如开放词汇检测模型把图里的目标框出来人工只需要做“审核和修正”而不是“从零画框”。这样一来单张图的标注时间能从几十秒压到几秒标注成本能降一个数量级。而X-AnyLabeling、autodistill、Grounded-SAM这三个工具恰好能串成一条完整的自动标注流水线Grounded-SAM 负责“看懂图里有什么并分割出来”autodistill 负责“把大模型的知识蒸馏成你要的小模型能用的标注”X-AnyLabeling 负责“人工审核、修正、导出成标准格式”。这套组合适合谁如果你手上有几百到几万张图需要标注预算有限但又想要质量可控那这套流程基本就是为你准备的。它不需要你有 GPU 集群一台带显卡的工作站甚至一台配置好点的笔记本就能跑起来。下面我按自己实际跑过几轮的经验把整条链路拆开讲清楚包括每一步为什么这么做、参数怎么定、坑在哪里。2. 三个工具到底各自干什么为什么要串起来用2.1 Grounded-SAM开放词汇检测加分割的“眼睛”Grounded-SAM 这个名字其实是两个模型的组合Grounding DINO负责开放词汇目标检测SAMSegment Anything Model负责把检测框变成精细的分割掩码。它的价值在于“开放词汇”——你不需要预先定义类别直接用自然语言描述你要找什么比如“红色的安全帽”“裂纹”“螺丝”它就能把对应的区域框出来。这一点对自动标注太关键了。传统检测模型你必须先有标注才能训练而 Grounded-SAM 让你在零标注的情况下就能拿到第一版框。它的输出是检测框加分割掩码掩码对于做分割任务、抠图、精细边界标注特别有用。实测下来Grounding DINO 的召回率相当不错但会有一些误检和框不够准的情况所以它适合做“初筛”不适合直接当最终标注。2.2 autodistill把大模型的知识“蒸馏”成你的标注autodistill 的定位很有意思它是一个“知识蒸馏”框架。你可以把它理解成一个中间层上游接一个“基础模型”比如 Grounded-SAM、CLIP下游接一个“目标模型”比如 YOLO、Detectron2。它的工作是用基础模型自动生成标注然后用这些标注去训练目标模型让目标模型学会基础模型的能力。为什么需要这一步因为 Grounded-SAM 虽然强但推理慢、模型大不适合部署到边缘设备。而 YOLO 这类模型又快又小但需要标注才能训练。autodistill 就是搭这座桥的。它的 API 设计得很简洁几行代码就能定义一个“标注-训练”的循环。而且它支持增量式地加数据这对“数据飞轮”的构建非常友好——模型越好标注越准标注越多模型越好。2.3 X-AnyLabeling人工审核和格式导出的“工作台”前两个工具负责自动生成但自动生成的结果一定需要人工过一遍。X-AnyLabeling 就是一个专门为这个环节设计的标注工具。它支持多种标注格式COCO、YOLO、VOC、MOT 等支持 AI 辅助标注可以接入 SAM、YOLO 等模型做预标注还支持快捷键操作审核效率很高。它的一个亮点是跨平台Windows、Linux、macOS 都能跑Linux 下用 AppImage 或者源码安装都行。快捷键设计得也比较合理比如W画框、E编辑、D下一张、A上一张熟练之后审核速度能快不少。另外它支持导入模型做“自动标注”你可以把 Grounded-SAM 或者自己训好的 YOLO 挂进去让它在工具里直接出预标注结果人工只做修正。2.4 三者串联的完整逻辑把这三个串起来整条链路是这样的用 Grounded-SAM 对未标注图片做第一轮自动标注输出检测框和掩码用 autodistill 把这些标注作为“伪标签”训练一个轻量目标模型比如 YOLOv8用训练好的轻量模型去标注更多数据或者用 X-AnyLabeling 挂载模型做交互式预标注人工在 X-AnyLabeling 里审核、修正、导出成标准格式把修正后的数据再喂回训练形成数据飞轮。这个循环跑起来之后你会发现标注成本在快速下降而模型效果在稳步上升。下面我把每一步的实操细节展开。3. 环境搭建与依赖安装的实操细节3.1 硬件与系统选择这套流程对硬件的要求主要集中在 Grounded-SAM 的推理上。如果你只是做小批量几百张的自动标注一张 8GB 显存的显卡比如 RTX 3060就够用如果要处理上万张图建议 12GB 以上显存或者用批处理加显存优化。CPU 推理也能跑但速度会慢很多一张图可能要十几秒不太实用。系统方面LinuxUbuntu 20.04/22.04是最省心的CUDA 和 PyTorch 的兼容性最好。Windows 也能跑但偶尔会遇到一些依赖编译问题。macOS 可以用 MPS 加速但 Grounded-SAM 在 MPS 上的支持不如 CUDA 成熟建议还是用 Linux 或 Windows NVIDIA 显卡。3.2 Python 环境与核心依赖我习惯用 conda 建一个独立环境避免和系统 Python 打架conda create -n autolabel python3.10 conda activate autolabelPython 版本建议 3.9 到 3.10太新的版本有些依赖还没跟上。然后装 PyTorch根据你的 CUDA 版本去官网选对应的命令比如 CUDA 11.8pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118接着装 Grounded-SAM 相关的包。Grounded-SAM 的代码库依赖比较多建议直接 clone 官方仓库然后按 README 装git clone https://github.com/IDEA-Research/Grounded-Segment-Anything.git cd Grounded-Segment-Anything pip install -r requirements.txt这里有个坑segment-anything和groundingdino有时候需要单独编译安装尤其是 groundingdino 的 CUDA 算子。如果编译报错可以先检查你的 CUDA 版本和 PyTorch 版本是否匹配然后按官方 issue 里的方案处理。实在编译不过可以用预编译的 wheel或者退而求其次用 CPU 版本的算子速度会慢。autodistill 的安装就简单多了pip install autodistill autodistill-grounded-sam autodistill-yolov8X-AnyLabeling 可以直接下载 release 里的可执行文件Linux 下是 AppImageWindows 下是 exe。如果想用源码跑git clone https://github.com/CVHub520/X-AnyLabeling.git cd X-AnyLabeling pip install -r requirements.txt python anylabeling/app.py3.3 模型权重下载与存放Grounded-SAM 需要下载几个权重Grounding DINO 的权重、SAM 的权重vit_h、vit_l、vit_b 三选一。SAM 的 vit_h 最大最准但显存占用也最高8GB 显存建议用 vit_b 或 vit_l。权重下载后放在一个固定目录代码里用绝对路径引用避免路径混乱。提示权重文件比较大SAM vit_h 有 2.4GB下载时注意网络稳定下载完校验一下文件大小和 MD5避免半截文件导致加载失败。4. 用 Grounded-SAM 做第一轮自动标注4.1 核心参数怎么定阈值、文本提示、框筛选Grounded-SAM 的推理脚本里几个关键参数直接决定标注质量box_threshold检测框的置信度阈值默认 0.3 左右。调高会减少误检但可能漏检调低则相反。实测下来对于清晰的目标0.35 到 0.4 比较稳对于小目标或模糊目标可以降到 0.25。text_threshold文本匹配的阈值影响模型对提示词的理解严格程度一般 0.25 左右。文本提示prompt这是最关键的。不要只写一个词要用“类别1. 类别2. 类别3.”的格式比如“person. helmet. vest.”。多个类别之间用句点加空格分隔模型会分别检测。提示词越具体效果越好比如“red helmet”比“helmet”更准。NMS 阈值后处理时的非极大值抑制默认 0.5 到 0.7。如果发现同一个目标出了好几个框可以调低这个值。我一般会先用一小批图20 到 50 张做参数扫描把 box_threshold 从 0.2 到 0.5 各跑一遍看哪个阈值下误检和漏检的平衡最好。这个步骤不能省因为不同数据集的最优阈值差别很大。4.2 批处理脚本的写法与显存控制单张推理的脚本官方有示例但实际用的时候肯定要批处理。我写了一个简单的批处理脚本核心逻辑是遍历图片目录逐张推理把结果保存成 JSON 或直接写成标注格式。这里要注意显存控制每张图推理完要torch.cuda.empty_cache()否则跑几十张之后显存就爆了。import os import torch from grounded_sam import run_grounded_sam image_dir ./images output_dir ./auto_labels os.makedirs(output_dir, exist_okTrue) for img_name in os.listdir(image_dir): if not img_name.lower().endswith((.jpg, .png, .jpeg)): continue img_path os.path.join(image_dir, img_name) result run_grounded_sam( img_path, promptperson. helmet. vest., box_threshold0.35, text_threshold0.25 ) # 保存结果 save_result(result, os.path.join(output_dir, img_name .json)) torch.cuda.empty_cache()如果图片特别多可以考虑用多进程但要注意每个进程独立占显存别开太多。一般一张 8GB 卡跑一个进程就够了开两个就容易 OOM。4.3 输出格式与后续对接Grounded-SAM 的输出包括检测框xyxy 格式、置信度、类别标签、分割掩码。如果下游是检测任务只需要框和类别如果是分割任务还需要掩码。我建议把原始输出先存成 JSON保留所有信息后面再按需转换成 COCO 或 YOLO 格式。这样万一后面要改格式不用重新推理。注意Grounded-SAM 的类别标签是文本不是数字 ID。转格式的时候需要建一个类别到 ID 的映射表这个表要固定下来后面训练和推理都用同一套否则类别会错乱。5. 用 autodistill 训练轻量模型并形成闭环5.1 autodistill 的工作机制与 API 拆解autodistill 的核心抽象是“基础模型”和“目标模型”。基础模型负责生成标注目标模型负责学习。它的 API 大概长这样from autodistill_grounded_sam import GroundedSAM from autodistill_yolov8 import YOLOv8 base_model GroundedSAM(ontologyontology) target_model YOLOv8(yolov8n.pt) base_model.label(./images, extension.jpg) target_model.train(./dataset)这里的ontology是一个类别本体定义你要检测的类别。autodistill 会自动用基础模型给图片打标然后组织成目标模型需要的训练格式。这个流程的好处是标准化你不用自己写格式转换脚本。5.2 数据集划分与训练参数autodistill 默认会按一定比例划分训练集和验证集但你最好自己控制划分确保验证集有代表性。训练 YOLOv8 的时候几个关键参数epochs一般 50 到 100 轮数据少的时候可以多跑几轮但要注意过拟合。imgsz输入尺寸默认 640。如果目标很小可以调到 1280但显存占用会翻倍。batch根据显存定8GB 显存跑 yolov8n 可以用 batch 16跑 yolov8m 可能只能 batch 8。learning rate默认 0.01如果 loss 震荡可以降到 0.001。训练完之后用验证集评估 mAP。如果 mAP 太低比如低于 0.5说明自动标注的质量不够需要回到 Grounded-SAM 那一步调参数或者增加人工修正的比例。5.3 数据飞轮的启动与迭代节奏数据飞轮的核心是“模型越好标注越准标注越多模型越好”。具体操作上我建议这样迭代第一轮用 Grounded-SAM 标注 500 张人工修正 100 张作为验证集训练 YOLOv8第二轮用训练好的 YOLOv8 去标注新的 1000 张人工只修正模型不确定的样本置信度在 0.3 到 0.6 之间的再训练第三轮重复第二轮但逐步降低人工修正的比例直到模型在验证集上的 mAP 稳定在 0.8 以上。这个节奏下通常三轮之后人工工作量能降到最初的 20% 以下。关键是每一轮都要保留一批“干净”的人工标注作为评估基准否则你无法判断模型是真的变好了还是只是拟合了伪标签的噪声。6. 在 X-AnyLabeling 里做人工审核与格式导出6.1 导入预标注结果与快捷键操作X-AnyLabeling 支持导入多种格式的预标注。如果你用的是 Grounded-SAM 的 JSON 输出可能需要写个小脚本转成它支持的格式比如 COCO JSON 或 YOLO txt。导入之后每张图上会显示预标注的框你只需要检查、拖动、删除、补充。快捷键是提效的关键。我常用的几个W画新框E编辑当前框D下一张A上一张CtrlS保存Delete删除选中框熟练之后一张图如果预标注质量不错3 到 5 秒就能过。如果预标注质量差可能要 20 秒以上这时候就要回头去调 Grounded-SAM 的参数了。6.2 审核策略哪些该改哪些可以放过审核不是每张图都要精修。我的策略是分级高置信度且框准的直接过不改高置信度但框有偏差的微调框的边界低置信度的重点看可能是误检也可能是漏检的目标明显漏检的补框。另外对于分割任务掩码的边界往往需要修这个比较费时间。如果掩码质量普遍不好可以考虑只用检测框掩码后面用专门的分割模型再跑一遍。6.3 导出格式与训练对接X-AnyLabeling 支持导出 COCO、YOLO、VOC、MOT 等格式。导出前要确认类别映射表一致否则训练时类别会错。导出后建议抽查几张图的标注文件确认坐标和类别都对。特别是 YOLO 格式的归一化坐标如果图片尺寸信息丢了坐标就会错。提示导出前先备份一份原始标注万一导出格式有问题不用重新审一遍。7. 常见问题与排查技巧实录7.1 Grounded-SAM 误检漏检严重怎么办这是最常见的问题。排查顺序检查提示词是不是太宽泛换成更具体的描述试试调 box_threshold从 0.3 往上调到 0.4 或 0.5看误检是否减少检查图片质量太暗、太模糊、分辨率太低的图模型效果会差很多换 SAM 权重vit_b 换成 vit_h分割质量会提升但显存占用增加考虑微调 Grounding DINO如果某个类别的漏检特别严重可以用少量人工标注微调一下。7.2 autodistill 训练不收敛或 mAP 很低可能的原因自动标注的噪声太大伪标签本身就不准类别不平衡某些类别样本太少学习率太高或太低训练轮数不够或过拟合。我的做法是先用一小批人工精标的数据训练一个 baseline看 mAP 能到多少然后再用自动标注的数据训练对比差距。如果差距很大说明自动标注质量不行需要回去优化。7.3 X-AnyLabeling 在 Linux 下的常见问题Linux 下用 AppImage 有时候会遇到 FUSE 相关的问题可以加--appimage-extract-and-run参数运行。如果是源码运行可能会缺一些系统库比如libxcb、libGL按报错提示装对应的包就行。另外Linux 下中文输入法有时候会有问题建议用英文标签或者在系统层面配好输入法。7.4 显存不够用的优化手段用更小的 SAM 权重vit_b降低输入图片的分辨率但会影响小目标检测用半精度推理fp16批处理时及时清空显存如果实在不够可以分块推理把大图切成小块分别跑再合并结果。8. 一些实操心得与后续扩展方向跑了几轮之后我最大的体会是自动标注不是“一键搞定”而是一个“迭代优化”的过程。第一轮的结果通常只能算“可用”需要人工修正和参数调整但每一轮之后质量都会明显提升。关键是不要指望一次就完美而是建立一个可持续的循环。另外类别体系的设计很重要。如果类别定义模糊比如“车辆”和“汽车”混用自动标注和人工审核都会很痛苦。建议在开始之前就把类别体系定清楚写成一个 ontology 文件所有环节都用同一套。后续扩展的话可以考虑几个方向一是接入主动学习让模型主动挑“最不确定”的样本给人工标进一步提升效率二是把分割掩码用起来做实例分割或者抠图三是把整条链路容器化用 Docker 打包方便在不同机器上复现。最后分享一个小技巧在 X-AnyLabeling 里审核的时候可以先把图片按“预标注置信度”排序先审低置信度的因为那些最可能有问题。高置信度的快速过一遍就行。这样能把有限的人工时间花在刀刃上。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →