☰
X-AnyLabeling、Grounded-SAM与autodistill自动标注流水线实战
2026/9/30 10:07:27 网站建设 项目流程

标注数据集的活儿干多了,谁都会想找个偷懒的办法。我最近把 X-AnyLabeling、autodistill 和 Grounded-SAM 这三样东西串成了一条自动标注流水线,实测下来,原本要花一周的人工标注工作,压缩到一两天就能搞定。这篇文章把这套全流程完整记录下来,包括环境部署、参数调优、踩过的坑,以及最终怎么把标注结果直接喂给模型训练。

如果你正在做目标检测、实例分割这类视觉项目,每天被标注软件折磨得昏天黑地,或者已经听说过 X-AnyLabeling 但没真正跑起来,这篇文章应该能帮你少走不少弯路。我会尽量说人话,该给命令给命令,该讲原理讲原理,保证新手也能照着复现。

1. 自动标注的逻辑:为什么要把这三个工具串起来

1.1 每个工具的分工

先说结论:X-AnyLabeling 是干活的主战场,Grounded-SAM 是出高质量标注的核心引擎,autodistill 是打通“标注-训练”全自动闭环的最后一环。

X-AnyLabeling 这个工具,本质上是 labelme 的增强魔改版。它保留了手工标注的全部能力,同时内置了大量 AI 模型。你可以在界面里直接加载 YOLOv8、SAM、GroundingDINO 这些模型,点一下按钮,模型自动画框、自动出分割掩码,然后你只用做人工复核。这意味着“人机协同标注”可以在同一个软件里完成,不用在多个工具之间来回切换。

Grounded-SAM 是一个组合模型,把 GroundingDINO 和 SAM 串在一起。GroundingDINO 负责“看文字找目标”,你输入“人、汽车、狗”这样的文本提示,它就能在图片里把对应物体框出来;SAM 负责“精确抠图”,拿到框之后,生成像素级的分割掩码。这两者一配合,就实现了“用一句话自动生成精确标注”。

autodistill 解决的问题是最后一公里的自动化。它把 Grounded-SAM 这类大模型当作“标注老师”,自动给一整批图片生成标注;再把标注结果直接蒸馏训练一个轻量级的目标检测模型。整个流程从原始图片到训练好的小模型,只需要写几行 Python 代码。

1.2 流水线的核心思路

把这几个工具串起来的核心逻辑其实很简单:先用大模型自动标注,再用小模型承接业务。

纯手工标注的问题不用多说,一张图里十几个目标,框到眼瞎,腰酸背痛。纯自动标注也不现实,模型总有失误,特别是边缘案例、遮挡严重的物体,直接拿自动标注去训练,模型会学到一堆错误。

所以我实际采用的路线是分层推进:第一层用 Grounded-SAM 做“粗标”,把图片里的目标全部找出来、框出来、分割出来,这一步追求的是覆盖率和召回率;第二层用 X-AnyLabeling 做“精修”,人工把错误的标注删掉、修正边界、补充漏检目标,这一步追求的是准确性;第三层把修正后的数据交给 autodistill,自动完成格式转换和模型蒸馏训练,尽量把手动环节压缩到最小。

这套方案还有个好处:每个环节的产出物都是标准格式。Grounded-SAM 输出 COCO 格式 JSON,X-AnyLabeling 基于 labelme 格式,autodistill 直接产出 YOLO 训练集。数据在工具之间流转不需要写复杂的迁移脚本,对非程序员也很友好。

2. 环境部署:把 X-AnyLabeling 源码跑起来

2.1 源码安装的关键步骤

X-AnyLabeling 的安装有不少细节,最容易出问题的是直接拿 pip 装成品包。我建议用源码方式部署,因为这样能拿到最新的模型支持列表,也方便后续改代码。

git clone https://github.com/CVHub520/X-AnyLabeling.git cd X-AnyLabeling conda create -n anylabeling python=3.8 -y conda activate anylabeling pip install -r requirements.txt

这里有几个坑必须先说明:

第一,Python 版本建议固定在 3.8 到 3.10 之间。太新的 Python 版本,部分依赖库编译会出问题,特别是 opencv-python 和 PyQt5 的二进制包在某些新版本下表现不稳定。

第二,requirements.txt 安装完之后,强烈建议单独验证一下 PyQt5 是否正常。很多人的环境里 PyQt5 装上了但实际上缺 libGL 等系统库,启动时直接闪退。

python -c "from PyQt5.QtWidgets import QApplication; print('PyQt5 OK')"

如果这一步报错,在 Ubuntu 系系统上装一下系统依赖:

sudo apt-get install libgl1 libglib2.0-0 -y

第三,模型文件不是安装包自带的。进入界面以后,左下角选择模型时,软件会自动弹出下载提示。国内网络环境下模型下载经常失败,我建议直接从各模型的官方 Release 页面手动下载权重,放到~/.anylabeling或项目根目录下的models目录里。具体目录路径在软件输出的日志里能看到。

2.2 PyCharm 里运行 app.py

热词里出现“pycharm 运行 x-anylabeling 源码环境部署”,说明不少人卡在这一步。我用 PyCharm 跑该项目时遇到过几个典型问题,直接说结论。

打开 PyCharm 后,不要直接双击 app.py 就运行,你得先做三件事:

第一,把解释器切到刚才创建的 conda 虚拟环境。在 PyCharm 的 Settings → Project → Python Interpreter 里,选择anylabeling环境的 Python 路径。

第二,把项目根目录标记为 Sources Root。右键X-AnyLabeling文件夹,选择 Mark Directory as → Sources Root。不这么做的话,import anylabeling这类相对导入会报 ModuleNotFoundError。

第三,运行配置里,Script path 指向X-AnyLabeling/anylabeling/app.py,Working directory 填项目根目录。

完成后直接右键运行 app.py,正常情况下会弹出主窗口。如果界面没出现,先看 Run 窗口的日志。我碰到过一次卡在“Loading model...”的情况,后来发现是模型文件没下载完成,界面在等模型加载线程返回。

2.3 模型加载与快捷键

X-AnyLabeling 界面左下角是模型选择区,点开能看到一长串可用模型,包括groundingdino_swint_ogc、yolov8s、sam_vit_h、oneformer等。这里有几个经验:

  • 做目标检测优先选 YOLOv8 系列,速度最快,加载也快。
  • 做实例分割选 SAM 系列,但 SAM 对显存要求高,如果你的显卡显存小于 8GB,运行起来会明显卡顿。
  • GroundingDINO 适合“不知道要标什么类别”的冷启动阶段,输入文本提示词就能出框。

实际操作中我通常加载两个模型:一个检测模型快速出框,一个 SAM 模型做精细分割。不需要同时加载太多模型,内存会爆炸。

快捷键这块,不同小版本会有细微差别,但核心的几组我整理在这里:

操作快捷键
创建矩形框Ctrl+N
创建多边形Ctrl+W
保存标注Ctrl+S
复制选中标注Ctrl+C / Ctrl+V
撤销 / 重做Ctrl+Z / Ctrl+Shift+Z
删除选中标注Delete
缩放画布Ctrl+滚轮
平移画布空格+左键拖拽

另外有个很实用的小技巧:调整已有标注框大小时,在框的顶点附近悬停,鼠标会变成双向箭头,直接拖就行。想微调的话,配合 Alt 键用滚轮可以逐像素调整边缘位置,实测比鼠标拖拽精准得多。

所有快捷键在菜单栏的 Help 里都有速查表,如果你发现自己的版本和上面的表不一样,以你本机的为准。

3. 核心实操:从 Grounded-SAM 精度标注到 autodistill 蒸馏闭环

3.1 Grounded-SAM 批量出标注

要让 Grounded-SAM 跑起来,先准备环境。我建议单独建一个 conda 环境,避免跟 X-AnyLabeling 的依赖冲突。

conda create -n grounded_sam python=3.8 -y conda activate grounded_sam git clone https://github.com/IDEA-Research/Grounded-SAM.git cd Grounded-SAM pip install -r requirements.txt

然后下载两个关键权重:GroundingDINO 的groundingdino_swint_ogc.pth和 SAM 的sam_vit_h_4b8939.pth。前者接近 700MB,后者超过 2GB,都是从官方 GitHub Releases 页面下载。

跑批量的核心命令长这样:

python main.py \ --config GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py \ --grounded_checkpoint ./groundingdino_swint_ogc.pth \ --sam_checkpoint ./sam_vit_h_4b8939.pth \ --input_image "images" \ --output_dir "outputs" \ --text_prompt "person. car. dog." \ --box_threshold 0.3 \ --text_threshold 0.25

这里要注意--input_image参数,当前版本支持传入文件夹路径对整目录图片进行批量标注。我之前一直传单张图片路径,后来才发现目录批量支持早就有了,白白浪费了很多时间手动逐张跑。

--text_prompt的写法有讲究,类别之间用英文句点隔开。注意是句点,不是逗号。用逗号的话,GroundingDINO 会把它当成一个长文本短语去匹配,效果差很多。另外提示词尽量具体,比如“person”和“pedestrian”在这个模型里对应的检测结果会有差别。

3.2 标注结果回灌 X-AnyLabeling 复核精修

Grounded-SAM 跑完以后,输出的 JSON 文件可以直接用 X-AnyLabeling 打开复核。

打开 X-AnyLabeling 后,直接 File → Open Dir 选择 Grounded-SAM 的输出目录。软件会自动读取 JSON 并叠加显示分割掩码和标注框。你会发现 Grounded-SAM 生成的标注整体质量相当高,但仍然会有漏检和错检的情况,特别是小目标密集区域和遮挡严重的场景。

人工精修阶段,我的操作习惯是:

  • 先过一遍整张图,用 Delete 键删掉明显错误的标注。
  • 漏检的目标,切换成“创建矩形框”模式,用 Ctrl+N 快速补框。
  • 轮廓边界不精细的,选中分割掩码对应的标注,拖动顶点微调。

这个环节看着还是在纯手工干活,但效率完全不一样。因为模型已经帮你把 80% 以上的目标准确标好了,你要做的只是查漏补缺,而不是从零开始画。实际体验下来,一张场景复杂的街拍图,人工从零标注需要 5 到 10 分钟,复核修正只需要 30 秒到 1 分钟。

修正完毕记得 Ctrl+S 保存,标注会写成 labelme 风格的 JSON。

3.3 autodistill 自动化蒸馏训练

数据修正好以后,传统做法是导出 COCO 或 YOLO 格式,然后用训练脚本跑模型。autodistill 把这个过程封装成了几行代码,而且它的设计思路非常适合自监督蒸馏场景。

安装:

pip install autodistill autodistill-grounded-sam autodistill-yolov8

这三件套的作用分别是:主框架、Grounded-SAM 基础模型封装、YOLOv8 目标模型封装。

核心代码:

from autodistill_grounded_sam import GroundedSAM from autodistill.detection import DetBoundingBoxPrompt from autodistill_yolov8 import YOLOv8 # 用文本提示词驱动基础模型自动标注 base_model = GroundedSAM( ontology=DetBoundingBoxPrompt("person. car. dog.") ) # 对未标注图片目录执行自动标注 base_model.label( input_folder="./unlabeled_images", output_folder="./auto_labeled_dataset" ) # 把自动标注结果直接蒸馏训练一个 YOLOv8 检测模型 target_model = YOLOv8("yolov8n.pt") target_model.train("./auto_labeled_dataset", epochs=50)

这里面的关键点是 ontology 的定义,它和 Grounded-SAM 里的text_prompt是等价的。类别名必须跟 X-AnyLabeling 里人工复核时用的标签名保持一致,否则后续数据集合并时类别对不上。

autodistill 跑起来以后,它会自动把图片拷贝到 output 目录下,按 YOLO 格式生成对应的 txt 标注文件,同时按照 train/valid 的比例自动划分数据集。整个过程结束,你直接得到一个可以直接训练的 YOLO 数据集,省去了写转换脚本的功夫。

实测中,用 X-AnyLabeling 人工精修后的数据作为训练集来训练 YOLOv8n,跟直接用 Grounded-SAM 的原始自动标注训练相比,mAP 提升了大概 6 到 8 个百分点。这说明人工复核环节不是可有可无的,它对最终模型质量的影响非常大。

3.4 数据导出与格式转换

X-AnyLabeling 在 File → Export 里提供了多种导出格式,包括 COCO、YOLO、VOC 等。这里单独讲一下,因为格式选不对,后面训练会非常头疼。

如果你走 autodistill 路线,实际上不需要在 X-AnyLabeling 里导出。autodistill 会自己生成 YOLO 格式数据集。但如果你不想走 autodistill,而是想用自己的训练脚本,那在 X-AnyLabeling 里直接导出 COCO 格式是最稳妥的选择。

导出时注意类别顺序。COCO 导出会按照当前标注文件里类别出现的顺序生成 categories 列表,如果你之前标注时类别命名不规范(比如同一物体既有“car”又有“Car”),导出后会生成两个独立的类别,后面训练时模型会把它们当成两种东西。

我建议在开始标注前,先在 X-AnyLabeling 的标签列表里把类别名统一设置好,标的时候直接选择,不要手动输入。这能避免后期一堆格式头疼事。

4. 常见问题与避坑实录

4.1 环境搭建阶段的老大难

环境问题占了我整个流程将近一半的排错时间。这里把典型的几个列出来。

X-AnyLabeling 启动闪退,多半是 PyQt5 或 libGL 的锅。先跑一下前面提到的 PyQt5 验证命令,如果确认 PyQt5 能正常 import,再看系统依赖。Windows 上一般是缺 Visual C++ Redistributable,Mac 上则要关注 PyQt5 和 Python 版本的兼容性。

PyCharm 里运行报 ModuleNotFoundError,90% 是 Sources Root 没设置。还有 10% 是解释器选错了。这两个问题在 2.2 节说过,不再重复。

加载模型时界面卡死,通常是模型文件问题。X-AnyLabeling 加载模型走的是 ONNX Runtime,模型文件在加载过程中如果格式损坏或路径不对,界面会一直卡在“Loading model...”。这时候去日志里找到模型加载的绝对路径,手动确认文件存在且大小正常。

Grounded-SAM 批量跑的时候 OOM,最简单粗暴的方法是减小单批图片尺寸。代码默认会保持原图分辨率,如果原图是 4K 级别的照片,SAM 的显存占用会非常可怕。可以先把图片缩到 1280 边长以内再跑。

4.2 标注质量调整与阈值优化

Grounded-SAM 的box_threshold和text_threshold决定了检测结果的多少和好坏。这两个参数配合起来非常敏感。我实测的经验值:

场景box_thresholdtext_threshold
通用目标检测0.350.25
小目标/密集场景0.250.20
只想要高置信度干净框0.450.30

box_threshold 控制的是“框的置信度门槛”,threshold 设高,检测框少但更准;设低,框多但可能有假阳性。text_threshold 控制的是文本匹配的严格程度,设低能匹配到更多形态的目标,但误匹配也会增加。

实际调参建议:先拿 5 到 10 张有代表性的图片,用一组参数跑一遍,肉眼检查结果,然后调整参数。不要在一开始就追求把参数调到完美,因为后面人工复核环节能兜底,宁可让自动标注结果多一些错漏框,也要保证召回率足够高,把容易漏检的目标尽可能找出来。

另外要说一下文本提示词对质量的影响。Grounded-DINO 对文本比较敏感,同样是“狗”,写“dog.”和“dog. puppy.”的效果就不一样。如果类别是长尾目标,建议在提示词里加入常见同义词或英文复数形式,比如“person. people.”,能明显减少漏检。

4.3 巧用快捷键和模型组合提升效率

最后分享几个能明显提升效率的细节。

X-AnyLabeling 里同时加载 YOLOv8 和 SAM 两个模型时,建议先让 YOLOv8 出框,再让 SAM 基于这些框生成分割掩码。操作顺序是:加载 YOLOv8 模型,点击 AI 自动标注按钮,得到一版检测框;然后切换到 SAM 模型,选中某个检测框,SAM 会自动基于框内的区域生成精确分割。这个顺序比直接上 SAM 全图分割要快得多,显存占用也更低。

批量标注时不要一张一张在界面里操作。Grounded-SAM 支持整个目录批量处理,先在它那里批量出所有图片的初始标注,再统一到 X-AnyLabeling 里复核。复核的时候按 Ctrl+S 保存当前图后,软件会自动跳到下一张,配合快捷键可以做到全程不碰鼠标。

还有个小点,X-AnyLabeling 的自动保存功能建议打开。路径在 Settings → Auto Save,间隔设成 30 秒。我吃过一次亏,标了 20 张图没保存,软件崩了全没了。从那以后我逢人就说先开自动保存。

格式转换方面,如果是从 Grounded-SAM 输出转 X-AnyLabeling 可打开的标注,可以直接用官方给的转换脚本,也可以自己写个小脚本做字段映射。核心就是把 Grounded-SAM 输出的 COCO 风格 JSON 转换成 labelme 风格的 JSON,类别名和坐标格式对齐就行。这个转换不复杂,但确实能省很多手工整理的时间。

我个人在实际操作中的体会是,自动标注的价值不在于完全替代人工,而在于把人工从“从零作画”变成“看图修图”。前者的精力消耗是后者的五到十倍。把 X-AnyLabeling、Grounded-SAM 和 autodistill 按这个流程串起来之后,我最大的感受是:以前标注是项目里最想逃避的环节,现在反而是最快能出成果的环节。如果你正在为标注数据集发愁,不妨照着这套流程试一次,跑通了以后,你大概也会跟我做出同样的选择——先让模型干 80% 的活,自己只留最需要判断力的 20%。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询