整数干货 | 数据标注的导出格式有哪些?

文摘   2024-06-06 18:00   浙江  
                 


        

在人工智能模型的建构过程中,数据作为人工智能发展三大基石之一,处于至关重要的地位。人工智能仰赖大量的数据来进行训练和学习,以便识别模式、做出预测和决策。高质量的数据集依靠的是高效高质的数据标注。在数据标注的过程中,我们往往把更多的关注点放在对标注数据本身的需求描述上,即“我要对xx内容进行标注”,而忽略了另一个重要的问题,即我们想要成品数据集以什么形式呈现,从而有效服务于最终需求。因此,在进行数据标注任务时,根据最终需求确定数据导出格式至关重要。明确数据标注导出的格式,有利于数据需求者更加清晰地传达数据标注要求,也能够让数据标注员更好地完成标注任务,进行高质量的数据交付,起到数据集保质、标注过程提效的作用。

              

下文将全面总结所有现行的数据标注格式,以及各自的应用场景,希望能给予具有数据标注需求和想要了解人工智能相关知识的朋友们一些帮助。

           

1. 数据导出格式一览

            

在开始介绍之前,我们为大家总结了不同数据标注任务可供选择的导出数据格式,大家可以根据自己的数据标注需求有的放矢地了解不同数据导出格式的区别。

            

标注任务

可以选择的导出数据格式

图像目标检测

YOLO VOC COCO labelme

图像语义分割

VOC COCO labelme mask

图像关键点标注

VOC COCO

点云目标检测

KITTI NuScenes Waymo

点云语义分割

KITTI NuScenes

OCR

SimpleDataSet

             

2. 数据标注导出格式详解
                 

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.动作识别:对图像中目标行为进行标注。

动作识别

                 

4.人体布局:使用标注框以及标签对人体不同部分进行标注。

人体布局

               

基本结构类型

基本的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左上角点的横纵坐标,右下角点的横纵坐标

#注:根据不同需求,xmlobject 标签中属性会有所不同,主要体现在bndbox 上,画框类型POLYGON ,LINE 仅需将所有点放入bndbox ,而RECTANGLE 仅需将对角线两个点放入bndbox ;若为INCLINED ,则传入中心点 x,y,宽高w,h

                    

2.3. COCO

          

可用场景

  1. 目标检测

目标检测

             

  1. 密集姿势估计:密集姿势估计任务涉及同时检测人、分割他们的身体并将属于人体的所有图像像素映射到身体的3D表面,主要用于不可控条件下的密集人体姿态估计。

密集姿势估计


  1. 关键点检测:在任意姿态下对人物的关键点进行定位,包括检测行人及定位行人的关键点。

关键点检测

                 

  1. 全景分割:生成丰富且完整的连贯场景分割,这是实现自动驾驶或增强现实等真实世界视觉系统的重要一步。

全景分割

                    

  1. 图像标题生成:根据图像生成一段文字。

图像标题生成

               

基本结构类型
  1. 本的JSON结构类型

JSON本身是一个字典,包含以下关键内容:

           

JSON包含的关键点:
>>> import json>>> val = json.load(open('instances_val2017.json', 'r'))>>> val.keys()
dict_keys(['info', 'licenses', 'images', 'annotations', 'categories'])

                   

object instancesobject keypointsimage captions这3种类型共享这些基本类型:infoimagelicense,而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}

             

  1. object instances结构类型

   

annotation字段是包含多个annotation实例的数组,annotation本身又包含了一系列的字段,如这个目标的category idsegmentation mask

segmentation格式取决于这个实例是单个对象还是一组对象


  • iscrowd=0segmentationpolygons格式

segmentation 多边形边界顶点的横坐标和纵坐标

area 标注区域的面积。如果是矩形框,那就是高乘宽;如果是polygon或者RLE,那就复杂点

iscrowd=0 单个对象

image_id 对应图片的序号

category_id 对应类别的序号             

iscrowd=0:
{  "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=1segmentationRLE格式

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}

           

  1. object keypoints结构类型
                
  • annotations字段,这个类型中的annotation结构体包含了object instanceannotation结构体的所有字段,再加上两个额外的字段   

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图像来表示。

            

可用场景

  1. 目标检测
  2. 图像分割
Mask图像用色块覆盖原有标注对象,同一色块表示相同属性内容
  1. 遥感图像分析:通过标注遥感图像中的掩模,可以帮助分析土地利用、城市规划等领域。

  2. 医疗图像分析:通过标注医疗图像中的掩模,可以帮助诊断和治疗,例如肺部CT图像的结节检测。

                        

2.6. KITTI

          

可用场景

          

  1. tero(立体)/optical flow(光流)

optical flow

            

  1. Scene flow(场景流)

scene flow

          

  1. 2D/3D目标检测

目标检测

           

  1. 道路/车道检测

道路检测

          

  1. 语义分割

语义分割

              

基本结构类型

示例:

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.55Car 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.68Car 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.68Van 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.01Car 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.53Car 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.67Car 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.52Car 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.66DontCare -1 -1 -10 657.43 162.95 685.32 179.78 -1 -1 -1 -1000 -1000 -1000 -10DontCare -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数据结构示例说明

*注:一般来说 没有2D相机辅助的情况下,2D标注框部分数据为0。


2.7. NuScenes

            

可用场景

1、视频流下三维场景下的语义分割

视频流语义分割

           

2、2D/3D目标检测

目标检测

                

3、渲染标签

渲染标签

             

4、可视化雷达分割预测/全景预测

可视化预测

*注:NuSences可用到的场景以1/2最为广泛,当然不乏还有Stero(立体)/optical flow(光流)等其他应用场景,详情可见KITTI

            

基本结构类型

NuScenes数据结构

             

annotationNuScenes数据集存储的标注数据,包括instance lidarsegsample_annotation三个部分,以json格式存储在文件夹中。同时NuScenes数据集还会储存将数据集转化为coco数据格式的标注文件annotation_3sweeps

           

在未经标注的数据中,包含所有图像与雷达采集点的数据为sample_datasample则是从sample_data中提取的同时具备图像信息和雷达采集信息的关键时刻的关键帧的集合,连续的一组关键帧组成了一个场景scene

         

经过标注后,标注数据将会以instancelidarsegsample_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中的rotationtranslation用于将camera坐标系变换成ego坐标系ego_pose中的rotation用于将ego坐标系变换成global坐标系NuScenes中所有的json文件均以token作为唯一标识对应找到标注时间、地点等。   

               

2.8. Waymo

             

Waymo motion数据集主要用于自动驾驶行为预测。

                   

可用场景

  1. 目标检测

  • 3D检测

相同的AP度量实现:在旧金山、山景城和凤凰城,所有自我姿势触及的13级S2细胞的平行图覆盖

  • 相机图像中的2D目标检测
  1. 目标跟踪

                

基本结构类型

          

Waymo数据集文件格式为tfrecordtfrecord格式是Google专门为TensorFlow设计的一种数据格式,用于更好地利用内存并高效地训练和评估模型。一个tfrecord文件中包含了一段时间内(例如20秒)的连续驾驶画面,具有多帧(如199帧)数据,每一帧都包含了车上所有传感器的数据以及相应的标签。这些数据对于开发模型来跟踪和预测其他道路使用者的行为非常有用。

          

tf.Exampletfrecord的基本单元,表示一组stringbytes value的映射。在Waymo数据集中,每一帧数据都被序列化为tf.Example并存储在tfrecord文件中。

数据格式包含Scenario中,使用scenario.proto(protobuf)文件描述 。

        

Scenario代表一个场景,也就是一段时间内的交通情况,包括自动驾驶车自身,其它的交通参与者(车辆、行人),以及交通灯在20s内的轨迹和状态,同时还包括了道路信息。也就是说Scenario是一条数据的最小单元,一个tfrecord文件包括多条Scenario

        

Scenario具体的格式信息保存在scenario.proto 文件中,这个文件可以参考waymo数据集官方github仓库下载。protobuf是一种文件格式,类似于jsonxml等,它的主要好处是压缩的效率高、速度快,通常用于数据传输的序列化和反序列化,也可以用于保存文件。

          

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, 一个框代表一个dicttanscription为OCR识别结果,points为坐标,difficult默认为false

Label.txt:

TrainData/test.jpeg  [{"transcription": "U674997", "points": [[41, 91], [226, 85], [227, 122], [42, 128]], "difficult": false}]...

             

  1. rec_gt.txt,共两列,首列为切图的路径,次列为OCR识别结果。
rec_gt.txt
crop_img/test_crop_0.jpg  U6749970

                      

3. 如何用MooreData智能数据工程平台导出数据

          

在左侧工具栏中点击【导入导出】,切换至数据导出页面。


  1. 选择要导出的批次和条目。

                      

  1. 选择要导出的标签,并设置标签的别名

            

  1. 选择导出数据格式

          

  1. 点击【启动导出】,页面自动切换至数据导出,可在该页面查看导出任务的进度和数据统计。
               
  2. 导出完成后点击【下载】即可将标注完成的数据下载至本地。

  

     

整数智能信息技术(杭州)有限责任公司,起源自浙江大学计算机创新技术研究院,致力于成为AI行业的数据领航员。整数智能也是中国人工智能产业发展联盟、ASAM协会、浙江省人工智能产业技术联盟成员,其提供的智能数据工程平台(MooreData Platform)与数据集构建服务(ACE Service),满足了智能驾驶、AIGC等数十个人工智能应用场景对于先进的智能标注工具以及高质量数据的需求。

      

     

目前公司已合作海内外顶级科技公司与科研机构客户1000余家,拥有知识产权数十项,通过ISO 9001、ISO 27001等国际认证,也多次参与人工智能领域的标准与白皮书撰写,也受到《CCTV财经频道》《新锐杭商》《浙江卫视》《苏州卫视》等多家新闻媒体报道。

       

        

               

点击「在看」
好内容大家分享

整数智能
整数智能作为AI行业的数据合伙人,我们提供专家级的数据标注工程平台与数据集解决方案(数据采集、数据清洗与数据标注)。
 最新文章