原文:推动AI的加速器—AI数据标注平台ANNO - 201.04.26

出处:爱奇艺技术产品团队 - 微信公众号

作者:田兴

1. 背景

AI 算法应用于爱奇艺的各个生产业务线中,大大提高了生产效率及用户体验. 而 AI 数据作为算法研发的基础,起到了关键性的作用. 随着算法研发人力及需求量的持续增长,AI标注数据量需求也处于持续增长的状态.

之前的 AI 数据标注由各个算法团队独立完成,标注人力管理,标注工具研发及标注质量管控均成为算法研发人员所面临的挑战. 从 AI 数据标注行业来看,如何获取符合算法需求的高质量标注数据,如何对标注人员进行规范培训,如何控制标注质检的成本,都是普遍存在的且亟待解决的难题.

为解决重复研发标注工具的问题,提高标注效率,建立合理的人力管理及质检流程,帮助算法研发人员获取优质的训练数据,降低数据标注成本,ANNO 平台应运而生.

ANNO 的使用方为内部的 AI 算法研发人员、标注管理员及标注员,同样开放给公司外部提供数据标注服务的合作伙伴.

2. 面临的挑战

如何灵活支持复杂多样的标注场景、保持良好的可扩展性以应对不断出现的新的标注需求,是我们在设计统一标注平台的过程中,面临的最大挑战. 若设计不当,很容易陷入 ad-hoc 式的开发:每应对一种全新的标注场景,就需为之定制开发一套界面和流程,开发和维护成本高昂.

标注场景的复杂多样化主要体现在以下方面:

2.1. 标注数据多样

[1] - 数据类型多样

标注数据可能为单个的文本、图片、音频、视频文件,亦可能是混合类型(e.g., 一条微博)

[2] - 数据结构多样

某些标注任务(e.g., 对比标注)所使用的标注数据除了包含标注素材外,还有与之对应的参照素材,标注素材与参照素材存在着 n : n 的数量比关系.

[3] - 附加信息多样

数据或素材可能会带有描述性信息(e.g., 一段视频素材可能会附带有拍摄用户 uid、拍摄时间等信息). 数据或素材还可能会附带有标注方式相关的信息(例如在某些分类标注任务中,每个数据的类别选项各不相同,由数据自身携带. ).

2.2. 业务标注模式多样

[1] - 数据源类型多样

标注任务的数据源可以为单次离线上传,或以多次追加、甚至是实时流入的形式确定. 部分的标注数据存在着被多个不同的标注任务复用的情形.

[2] - 标注任务模式多样

对于标注数据实时流入的标注任务而言,不同的业务需求方的有着不同的标注任务模式,某些按照数据的时间维度进行任务划分,某些则依据数据的属性进行划分.

某些业务方的标注任务会带上预标注的结果(通常是算法预处理后的结果). 某些标注任务还可能需要在标注过程中实时地调用算法进行标注以提高标注员效率.

3. 模型设计

为了应对上述复杂多样的标注场景,在深入地了解各个算法业务方的当前的标注需求,以及调研市面上同类产品(京东微工阿里数据标注Amazon Mechanical Turk 等)之后,我们对标注行为进行了细致的分析,进行了如下抽象.

3.1. 标注数据设计

[1] - 标注素材(MEDIA RECORD)

一个标注素材是一个多媒体文件(文本、图片、音频、视频),是标注数据的基本组成单位.

标注素材可能会带有描述性信息(metadata).

// 样例:文本标注素材 (Text Media Record)
{
    "metadata": {
        "postId": "p123456"
    },
    "type": "text",
    "content": {
        "评论": "知道爱豆恋爱了,而且对方我十分不喜欢,你们都是怎么做的?想脱粉了. ", 
        "ocr文本": "竟成了一场笑话纯妃(纯惠皇)",
    }
}

[2] - 标注数据(HIT)

我们将一次完整的标注过程(标注员领取数据 -> 完成标注 -> 提交标注结果)中所使用的数据称为一个标注数据(HIT).

一个 HIT 由一或多个标注素材组成. HIT 可能会带有相应的描述信息(metadata).

// 样例:HIT
{
  "metadata": {
      "location": "chengdu", 
      "device": "iPhone6"
  },
  "workSet": [
      {
          "type": "image",
          "url": "http://somePath/images/xxx.jpg",
          "height": 405,
          "width": 720
      },
      {
          "metadata": {
              "postId": "p123456"
          },
          "type": "text",
          "content": {
              "评论": "知道爱豆恋爱了,而且对方我十分不喜欢,你们都是怎么做的?想脱粉了. ", 
              "ocr文本": "竟成了一场笑话纯妃(纯惠皇)",
          }
      }
  ]
}

[3] - 标注数据段(PARTITION)

一个标注数据段由多个标注数据(HIT)组成.

标注数据段是标注任务的数据源的基本组成单位.

一个标注任务将使用一个或者多个标注数据段作为本次标注任务的数据源.

{
  "description": "2019年第一季度数据段",
  "hits": [
      $hit1,
      $hit2,
      $hitN
  ]
}

[4] - 标注数据集(HITSET)

一个标注数据集由多个具有共同属性的标注数据段组成.

数据场景类比:

一条微博可能是文本、视频、图片(MEIDA RECORD)的组合.

一条完整的微博可以视作为一个标注数据(HIT).

我们可以按照时间维度进行划分,将每一天发的所有微博收集成一个数据段(PARTITION).

这些数据段就构成了整个的微博数据集(HITSET)

通过上述对标注数据的抽象化设计,我们可以对绝大多数不同类型和结构的标注数据进行描述和表达. 其中数据段以及数据集的设计,能够很好地支持不同数据源类型(多次追加、实时流入等)、不同维度划分(时间、属性等)的标注任务.

3.2. 标注任务设计

[1] - 标注点(LABEL POINT)

有了标注数据之后,以何种方式对数据进行标注,是标注过程中最为复杂和多样的部分. 我们做出了如下的归纳:无论标注行为如何变化,都能归纳至以下两类:

(1) - 在标注数据 H 中依据某种规则选取出 P,P 为 H 的子集 (P ⊆ H,注意此处非 ⊊)

(2) - 对 P 进行分类或者问答

根据上述的定义,我们创新性地提出了标注点这一概念. 一个标注点能够单独完成上述编号1 或者 2 或1、2一起的工作.

下面我们给出几种标注点样例,做简要的说明和介绍

[1] - 分类标注点:

// 分类标注点
  // 1. P = H
  // 2. 对 P 进行分类
  {
    "target": ".", // * -> HIT 整体
                    // . -> HIT 中每一个标注素材
                   // workSet-0 -> 第一个标注素材
                    // 正则标注式
    "type": "question_choice",
    "question": "图片中人物是否与参照人物图一致?",
    "options":[
        {
            "name": "一致",
            "value": "yes"
        },
        {
            "name": "不一致",
            "value": "no"
        }
    ]
  }

  // 标注点对应产生的标注答案($LabelAnswer)
  {
    "target": ".",
    "type": "question_choice",
    "count": 1,
    "question": "图片中人物是否与参照人物图一致?",
    "values": [
        {
            "mediaRecordNo": 0, // 第1张图片与参照图一致
            "subValues":["yes"]
        },
        {
            "mediaRecordNo": 1, // 第2张图片与参照图不一致
            "subValues":["no"]
        }
    ]
  }

[2] - 图片框选标注点:

// 图片框选标注点
  // 1. P = 人脸, P ⊆ H (人脸是图片的一个部分) 
  // 2. 对 P 进行分类和问答
  {
    "target": ".",
    "type": "lasso",
    "question": "请将图中的人脸框出来",
    "subLabelPoints": [
      {
        "type": "question_choice",
        "question": "是男是女?",
        "options":[
            {
                "name": "男",
                "value": "man"
            },
            {
                "name": "女",
                "value": "femal"
            }
        ]
    },
      {
        "type": "question_text",
        "question": "颜值打几分(满分10分)?"
      }
    ]
  }
 // 图片框选标注答案
  {
    "target": "*",
    "type": "lasso",
    "question": "请将图中的人脸框出来",
    "values": [
        {
          "mediaRecordNo": 0, 
          "lassoType": "rectangle", // 矩形框
          "coords": [30,60,90,60,90,20,30,20], // 顶点坐标
          "subLabelAnswers": [
            {
              "type": "question_choice",
              "question": "是男是女?",
              "values": ["man"]
            },
            {
               "type": "question_text",
               "question": "颜值打几分(满分10分)?",
               "values": ["6"]
            }
          ]
        },
        {
          "mediaRecordNo": 1,
          "lassoType": "quadrangle", // 多边形框
          "coords": [33,67,90,60,90,20,30,20],
          "subLabelAnswers": [
            {
              "type": "question_choice",
              "question": "是男是女?",
              "values": ["female"]
            },
            {
              "type": "question_text",
              "question": "颜值打几分(满分10分)?",
              "values": ["8"]
            }
          ]
        },
    ]
  }

通过对标注方式的抽象, 标注点能够很好地对不同标注数据下,各类标注方式进行表达.

[3] - 标注作业 (ASSIGNMENT)

我们将一次完整的标注过程称为一次标注作业(ASSIGNMENT), 标注作业记录了操作员信息、作业时间、标注任务编号、标注数据编号以及标注产生的结果等等.

{
    "jobId" : "xxxxxx",
    "hitId" : "xxxxxx",
    "assignType" : "LABEL", // LABEL: 标注员标注
                            // INSPECT: 质检员标注
                            // GROUD_TRUTH: 埋点答案
                            // PRE_LABEL: 预标注
    "operator" : "christian",
    "labelAnswers" : [ // 标注点产生标注答案集合
        {
            "target" : "*",
            "type" : "question_choice",
            "question" : "图片类别",
            "values" : [ 
                "porn"
            ]
        }
    ]
}

将标注作业作为独立于标注任务和标注数据的概念实体,能够对标注平台中多种不同类型的标注过程(标注、质检、仲裁、GROUND_TRUTH、预标注、智能标注等)进行描述.

质检员可以对标注员产生的标注作业进行质检. 除此之外,还可以预先设置带有正确标注答案( GROUND_TRUTH)的埋点作业,对标注员的标注作业进行质量评估.

下图是对上述的各个数据模型的整体架构示意:

4. 前端模块化

在数据模型设计中,我们对标注平台中的各类实体和标注行为进行了抽象. 这一设计也指引着我们前端工程的模块化设计与开发,这使得前端工程也具有了极大的灵活性和扩展性,能够应对不同标注数据、不同标注方式的标注场景,最大程度地避免了 ad-hoc 式的开发.

基于大小、性能、简单性以及学习曲线上的综合考虑,我们选择了 Vue.js 作为前端框架进行开发. 同时 Vue.js 对于组件开发有着非常好的支持,这也为我们前端的模块化开发提供极大的便利.

下面以我们标注平台上几个标注任务为例,简要介绍一下我们前端标注页面的模块化设计.

4.1. 图片标注

标注数据:4张图片素材;4个标注点

4.2. 单文本标注

对于单一素材的标注,我们同时也支持以下页面进行展示

我们依照数据模型的设计,对标注素材、标注数据、标注点、标注答案等模型进行了组件开发. 通过不同的标注场景下各个组件的不同的组合和排列,我们能够最大化地避免 ad-hoc 式的开发,降低开发和维护的成本.

5. AI 智能标注

标注平台为各类 AI 模型提供大量的训练数据,反过来 AI 模型也可以应用于标注平台之上,提升标注员的标注效率. 这也正是从一开始,我们意图构建统一的标注平台的重要原因之一.

在标注平台设计过程中,从一开始我们便将智能标注作为了重要的目标,下图是智能标注简要的流程图:

我们将 AI 标注模型同标注点进行关联,二者共同产生预标注答案(从另一个角度来看,AI 标注模型可以看做是一种智能标注点,接收到标注数据之后可以自动产生预标注答案,而普通标注点则需要通过标注员来产生标注答案). 这样的设计使得智能标注的流程与人工标注能够无缝衔接,具有非常大的灵活性.

在智能标注流程下,业务方只需依据 ANNO 标注平台设定的接口规范以及对应的标注答案(LABEL ANSWER)的生成格式,部署自己的标注任务所对应的 AI 标注模型,便可以使标注员在标注过程中,实时地获取到模型产生的预标注答案,标注员只需在此答案上进行调整即可. 反过来,在模型给出预标注答案的情况下,标注员对答案的修正结果也可以作为监督信号对 AI 标注模型进行优化.

我们当前已经构建了通用的图片 OCR 智能标注模型,标注员在进行图片 OCR 框选标注任务时,可以实时地借助智能标注快速定位文字画框位置以及识别文字内容,在大部分情况下,自身只需进行画框和内容微调即可完成标注.

实践证明,加入智能标注后, 标注员效率能得到极大的提高. 我们从综艺节目字幕标注任务中,选取了 25 张图片作业. 在部署智能标注模型之前,人工标注用时 5 分 20 秒,平均 13 s 完成一张图片的标注. 在部署智能标注模型后,只用时 2 分 55 秒,每张图片平均标注时间下降至了 7s, 效率提升 46%. 对于更为一般性的图片(文字段落的数量,文字出现的位置、文字的形态完全无规律),智能标注对于标注效率的提升效果将更为明显.

6. 结语

ANNO 现已支持各种主流算法场景数据的标注,在标注人力的管理、绩效统计等方面给予标注团队有力协助,在敏感隐私数据标注等数据安全领域也有完善的权限管理制度. 未来,ANNO 将会对外开放给更多的标注团队及标注公司,作为标注工具提供价值. 也会打通数据采集、数据存储、数据管理等多项服务,作为数据服务体系助力AI算法研发.

Last modification:April 26th, 2019 at 09:01 pm