导出数据格式

该文档描述了星尘数据标注平台上导出的标注数据格式。

标注对象数据格式

点标注

如果该标注任务已经完成,annotations 数组中会包含每个标注数据,其中的每个标注数据都会有如下结构:

  • x:点距离图片左边界的距离,单位:像素。

  • y:点距离图片上边界的距离,单位:像素

  • label:项目配置中点的标签。

{
"response": {
"annotations": [
{
"x": 123,
"y": 10,
"label": "headlight"
},
{
"x": 140,
"y": 49,
"label": "brakelight"
},
{...}
]
},
"metadata": {}
}

2D 矩形框标注

如果该标注任务已经完成,annotations 数组中会包含每个标注数据,其中的每个标注数据都会有如下结构:

  • left:2D 矩形框左边界和图片左边界的距离,单位:像素。

  • top:2D 矩形框上边界和图片上边界的距离,单位:像素。

  • width:2D 矩形框的宽,单位:像素。

  • height:2D 矩形框的高,单位:像素。

  • label:项目配置中 2D 矩形框的标签。

{
"response": {
"annotations": [
{
"left": 2,
"top": 4,
"width": 3,
"height": 5,
"label": "pedestrian"
},
{
"left": 7,
"right": 5,
"width": 14,
"heigh": 5,
"label": "car"
}
{...}
]
},
"metadata": {}
}

2D 立方体标注

如果该标注任务已经完成,annotations 数组中会包含每个标注数据,其中的每个标注数据都会有如下结构:

  • front_top_left(1)

  • front_top_right(2)

  • front_bottom_left(3)

  • front_bottom_right(4)

  • back_top_left(5)

  • back_top_right(6)

  • back_bottom_left(7)

  • back_bottom_right(8)

2D 立方体在数据层面(front)分为前侧面和后侧面(back),其定义为第一个画的矩形为前侧面,第二个画的矩形为后侧面。为了简洁得表示各个顶点,下图顶点上标的为各点的代号,见结构描述中每个顶点 () 中的值。

5-------6
/| /|
/ | / |
1-------2 |
| 7----|--8
| / | /
3-------4
{
"response": {
"annotations": [
{
"front_top_left": {
"x": 178,
"y": 946
},
"front_top_right": {
"x": 423,
"y": 946
},
"front_bottom_left": {
"x": 178,
"y": 1092
},
"front_bottom_right": {
"x": 423,
"y": 1092
},
"back_top_left": {
"x": 286,
"y": 889
},
"back_top_right": {
"x": 548,
"y": 889
},
"back_bottom_left": {
"x": 286,
"y": 1018
},
"back_bottom_right": {
"x": 548,
"y": 1018
}
},
{...}
]
},
"metadata": {}
}

多边形标注

如果该标注任务已经完成,annotations 数组中会包含每个标注数据,其中的每个标注数据都会有如下结构:

  • vertices:一组有序点组成的数组,描述了多边形标注数据。其中每个点都会有如下结构:

    • x:点距离图片左边界的距离,单位:像素。

    • y:点距离图片上边界的距离,单位:像素。

  • label:项目配置中多边形的标签。

{
"response": {
"annotations": [
{
"label": "car",
"vertices": [
{
"x": 123,
"y": 10
},
{
"x": 140,
"y": 49
},
{
"x": 67,
"y": 34
}
]
},
{...}
]
},
"metadata": {}
}

3D框标注

如果该标注任务已经完成,annotations 数组中会包含每个标注数据,其中的每个标注数据都会有如下结构:

  • center:3D 框中点在点云中的位置,包括:

    • x:3D 框中心点与 X 轴的距离。

    • y:3D 框中心点与 Y 轴的距离。

    • z:3D 框中心点与 Z 轴的距离。

  • length:3D 框的在 X 轴方向上的长度。

  • width:3D框在 Y 轴方向上的长度。

  • height:3D 框在 Z 轴方向上的长度。

  • rotation:3D 框在点云坐标系中的旋转角度,以欧拉角的方式表示,包括:

    • x:在 X 轴上的旋转角度,取值范围是 [-π, π]。

    • y:在 Y 轴上的旋转角度,取值范围是 [-π, π]。

    • z:在 Z 轴上的旋转角度,取值范围是 [-π, π]。

  • points:3D 框中包含的点的数量。

  • label:项目配置中 3D 框的标签。

{
"response": {
"annotations": [
{
"label": "car",
"center": {
"x": -41.158,
"y": -3.934,
"z": -0.434
},
"length": 11.754,
"width": 2.786,
"height": 3.125,
"rotation": {
"x": 0,
"y": 0,
"z": -0.046
},
"points": 230
},
{...}
]
},
"metadata": {}
}

音频时间段选择

如果该标注任务已经完成,annotations 数组中会包含每个标注数据,其中的每个标注数据都会有如下结构:

  • start:时间段起始时间,单位:ms。

  • end:时间段结束时间,单位:ms。

{
"response": {
"annotations": [
{
"start": 330,
"end": 1040
},
{...}
]
},
"metadata": {}
}

文本标注

如果该标注任务已经完成,annotation 数组会包含每个标注数据,其中每个标注数据都会有如下结构:

  • start:选中字符串首个字符在整段文本中的位置下标(从 0 开始)

  • offset:选中字符串自起始位置的偏移量, 表示偏移量

{
"response": {
"annotations": [
{
"start": 23,
"offset": 8
},
{...}
]
},
"metadata": {}
}

属性

标注对象属性

在创建项目的时候,可以为每种不同类型的标注对象设置零到多个对象属性。比如,在 2D 矩形框标注项目中,可以为标签的是否停泊属性设置 等属性值,为行人标签的行人状态属性设置行走站着坐着等属性值。

{
"response": {
"annotations": [
{
"left": 2,
"top": 4,
"width": 3,
"height": 5,
"label": "pedestrian",
"attributes": {
"status": "Walking"
}
},
{
"left": 7,
"right": 5,
"width": 14,
"heigh": 5,
"label": "car",
"attributes": {
"parked": "Yes"
}
}
{...}
]
},
"metadata": {}
}

多帧

多帧出现在需要做对物体追踪的情况下。某个物体可能会出现在多张连续的图片中,在标注的时候不仅仅需要对每张图片按照需求进行标注,还需要记录下该物体的运动轨迹。目前多帧仅支持 3D 框标注。

多帧数据格式和单帧数据格式的差别仅在于 annotations 这一级。单帧数据文件 annotations 下是具体的标注对象,但是多帧数据文件会在 annotations 下包一层数组,即多帧数据文件中 annotaitons 下包含了 N 个数组,表示 N 帧,每个数组表示该帧数据文件的标注对象。

另外标注对象中的 id 表示该标注对象的 id,并且如果同一个物体出现在多帧中,那么 id 保持不变(见例子中 WY7MGZFZ)。

{
"response": {
"annotations": [
[
{
"id": "WY7MGZFZ",
"label": "car",
"center": {
"x": -41.158,
"y": -3.934,
"z": -0.434
},
"length": 11.754,
"width": 2.786,
"height": 3.125,
"rotation": {
"x": 0,
"y": 0,
"z": -0.046
},
"points": 230
},
{...}
],
[
{
"id": "WY7MGZFZ",
"label": "car",
"center": {
"x": -41.158,
"y": -3.934,
"z": -0.434
},
"length": 11.754,
"width": 2.786,
"height": 3.125,
"rotation": {
"x": 0,
"y": 0,
"z": -0.046
},
"points": 230
},
{...}
],
[...],
...
]
},
"metadata": {}
}

曲线计算方式

Stardust标注平台的曲线工具参照的是Catmull-Rom Spline曲线

文献参考: http://www.cs.cmu.edu/~462/www/projects/assn2/assn2/catmullRom.pdf

计算过程

  1. 记录上面例子的点:pts=[x1,y1,x2,y2,x3,y3]

  2. 复制第一个点以及最后一个点的坐标并放入set: pts=[x1, y1, x1, y1, x2, y2, x3, y3, x3, y3]

  3. 曲线计算公式为: p(s)=[1 u u2 u3][0100t0t02tt332ttt2tt2t][pi2pi1pipi+1]{p(s) = [1 \ u \ u^2 \ u^3] \left[ \begin{array}{ccc} 0 & 1 & 0 & 0\\ -t & 0 & t & 0\\ 2t & t-3 & 3-2t & -t\\-t & 2-t & t-2 &t \end{array} \right ]\left[ \begin{array}{ccc} p_{i-2}\\p_{i-1}\\p_{i}\\p_{i+1} \end{array} \right ]}

    1. u[0,1]u\in[0,1]

    2. 默认 t=0.5t=0.5tt 用于控制曲率, tt 越大, 曲线曲率越大)

    3. pi2,pi1,pi,pi+1p{i-2}, p{i-1}, p{i}, p{i+1} 为set中的点

  4. 将set中的数据代入计算曲线计算公式计算, 以下以计算 第一个点和第二个点之间 的曲线为例:

    1. 将set中的x坐标代入曲线计算公式,得到: x(s)=[1 u u2 u3][0100t0t02tt332ttt2tt2t][x1x1x2x3]t=0.5,u[0,1]{x(s) = [1 \ u \ u^2 \ u^3] \left[ \begin{array}{ccc} 0 & 1 & 0 & 0\\ -t & 0 & t & 0\\ 2t & t-3 & 3-2t & -t\\-t & 2-t & t-2 &t \end{array} \right ]\left[ \begin{array}{ccc} x_{1}\\x_{1}\\x_{2}\\x_{3} \end{array} \right ]} 默认t=0.5, u \in[0,1]

    2. 将set中的y坐标代入曲线计算公式,得到: y(s)=[1 u u2 u3][0100t0t02tt332ttt2tt2t][y1y1y2y3]t=0.5,u[0,1]{y(s) = [1 \ u \ u^2 \ u^3] \left[ \begin{array}{ccc} 0 & 1 & 0 & 0\\ -t & 0 & t & 0\\ 2t & t-3 & 3-2t & -t\\-t & 2-t & t-2 &t \end{array} \right ]\left[ \begin{array}{ccc} y_{1}\\y_{1}\\y_{2}\\y_{3} \end{array} \right ]}默认t=0.5, u \in[0,1]

  5. 根据4中的两个公式, 可以得到两点间的曲线方程, 通过曲线公式可以得到两点间任意一点坐标

计算例子:

根据上述曲线公式计算第一个点 (1,1)(1,1)第二个点 (2,3)(2,3) 上的曲线方程:

  1. pts=[1,1,2,3,3,2]

  2. 复制第一个点和第二个点到set: pts=[1,1,1,1,2,3,3,2,3,2]

  3. 代入曲线公式, 取 t=0.5 t=0.5

    1. x(s)=[1 u u2 u3][01000.500.5012.520.50.51.51.50.5][x1x1x2x3]{x(s) = [1 \ u \ u^2 \ u^3] \left[ \begin{array}{ccc} 0 & 1 & 0 & 0\\ -0.5 & 0 & 0.5 & 0\\ 1 & -2.5 & 2 & -0.5\\-0.5 & 1.5 & -1.5 & 0.5 \end{array} \right ]\left[ \begin{array}{ccc} x_{1}\\x_{1}\\x_{2}\\x_{3} \end{array} \right ]}

    2. x1=1,x2=2,x3=3x_1=1,x_2=2,x_3=3 代入公式得到 x(s)=1+0.5u+u20.5u3{x(s) = 1 + 0.5u + u^2 - 0.5u^3}

    3. 同理得到y(s)=1+u+3.5u22.5u3{y(s)= 1 + u + 3.5u^2 - 2.5u^3}

  4. 综上得到第一个点和第二个点的曲线方程为: x(s)=1+0.5u+u20.5u3,y(s)=1+u+3.5u22.5u3{x(s) = 1 + 0.5u + u^2 - 0.5u^3} , {y(s) = 1 + u + 3.5u^2 - 2.5u^3} , 其中 u[0,1]u\in[0,1]