拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

X-AnyLabeling + autodistill + Grounded-SAM:零标注数据自动标注实战

X-AnyLabeling + autodistill + Grounded-SAM:零标注数据自动标注实战

1. 自动标注这件事,为什么值得认真做

做视觉项目的人都有一个共同体会:模型精度的天花板,往往不是网络结构决定的,而是标注数据的数量和质量决定的。一个几千张图的检测任务,纯手工拉框,熟练工一天也就标个几百张,遇到小目标密集、遮挡严重的场景,效率还要再打对折。更麻烦的是,标注标准会随着项目推进不断调整,返工成本极高。所以这几年“自动标注”从一个边缘话题变成了刚需,大家都在琢磨怎么让模型先跑一遍,人工只做修正,把重复劳动压到最低。

我这次要聊的这套组合——X-AnyLabeling + autodistill + Grounded-SAM,就是目前开源生态里落地性比较强的一条链路。它解决的核心问题是:在没有或只有极少标注数据的情况下,快速生成可用的预标注结果,并通过人工修正形成高质量数据集,再反哺模型训练,形成数据飞轮。X-AnyLabeling 负责交互式标注和 AI 辅助推理,autodistill 负责把大模型的知识蒸馏成小模型可用的标注,Grounded-SAM 则提供开放词汇的检测加分割能力,三者串起来,基本覆盖了从“零标注”到“可训练数据”的全过程。

这套流程适合谁?如果你正在做目标检测、实例分割、缺陷检测这类任务,手里有一批原始图片但标注进度严重滞后,或者你想验证一个新品类但不想一上来就投入大量人力,那这套方案值得花时间跑一遍。它不需要你从头训练大模型,也不需要昂贵的标注平台账号,一台带显卡的机器就能起步。下面我按实际操作的顺序,把每个环节的选型逻辑、关键参数、踩坑经验都摊开讲。

2. 三件套各自扮演什么角色,为什么这样搭配

2.1 X-AnyLabeling:把标注工具变成推理前端

X-AnyLabeling 本质上是一个标注工具,但它的价值远不止画框。它内置了多种 AI 模型接口,可以在标注过程中直接调用模型做预标注,人工只需要调整和确认。这一点很关键,因为传统流程是“先跑推理脚本生成 json,再导入标注工具”,中间格式转换、坐标对齐、类别映射全是坑。X-AnyLabeling 把推理和标注合到一个界面里,省掉了大量胶水代码。

它的另一个优势是支持自定义模型。你可以把训练好的 YOLO、Segment Anything、Grounding DINO 等模型挂进去,用快捷键触发推理。对于自动标注场景,这意味着你可以先用大模型生成粗标,再用自己的小模型做二次筛选,整个迭代都在一个工具里完成。安装方式上,官方推荐用 conda 建独立环境,Python 版本建议 3.9 到 3.10,太高或太低都会遇到依赖冲突。源码运行的话,PyCharm 里配置好解释器后直接跑anylabeling/app.py即可,首次启动会下载默认模型权重,网络不稳的话可以手动放到缓存目录。

2.2 autodistill:把大模型能力蒸馏成可训练标签

autodistill 的定位是“用基础模型自动生成标注”。它的工作方式是:你指定一个基础模型(比如 Grounding DINO)和一个目标模型(比如 YOLOv8),autodistill 会调用基础模型对未标注图片做推理,把结果转成目标模型训练所需的格式,然后自动训练目标模型。整个过程你只需要提供图片和一个文本提示词,比如“person, car, dog”,剩下的它帮你跑完。

为什么需要这一步?因为 Grounded-SAM 这类模型虽然强,但推理速度慢、显存占用高,不适合直接部署到产线。autodistill 的思路是让大模型当“老师”,小模型当“学生”,用大模型的输出去训练小模型,最终得到一个又快又轻的检测器。这个蒸馏过程不是一次性的,你可以迭代多轮:第一轮用大模型标,训练小模型;第二轮用小模型预标,人工修正后再训练。每轮数据质量都在提升,这就是数据飞轮的基本形态。

2.3 Grounded-SAM:开放词汇检测加分割的底座

Grounded-SAM 是 Grounding DINO 和 SAM 的组合。Grounding DINO 负责根据文本提示做开放词汇检测,你输入“红色安全帽”,它就能框出图中所有红色安全帽,不需要预先定义类别。SAM 则负责把框内的物体精细分割出来,得到像素级掩码。两者结合,既能检测又能分割,而且类别是文本驱动的,灵活性极高。

在自动标注链路里,Grounded-SAM 通常扮演“第一遍粗标”的角色。你不需要训练任何模型,只要写好提示词,它就能对一批图片生成检测框和分割掩码。这些结果导入 X-AnyLabeling 后,人工只需要删掉误检、补上漏检、修正边界,工作量比从零标注小得多。需要注意的是,Grounded-SAM 对提示词很敏感,同一个物体用不同的词描述,召回率可能差很多,后面我会专门讲提示词工程。

2.4 三者串联的完整数据流

把这三个工具串起来,实际流程是这样的:原始图片先经过 Grounded-SAM 生成初始标注,导出为 COCO 或 YOLO 格式;然后用 autodistill 把这些标注作为监督信号,训练一个轻量级检测器;训练好的检测器挂到 X-AnyLabeling 里,对剩余图片做预标注;人工在 X-AnyLabeling 里修正后导出最终数据集;这个数据集再拿去训练,循环往复。每一轮循环,标注质量和模型精度都在提升,人工介入的比例逐渐下降。

这个链路的核心价值在于把人工从“全量标注”变成“抽样修正”。第一轮可能人工要改 60% 的框,第二轮降到 30%,第三轮可能只需要改 10%。对于大规模数据集,这个效率提升是数量级的。

3. 环境搭建与依赖安装的实操细节

3.1 基础环境准备与版本选择

这套工具链对环境的敏感度比较高,我建议用 conda 做隔离,不要混用系统 Python。基础环境如下:操作系统 Ubuntu 20.04 或 Windows 10/11 都可以,显卡建议 8G 显存起步,Grounded-SAM 在 1080p 图片上大约占 4-6G 显存。CUDA 版本建议 11.8 或 12.1,对应的 PyTorch 选 2.0 以上。Python 版本统一用 3.10,这是目前兼容性最好的选择。

创建环境的命令很简单:

conda create -n autolabel python=3.10 conda activate autolabel

然后安装 PyTorch,具体命令去官网根据你的 CUDA 版本生成,不要直接pip install torch,那样装的是 CPU 版本,后面跑推理会慢到怀疑人生。装完 PyTorch 后验证一下:

import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))

输出 True 和显卡型号才算正常。这一步没搞定,后面全是白搭。

3.2 X-AnyLabeling 源码运行与模型配置

X-AnyLabeling 可以直接下载 release 包,也可以源码运行。源码运行的好处是方便改代码、加自定义模型。克隆仓库后,进入目录安装依赖:

git clone https://github.com/CVHub520/X-AnyLabeling.git cd X-AnyLabeling pip install -r requirements.txt

如果遇到onnxruntime或opencv版本冲突,优先保证opencv-python是 4.8 以上,onnxruntime-gpu和 CUDA 版本匹配。PyCharm 里运行时,把工作目录设为项目根目录,解释器选刚才建的 conda 环境,直接运行anylabeling/app.py。首次启动会自动下载默认模型,如果卡住不动,去~/.anylabeling/models目录看下载进度,或者手动下载权重放进去。

模型配置在anylabeling/configs下,你可以添加自己的 YOLO 模型。配置文件里指定模型路径、输入尺寸、类别列表、置信度阈值。置信度阈值建议先设 0.3 左右,宁可多出一些误检,也不要漏检,因为人工删框比补框快。

3.3 autodistill 与 Grounded-SAM 的安装要点

autodistill 的安装相对简单:

pip install autodistill pip install autodistill-grounded-sam pip install autodistill-yolov8

但 Grounded-SAM 的依赖比较重,它会自动拉取 Grounding DINO 和 SAM 的权重。如果网络环境不好,建议提前把权重下载到本地,然后修改配置文件指向本地路径。Grounded-SAM 的推理脚本通常需要指定config文件和checkpoint文件,这两个文件在官方仓库的groundingdino/config和weights目录下。

注意:Grounded-SAM 对torch和torchvision版本很挑,如果报CUDA error或undefined symbol,大概率是版本不匹配。建议严格按照官方 requirements 安装,不要随意升级。

4. 用 Grounded-SAM 生成第一轮预标注

4.1 提示词设计与类别映射策略

Grounded-SAM 的检测结果完全取决于你输入的文本提示。提示词写得好,召回率能到 80% 以上;写得不好,可能一半目标都框不出来。我的经验是:用具体名词,不用抽象词;用常见叫法,不用专业术语;多个同义词用句号分隔。比如你要检测“安全帽”,可以写hard hat. safety helmet. helmet.,这样模型会综合多个描述的检测结果,召回率更高。

类别映射是另一个关键点。Grounded-SAM 输出的类别是你输入的文本,但你的训练数据集需要固定的类别 ID。所以中间要做一层映射:把hard hat、safety helmet、helmet都映射到helmet这个类别。这个映射表建议单独用一个 json 文件管理,方便后续修改。映射逻辑写在推理脚本里,不要手动改结果文件,否则图片一多根本管不过来。

4.2 批量推理脚本与参数调优

单张推理用官方 demo 就行,批量推理需要自己写脚本。核心逻辑是遍历图片目录,对每张图调用 Grounded-SAM,把结果转成 COCO 格式的 json。关键参数有三个:box_threshold、text_threshold、nms_threshold。box_threshold控制检测框的置信度阈值,建议 0.25 到 0.35;text_threshold控制文本匹配的阈值,建议 0.2 到 0.3;nms_threshold控制重叠框的合并,建议 0.5 到 0.7。

我实测下来,box_threshold=0.3、text_threshold=0.25、nms_threshold=0.6是一个比较均衡的起点。如果发现漏检多,把box_threshold降到 0.2;如果误检多,升到 0.4。不要一次调多个参数,每次只动一个,观察结果变化。

from autodistill_grounded_sam import GroundedSAM from autodistill.detection import CaptionOntology ontology = CaptionOntology({ "hard hat": "helmet", "safety helmet": "helmet", "person": "person", "vest": "vest" }) base_model = GroundedSAM(ontology=ontology) base_model.label("./images", extension=".jpg")

这段代码会遍历images目录,生成标注结果。CaptionOntology里的字典就是提示词到类别的映射,左边是提示词,右边是类别名。注意提示词不要用大写,全部小写效果更稳定。

4.3 结果导出与格式转换的坑

Grounded-SAM 默认输出的是它自己的格式,需要转成 COCO 或 YOLO 才能被后续工具读取。转 COCO 时要注意bbox格式是[x, y, width, height],不是[x1, y1, x2, y2],很多转换脚本在这里搞错,导致框全部偏移。转 YOLO 时要注意归一化坐标,x_center和y_center是相对于图片宽高的比例,不是绝对像素。

还有一个坑是图片文件名。如果文件名里有中文或空格,某些转换脚本会报错。建议在推理前统一重命名图片为纯数字或英文,比如img_0001.jpg,这样后续处理省心很多。

5. 用 autodistill 训练轻量级检测器

5.1 蒸馏流程的配置与启动

autodistill 的训练流程很直接:指定基础模型、目标模型、数据集路径,然后调用train方法。目标模型通常选 YOLOv8,因为它在速度和精度之间平衡得比较好,而且部署方便。训练参数包括epochs、batch_size、imgsz、device。epochs建议 50 到 100,batch_size根据显存调整,8G 显存用 8 或 16,imgsz用 640。

from autodistill_yolov8 import YOLOv8 target_model = YOLOv8("yolov8n.pt") target_model.train("./dataset", epochs=100, batch_size=16, imgsz=640)

训练完成后,权重保存在runs/detect/train/weights/best.pt。这个模型就是你的第一版自动标注器,可以挂到 X-AnyLabeling 里用了。

5.2 训练数据划分与增强策略

autodistill 会自动划分训练集和验证集,默认比例是 8:2。如果你的数据量很小,比如只有几百张,建议手动划分,确保验证集有足够的样本覆盖各种场景。数据增强方面,YOLOv8 默认开启了 mosaic、mixup、随机翻转等增强,对于小数据集很有帮助。但如果你的目标有方向性(比如文字、交通标志),不要用随机翻转,否则会引入错误标签。

提示:第一轮训练不要追求高精度,mAP 能到 0.5 以上就够用了。这一轮的目的是得到一个能用的预标注器,不是最终模型。

5.3 模型评估与迭代判断

训练完成后看results.csv和confusion_matrix.png。重点看两个指标:mAP50和recall。mAP50反映整体精度,recall反映漏检情况。对于自动标注场景,recall比precision更重要,因为漏检的框人工很难发现,而误检的框人工删掉就行。如果recall低于 0.6,说明模型漏检严重,需要增加数据或调整提示词。

6. 在 X-AnyLabeling 里做人工修正与数据闭环

6.1 模型挂载与快捷键操作

把训练好的best.pt放到 X-AnyLabeling 的模型目录,在配置文件里注册。启动后,按Ctrl+A触发 AI 推理,模型会对当前图片生成预标注框。常用快捷键:D下一张,A上一张,Ctrl+S保存,Delete删除选中框,Ctrl+Z撤销。熟练之后,一张图修正时间可以控制在 10 到 20 秒。

6.2 修正策略与质量控制

修正时遵循“先删后补”的原则:先快速扫一遍,删掉明显错误的框;再检查有没有漏检,补上遗漏的目标;最后微调边界框,让框贴合目标边缘。对于分割任务,还要检查掩码边缘是否准确。质量控制方面,建议每 100 张图抽检 10 张,计算修正率。如果修正率低于 20%,说明模型已经比较可靠,可以扩大自动标注比例;如果高于 50%,说明模型还需要更多数据训练。

6.3 数据飞轮的启动与加速

第一轮修正完成后,导出数据集,重新训练模型。第二轮训练时,把第一轮人工修正过的数据也加入训练集,这样模型能学到人工修正的边界情况。第二轮模型挂到 X-AnyLabeling 后,预标注质量会明显提升,人工修正率下降。如此循环三轮左右,基本可以达到“模型预标 + 人工抽检”的状态,标注成本降到最初的 20% 以下。

7. 常见问题与排查技巧实录

7.1 环境与依赖类问题

问题现象可能原因解决方法
torch.cuda.is_available()返回 FalsePyTorch 装成 CPU 版卸载重装对应 CUDA 版本的 PyTorch
Grounded-SAM 报undefined symboltorch 和 torchvision 版本不匹配按官方 requirements 重装
X-AnyLabeling 启动闪退PyQt 版本冲突重装PyQt5==5.15.9
模型下载卡住网络问题手动下载权重放到缓存目录

7.2 推理与标注类问题

问题现象可能原因解决方法
检测框大量漏检提示词不准确增加同义词,降低 box_threshold
检测框大量误检阈值过低提高 box_threshold 到 0.4
分割掩码边缘粗糙SAM 输入框不准确先修正检测框,再重新分割
导出 COCO 格式后框偏移bbox 格式转换错误检查 xywh 和 xyxy 转换逻辑

7.3 训练与迭代类问题

问题现象可能原因解决方法
训练 loss 不下降学习率过高降低 lr0 到 0.001
验证集 mAP 波动大数据量太少增加数据或增强策略
模型过拟合训练轮次过多减少 epochs,增加 dropout
推理速度慢模型太大换 yolov8n 或 yolov8s

实操心得:Grounded-SAM 的推理速度大约是每张图 2 到 5 秒,autodistill 训练 100 轮大约 30 分钟到 1 小时,X-AnyLabeling 修正一张图 10 到 20 秒。整个流程跑通后,一个 5000 张图的项目,从零到可用数据集,大约需要 3 到 5 天,其中人工修正占 60% 时间。

8. 一些让流程更顺滑的个人经验

提示词工程这块,我踩过最大的坑是用了一个很专业的术语,结果模型完全不认识。后来换成大白话,召回率直接翻倍。所以写提示词的时候,把自己当成在跟一个外国人描述图片,用最简单、最具体的词。

X-AnyLabeling 的模型配置,建议把置信度阈值设低一点,比如 0.25,让模型多输出一些框。人工删框比补框快得多,而且删框的时候还能顺便检查有没有漏检。这个策略在多个项目里都验证过,整体效率最高。

autodistill 训练的时候,第一轮不要用太多数据增强,先把基础模型跑起来。等第二轮数据量上来了,再开启 mosaic 和 mixup。否则小数据集加上强增强,模型很难收敛。

最后分享一个小技巧:在 X-AnyLabeling 里修正的时候,可以按类别分组处理。比如先把所有person的框检查一遍,再检查helmet,这样注意力更集中,不容易漏掉细节。这个习惯让我在密集场景下的修正效率提升了大概 30%。

返回列表