目录

  1. 初探
  2. 安装和启动
  3. 设置标签
  4. 导入任务
  5. 开始标注
  6. 导出数据
  7. 优缺点
  8. Reference
  9. END

Photo by Josh Sorenson on Unsplash

数据标注是人工智能背后的女人。—— 我说的

初探

在 reddit 上看到一个人提了一个问题:What is your favourite (free) labelling tool?,你最喜欢的(免费)标注工具是什么。由于我一直关注标注工具,而且没找到好用、漂亮的标注工具(甚至一度计划自己做一个),也认为这块很重要,所以就点进去看了下。收获不少,帖子楼主提到的 Prodigy,我点进去看了看,确实很漂亮,但是收费,来看下价格:

Prodigy 价格Prodigy 价格

罢了。

贫穷让我看到了 Label Studiodoccanobrat,brat 我之前就知道,只是没那么美观。剩下两个都很不错,开源也美观,这次我们来看看前者。

Label StudioLabel Studio

以命名实体识别任务的数据标注为例,先来看下使用 Label Studio 进行标注的效果:

ner演示.gifner演示.gif

查看任务进度:

查看任务进度查看任务进度

后端使用的是 flask,前端使用的是 React。

OK,如果你还满意的话可以继续往下看安装、导入数据等部分了。接下来我会以标注 NER 数据为例,介绍如何使用 Label Studio。标注类别有人名、地名、公司名、产品和时间,标注数据放在 sentences.txt 中,内容如下:

1
2
3
4
5
狼牙山,我站在你面前,显得多么矮小呀!
1976年9月间,我与《福建文艺》编辑部的几位同事,专程到上杭县举办改稿学习班。
罗湾村为修建一座庙宇,从筹集资金、征集土地,到竣工持续近10年。
20日凌晨1时许,博物馆附设的“艺术咖啡”酒吧招待员克罗科洛与监控室的3名女看守联系,没有得到回答。
可口可乐公司的发言人辩称,饮料市场本来就是竞争高度激烈的地方,百事可乐应该直接到市场去竞争,而不是在法庭上争斗。

安装和启动

主要有三种方式 :

  • pip:pip install label-studio,建议使用 conda 等虚拟环境
  • docker:docker pull heartexlabs/label-studio,docker 镜像版本可能会滞后
  • 源码:
    1
    2
    3
    git clone https://github.com/heartexlabs/label-studio.git
    cd label-studio
    python setup.py develop

建议使用 pip 方式安装。

假设我们计划将标注相关文件放在 ner_labeling 文件夹中,你不用事先创建。安装好后使用如下命令启动:

1
label-studio start ner_labeling --init

这会初始化这个项目并默认在 8200 端口启动服务,生成一些默认文件和文件夹:

1
2
3
4
5
ner_labeling/
├── completions # 存放标注好的数据,json 文件,每一个标注完成的任务都放在一个以其 ID 命名的 json 文件中
├── config.json # 项目设置,例如服务端口
├── config.xml # 标签(label)设置
└── tasks.json # 所有导入的任务,key 为任务 ID,value 为任务数据

然后你就可以在 http://{your-server-ip}:8200 访问了。

设置标签

第一步就是要设置标签,具体包括标签名称、颜色等。可以在网页上直接修改并直观看到效果:

设置标签设置标签

如图修改标签名称和颜色,满意后点击左下角的 Save 按钮,保存设置到 config.xml 中。

注意官方并不建议直接修改项目中的文件,建议使用网页或者命令修改。

导入任务

接着点击左上角图标回到主页面,进行第二步导入任务,可以导入 json、csv、tsv 和 txt 等文件格式。对于本文的例子来说,我们使用 txt 文件最为方便,一行是一个句子,直接将文件拖入上传框中即可,完成后会显示导入任务数和耗费时间:

单个 txt 文件大小不超过 1M,如果超过 1M,可以使用 split 命令分割。

导入任务导入任务

关闭后点击右上方导航栏的 Tasks,可看到导入的任务数和任务存放地址,就是那个 tasks.json,任务 ID 默认从 0 开始计数,生成的 tasks.json 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"0": {
"id": 0,
"data": {
"text": "狼牙山,我站在你面前,显得多么矮小呀!"
}
},
"1": {
"id": 1,
"data": {
"text": "1976年9月间,我与《福建文艺》编辑部的几位同事,专程到上杭县举办改稿学习班。"
}
},
"2": {
"id": 2,
"data": {
"text": "罗湾村为修建一座庙宇,从筹集资金、征集土地,到竣工持续近10年。"
}
},
"3": {
"id": 3,
"data": {
"text": "20日凌晨1时许,博物馆附设的“艺术咖啡”酒吧招待员克罗科洛与监控室的3名女看守联系,没有得到回答。"
}
},
"4": {
"id": 4,
"data": {
"text": "可口可乐公司的发言人辩称,饮料市场本来就是竞争高度激烈的地方,百事可乐应该直接到市场去竞争,而不是在法庭上争斗。"
}
}
}

开始标注

导入数据后就可以开始标注了,点击导航栏的 TasksStart Labeling 或者直接点击导航栏的 Labeling 即可开始标注:

标注示例.gif标注示例.gif

每次点击 Submit 就会保存标注好的数据到 completions 文件夹中,同时也可以在 Tasks 中查看已完成的任务及完成时间:

查看已完成的任务及完成时间查看已完成的任务及完成时间

导出数据

导出数据这块是 Label Studio 的一个缺点,官方目前支持的是 JSON、CSV、TSV、CoNLL 2003、COCO 和 Pascal VOC XML,其中 CoNLL 2003 是 ner 数据格式的一种,但是经过我测试导出这种格式并不成功,导出的文件是空的。

但是我们可以先导出为 JSON 文件,然后编写一个脚本转换成我们需要的格式,例如 BIEOS。

优缺点

经过我粗浅的使用,发现一些优缺点:

优点:

  • 界面相对美观
  • 部署方便
  • 配置方便,有多种内置模板
  • 导入数据方便
  • 可以明晰了解任务的完成度及每条任务的完成时间
  • 支持图像、文本和音频等多种数据格式和多种任务数据的标注

缺点:

  • 速度较慢,尤其是保存标注结果并进行下一条标注时
  • 没有账号体系,但是有一个 multisession mode,暂未深入研究

Reference

END