ZenML 集成 Label Studio:在 MLOps 流水线中接入数据标注的完整指南
ZenML 集成 Label Studio在 MLOps 流水线中接入数据标注的完整指南【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml本篇技术指南以 ZenML 开源仓库中的 Label Studio 组件指南 为骨架结合 Label Studio 集成源码 展开系统讲解如何在 ZenML 栈中注册 Label Studio 标注器、配置云对象存储与认证密钥、通过 CLI 与标准步骤完成数据集的注册、同步和标注数据导出。读完本文你将能够在自己的 ML 工作流中搭建一套云存储数据 → Label Studio 人工标注 → 标注结果回流 ZenML 流水线的完整闭环。Label Studio 与 ZenML 的结合点Label Studio 是目前数据科学家与 ML 工程师最常用的开源标注平台之一用于创建或编辑数据集并作为训练或验证工作流的一部分被消费。它支持广泛的标注类型包括计算机视觉图像分类、目标检测、语义分割音频与语音分类、说话人日志speaker diarization、情感识别、音频转录文本 / NLP分类、命名实体识别NER、问答、情感分析时间序列分类、分割、事件识别多模态 / 领域任务对话处理、OCR、带参照的时间序列。在 ZenML 中标注器Annotator是栈Stack中的一个可选组件。官方组件总览页见 docs/book/component-guide/annotators/README.md明确指出当你的 ML 工作流中需要对数据进行标注时就可以考虑将标注器组件加入 ZenML 栈。从源码结构看ZenML 的标注器抽象BaseAnnotator被设计成同时服务于训练与部署两个生命周期环节其核心职责包括在训练步骤中无缝使用标签或标注处理标注数据的版本管理支持标注数据在自定义格式之间的转换处理标注工具特有的任务例如生成 Label Studio Web 标注界面所需的 UI 配置label config。关于术语ZenML 在命名上做了一个明确的取舍Label Studio 把一组标注/任务称为Project而大多数其他工具称其为DatasetZenML 统一称之为Dataset单个标注 源数据的最小单元在 ZenML 与 Label Studio 中统称为task。这一命名约定在整篇文档和后续 CLI 命令中都会用到。当前集成支持的存储范围需要特别注意当前版本的 Label Studio 集成只支持以下三种云对象存储用于标注工作流——AWS S3、GCP/GCS、Azure Blob Storage。纯本地的栈目前无法将标注组件加入其中使用文档明确说明这一限制源码中的populate_artifact_store_parameters方法同时也支持local存储类型属于实现层面的额外支持但官方文档以云存储为准。部署 Label Studio 标注器Label Studio 标注器 flavor 由 ZenML 的 Label Studio 集成提供必须先安装集成才能将其注册为标注器并加入栈。第一步安装集成zenml integration install label_studio安装后集成会声明其 Python 依赖label-studio-sdk1.0.0见 src/zenml/integrations/label_studio/init.py并通过LabelStudioAnnotatorFlavor向 ZenML 注册名为label_studio的 flavor。可以用zenml annotator flavor list查看当前可用的标注器 flavor 列表。第二步获取 Label Studio API Key接下来需要获取 Label Studio 的 API Key它用于访问 Web 标注界面。以下步骤针对本地实例如果你使用的是已部署的实例可以直接从实例中获取 API Key。git clone https://github.com/HumanSignal/label-studio.git cd label-studio docker-compose up -d # 在 http://localhost:8080 启动 Label Studio然后访问 http://localhost:8080/ 登录再进入 http://localhost:8080/user/account 从右上角获取你的 Label Studio API Key。保持 Label Studio 服务持续运行因为 ZenML 的 Label Studio 标注器会把它作为后端来使用。第三步注册认证密钥将 API Key 注册到 ZenML 的自定义密钥secret中把中的两部分替换为你自己的命名zenml secret create label_studio_secrets --api_keyyour_label_studio_api_key从源码看API Key 的获取优先级是先读取步骤级 settings 中显式配置的api_key若不存在则从认证密钥get_authentication_secret()中读取名为api_key的键值见 label_studio_annotator.py。因此密钥中的字段名必须为api_key。第四步注册标注器组件zenml annotator register label_studio --flavor label_studio --authentication_secretlabel_studio_secrets --port8080 # 对于已部署的 Label Studio 实例也可以传入 URL例如 # zenml annotator register label_studio --flavor label_studio --authentication_secretLABEL_STUDIO_SECRET_NAME --instance_urlyour_label_studio_url --port80使用已部署实例时instance URL 末尾不能带/并且要显式指定端口例如标准 HTTP 连接使用 80。如果使用 Hugging Face 部署上手 Label Studio 的最简方式请参考 Hugging Face 关于 Label Studio Docker Space 的部署文档。相关配置项在源码中有明确的默认值见 label_studio_annotator_flavor.py配置项默认值说明instance_urlhttp://localhostLabel Studio 实例的 URLport8093标注界面使用的端口api_keyNoneSecretFieldLabel Studio 的 API Key属于敏感字段从密钥中读取LabelStudioAnnotator的get_url()方法会按instance_url:port拼接访问地址若未配置 port 则直接使用instance_url。而get_url_for_dataset(dataset_name)则会进一步拼接出某个数据集对应的标注页面地址形如.../projects/id/供 CLI 的dataset annotate命令打开浏览器使用见 label_studio_annotator.py。第五步组装并激活栈把以上组件加入栈并设为当前激活栈。例如zenml stack copy default annotation zenml stack update annotation -a YOUR_CLOUD_ARTIFACT_STORE # 这一步必须单独执行以便先注册好其他必需的栈组件 zenml stack update annotation -an YOUR_LABEL_STUDIO_ANNOTATOR zenml stack set annotation # 可选 zenml stack describe完成后运行一个简单的 CLI 命令验证zenml annotator dataset list如果该命令无报错输出说明标注器已就绪可以在 ML 工作流中使用了。通过 CLI 使用标注器ZenML 假设用户已按上述步骤注册了云对象存储与标注器目前仅支持这一组合本地全栈方案后续版本才会加入。日常使用主要通过zenml annotator ...系列 CLI 命令完成zenml annotator dataset list列出当前可用的数据集。其底层调用annotator.get_dataset_names()返回所有 Label Studio Project 的标题见 src/zenml/cli/annotator.pyzenml annotator dataset annotate dataset_name针对某个数据集打开 Web 标注界面zenml annotator dataset stats dataset_name查看某数据集的统计信息返回(已标注任务数, 未标注任务数)二元组对应源码中的get_dataset_stats见 label_studio_annotator.pyzenml annotator dataset delete dataset_name支持--all删除数据集。仓库中还有一个端到端计算机视觉示例位于examples/computer_vision其标注部分使用了 FiftyOne 与 Ultralytics 生态而 Label Studio 的完整端到端示例可参考官方 zenml-projects 仓库的 end-to-end-computer-vision 项目是理解本集成各组件如何协同工作的最佳起点。Label Studio 标注器栈组件核心能力ZenML 的LabelStudioAnnotator类继承自BaseAnnotator并混入了AuthenticationMixin除了必须实现的核心方法如注册/获取数据集之外还针对 Label Studio 提供了大量扩展方法。核心已启用的功能包括注册数据集add_dataset(dataset_name, label_config)调用 Label Studio SDK 的start_project创建 Projectregister_dataset_for_annotation则先按名称查重存在则复用不存在才创建见 label_studio_annotator.py 与 label_studio_annotator.py导出标注数据get_labeled_data/get_unlabeled_data分别取回已标注与未标注的任务列表get_converted_dataset(dataset_name, output_format)支持按指定格式Label Studio 支持的 export 类型导出转换后的数据集启动标注器守护进程launch()会先通过_connection_available()检查与 Label Studio 后端的连接调用check_connection()状态为UP即视为可用然后调用webbrowser.open打开标注界面。由于 Label Studio 必须运行一个服务才能使用 Web 界面ZenML 会根据注册组件时传入的细节在本地代为启动该服务——除非你显式指定使用已部署的实例。此外还提供get_url()、get_url_for_dataset()、get_dataset_stats()、get_parsed_label_config()等辅助方法方便在流水线中或调试时获取界面 URL、数据集统计与解析后的 label config。标准步骤快速打通标注工作流ZenML 提供了一系列标准步骤及其配套配置对象让 Label Studio 集成可以快速上手。这些步骤统一带有step(enable_cacheFalse)装饰器见 label_studio_standard_steps.py即默认禁用步骤缓存确保每次运行都真正访问 Label Studio 拉取最新状态。配置对象LabelStudioDatasetRegistrationConfig注册数据集时使用的步骤配置对象用于get_or_create_dataset步骤。LabelStudioDatasetSyncParameterssync_new_data_to_label_studio步骤的参数对象源码中的实际配置类名。关键字段及默认值如下参数默认值说明storage_typelocal同步的存储类型可选[gcs, s3, azure, local]label_config_type必填使用的 label config 类型prefixNone云端存储中导入数据的路径前缀本地存储则为数据所在目录的绝对路径regex_filter.*过滤待导入文件的正则表达式use_blob_urlsTrue数据是原始图片/视频还是 JSON 任务presignTrue是否创建预签名 URLpresign_ttl1预签名 URL 的保持时间description数据集描述azure_account_name/azure_account_keyNoneAzure 存储账户凭据google_application_credentialsNoneGCP 应用凭据文件路径aws_access_key_id/aws_secret_access_key/aws_session_tokenNoneAWS 凭据s3_region_name/s3_endpointNoneS3 区域与端点需要提醒的是使用sync_new_data_to_label_studio时要求你的对象存储组件预先注册好一个 ZenML 密钥用于存放对应云厂商的认证信息——这些凭据会被 ZenML 自动转换为 Label Studio 导入存储import storage所需的格式。四个标准步骤get_or_create_dataset(label_config, dataset_name)接收LabelStudioDatasetRegistrationConfig配置包含数据集名称。若数据集已存在则直接返回其名称若不存在则 ZenML 会连同合适的 label config 一起向 Label Studio 注册该数据集。步骤内部会先确认当前激活栈的标注器是LabelStudioAnnotator并检查后端连接否则抛出StackComponentInterfaceError或TypeError见 label_studio_standard_steps.py。get_labeled_data(dataset_name)获取指定数据集的所有已标注数据。输出为 Label Studio 的标注格式之后需要转换为适合你具体场景的格式例如后续训练步骤所需的 COCO、YOLO 等格式。底层调用Project.get_labeled_tasks()。sync_new_data_to_label_studio(uri, dataset_name, predictions, params)确保 ZenML 管理标注、且使用的文件存储在 ZenML 云对象存储中并保持同步。这是持续标注工作流中的关键步骤——它保证工作流后续步骤与最新产生的标注保持一致。其执行流程见 label_studio_standard_steps.py为校验当前激活栈同时包含标注器与对象存储从传入 URI 解析出prefix去除开头的/与base_uri并校验 URI 必须以当前对象存储路径开头否则拒绝同步调用populate_artifact_store_parameters()从对象存储拉取云厂商凭据并填入参数S3 读取 access key/secret/session tokenGCS 将凭据落盘为临时 JSON 文件Azure 从连接字符串解析 AccountName/AccountKey见 label_studio_annotator.py调用connect_and_sync_external_storage()在 Label Studio 侧建立对应云厂商的 import storage 并触发同步S3 路径由于 SDK 暂不支持recursive_scan源码通过直接调用/api/storages/s3接口并设置recursive_scan: True的方式实现递归扫描见 label_studio_annotator.py若传入了预测结果predictions会通过convert_pred_filenames_to_task_ids将基于文件名的预测映射为 task id再调用dataset.create_predictions()写入预标注。此外还有配套的工具函数模块label_studio_utils.py见 label_studio_utils.py提供is_s3_url/is_azure_url/is_gcs_url等 URL 判别函数、clean_url以及上述预测文件名到 task id 的转换函数供各步骤内部复用。辅助函数程序化生成 Label ConfigLabel Studio 在创建/注册数据集时要求提供所谓的label config——一段包含 HTML 风格语法的字符串用于定义自定义标注界面。ZenML 提供三个辅助函数来构造这类字符串位于 label_config_generators/label_config_generators.py文档中提到支持目标检测、图像分类与 OCR 三类从源码看实际实现了四类生成器均返回(label_config, label_config_type)二元组label_config_type对应 enums.py 中的AnnotationTasks枚举generate_image_classification_label_config(labels)生成图像分类标注界面。核心结构为Image标签绑定$image数据字段 Choices单选分类from zenml.integrations.label_studio.label_config_generators.label_config_generators import ( generate_image_classification_label_config, ) label_config, config_type generate_image_classification_label_config( labels[cat, dog] ) # label_config 形如 # View # Image nameimage value$image/ # Choices namechoice toNameimage # Choice valuecat / # Choice valuedog / # /Choices # /Viewgenerate_basic_object_detection_bounding_boxes_label_config(labels)生成目标检测边界框标注界面。使用RectangleLabels为图像提供矩形框标注工具每个类别对应一个Label。generate_basic_ocr_label_config(labels)生成 OCR 标注界面。配置更为复杂包含支持缩放/旋转控制的Image、可过滤的Labels、Rectangle/Polygon区域标注工具以及perRegiontrue的TextArea转录输入框。generate_text_classification_label_config(labels)生成文本分类标注界面源码中已实现文档中提及后续将补充更多类型实际仓库已包含文本分类。所有生成器在labels为空列表时都会抛出ValueError(No labels provided)。你可以直接把这些函数生成的label_config字符串传给get_or_create_dataset步骤或add_dataset方法避免手写易错的 HTML 模板。一个典型的持续标注流水线形态结合以上组件一个典型的持续标注工作流可以组织为如下形态基于文档描述与标准步骤接口推导具体步骤编排可参考官方端到端示例数据准备步骤产出待标注数据并写入云对象存储输出数据 URIsync_new_data_to_label_studio步骤接收数据 URI将对象存储与 Label Studio 建立同步连接可选地把模型预标注predictions一并写入get_or_create_dataset步骤确保目标数据集在 Label Studio 中已存在含正确的 label config人工标注标注团队通过zenml annotator dataset annotate dataset_name打开 Web 界面完成标注get_labeled_data步骤在训练流水线中拉取最新已标注数据转换为目标格式后进入训练或验证步骤。通过把标注器与对象存储封装进 ZenML 栈标注环节得以纳入版本化、可复现的流水线体系enable_cacheFalse与每次运行实时同步的机制保证了标注结果的即时性。使用前提与限制小结集成目前面向AWS S3、GCP/GCS、Azure Blob Storage三种云对象存储设计纯本地栈不在文档承诺的支持范围内源码实现中额外支持local存储同步但需注意 Label Studio 本地文件服务需开启LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED环境变量见 label_studio_annotator.py已部署的 Label Studio 实例 URL 不能带末尾/且必须显式指定端口sync_new_data_to_label_studio要求对象存储预先注册承载云厂商认证信息的 ZenML 密钥标注数据以 Label Studio 原生格式输出需要在训练前转换为适合具体任务如检测/分类的格式。以上内容均以当前仓库实现为准文档主体见 label-studio.md实现代码见 src/zenml/integrations/label_studio/CLI 入口见 src/zenml/cli/annotator.py标注任务枚举见 src/zenml/enums.py。实际部署时请以你所安装的 ZenML 版本对应的命令输出为准。【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考