前言
在人工智能模型的建构过程中,数据作为人工智能发展三大基石之一,处于至关重要的地位。人工智能仰赖大量的数据来进行训练和学习,以便识别模式、做出预测和决策。高质量的数据集依靠的是高效高质的数据标注。在数据标注的过程中,我们往往把更多的关注点放在对标注数据本身的需求描述上,即“我要对xx内容进行标注”,而忽略了另一个重要的问题,即我们想要成品数据集以什么形式呈现,从而有效服务于最终需求。因此,在进行数据标注任务时,根据最终需求确定数据导出格式至关重要。明确数据标注导出的格式,有利于数据需求者更加清晰地传达数据标注要求,也能够让数据标注员更好地完成标注任务,进行高质量的数据交付,起到数据集保质、标注过程提效的作用。
下文将全面总结所有现行的数据标注格式,以及各自的应用场景,希望能给予具有数据标注需求和想要了解人工智能相关知识的朋友们一些帮助。
1. 数据导出格式一览
在开始介绍之前,我们为大家总结了不同数据标注任务可供选择的导出数据格式,大家可以根据自己的数据标注需求有的放矢地了解不同数据导出格式的区别。
可以选择的导出数据格式 | |
图像目标检测 |
|
图像语义分割 |
|
图像关键点标注 |
|
点云目标检测 |
|
点云语义分割 |
|
OCR |
|
2.1. YOLO
YOLO
允许用户定义数据集根目录、训练/验证/测试图像目录,或包含图像路径的txt
文件的相对路径,以及类名字典。
YOLO
只用于目标检测
基本结构类型
YOLO
使用的标注文件是txt
格式,它位于图片的上级目录labels
目录下。YOLO格式中每个图像对应一个txt
文件,如果图像中没有对象,则不需要txt
文件。
标注文件中标签的数据格式如下:
图1中左边的人的标注格式示例:
0 0.48 0.63 0.69 0.71
每个对象一行,方框坐标采用统一的xywh(x_center y_center Width Height) 格式,四个参数均为百分比形式;
类号为零索引。
2.2. VOC
可用场景
1.目标检测:使用边界框和类别标签对目标进行标注。
目标检测
2.图像分割:使用掩码对目标进行标注,分为语义分割和实例分割。
语义分割:通过标注每个像素的掩模,可以为计算机视觉模型提供更多的语义信息,帮助模型更好地理解图像。
实例分割:与语义分割类似,但是可以区分出同一类别中不同的实例,例如标注一个图片中多个人的掩模。
从左到右依次为原图、实例分割、语义分割
3.动作识别:对图像中目标行为进行标注。
动作识别
人体布局
基本结构类型
基本的xml
结构类型:标注信息是放置于Annotation
文件夹中的xml
文件,与JPEGImage
文件中的图片一一对应。
VOC文件夹结构组成:
Annotations 进行detection任务时的标签文件,xml形式,文件名与图片名一一对应。
ImageSets 包含三个子文件夹Layout、Main、Segmentation,其中Main存放的是分类和检测的数据集分割文件。
JPEGImages 存放.jpg格式的图片文件,主要提供的是PASCAL VOC所提供的所有的图片信息,包括训练图片,测试图片。这些图像就是用来进行训练和测试验证的图像数据。
SegmentationClass 存放按照class分割的图片。
SegmentationObject 存放按照object分割的图片。
VOC数据结构示例:
<annotation>
<folder>VOC2007</folder>
<filename>000001.jpg</filename>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>341012865</flickrid>
</source>
<owner>
<flickrid>Fried Camels</flickrid>
<name>Jinky the Fruit Bat</name>
</owner>
<size>
<width>353</width>
<height>500</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>dog</name>
<pose>Left</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>48</xmin>
<ymin>240</ymin>
<xmax>195</xmax>
<ymax>371</ymax>
</bndbox>
</object>
<object>
<name>person</name>
<pose>Left</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>8</xmin>
<ymin>12</ymin>
<xmax>352</xmax>
<ymax>498</ymax>
</bndbox>
</object>
</annotation>
size 图像尺寸, 用于对bbox 左上和右下坐标点做归一化操作
segmented 是否用于分割
name 物体类别pose拍摄角度(front, rear, left, right, unspecified )
truncated 目标是否被截断或者遮挡(超过15%即为被遮挡)
difficult 检测难易程度,这个主要是根据目标的大小,光照变化,图片质量来判断
bndbox
#boundingbox左上角点的横纵坐标,右下角点的横纵坐标
#注:根据不同需求,xml 的object 标签中属性会有所不同,主要体现在bndbox 上,画框类型POLYGON ,LINE 仅需将所有点放入bndbox ,而RECTANGLE 仅需将对角线两个点放入bndbox ;若为INCLINED ,则传入中心点 x,y,宽高w,h 。
2.3. COCO
可用场景
目标检测
目标检测
密集姿势估计:密集姿势估计任务涉及同时检测人、分割他们的身体并将属于人体的所有图像像素映射到身体的3D表面,主要用于不可控条件下的密集人体姿态估计。
密集姿势估计
关键点检测:在任意姿态下对人物的关键点进行定位,包括检测行人及定位行人的关键点。
关键点检测
全景分割:生成丰富且完整的连贯场景分割,这是实现自动驾驶或增强现实等真实世界视觉系统的重要一步。
全景分割
图像标题生成:根据图像生成一段文字。
图像标题生成
基本的
JSON
结构类型
JSON
本身是一个字典,包含以下关键内容:
>>> import json
>>> val = json.load(open('instances_val2017.json', 'r'))
>>> val.keys()
dict_keys(['info', 'licenses', 'images', 'annotations', 'categories'])
object instances
、object keypoints
、image captions
这3种类型共享这些基本类型:info
、image
、license
,而annotations
类型和categories
类型则呈现出了多态。
info 字段可以为空
images 是包含多个image实例的数组
licenses 是包含多个license实例的数组,可以为空
基本JSON结构:
{
"info" : info
"images" : [image]
"annotations" : [annotation]
"licenses" : [license]
}
info结构说明:
{
"year" : int
"version" : str
"description" : str
"contributor" : str
"url" : str
"date_created" : datetime
}
image结构说明:
{
"id" : int
"width" : int
"height" : int
"file_name" : str
"license" : int
"flickr_url" : str
"coco_url" : str
"date_captured" : datetime
}
license结构说明:
{
"id" : int
"name" : str
"url" : str
}
object instances
结构类型
annotation
字段是包含多个annotation
实例的数组,annotation
本身又包含了一系列的字段,如这个目标的category id
和segmentation mask
segmentation
格式取决于这个实例是单个对象还是一组对象
当
iscrowd=0
,segmentation
是polygons
格式
segmentation 多边形边界顶点的横坐标和纵坐标
area 标注区域的面积。如果是矩形框,那就是高乘宽;如果是polygon或者RLE,那就复杂点
iscrowd=0 单个对象
image_id 对应图片的序号
category_id 对应类别的序号
{
"segmentation": [[510.66, 423.01, 420.03, 510.45]]
"area": 702.1057499999998
"iscrowd": 0
"image_id": 289343
"bbox": [473.07, 395.93, 38.65, 28.67], // boundingbox矩形框左上角的横坐标,纵坐标和矩形框的长,宽
"category_id": 18
"id": 1768
}
当 iscrowd=1
,segmentation
是RLE
格式
counts 对于一个240x320的图片来说,一共有76800个像素点,有76800个bit,如果每一个像素点都记录为00000111100111110...的形式浪费空间,因此直接记录为0或者1的个数,即Run-length encoding,需要特别注意的是索引总是从0开始(如对于[1 1 1 0 0]对应的RLE是[0 3 2])
size 图片的宽高
iscrowd=1 一组对象
iscrowd=1
{
"segmentation":
{
"counts": [8214,6,629,17,2,6,614,28,611,29,610,31,609,31,609,32,608,32,608,32,608,31,609,31,610,29,612,27],
"size": [640, 549]
},
"area": 962,
"iscrowd" 1
"image_id": 374545,
"bbox": [12, 524, 381, 33],
"category_id": 1,
"id": 900100374545
}
object keypoints
结构类型
annotations
字段,这个类型中的annotation
结构体包含了object instance
中annotation
结构体的所有字段,再加上两个额外的字段
num_keypoint 表示这个目标上被标注的关键点的数量(v>0),比较小的目标上可能就无法标注关键点
keypoints 新增的keypoints是一个长度为3*k的数组,其中k是category中keypoints的总数量。每一个keypoint是一个长度为3的数组(xyv),x和y为坐标值,v为标志位(v为0时表示关键点不在标注范围内,此时x=y=v=0;v=1是表示关键点标注了但不可见;v=2表示关键点标注了同时可见)
annotations字段:
{
"segmentation": [[125.12, 539.69, 140.94, 522.43...]],
"num_keypoints": 10
"area": 47803.27955,
"iscrowd": 0,
"keypoints": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,309,1,177,320,2,191,398...]
"image_id": 425226,
"bbox": [73.35, 206.02, 300.58, 372.5],
"category_id": 1,
"id": 183126
}
categories
字段,相比object instance
中的category
新增了2个额外的字段
keypoints 长度为k的数组,包含了每个关键点的名字,目前,COCO的keypoints只标注了人这一分类(person category)
skeleton 定义各个关键点之间的连接性,标识所有具有连接性的关键点,没有连接性则不会显示
categories:
{
"supercategory": "person",
"id": 1,
"name": "person",
"keypoints": ["nose","left_eye","right_eye","left_ear","right_ear","left_shoulder","right_shoulder","left_elbow","right_elbow","left_wrist","right_wrist","left_hip","right_hip","left_knee","right_knee","left_ankle","right_ankle"]
"skeleton": [[16,14],[14,12],[17,15],[15,13],[12,13],[6,12],[7,13],[6,7],[6,8],[7,9],[8,10],[9,11],[2,3],[1,2],[1,3],[2,4],[3,5],[4,6],[5,7]]
}
2.4. labelme
labelme
是一个常用的开源标注软件。这种格式设计使标注数据可以被轻松读取和处理,适合用于训练计算机视觉模型。
可用场景
1.目标检测
2.图像分割
对图像进行多边形,矩形,圆形,多段线,线段,点形式的标注
3.图像分类和清理
对图像进行进行flag
形式的标注
4.视频标注
5.生成 VOC
格式的数据集
6.生成COCO
格式的数据集
基本结构类型
labelme
的标准模式是一个结构化的json
文件,包含图像的标注信息和一些元数据。
labelme实例分割示例.json:
{
"version": "4.0.0",
"flags": {},
"shapes": [
{
"label": "person",
"points": [
[
250.8142292490119,
107.33596837944665
],
[
229.8142292490119,
119.33596837944665
],
],
"group_id": 0,
"shape_type": "polygon",
"flags": {}
},
"imagePath": "2011_000003.jpg",
"imageData": null,
"imageHeight": 338,
"imageWidth": 500
}
shapes 是一个存储了所有标签及对应的框的数组
imagePath 图片路径,json和jpg图片存储在同一路径下
label 标签类别
points 标签标注的起点和终点
shape_type rectangle表示矩形,polygon表示多边形
imageHeight 图片的高
imageWidth 图片的宽
2.5. Mask
Mask
数据标注是在图像上标记出对象轮廓或区域的像素级别标注,通过标注可以准确地描述出图像中每一个目标对象的形状、位置、大小等特征。在Mask
数据标注中,通常使用二值图像(即黑白图像)来表示目标对象的轮廓或区域,其中目标区域的像素值为1,背景区域的像素值为0。一张图像上可能有多个目标对象需要标注,每个对象需要用一个单独的Mask
图像来表示。
可用场景
目标检测 图像分割
遥感图像分析:通过标注遥感图像中的掩模,可以帮助分析土地利用、城市规划等领域。
医疗图像分析:通过标注医疗图像中的掩模,可以帮助诊断和治疗,例如肺部CT图像的结节检测。
2.6. KITTI
tero(立体)/optical flow(光流)
Scene flow(场景流)
scene flow
2D/3D目标检测
目标检测
道路/车道检测
道路检测
语义分割
语义分割
基本结构类型
示例:
Cyclist 0.89 0 -2.22 1056.16 190.50 1241.00 374.00 1.59 0.53 1.89 2.75 1.68 3.14 -1.55
Car 0.00 0 1.90 359.43 179.30 516.30 270.97 1.44 1.64 3.78 -3.03 1.57 13.30 1.68
Car 0.00 1 1.82 444.13 163.92 559.20 247.04 1.77 1.71 4.28 -2.52 1.61 17.60 1.68
Van 0.00 1 -0.47 870.59 115.22 1101.06 213.85 2.71 2.12 5.66 10.90 1.13 21.30 -0.01
Car 0.00 0 -1.72 724.49 171.09 790.50 215.13 1.45 1.71 3.93 5.18 1.42 25.97 -1.53
Car 0.00 1 1.74 534.25 166.20 596.08 216.76 1.73 1.65 3.96 -1.62 1.53 26.83 1.67
Car 0.00 2 -1.69 709.81 162.43 765.70 205.68 1.78 1.89 4.37 5.57 1.38 32.13 -1.52
Car 0.00 2 1.69 562.02 166.42 605.57 206.89 1.68 1.51 3.29 -1.14 1.43 31.78 1.66
DontCare -1 -1 -10 657.43 162.95 685.32 179.78 -1 -1 -1 -1000 -1000 -1000 -10
DontCare -1 -1 -10 600.19 163.56 633.57 188.60 -1 -1 -1 -1000 -1000 -1000 -10
上述示例的说明如下表,其中包含以下标签
例:car 0 0 1.85 387.63 181.54 423.81 203.12 1.67 1.87 3.69 -16.53 2.39 58.49 1.57
KITTI数据结构示例说明
2.7. NuScenes
可用场景
1、视频流下三维场景下的语义分割
视频流语义分割
2、2D/3D目标检测
目标检测
3、渲染标签
渲染标签
可视化预测
*注:NuSences
可用到的场景以1/2最为广泛,当然不乏还有Stero(立体)/optical flow(光流)等其他应用场景,详情可见KITTI
。
基本结构类型
NuScenes数据结构
annotation
是NuScenes
数据集存储的标注数据,包括instance
lidarseg
sample_annotation
三个部分,以json
格式存储在文件夹中。同时NuScenes
数据集还会储存将数据集转化为coco
数据格式的标注文件annotation_3sweeps
。
在未经标注的数据中,包含所有图像与雷达采集点的数据为sample_data
,sample
则是从sample_data
中提取的同时具备图像信息和雷达采集信息的关键时刻的关键帧的集合,连续的一组关键帧组成了一个场景scene
。
经过标注后,标注数据将会以instance
、lidarseg
和sample_annotation
三种形式存储。
instance 是同一场景中连续帧对同一实例的标注的合集。在不同的场景中,实例之间无关联;
sample_annotation 是某个目标在单个关键帧中基于三维标注框的标注信息;
lidarseg 是标注对象点云信息,关键帧的雷达点云数据对应到sample_data 中,与sample_data 相互关联。
instance结构说明
{
"token": "6735e2f405ba604*****42cd12f",
"category_token": "7d5dce4de8******bde2031571c",
"nbr_annotations": 38,
"first_annotation_token": "bde21462*****0a9e7d1d",
"last_annotation_token": "1ccbe6ba7*****e4e38b6c84320d47"
}
token 由于数据集本身的庞大,加强数据集的扩展性和多样性,因此数据集中对所有的内容进行编码,包括对数据集对象、传感器、场景、关键帧等进行token的赋值,每个token都是独特的编码,是全局的唯一性标识。
category_token 该标注实例的种类
nbr_annotations 该标注实例出现的总次数
first_annotation_token last_annotation_token 标注实例首次出现和最后一次出现时的token
sample_annotation结构说明
{
"token": "bde21462e4b51*****b0a9e7d1d",
"sample_token": "e9935c2ca1e5*****627aaf14aeafb4",
"instance_token": "6735e2f405*****a3f9242cd12f",
"attribute_tokens": [
"44a1956*****5a06bb066e282a"
],
"visibility_token": "3",
"translation": [
4629.43562557203,
976.7975901061096,
-81.2221261054796
],
"size": [
4.6123827230245285,
10.56,
5.047101939890802
],
"rotation": [
0.7854279005654885,
0.0,
0.0,
-0.6189531589815899
],
"num_lidar_pts": 94,
"num_radar_pts": 0,
"next": "1ae519439*****d40cd5fbe2093a",
"prev": ""
}
sample_token 对应sample_data 中所关联的sample,说明该标注实例来自哪一个sample
instance_token 对应的具体instance,因为一个实例可以有多次标注
attribute_tokens 标注目标的属性,目标的属性在不同的场景中会不停改变
visibility_token 目标的可见性特征
translation 标注框中心坐标的坐标值
size 标注框的大小
rotation 标注框的方向四元数,代表标注框的旋转角度。
num_lidar_pts 标注框内激光雷达点的数量。是所有雷达传感器的综合,不含任何无效点过滤。
num_radar_pts 标注框内雷达点的数量。和激光雷达点一样,是所有雷达传感器的综合,不含任何无效点过滤。数值为零表示采集时没有采用雷达探测只使用了激光雷达探测。
next prev 同一个目标点的下一个/前一个sample_annotation ,如该目标点为第一个,则prev 为空;同理如该目标点为最后一个,则next 为空
calibrated_sensor
中的rotation
与translation
用于将camera坐标系
变换成ego坐标系
。ego_pose
中的rotation
用于将ego坐标系
变换成global坐标系
。NuScenes
中所有的json
文件均以token
作为唯一标识对应找到标注时间、地点等。
2.8. Waymo
Waymo motion数据集主要用于自动驾驶行为预测。
可用场景
目标检测
3D检测
相同的AP度量实现:在旧金山、山景城和凤凰城,所有自我姿势触及的13级S2细胞的平行图覆盖
相机图像中的2D目标检测
目标跟踪
基本结构类型
Waymo
数据集文件格式为tfrecord
,tfrecord
格式是Google专门为TensorFlow设计的一种数据格式,用于更好地利用内存并高效地训练和评估模型。一个tfrecord
文件中包含了一段时间内(例如20秒)的连续驾驶画面,具有多帧(如199帧)数据,每一帧都包含了车上所有传感器的数据以及相应的标签。这些数据对于开发模型来跟踪和预测其他道路使用者的行为非常有用。
tf.Example
是tfrecord
的基本单元,表示一组string
到bytes value
的映射。在Waymo
数据集中,每一帧数据都被序列化为tf.Example
并存储在tfrecord
文件中。
数据格式包含Scenario
中,使用scenario.proto(protobuf)
文件描述 。
Scenario
代表一个场景,也就是一段时间内的交通情况,包括自动驾驶车自身,其它的交通参与者(车辆、行人),以及交通灯在20s内的轨迹和状态,同时还包括了道路信息。也就是说Scenario
是一条数据的最小单元,一个tfrecord
文件包括多条Scenario
。
Scenario
具体的格式信息保存在scenario.proto
文件中,这个文件可以参考waymo
数据集官方github
仓库下载。protobuf
是一种文件格式,类似于json
,xml
等,它的主要好处是压缩的效率高、速度快,通常用于数据传输的序列化和反序列化,也可以用于保存文件。
scenario.proto文件的具体内容:
message Scenario {
reserved 9;
// 场景唯一ID
optional string scenario_id = 5;
// 时间戳为一个数组,tracks[i].states的数量和时间戳数组大小相等
// dynamic_map_states(红绿灯的状态)的大小也和时间戳数组大小相等
repeated double timestamps_seconds = 1;
// 当前时间在时间戳数组中的ID
optional int32 current_time_index = 10;
// 对象的追踪信息,是一个数组,每个对象中保存了一段时间内对象的位置和速度,
// 这个时间对应上述时间戳数组的时间
repeated Track tracks = 2;
// 交通灯状态信息
repeated DynamicMapState dynamic_map_states = 7;
// 地图信息
repeated MapFeature map_features = 8;
// 自动驾驶车自身对应tracks数组中的ID
optional int32 sdc_track_index = 6;
// 有交互对象的ID列表
repeated int32 objects_of_interest = 4;
// 需要预测的对象列表,这只是建议train对象,不是包含所有object
repeated RequiredPrediction tracks_to_predict = 11;
}
motion
数据集下载下来的文件为tfrecord
格式,如果要可视化查看具体的内容,需要对文件进行解析。
2.9. SimpleDataSet
可用场景
各类OCR应用领域:
基本结构类型
1.按目录结构填充文件夹即可,下面主要展示几个txt文件内容:
fileState.txt
,共两列,首列为图片完整路径,次列导入已标注文件时默认为1。
fileState.txt:
D:/PaddleOCR-release-2.6/TrainData/test.jpeg 1
...
2.Label.txt
,共两列,首列为图片路径(仅需到该目录结构的文件夹即可),第二列为包含一个框或多个框信息的list
, 一个框代表一个dict
, tanscription
为OCR识别结果,points
为坐标,difficult
默认为false
。
Label.txt:
TrainData/test.jpeg [{"transcription": "U674997", "points": [[41, 91], [226, 85], [227, 122], [42, 128]], "difficult": false}]
...
rec_gt.txt
,共两列,首列为切图的路径,次列为OCR识别结果。
crop_img/test_crop_0.jpg U6749970
3. 如何用MooreData智能数据工程平台导出数据
在左侧工具栏中点击【导入导出】,切换至数据导出页面。
选择要导出的批次和条目。
选择要导出的标签,并设置标签的别名
选择导出数据格式
点击【启动导出】,页面自动切换至数据导出,可在该页面查看导出任务的进度和数据统计。 导出完成后点击【下载】即可将标注完成的数据下载至本地。
整数智能信息技术(杭州)有限责任公司,起源自浙江大学计算机创新技术研究院,致力于成为AI行业的数据领航员。整数智能也是中国人工智能产业发展联盟、ASAM协会、浙江省人工智能产业技术联盟成员,其提供的智能数据工程平台(MooreData Platform)与数据集构建服务(ACE Service),满足了智能驾驶、AIGC等数十个人工智能应用场景对于先进的智能标注工具以及高质量数据的需求。
目前公司已合作海内外顶级科技公司与科研机构客户1000余家,拥有知识产权数十项,通过ISO 9001、ISO 27001等国际认证,也多次参与人工智能领域的标准与白皮书撰写,也受到《CCTV财经频道》《新锐杭商》《浙江卫视》《苏州卫视》等多家新闻媒体报道。