说实话我最早对“自动标注”这件事是有点不屑的。以前做目标检测项目一直觉得标注就是纯体力活机器顶多帮你画个框最后还是得人眼一个个过。直到有一次接了个工业质检的项目三千多张缺陷图要求在两周内出第一版模型我算了一下靠两个人手工标注加复核光标注就要干一个半星期剩下时间根本不够调模型。那一次我被迫把市面上能用的自动标注工具全试了一遍最后沉淀下来一套组合流程X-AnyLabeling 做人工精标和结果复核Grounded-SAM 做零样本分割生成autodistill 把整个“老师标注—学生训练”的流程串成流水线。这套流程后来帮我在这类项目上把标注周期压缩到原来的三分之一左右而且模型效果的提升比想象中更明显。这篇文章我把整套流程拆开讲不光是工具怎么装、命令怎么敲更重要的是告诉你每一步为什么这么设计、哪些地方容易踩坑。内容面向的是正在做目标检测、实例分割项目的算法工程师和独立开发者如果你是刚入门的小白也能照着一步步跑通。先说明一点这里说的自动标注是计算机视觉领域的数据标注不是 CAD 图纸的尺寸标注别被某些外挂工具的名字带偏了。1. 自动标注到底在解决什么先想清楚再动手1.1 标注成本是 CV 项目里最容易被低估的坑先说个我自己的惨痛经历。早期做安防场景的行人检测数据量不算大八千张图我用 LabelImg 手工画框画到第两千张的时候就开始手抖。不是累是麻木了。更可怕的是画到后面同一个类别在不同光线下的判定标准都开始漂移了——上午画的和下午画的明显不一样。这种问题不是个别现象。标注成本在 CV 项目里通常占掉整个项目周期的 50% 到 70%而很多人一开始只把标注当成一个“多花点人力就能解决”的环节完全没意识到它会变成瓶颈。具体来说有四个痛点第一是速度。一个熟练的标注员画一个带角度的旋转框平均也要 5 到 8 秒复杂场景下更慢。一整天下来能出 800 到 1000 张图已经算体力不错了。第二是质量一致性。同样一个模糊目标不同人判断标准不一样同一个人不同时间段也不一样。这对训练集的伤害是隐性的模型学了矛盾的标准推理时就容易出现边界摇摆。第三是类别分布。手工标注很容易让稀有类别的样本被忽略因为人眼会本能地去找“显眼”的目标。而自动标注可以按提示词强制扫描每一张图里的每一个目标稀有类反而不容易漏。第四是迭代成本。模型的初版效果往往不理想需要反复补充标注。修复错标、补漏标、调整类别每一轮都是额外的人力。自动标注解决的正是这四个问题。它不是要完全替代人而是把人的工作从“画框”变成“检查框”把机器从“被动执行”变成“主动发现”。1.2 三件套的分工人工精标、零样本分割、批量蒸馏我最终采用的组合是 X-AnyLabeling、Grounded-SAM 和 autodistill 这三个工具。它们不是同一层的东西搞清楚各自的定位才不会用乱。X-AnyLabeling 是一个交互式标注工具它的价值在于“人在环上”。它把 YOLO 检测模型、SAM 分割模型、GroundingDINO 这类基础模型直接集成到了界面里你框一个点它就能建议一个完整的目标你输入一句话它就能把图上所有匹配的目标都标出来。但标注结果的最终决定权仍然在你手里。它的定位是精标和复核工具。Grounded-SAM 则是一个技术组合GroundingDINO 负责根据文本提示找到目标框SAM 负责把目标框精确分割成像素级掩码。合在一起就是“用一句话就能分割出任意目标”。它不需要任何训练样本是真正的零样本能力适合做数据生成的“老师”。autodistill 是一个自动化标注框架。它把“老师模型”比如 GroundingDINO、SAM和“学生模型”比如 YOLOv8之间的流程打通了老师模型自动完成标注输出的数据集直接进入学生模型的训练流程。它解决的是流程串联问题让你不需要自己写一堆胶水代码。工具定位典型产出适合场景X-AnyLabeling交互式标注与复核人工精标、修正后的 JSON/COCO/YOLO种子集标注、结果抽检、少量数据快标Grounded-SAM零样本检测分割引擎文本提示驱动的框与掩码新类别快速出标、无训练数据的冷启动autodistill自动标注到训练流水线可直接训练的数据集训练好的学生模型大批量数据、多轮迭代、持续新增数据用一句话总结我的方案用 X-AnyLabeling 做种子数据的精标和质量控制用 Grounded-SAM 作为零样本标注引擎批量生成标注再用 autodistill 把标注到训练这一整条链路自动化最后回到 X-AnyLabeling 做抽样复核和修正。这套设计解决了前面说的四个痛点中的三个速度交给模型、一致性靠统一的提示词保证、稀有类别靠文本扫描避免遗漏而质量和迭代问题则靠最后的人工复核环节兜底。整个流程是“机器先干 80%人补 20%”而不是反过来。2. 环境准备与安装避坑三个工具一步步装起来2.1 X-AnyLabelingWindows 和 Linux 两个平台的打开方式X-AnyLabeling 的安装在不同平台上差异还挺大的。如果你用的是 Windows最省事的方式是直接去它的 Release 页面下载打包好的 exe。这个打包版本集成了 PyQt5 运行时装上就能用不过缺点是最新功能会比源码版滞后一点模型也需要额外下载。Linux 下就得从源码跑这也是很多算法工程师遇到的第一道坎。先看完整流程git clone https://github.com/CVHub520/X-AnyLabeling.git cd X-AnyLabeling pip install -r requirements.txt python app.py就是这么简单理论上装完依赖就能启动。但实际坑不少。最大的坑是 PyQt5 的依赖版本冲突特别是在 Conda 环境里。我遇到过装完依赖之后启动直接黑屏控制台报的错是 Qt 平台插件相关的。解决办法是单独建一个干净的 Conda 环境Python 版本选 3.9 或 3.10然后在这个环境里装依赖不要跟训练用的环境混在一起。第二个常见坑是模型文件下载。X-AnyLabeling 启动后如果你直接选择某个模型比如 GroundingDINO 或者 SAM它不会自动下载权重而是需要你手动下载模型文件然后在界面里指定路径。下载地址在项目的模型列表页有说明但很多人第一次用不知道以为模型选了就生效结果界面半天没反应。第三个坑是 GPU 和 CPU 的选择。X-AnyLabeling 在模型配置 JSON 里可以指定用 GPU 还是 CPU 推理。默认情况下我建议把 GroundingDINO 这种大模型切到 GPUSAM 可以看情况用 CPU但 CPU 上分割一张图要几秒钟交互体验很差有条件还是上 GPU。启动之后你会看到一个主界面左侧是图片列表中间是画布右侧是标注信息和标签列表。模型的入口在界面的 AI 辅助标注区域选择对应的模型配置加载权重然后就可以在图上交互了。这里有一个使用说明里经常被忽略的小细节模型配置选中之后需要先在右侧或者工具菜单里激活模型然后点击图片上的目标模型才会给出预测。如果你只是选了模型但没激活画布上怎么点都不会有反应。这个坑我帮不少人排查过。2.2 Grounded-SAM把两个模型串成零样本标注链路Grounded-SAM 严格说不是一个开箱即用的工具而是一个项目仓库。它把 GroundingDINO 和 SAM 串成了一个完整的工作流你可以直接跑它的推理脚本也可以把它封装成服务。环境搭建方面推荐直接看 IDEA-Research 的 Grounded-Segment-Anything 仓库。基本步骤是git clone https://github.com/IDEA-Research/Grounded-Segment-Anything.git cd Grounded-Segment-Anything pip install -e . pip install segment-anything然后需要下载两个权重文件。第一个是 GroundingDINO 的 groundingdino_swint_ogc.pth大概 700 多 MB第二个是 SAM 的 sam_vit_h_4b8939.pth大概 2.5 GB。如果你机器显存紧张SAM 也有 ViT-B 和 ViT-L 的版本体积和显存占用都会小很多但分割质量会有一定下降。推理脚本基本长这样python grounding_sam_demo.py \ --config groundingdino/config/GroundingDINO_SwinT_OGC.py \ --grounded_checkpoint groundingdino_swint_ogc.pth \ --sam_checkpoint sam_vit_h_4b8939.pth \ --input_image demo.jpg \ --text_prompt person. car. dog \ --output_dir outputs这里有一个特别关键的参数细节文本提示词用英文而且要用空格或者句号分隔不同类别。比如你要同时识别行人和汽车应该写成 person . car 而不是用逗号。因为 GroundingDINO 的文本编码器是基于 BERT 的它的 prompt 解析逻辑对逗号的支持不稳定用点号或者空格是最稳妥的。还有一个限制是 GroundingDINO 的文本长度限制。它的 BERT tokenizer 最大支持 256 个 token超长提示词会直接截断。如果你要识别很多类不要一次全塞进提示词建议分批跑或者按类别单独跑后再合并结果。如果你是在服务器环境使用我建议把 Grounded-SAM 封装成一个 HTTP 服务输入是图片路径加提示词输出是结果图、掩码和置信度。这样 autodistill 和 X-AnyLabeling 都可以通过接口调用不用每次都在进程里加载模型。加载一次 SAM 的 ViT-H 要好几秒如果每次都重新加载批量标注时这时间消耗是非常可观的。2.3 autodistill用最简单的方式搭出标注到训练的流水线autodistill 的定位和前面两个完全不同。它是一个流程框架由 Roboflow 团队维护核心概念是 teacher-student distillation用一个强大的基础模型当老师自动给无标注数据打标签然后用这些标签去训练一个小而快的学生模型。安装方面很简单pip install autodistill autodistill-grounding-dino autodistill-yolov8它由很多模块组成autodistill-grounding-dino 是老师模型模块autodistill-yolov8 是学生模型模块。如果你要做分割任务可以再加 autodistill-sam。我第一次用 autodistill 的时候只写了大概二十行代码就把一千多张车牌的检测标注跑完了。这里贴一个核心的检测任务示例from autodistill_grounding_dino import GroundingDINO from autodistill.detection import CaptionOntology from autodistill_yolov8 import YOLOv8 ontology CaptionOntology({ license plate: plate, vehicle: car }) base_model GroundingDINO(ontologyontology) dataset base_model.label( input_folder./raw_images, output_folder./labeled_images ) target_model YOLOv8(yolov8n.pt) target_model.train(dataset, epochs100)这个流程里最需要理解的是 CaptionOntology 这个类的设计。它的 key 是给老师模型看的提示词value 是最终数据集的类别名。比如 license plate 是 GroundingDINO 用来在图上找目标的文本plate 是转换后你的数据集里的类别名。这样设计的好处是提示词可以写得非常具体但数据集类别名仍然保持简洁。有一点大家要注意autodistill 在环境上有一个隐蔽的依赖问题。它底层调用 GroundingDINO而 GroundingDINO 对 pytorch、torchvision 和 CUDA 的版本匹配比较敏感。我踩过的坑是 torchvision 版本不对导致运行时直接报错说某个算子找不到。解决办法是严格按照 GroundingDINO 仓库的环境配置来装依赖不要随意升级版本。还有一个使用习惯问题如果你的数据里有很多图压根没有目标label 过程中那些图会被直接跳过或者生成空标注文件。autodistill 默认行为是如果检测不到任何目标会生成一个空的结果。这个没问题但你要知道最后训练的时候这些空图如果混进数据集会影响类别分布和训练指标。后面我在数据校验的环节会专门讲怎么处理。3. 自动标注全流程实战从原始图片到可训练数据集3.1 第一步用 X-AnyLabeling 人工精标种子集很多人的惯性思维是一上来就让模型全自动标注。我的建议恰恰相反先用 X-AnyLabeling 手工标一批种子集数量不大每个类别 30 到 50 个目标就够了。为什么要这样做呢原因有三个。第一是确立标注标准。一个项目里“什么样的目标算有效目标、什么情况要画框、遮挡到什么程度就不标”这些规则必须在种子集里定下来。否则全自动标注出来的结果你会发现数据标准是乱的后期根本没法训练。第二是验证提示词。Grounded-SAM 的提示词设计需要基于真实图片来验证。你写一个 damaged surface 的提示词可以在种子集里直接测看它到底能不能稳定检出你要的缺陷。这一步提前做能避免批量标注跑完才发现提示词不对白跑几小时。第三是给后续的自动标注结果一个对比基准。没有人工精标过的数据你就没法评估自动标注的准确率。有了种子集你就可以随机抽一批自动标注的结果和人工标注比对算 IoU 和类别准确率知道自己该在哪些类别上多花精力复核。在 X-AnyLabeling 里做种子集标注时我一般用矩形框加多边形混合的方式。矩形框标常规目标边界复杂的用多边形。X-AnyLabeling 对多边形标注的支持做得不错可以逐点编辑、插入删减锚点比 LabelImg 好用很多。标注完记得保存成 X-AnyLabeling 的 JSON 格式因为后面如果要导出 YOLO 格式或者 COCO 格式JSON 是中间格式可以无损转换。这一步的产出除了种子集本身还有一套你亲自验证过的标注规范。这是整个自动标注流程里投入产出比最高的一步。3.2 第二步GroundingDINO 跑批量检测的提示词与阈值种子集搞定之后就可以启动批量标注了。如果你的场景类别比较固定、你只是想快速出一批检测框直接用 GroundingDINO 就行。如果你的最终任务是实例分割那就要把 SAM 接在 GroundingDINO 后面。先聊 GroundingDINO 批量检测的实操。它的推理脚本支持传入一个目录里的所有图片但输出的结果默认是画好边界框的图。如果你要的是标注数据而不是可视化图我推荐直接写一个调用脚本遍历图片把检测到的 box、类别和置信度保存到 JSON 里。这里有一个关键参数box_threshold。这个值控制保留检测结果的置信度阈值默认是 0.35。实际项目里我建议先跑一个小批次用 0.2、0.3、0.4 各试一遍把结果可视化之后挑一个平衡点。阈值太高容易漏检尤其小目标和遮挡目标太低又会带来大量误检后期复核工作量爆炸。配合 box_threshold 的还有 text_threshold它控制文本匹配的置信度通常保持默认 0.25 就行主要调整 box 侧就够了。文本提示词的设计也有讲究。我总结了三条经验第一条类别词要贴近 GroundingDINO 训练时见过的语义。网络训练用的概念大多是日常物体的英文名词。如果你写很抽象的工业术语模型很难理解。比如你检测“轮胎上的气泡缺陷”与其写 bubble defect不如先写 bubble 或者 bubble on tire。第二条多个类别时把容易混淆的类别分开跑。比如 person 和 person head如果直接一起写模型很容易把整个人体和头部一起框出来。这时候可以把它们分开跑或者用更细的短语描述。第三条如果项目本身包含中文标注需求GroundingDINO 的中文支持有限建议用英文提示词跑通流程。用翻译工具把类别名翻译成英文跑完之后在导出阶段再把类别名映射回中文。另外提醒一个性能问题。GroundingDINO 用 CPU 跑一张 640x640 的图大约要 10 到 20 秒批量几百张图就得等很久。如果预算允许用 GPU 跑一张图不到一秒效率完全两个世界。没有 GPU 的可以考虑把图缩到 480 以下再喂进模型精度损失可控。3.3 第三步用 SAM 把检测框变成像素级掩码如果你的模型需要实例分割标签批量检测之后还需要一步 SAM。SAM 可以在 GroundingDINO 生成的 box 提示下把检测框区域精确分割成像素级掩码。这个环节的核心体验是“框是粗的掩码是细的”。GroundingDINO 给出的框可能包含背景但 SAM 会基于框内的语义信息把目标本身的轮廓完整抠出来。所以你会发现SAM 生成的掩码往往比框本身更接近人工标注的效果。不过 SAM 也有翻车场景。主要出现在两类图上一类是目标边缘极其不规则且与背景混淆比如透明物体、密集堆叠的物品另一类是目标在图里非常小SAM 对极小目标的分割稳定性会比较差。遇到这两类情况我的建议是不要过度依赖 SAM把它当成粗标工具后续在 X-AnyLabeling 里用多边形修正。如果你要走 autodistill 的流水线做分割流程差不多只是把学生模型换成支持分割的版本比如 YOLOv8-seg。autodistill-sam 模块会负责调用 SAM 完成掩码生成然后输出成训练可用的格式。我自己在实例分割项目里会把 SAM 的分割结果统一做一次后处理把生成的掩码按类别存储成 PNG 单通道图视觉上检查一下有没有明显的错位和噪声。这一步通常在脚本里批量做不需要打开工具界面。3.4 第四步autodistill 流水线与学生模型训练当你需要长期迭代、数据量很大、或者想完整走通“标注-训练”闭环autodistill 的价值就体现出来了。它的工作方式是base_model.label() 生成标注数据集这个数据集实际上是一个带标注文件的目录结构然后 target_model.train() 直接用这个数据集训练学生模型。注意这里说的数据集目录结构是有约定的想要自定义输出格式的话得在 label 之后自己做一次转换。用 autodistill 有一个最核心的流转逻辑老师模型负责“教”学生模型负责“学”。它的工作原理就是让一个开箱即用的基础模型在没有人工标注的新数据上自动产生标签然后让一个小模型在这些自动标签上训练最终得到一个部署场景下更快、更可控的模型。你需要根据任务的标注难度和资源情况来选择合适的老师模型。如果你的类别比较常见GroundingDINO 是一个性价比很高的选择。如果类别很特殊全自动标注效果可能不理想得先用 X-AnyLabeling 标一批种子集再用少量数据微调老师侧或者干脆用纯人工标注。提示词的质量直接影响标注效果这一点怎么强调都不过分。训练学生模型的时候我一般会从轻量级配置开始比如 YOLOv8n 或者 YOLOv8s。用自动标注数据训练的模型初期效果可能没有大模型那么好但它是针对你的数据分布训练过的。之后在 X-AnyLabeling 里复核修正一批错标和漏标把这些修正后的数据回喂给训练集再来一轮训练。如此循环两三轮小模型的效果会迅速逼近甚至超过纯 GroundingDINO 的零样本效果。3.5 第五步回到 X-AnyLabeling 复核修正与格式导出自动标注跑完千万别直接把数据丢进训练脚本。抽样复核这一步是我无论如何都会保留的环节。我的复核策略是按类别分层抽样每类抽 10% 到 15%重点看置信度低的样本和没有检出的图片。在 X-AnyLabeling 里加载自动标注产生的 JSON 文件逐张过一遍发现错的框就直接改漏检的框就补上。这些修改保存后成为新一轮数据集的一部分。还有一类图尤其需要人工确认没有任何目标的空图。自动标注流程里这些图往往生成了空的标注文件但它们对训练的贡献是负面的。要么检查后丢弃要么补充标注后再用。不要默认它们是对的。数据格式转换这个环节X-AnyLabeling 支持输出 YOLO、COCO、VOC 等常见格式。我日常被问得最多的就是“怎么导出 YOLO 的 txt 文件”。在 X-AnyLabeling 的保存或者导出菜单里选择目标格式它会按类别名自动生成 class 列表和归一化的 txt 标注。要注意的是如果数据集中有大量旋转框或者多边形YOLO 格式只支持水平框这时候你就要想想是不是用 COCO 格式或者用 YOLOv8-OBB 那套格式来导出。4. 常见问题排查实录打不开、显存溢出、结果为空在跑这套流程的过程中我遇到的典型问题其实高度集中。先把速查表放出来再展开细说。症状大概率原因快速处理X-AnyLabeling 打开黑屏/闪退PyQt5 与 OpenCV 版本冲突干净环境重装依赖选择模型后无反应权重路径未指定或路径含中文空格配置绝对路径全英文目录CUDA out of memory残留进程占显存 / 模型过大先杀残留进程再换小模型GroundingDINO 漏检多box_threshold 过高 / 提示词不匹配调低阈值重写提示词单独验证SAM 掩码质量差目标极小或边缘与背景混淆改用别的方式初标SAM 只做粗标autodistill 结果全空提示词对图片不敏感单独用 GroundingDINO 验证提示词类别全部错乱ontology key/value 写反确认 key 是提示词value 是类别名4.1 X-AnyLabeling 打不开、闪退、模型加载失败第一优先级是检查环境。最常见的闪退原因是 PyQt5 和 OpenCV 的版本冲突尤其是在 Linux 下装过多个版本的 OpenCV。解决办法是把环境里的 opencv-python 卸载重装一遍确保 Qt 的插件路径能找到。第二个高频问题“我点开模型之后怎么完全没反应” 大概率是模型配置选了但权重文件没有指定或者路径不对。X-AnyLabeling 里的 AI 模型需要你手动指定一个权重文件的绝对路径如果路径含中文或者空格一些跨平台路径处理就容易出问题。建议项目目录全英文路径里不要有空格。第三个问题“明明有 GPU模型加载却报 CUDA out of memory。” 这个不是显存真的不够很多时候是其他进程占了显存。我看了一下 nvidia-smi经常发现是上次跑脚本的进程没杀干净。先 kill 再重试不行再考虑用小一点的模型。4.2 Grounded-SAM 显存溢出与漏检误检Grounded-SAM 里 SAM 的 ViT-H 权重加载就要占 2.5 GB 显存跑推理的时候峰值内存大概要到 8 GB 以上。如果你的显卡只有 6 GB跑大图很容易 OOM。我的处理办法有三个按优先级来说第一把输入图片做短边缩放比如限制到 800 或者 640SAM 的分割质量在小尺寸下损失不会太大第二SAM 换成 ViT-B 权重质量稍差但显存占用能减半第三批量推理的时候控制每次送入的图片数量不要一次把整个文件夹都喂进去。漏检误检的问题则要靠可视化来定位。我会把检测框和掩码叠加在图上输出肉眼快速扫一遍。漏检多就调低 box_threshold误检多就调高。如果一整个类别都几乎检不出来那是提示词的问题不是阈值的问题回到提示词设计上去。4.3 autodistill 标注结果为空或类别错乱autodistill 跑完打开输出文件夹发现很多空标注文件这是大家反馈最多的现象。核心原因多半是 ontology 里写的提示词对图片内容不敏感模型实际什么都没检测到。这时候最先做的应该是单独用 GroundingDINO 跑几张图看看确认提示词本身能不能检出目标。确定提示词没问题之后再检查你给 autodistill 的图片路径和目录结构是否正确。还有一类问题就是“类别错乱”——自动标注出来的类别和预期完全对不上。这通常是在 ontology 映射里 key 和 value 写反了。记住 key 是给老师模型的提示词value 是你想要的类别名两个方向反了输出结果就是乱的。autodistill 还有一个隐蔽问题它在环境初始化时会固定一个 GroundingDINO 的配置如果全局环境里存在多个版本的 groundingdino 包import 顺序可能导致它加载了错误版本表现就是你换了提示词结果完全不变。排查方法是打印一下模型的类名和权重路径确认加载的是哪个文件。5. 工程化落地经验让自动标注真正融入项目5.1 数据质量优先设一道自动标注质量门禁很多团队做完自动标注就直接训练结果模型上线之后才发现数据里有大量脏标签。我的建议是在标注流水线后面加一个质量门禁。最简单的做法就是抽取一部分数据做人工复核算一个“通过率”。比如通过率低于 90%就说明提示词或者阈值有问题需要回头调而不是继续训练。质量门禁的指标我常用两个类别正确率有标注的目标里类别标注正确的比例和边界 IoU自动框和人工框的重合度。这两个指标用一个几百张的小样本就够估算。5.2 半监督闭环让模型训练本身参与标注自动标注真正发挥威力是在你完成第一轮训练之后。第一轮训练得到的学生模型已经学过你项目的数据分布它可以直接部署到 X-AnyLabeling 里做辅助标注。这时候你会发现它在你的业务数据上的预测比 GroundingDINO 更准因为它是见过你的数据的。这个半监督闭环我一直在用自动标注 → 训练小模型 → 小模型辅助人工复核 → 修正后的数据回炉 → 再训练。每轮迭代的数据量不需要大几百张修正图就足以带来明显的效果提升。两三轮之后你会发现新增数据越来越少模型效果趋于稳定这时候项目才算真正进入健康状态。5.3 成本与收益的理性判断最后说一个实际的建议自动标注不是万能的。如果你的项目只有几百张图、类别非常特别、或者目标在视觉上极度依赖专业经验那么纯手工标注反而更快。自动标注的价值曲线在大数据和常规类别场景。你至少要有一千张以上的图片规模或者你的标注迭代要发生三轮以上搭建自动标注流水线的投入才是划算的。从我个人的经验来看判断要不要上自动标注最简单的标准是如果你的数据量超过你手工在三天内能完成标注的量或者你预期未来会连续增加两个以上的新类别那就值得花半天时间把这套流程搭起来。这套流程搭完之后后续每来一批新数据成本几乎就是纯粹的 GPU 推理时间这对项目的扩展节奏影响非常明显。以前我一个人同时带三四个小项目总觉得人手不够现在模型自动干活我只负责抽查和修正精力才真正放回到了模型设计和调优上。最后再提醒一句不管工具多智能第一批数据务必人工精标那是整个自动标注流水线唯一能保证质量的锚点。