ARTICLE DETAIL

资讯详情

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

基于Grounded-SAM与autodistill的自动标注全流程实战

基于Grounded-SAM与autodistill的自动标注全流程实战 1. 为什么我要折腾自动标注这条链路做视觉项目的人都有一个共同的痛模型结构调来调去最后卡住进度的往往不是网络设计而是数据标注。一个几千张图的小项目纯手工框选加打标签两三个人干一周是常态标注质量还参差不齐。更麻烦的是业务方今天说要加一个安全帽类别明天说要补一个反光背心你之前标好的数据全部要返工。这种反复拉扯才是真正拖垮项目节奏的东西。我这次要分享的是一套我自己跑通并且已经在两个实际项目里落地的自动标注全流程核心用到三个工具X-AnyLabeling、autodistill和Grounded-SAM。简单说这套组合能让你用自然语言描述你要标什么模型自动把框和掩码画出来你只需要做审核和微调。它解决的核心问题是把标注从纯人工从零画变成模型预标注加人工审核人力成本能压到原来的两三成。这套流程适合谁如果你正在做目标检测、实例分割相关的项目手里有一批原始图片但标注进度严重滞后或者你想搭建一个能持续迭代的数据飞轮——模型预测、人工修正、数据回流、模型再训练——那这篇内容就是写给你的。哪怕你之前没接触过这几个工具只要会基本的 Python 环境操作跟着走也能跑起来。我会把每一步为什么这么做、参数怎么定、坑在哪里都讲清楚而不是只丢几个命令给你。先说清楚这三个工具各自的定位不然后面容易混。Grounded-SAM是检测加分割的底座它把 Grounding DINO 的开放词汇检测能力和 SAM 的分割能力拼在一起你给一句文本提示它就能把对应物体的框和精细掩码都吐出来。autodistill是一个蒸馏编排框架它的价值在于把大模型基础模型的标注能力转成一个小模型目标模型能学的训练数据本质是帮你把自动标注和后续训练串成流水线。X-AnyLabeling则是那个人机协作的标注前端它内置了多种 AI 辅助标注能力支持导入模型做预标注也支持人工快速修正是整条链路里你每天真正面对的操作界面。把这三个串起来逻辑就顺了Grounded-SAM 负责生成autodistill 负责编排和蒸馏X-AnyLabeling 负责审核和修正。下面我按实际搭建顺序一层层拆开讲。2. 三个工具到底怎么分工选型背后的逻辑2.1 Grounded-SAM开放词汇检测加分割的底座传统检测模型有个死穴它只能识别训练时见过的类别。你想标红色安全帽和蓝色安全帽两个细分类别得先有这两个类别的训练数据鸡生蛋蛋生鸡。Grounded-SAM 绕开了这个限制它用的是开放词汇检测思路——你用自然语言描述目标它就能定位。它的工作流程分两段。第一段是 Grounding DINO 根据文本提示生成候选框比如你输入 person. helmet. vest.它会把图里所有可能是人、头盔、背心的区域框出来并给出置信度。第二段是把这些框喂给 SAMSAM 在框内做精细分割输出像素级的掩码。这个组合的妙处在于检测负责找到大概在哪分割负责精确到边缘两者互补。我实测下来Grounded-SAM 对常见物体的召回相当不错尤其是人、车、动物、日常用品这类。但它也有明显短板文本提示的措辞会显著影响结果。你写 helmet 和写 safety helmet检出的框可能不一样。所以提示词需要针对你的场景调这部分后面会专门讲。2.2 autodistill把大模型能力蒸馏成可训练数据很多人第一次听到 autodistill 会以为它是个标注工具其实不是。它的定位是用基础模型自动标注数据然后训练一个更小、更快、可部署的目标模型。这个思路在业界叫知识蒸馏autodistill 把它工程化了。为什么需要它因为 Grounded-SAM 虽然强但推理慢、显存吃得多你不可能把它部署到边缘设备上跑实时。实际生产里你需要的是一个轻量模型比如 YOLO 系列。autodistill 的作用就是用 Grounded-SAM 给大量无标注图片打上伪标签然后用这些伪标签去训练 YOLO。训练出来的 YOLO 又快又小能部署而它的知识来自 Grounded-SAM。它的 API 设计得很简洁核心就是BaseModel和TargetModel两个概念。你指定一个基础模型比如 GroundingDINO和一个目标模型比如 YOLOv8调用distill方法它就自动完成标注加训练的闭环。这个抽象让整条流水线的代码量压到几十行。2.3 X-AnyLabeling人机协作的审核前端自动标注再强也不可能 100% 准确尤其是边界模糊、遮挡严重的场景。所以必须有一个高效的人工审核环节。X-AnyLabeling 就是干这个的它是 AnyLabeling 的增强版内置了 Segment Anything、YOLO、Grounding DINO 等多种模型的辅助标注能力。它最实用的几个点一是支持导入自定义模型做预标注你可以把 autodistill 产出的伪标签直接加载进来审核二是快捷键设计得很顺手画框、改框、切换图片基本不用碰鼠标三是支持多种导出格式COCO、YOLO、VOC 都能出省去格式转换的麻烦。我个人的用法是Grounded-SAM 批量生成初稿导入 X-AnyLabeling人工只做删错框、补漏框、改类别三件事不做从零画框。这样一张图的审核时间从几分钟压到十几秒。2.4 三者组合的完整数据飞轮把这三个工具串起来就形成了一个闭环原始图片进 Grounded-SAM 生成伪标签伪标签进 X-AnyLabeling 人工审核修正修正后的高质量数据一部分直接用于训练一部分通过 autodistill 蒸馏出轻量模型轻量模型再部署回产线做推理推理结果又能作为下一轮预标注的输入。这就是所谓的数据飞轮——每一轮迭代数据质量和模型能力都在往上走。下面这张表是我对三个工具核心能力的对比方便你快速判断每个环节该用谁工具核心能力输入输出适用环节Grounded-SAM开放词汇检测加分割图片加文本提示框加掩码批量初稿生成autodistill蒸馏编排无标注图片训练好的轻量模型流水线自动化X-AnyLabeling人机协作标注图片加预标注修正后的标注文件人工审核修正3. 环境搭建从零把三个工具跑起来3.1 基础环境与依赖版本选择环境这块我踩过不少坑核心教训是版本一定要锁死。这几个工具依赖的 PyTorch、CUDA、transformers 版本互相之间有兼容性要求你随便装最新版大概率报错。我的推荐配置是 Python 3.10PyTorch 2.1 以上CUDA 11.8 或 12.1。为什么选 3.10 而不是 3.11 或 3.12因为部分依赖尤其是 segment-anything 相关的在 3.11 以上还没完全适配3.10 是最稳的。CUDA 版本要和你显卡驱动匹配用nvidia-smi看一下驱动支持的 CUDA 上限别超过它。先建一个独立虚拟环境别在系统环境里装不然依赖冲突会让你怀疑人生conda create -n autolabel python3.10 -y conda activate autolabel然后装 PyTorch去官网查对应 CUDA 版本的安装命令别用 pip 默认的默认那个往往是 CPU 版pip install torch torchvision --index-url https://download.pytorch.org/whl/cu1183.2 Grounded-SAM 的安装与权重准备Grounded-SAM 的代码仓库需要单独拉它不是一个 pip 包。拉下来之后重点是把两个权重文件放对位置Grounding DINO 的权重和 SAM 的权重。git clone https://github.com/IDEA-Research/Grounded-Segment-Anything.git cd Grounded-Segment-Anything权重文件我建议手动下载因为自动脚本有时候会卡在下载环节。Grounding DINO 的 SwinT 权重大概 700MBSAM 的 vit_h 权重大概 2.4GB。下载完放到指定目录然后在代码里把路径配好。这里有个细节SAM 有三个规格vit_b、vit_l、vit_h参数量依次增大精度也依次提高但显存占用差别很大。vit_h 在 8GB 显存上跑单张图勉强够批量跑会爆。如果你显存紧张用 vit_b 或 vit_l精度损失在大多数场景下可以接受。3.3 autodistill 的安装与模型对接autodistill 是 pip 包装起来简单但要注意它把不同模型拆成了独立子包你需要哪个装哪个pip install autodistill pip install autodistill-grounded-sam pip install autodistill-yolov8装完之后核心就是配置基础模型和目标模型。基础模型用 GroundedSAM目标模型用 YOLOv8。这里有个容易忽略的点autodistill 的 GroundedSAM 封装默认用的提示词需要你自己传不传的话它不知道要标什么。3.4 X-AnyLabeling 的部署与模型加载X-AnyLabeling 有两种用法一是直接下载打包好的可执行文件开箱即用二是从源码跑方便你改代码。如果你只是想用直接下可执行文件最省事。如果你想集成自定义模型就得从源码跑。从源码跑的话装依赖的时候注意它有自己的 requirements别和前面环境的依赖打架。我建议单独再建一个环境给 X-AnyLabeling因为它对某些库的版本要求和其他两个工具不一样。git clone https://github.com/CVHub520/X-AnyLabeling.git cd X-AnyLabeling pip install -r requirements.txt跑起来之后在设置里配置模型路径把 Grounded-SAM 或 YOLO 的权重挂上去就能用 AI 辅助标注了。注意三个工具建议分三个 conda 环境装不要图省事塞一个环境里。它们的依赖冲突是真实存在的分开装能省掉大量排查时间。4. 核心实操从原始图片到可用标注的完整流程4.1 用 Grounded-SAM 批量生成初稿第一步是把你的原始图片整理成一个文件夹然后写一个批量推理脚本。核心逻辑是遍历图片对每张图调用 Grounded-SAM把结果存成标注格式。提示词的写法是关键。我一般用点号分隔多个类别比如要标人、头盔、背心就写person. helmet. vest.。注意每个词后面都要有点号这是 Grounding DINO 的格式要求漏了点号会导致解析异常。置信度阈值和文本阈值这两个参数要重点调。置信度阈值box_threshold控制框的取舍设高了漏检多设低了误检多我一般从 0.3 起步。文本阈值text_threshold控制文本匹配的严格程度0.25 是个不错的起点。这两个值需要根据你的场景微调没有万能值。from groundingdino.util.inference import load_model, load_image, predict import cv2 import os # 加载模型 model load_model(groundingdino/config/GroundingDINO_SwinT_OGC.py, weights/groundingdino_swint_ogc.pth) # 提示词 TEXT_PROMPT person. helmet. vest. BOX_THRESHOLD 0.3 TEXT_THRESHOLD 0.25 img_dir raw_images for img_name in os.listdir(img_dir): img_path os.path.join(img_dir, img_name) image_source, image load_image(img_path) boxes, logits, phrases predict( modelmodel, imageimage, captionTEXT_PROMPT, box_thresholdBOX_THRESHOLD, text_thresholdTEXT_THRESHOLD ) # 后续把 boxes 转成标注格式保存跑完这一步你会得到每张图的候选框。但这时候还没有掩码如果需要分割标注要把框喂给 SAM。SAM 的调用是逐框进行的框多的时候会慢可以考虑用 batch 模式或者降低图片分辨率来提速。4.2 用 autodistill 串起蒸馏流水线如果你不想手写上面那套批量脚本autodistill 能帮你省掉大部分代码。它的核心就几行from autodistill_grounded_sam import GroundedSAM from autodistill.detection import CaptionOntology from autodistill_yolov8 import YOLOv8 # 定义本体也就是提示词到类别的映射 ontology CaptionOntology({ person: person, helmet: helmet, vest: vest }) # 基础模型 base_model GroundedSAM(ontologyontology) # 对无标注图片生成数据集 dataset base_model.label( input_folder./raw_images, extension.jpg, output_folder./labeled_dataset ) # 目标模型 target_model YOLOv8(yolov8n.pt) target_model.train(dataset, epochs50)这段代码干了三件事用 GroundedSAM 给所有图片打伪标签把伪标签整理成 YOLO 训练格式然后训练一个 YOLOv8。跑完之后你既得到了标注数据又得到了一个可部署的轻量模型。本体ontology的定义是重点。左边是提示词右边是你要输出的类别名。提示词可以写得具体一点比如 safety helmet 映射到 helmet这样检出率往往比直接写 helmet 高。4.3 导入 X-AnyLabeling 做人工审核伪标签生成后导入 X-AnyLabeling 审核。导入的时候选对应的格式如果是 YOLO 格式注意类别文件classes.txt要一起放进去不然类别名会显示成数字。审核阶段我总结了一套高效操作流先用快捷键快速过一遍看到明显错误的框直接删然后处理漏检用 AI 辅助功能补框最后统一检查类别是否正确。X-AnyLabeling 的快捷键设计得很合理比如D下一张、A上一张、CtrlS保存熟练之后一张图几秒钟就能过。这里有个提效技巧把置信度低的框用不同颜色显示优先审核这些。X-AnyLabeling 支持按置信度排序你可以先处理最不确定的那些高置信度的快速扫过。4.4 数据回流与飞轮迭代审核完的数据就是高质量标注了。这批数据有两个用途一是直接用于训练你的业务模型二是作为 autodistill 的输入去蒸馏更好的轻量模型。飞轮的关键在于回流。你部署的轻量模型在产线上跑推理会遇到新的场景、新的难例。把这些难例图片收集起来重新走一遍Grounded-SAM 生成、人工审核、蒸馏训练的流程模型就会越来越强。我一般每积累 500 到 1000 张新难例就迭代一轮太频繁了收益不明显太稀疏了模型跟不上场景变化。5. 参数调优与提示词工程实战5.1 提示词怎么写才能提高检出率提示词是 Grounded-SAM 的命门写得好坏直接决定初稿质量。我总结了几个规律。第一用具体名词别用抽象词。写 car 比写 vehicle 好写 safety helmet 比写 protective equipment 好。抽象词会让模型把一堆不相关的东西框进来。第二多个类别之间用点号分隔末尾也要有点号。这是格式硬要求我见过太多人因为漏了点号导致解析失败。第三同义词可以都写上提高召回。比如你要标汽车可以写 car. automobile. vehicle.模型会把三种描述对应的物体都框出来你再在审核阶段去重。第四注意大小写和单复数。Grounded DINO 对大小写不敏感但单复数有时会影响结果。写 person 和 people 检出的框可能略有差异建议用单数。5.2 置信度阈值的取舍逻辑置信度阈值没有标准答案取决于你对漏检和误检的容忍度。我的经验是分场景定场景box_thresholdtext_threshold理由初稿生成宁多勿漏0.250.20后续有人工审核多框点没关系直接用于训练0.350.25减少噪声标签对训练的干扰密集小目标0.200.15小目标置信度普遍偏低阈值要降大目标稀疏场景0.400.30大目标容易检出可以提高门槛调阈值的方法很简单拿 20 张代表性图片跑几组不同阈值人工数一下漏检和误检数量选综合最优的那组。别凭感觉拍脑袋。5.3 SAM 分割精度的控制SAM 的分割质量受几个因素影响。一是框的质量框不准分割边缘就会偏。二是图片分辨率分辨率越高分割越精细但速度越慢。三是模型规格vit_h 比 vit_b 的边缘处理明显更好。如果你发现分割边缘毛糙先检查框是不是贴得太松。SAM 是在框内做分割的框如果比物体大一圈SAM 可能会把背景也分进来。解决办法是把框收紧一点或者用 SAM 的自动掩码生成模式不依赖框全图分割但那个模式更慢。6. 常见问题与排查实录6.1 环境与依赖类问题问题一导入 groundingdino 报错 No module named groundingdino这是最常见的问题。groundingdino 不是 pip 包需要从源码安装。进到 Grounded-Segment-Anything 目录下的 groundingdino 子目录执行pip install -e .。如果报编译错误检查你的 CUDA 和 PyTorch 版本是否匹配。问题二CUDA out of memory显存不够。解决办法按优先级降低图片分辨率、换小规格的 SAM 模型、减小 batch size、用半精度推理。如果都不行只能换显卡或者用 CPU 推理慢到怀疑人生。问题三autodistill 训练 YOLO 时报类别数不匹配检查你的 ontology 定义和数据集类别数是否一致。autodistill 会根据 ontology 自动生成类别如果你中途改了 ontology 但没重新生成数据集就会对不上。6.2 标注质量类问题问题一某些类别完全检不出来先检查提示词。把提示词换成更通用的说法试试比如 helmet 检不出就试 hat 或 headwear。如果还是不行可能是这个类别在 Grounding DINO 的训练数据里就很少见这种情况只能靠人工补标或者换用针对性的检测模型。问题二同一个物体被框了好几次这是重叠框问题。Grounded-SAM 有时会对同一物体输出多个框尤其是物体有多个部分符合提示词时。解决办法是在后处理里做 NMS非极大值抑制把重叠度高的框合并。autodistill 内部有做这个处理手写脚本的话要自己加。问题三分割掩码把背景也分进来了框太松导致的。收紧框或者调高 SAM 的分割阈值。SAM 有个pred_iou_thresh参数调高它会过滤掉低质量的掩码。6.3 性能与效率类问题问题一批量推理太慢Grounded-SAM 单张图推理在消费级显卡上大概 1 到 3 秒几千张图就是几个小时。提速手段用半精度、降低分辨率、用 batch 推理、多进程并行。我一般用 4 进程并行速度能提升 3 倍左右。问题二X-AnyLabeling 加载大图卡顿图片分辨率太高。建议在标注前把图片缩到 2000 像素以内标注完再把坐标映射回原图尺寸。X-AnyLabeling 支持自动缩放但大图还是会卡。问题三审核速度上不去快捷键不熟。花半小时把 X-AnyLabeling 的快捷键过一遍效率能翻倍。另外把置信度低的框优先审核高置信度的批量确认也能省不少时间。6.4 常见问题速查表问题现象可能原因排查方向解决办法模块导入失败依赖未安装或版本冲突检查 pip list按官方要求锁版本重装显存溢出模型太大或分辨率太高看 nvidia-smi换小模型或降分辨率类别检不出提示词不当换提示词测试用更通用的说法框重叠未做 NMS检查后处理加 NMS 合并重叠框掩码不准框太松看框的贴合度收紧框或调分割阈值推理太慢单进程串行看 CPU 占用多进程并行加半精度7. 我踩过的坑和几条实在建议先说一个最容易被忽视的坑别一上来就追求全自动。我见过有人想完全跳过人工审核直接用 Grounded-SAM 的输出训练模型结果模型学了一堆噪声标签精度还不如手工标的小数据集。自动标注的定位是提效工具不是替代人工。人工审核这一环在可预见的未来都省不掉但可以把工作量压到最低。第二个坑是提示词一次写太多类别。有人图省事把十几个类别塞进一个提示词里结果模型顾此失彼每个类别的检出率都下降。我的建议是一次不超过 5 个类别类别多了分批跑最后合并结果。第三个坑是忽略数据平衡。自动标注容易导致某些常见类别被标得特别多稀有类别很少。训练的时候要注意类别平衡不然模型会偏向常见类。可以在审核阶段刻意多补一些稀有类别的样本。第四个坑是版本不锁。前面反复强调过这里再提一次。这套工具链的依赖关系很脆弱今天能跑的代码明天更新个包可能就崩了。养成习惯环境建好后立刻pip freeze requirements.txt把版本固定下来。最后分享一个提效小技巧把整个流程脚本化。从图片预处理、Grounded-SAM 推理、格式转换到导入 X-AnyLabeling每一步都写成脚本用一个主脚本串起来。这样每次迭代只需要改几个参数不用重复手动操作。我现在的流程是把新图片丢进一个文件夹跑一条命令几个小时后就能拿到待审核的标注文件中间不需要人工干预。这套流程我用了大半年从最初的手忙脚乱到现在基本稳定最大的感受是自动标注的价值不在于省掉人工而在于把人工从重复劳动变成决策劳动。你不再需要一帧一帧画框而是快速判断这个框对不对、这个类别准不准这种工作模式对标注人员的要求更高但效率也高得多。如果你的项目正卡在数据标注上不妨按这个思路搭一套试试前期投入几天时间后面能省下几十天。
返回列表