从Label Studio导出标注和数据
在标注项目的任何阶段,您都可以从Label Studio导出标注结果。
Label Studio 将您的标注以原始JSON格式存储在SQLite数据库后端、PostgreSQL数据库后端或您指定的任何云或数据库存储目标中。云存储桶为每个已标注任务包含一个名为task_id.json
的文件。有关同步目标存储的更多信息,请参阅云存储设置。
以JSON格式导出的图像标注使用图像整体尺寸的百分比而非像素来描述边界框的大小和位置。更多信息请参阅如何转换图像标注单位。
备注
某些导出格式仅导出标注内容而不包含任务数据。如需了解更多信息,请参阅Label Studio支持的导出格式。
Label Studio 如何将结果保存在标注中
在标注任务时创建的每个注释都包含区域和结果。
- 区域指数据中被选中的部分,无论是文本片段、图像区域、音频段落还是其他实体。
- 结果指分配给该区域的标签。
每个区域在每条标注中都有一个唯一的ID,由A-Za-z0-9_-
字符组成的字符串构成。每个结果ID与其所应用的区域ID相同。
当使用预测结果创建标注时,标注字段中的结果ID保持不变。这使您能够追踪机器学习模型生成的区域,并将其与人工创建和审核的标注直接进行比较。
在Label Studio社区版中使用界面导出
按照以下步骤从Label Studio界面导出数据和标注。
- 对于项目,点击导出。
- 选择一个可用的导出格式。
- 点击导出来导出您的数据。
社区版中的导出超时设置
如果导出超时,请参阅如何使用SDK导出快照或API。您也可以使用控制台命令来导出项目。更多信息请参阅以下部分。
通过控制台命令导出
使用以下命令导出数据和标注。
label-studio export <project-id> <export-format> --export-path=<output-path>
启用日志:
DEBUG=1 LOG_LEVEL=DEBUG label-studio export <project-id> <export-format> --export-path=<output-path>
使用简易导出API进行导出
您可以调用Label Studio API来导出标注结果。对于小型标注项目,调用导出端点即可导出标注数据。
导出所有任务,包括未标注的任务
Label Studio开源版本默认仅导出带标注的任务。如需轻松导出所有任务(包括无标注的任务),可调用Easy Export API并添加查询参数download_all_tasks=true
。例如:
curl -X GET https://localhost:8080/api/projects/{id}/export?exportType=JSON&download_all_tasks=true
如果您的项目规模较大,可以使用快照导出(或快照SDK)来避免大多数情况下的超时问题。默认情况下,快照会包含所有未标注的任务。
使用快照API导出快照
对于一个包含数十万任务的大型标注项目,请执行以下操作:
- 向创建新的导出文件或快照发送POST请求。响应中包含所创建文件的
id
。 - 检查已创建的导出文件状态,使用
id
作为export_pk
。 - 使用创建的快照中的
id
作为导出主键(即export_pk
),向下载导出文件发起GET请求。
Label Studio 支持的导出格式
Label Studio支持多种常见和标准格式用于导出已完成的标注任务。如果找不到适合您的格式,您可以贡献一个。更多信息,请参阅Label Studio Converter工具的GitHub仓库。
ASR_MANIFEST
将自动语音识别的音频转录标签导出为NVIDIA NeMo模型所需的JSON清单格式。支持使用Audio
标签与TextArea
标签的音频转录标注项目。
{“audio_filepath”: “/path/to/audio.wav”, “text”: “the transcription”, “offset”: 301.75, “duration”: 0.82, “utt”: “utterance_id”, “ctm_utt”: “en_4156”, “side”: “A”}
将笔刷标签转换为NumPy和PNG格式
将您的笔刷遮罩标签导出为NumPy二维数组和PNG图像。每个标签输出为一张图像。支持使用BrushLabels
标签的笔刷标注图像项目。
COCO
一种流行的机器学习格式,被COCO数据集用于目标检测和图像分割任务。支持使用BrushLabels
、RectangleLabels
、KeyPointLabels
(见下方说明)或PolygonLabels
标签的边界框和多边形图像标注项目。
KeyPointLabels Export Support
如果使用KeyPointLabels
,您需要在标注配置中添加以下内容:
- 至少需要一个
选项。您将使用它作为关键点的父级边界框。 - 在
标签内的每个中添加一个
model_index
。model_index
值定义了YOLO输出数组中关键点坐标的顺序。
例如:
<View>
<Image name="image" value="$image"/>
<KeyPointLabels name="kp" toName="image">
<Label value="nose" model_index="0"/>
<Label value="eye" model_index="1"/>
<Label value="tail" model_index="2"/>
</KeyPointLabels>
<RectangleLabels name="bbox" toName="image">
<Label value="animal"/>
</RectangleLabels>
</View>
标注完成后,您必须将每个关键点区域拖放到区域面板中对应的矩形区域下方。
这将建立一个父子层级关系(通过parentID),这是导出所必需的。请参阅下面的导出示例。
导出示例
[
{
"result": [
{
"id": "17n06ubOJs",
"type": "keypointlabels",
"value": {
"x": 6.675567423230974,
"y": 20.597014925373134,
"width": 0.26702269692923897,
"keypointlabels": [
"nose"
]
},
"origin": "manual",
"to_name": "image",
"parentID": "QHG4TBXuNC",
"from_name": "kp",
"image_rotation": 0,
"original_width": 200,
"original_height": 179
},
{
"id": "QHG4TBXuNC",
"type": "rectanglelabels",
"value": {
"x": 3.871829105473965,
"y": 4.029850746268656,
"width": 94.39252336448598,
"height": 92.08955223880598,
"rotation": 0,
"rectanglelabels": [
"animal"
]
},
"origin": "manual",
"to_name": "image",
"from_name": "bbox",
"image_rotation": 0,
"original_width": 200,
"original_height": 179
}
]
[
{
"id": 0,
"image_id": 0,
"category_id": 0,
"segmentation": [],
"bbox": [
7.74365821094793,
7.213432835820895,
188.78504672897196,
164.84029850746268
],
"ignore": 0,
"iscrowd": 0,
"area": 31119.38345654903
},
{
"id": 1,
"image_id": 0,
"category_id": 0,
"keypoints": [
13,
37,
2,
33,
33,
2,
167,
24,
2
],
"num_keypoints": 3,
"bbox": [
13,
24,
154,
13
],
"iscrowd": 0
}
]
0 0.5106809078771696 0.5007462686567165 0.9439252336448598 0.9208955223880598 0.06675567423230974 0.20597014925373133 2 0.1628838451268358 0.18507462686567164 2 0.8371161548731643 0.13134328358208955 2
CoNLL2003
一种常用于CoNLL-2003命名实体识别挑战赛的流行格式。支持使用Text
和Labels
标签的文本标注项目。
CSV
结果以逗号分隔值的形式存储,列名由标注配置中"from_name"
和"to_name"
字段的值指定。支持所有项目类型。
JSON
以原始JSON格式存储的项目列表,保存在一个JSON文件中。使用此格式可同时导出数据集的数据和标注。支持所有项目类型。
JSON_MIN
导出仅包含原始JSON格式中"from_name", "to_name"
值的项目列表。使用此格式可导出数据集的标注和数据,不包含Label-Studio特定字段。支持所有项目类型。
例如:
{
"image": "https://htx-pub.s3.us-east-1.amazonaws.com/examples/images/nick-owuor-astro-nic-visuals-wDifg5xc9Z4-unsplash.jpg",
"tag": [{
"height": 10.458911419423693,
"rectanglelabels": [
"Moonwalker"
],
"rotation": 0,
"width": 12.4,
"x": 50.8,
"y": 5.869797225186766
}]
}
Pascal VOC XML
一种流行的XML格式任务数据,用于目标检测和图像分割任务。支持使用RectangleLabels
标签的边界框图像标注项目。
spaCy
Label Studio 不支持直接导出为 spaCy 二进制格式,但您可以将从 Label Studio 导出的标注转换为与 spaCy 兼容的格式。执行此转换必须安装 spacy Python 包。
要将Label Studio标注转换为spaCy二进制格式,请执行以下操作:
将您的标注导出为CONLL2003格式。
打开下载的文件并更新导出文件的第一行,在第一行添加
O
:-DOCSTART- -X- O O
在命令行中运行spacy convert命令,将CoNLL格式的标注转换为spaCy二进制格式,请将
/path/to/
替换为您的标注文件路径和名称:spacy 版本2:
spacy convert /path/to/
.conll -c ner spacy 版本3:
spacy convert /path/to/
.conll -c conll . 更多信息,请参阅spaCy文档中关于转换现有语料库和标注的部分,了解如何运行spacy convert。
TSV
结果存储在以制表符分隔的表格文件中,列名由标注配置中的"from_name"
和"to_name"
值指定。支持所有项目类型。
YOLO
以YOLOv3和YOLOv4格式导出目标检测标注。支持使用RectangleLabels
和KeyPointLabels
标签的目标检测标注项目。
备注
如果使用关键点标签(KeyPointLabels),请参阅COCO下的说明。
Label Studio 标注任务的JSON格式
当你标注数据时,Label Studio会将输出以JSON格式存储。每个已完成任务的原始JSON结构示例如下:
{
"id": 1,
"created_at":"2021-03-09T21:52:49.513742Z",
"updated_at":"2021-03-09T22:16:08.746926Z",
"project":83,
"data": {
"image": "https://example.com/opensource/label-studio/1.jpg"
},
"annotations": [
{
"id": "1001",
"result": [
{
"from_name": "tag",
"id": "Dx_aB91ISN",
"source": "$image",
"to_name": "img",
"type": "rectanglelabels",
"value": {
"height": 10.458911419423693,
"rectanglelabels": [
"Moonwalker"
],
"rotation": 0,
"width": 12.4,
"x": 50.8,
"y": 5.869797225186766
}
}
],
"was_cancelled":false,
"ground_truth":false,
"created_at":"2021-03-09T22:16:08.728353Z",
"updated_at":"2021-03-09T22:16:08.728378Z",
"lead_time":4.288,
"result_count":0,
"task":1,
"completed_by":10
}
],
"predictions": [
{
"created_ago": "3 hours",
"model_version": "model 1",
"result": [
{
"from_name": "tag",
"id": "t5sp3TyXPo",
"source": "$image",
"to_name": "img",
"type": "rectanglelabels",
"value": {
"height": 11.612284069097889,
"rectanglelabels": [
"Moonwalker"
],
"rotation": 0,
"width": 39.6,
"x": 13.2,
"y": 34.702495201535505
}
}
]
},
{
"created_ago": "4 hours",
"model_version": "model 2",
"result": [
{
"from_name": "tag",
"id": "t5sp3TyXPo",
"source": "$image",
"to_name": "img",
"type": "rectanglelabels",
"value": {
"height": 33.61228406909789,
"rectanglelabels": [
"Moonwalker"
],
"rotation": 0,
"width": 39.6,
"x": 13.2,
"y": 54.702495201535505
}
}
]
}
]
}
相关JSON属性描述
查看完整的JSON属性列表,请参阅API文档。
JSON属性名称 | 描述 |
---|---|
id | 数据集中标注任务的唯一标识符。 |
data | 从输入数据任务格式中复制的数据。详情请参阅任务格式文档。 |
project | Label Studio中特定项目的标识符。 |
annotations | 包含任务标注结果的数组。 |
annotations.id | 已完成任务的标识符。 |
annotations.lead_time | 标注任务所花费的时间(秒)。 |
annotations.result | 包含标注或注释任务结果的数组。 |
annotations.updated_at | 标注创建或修改的时间戳。 |
annotations.completed_at | 标注创建或提交的时间戳。 |
annotations.completed_by | 创建标注的用户ID。与Label Studio界面中"人员"页面的用户列表顺序匹配。关于导入格式选项,请参阅Specifying annotators during import。 |
annotations.was_cancelled | 布尔值。关于标注是否被跳过或取消的详细信息。 |
result.id | Identifier for the specific annotation result for this task. Use it to combine together regions from different control tags, e.g. <Labels> and <Rectangle> |
result.parentID | (可选) 引用父级区域result.id。它会在区域面板中将区域组织成层次树结构 |
result.from_name | 用于标注区域的标签名称。参见control tags。 |
result.to_name | 提供待标注区域的对象标签名称。参见object tags。 |
result.type | 用于标注任务的标签类型。 |
result.value | 标签特定的值,包含任务标注结果的详细信息。该值的结构取决于标签的类型。更多信息,请参阅Explore each tag。 |
drafts | 草稿注释数组。格式与annotations数组类似。仅当任务作为快照导出时包含,来自UI界面或通过API导出时包含。 |
predictions | 机器学习预测结果数组。遵循与annotations数组相同的格式,但包含一个额外参数。 |
predictions.score | 基于概率输出、置信度或其他因素得出的结果总体评分。 |
task.updated_at | 任务或其任何标注或评审被创建、更新或删除时的时间戳。 |
导入时指定标注人员
图像标注单元
图像标注的x、y、宽度和高度单位以整体图像尺寸的百分比表示。
使用以下转换公式计算 x, y, width, height
:
pixel_x = x / 100.0 * original_width
pixel_y = y / 100.0 * original_height
pixel_width = width / 100.0 * original_width
pixel_height = height / 100.0 * original_height
例如:
task = {
"annotations": [{
"result": [
{
"...": "...",
"original_width": 600,
"original_height": 403,
"image_rotation": 0,
"value": {
"x": 5.33,
"y": 23.57,
"width": 29.16,
"height": 31.26,
"rotation": 0,
"rectanglelabels": [
"Airplane"
]
}
}
]
}]
}
# convert from LS percent units to pixels
def convert_from_ls(result):
if 'original_width' not in result or 'original_height' not in result:
return None
value = result['value']
w, h = result['original_width'], result['original_height']
if all([key in value for key in ['x', 'y', 'width', 'height']]):
return w * value['x'] / 100.0, \
h * value['y'] / 100.0, \
w * value['width'] / 100.0, \
h * value['height'] / 100.0
# convert from pixels to LS percent units
def convert_to_ls(x, y, width, height, original_width, original_height):
return x / original_width * 100.0, y / original_height * 100.0, \
width / original_width * 100.0, height / original_height * 100
# convert from LS
output = convert_from_ls(task['annotations'][0]['result'][0])
if output is None:
raise Exception('Wrong convert')
pixel_x, pixel_y, pixel_width, pixel_height = output
print(pixel_x, pixel_y, pixel_width, pixel_height)
# convert back to LS
x, y, width, height = convert_to_ls(pixel_x, pixel_y, pixel_width, pixel_height, 600, 403)
print(x, y, width, height)
手动将JSON标注转换为其他格式
您可以通过命令行或Python对已完成JSON标注的目录或文件运行Label Studio转换工具,将Label Studio JSON格式的标注结果转换为其他格式。
备注
如果您使用的Label Studio版本早于1.0.0,那么这是将您的Label Studio JSON格式标注转换为其他标注格式的唯一方法。
在Label Studio外部访问任务数据(图像、音频、文本)用于机器学习后端
机器学习后端使用任务数据进行预测,您需要在机器学习后端侧下载这些数据。Label Studio提供了下载这些资源的工具,它们位于label-studio-tools Python包中。如果您使用的是官方Label Studio机器学习后端,label-studio-tools包会与其他依赖项自动安装。
从Label Studio实例访问任务数据
在Label Studio中有以下几种存储任务资源(图片、音频、文本等)的方式:
- 云存储
- 外部网页链接
- 已上传的文件
- 本地文件目录
Label Studio将上传的文件存储在项目层级结构中。每个项目都有自己独立的文件夹存放文件。
你可以使用label_studio_tools.core.utils.io.get_local_path
来获取任务数据 - 它会将任务数据中的路径或URL转换为本地路径。
如果是本地路径,它将返回完整的本地路径;如果使用download_resources
参数,则会下载资源。
提供Hostname
和access_token
用于访问外部资源。
在Label Studio实例外部访问任务数据
你可以使用label_studio_tools.core.utils.io.get_local_path
方法来从外部机器获取外部链接和云存储的数据。
重要
别忘了提供凭证。
如果您的机器挂载了相同的磁盘,您可以使用label_studio_tools.core.utils.io.get_local_path
获取数据。如果您将相同磁盘挂载到外部设备
另一种访问数据的方式是使用任务中的链接和ACCESS_TOKEN(查看身份验证文档)。将Label Studio主机名与任务数据中的链接拼接起来,然后在请求中添加访问令牌:
curl -X GET http://localhost:8080/api/projects/ -H 'Authorization: Token {YOUR_TOKEN}'
常见问题
问题 #1: 我发起了一个请求并收到以下API响应:
- 未提供任何数据。
- 返回了404或403错误代码。
回答: 首先在发送API请求时检查您的Label Studio实例的网络访问情况。您可以执行带有示例数据的测试curl请求。
问题 #2: 我尝试访问文件时收到FileNotFound
错误。
回答:
请确认您已挂载与Label Studio实例相同的磁盘。然后首先检查您的文件在Label Studio实例中是否存在。
检查您的Label Studio实例中的
LOCAL_FILES_DOCUMENT_ROOT
环境变量,并将其添加到您的数据访问脚本中。
问题 #3: 如何修改COCO和YOLO导出中的类别顺序?
标签默认按字母顺序排序。如需修改此行为,请在中添加category属性进行调整。例如:
<Label value="abc" category="1" />
<Label value="def" category="2" />