基本数据类型
2.2 基本数据类型
基本数据类型(basic types)是DSDL中的基本元素抽象出来的一些数据类型。这些基本数据类型的实例是构建一个数据集描述文件的基础构建模块。
注意:数据集描述文件所使用的JSON和YAML格式本身也会提供了一些语法来表示一些简单的类别,比如布尔类型,数字类型,字符串类型。当在DSDL中使用这些语法时来表示一个值时,DSDL会保留这些值在JSON/YAML格式中原本的含义。需要注意的很重要的一点是,DSDL基本数据类型和JSON中数据类型不是一对一的。DSDL中不同的基本数据类型可能会使用相同的JSON类型来表示他们各自的值。举例来说,目标定位器类型(
Loc
)和类别标注类型(Label
)在DSDL中是不同的数据类型,但是他们都使用了字符串类型来表示他们各自的值。
2.2.1 通用基本数据类型
DSDL定义了4种通用的基本数据类型。这4种数据类型可以被简单地解释,没有特殊含义。
Bool
:布尔类型,值可以为true
或false
。Int
:整数类型,值可以为任意的整数,例如12,-3或0。当一个数字被声明为Int
类型时,DSDL解释器会验证它是否真的是一个整数。Num
:通用数值类型,值可以是任何的数字,例如12.5,-13,1.25e-6。Str
:字符串类型,值可以是任意的字符串,例如"hello","a",""。Dict
:字典类型,值可以是一个字典,例如{"name": "dsdl", "age": 0}
2.2.2 特殊基本数据类型
DSDL定义了一些具有特殊含义的基本数据类型。这些数据类型的值同样通过字符串或其他JSON格式的基本类型来表示,但是他们有特殊的语义,DSDL解析器会根据他们各自的语义相应地解析他们。
Coord
:2D坐标,格式为[x, y]
Coord3D
:3D坐标,格式为[x, y, z]
Interval
:序列间隔,格式为[begin, end]
BBox
:bounding box,格式为[x, y, w, h]
RotatedBBox
:rotated bounding box,格式为[x1, y1, x2, y2, x3, y3, x4, y4]
或者[x, y, w, h, angle]
Keypoint
:关键点,格式为[[x1, y1, visable1], [x2, y2, visable2], ...]
Polygon
:多边形由多个2D坐标来表示,格式为[[x1, y1], [x2, y2], ...]
Date
:日期由一个字符串来表示,格式详见strftime specTime
:时间由一个字符串来表示,格式详见strftime spec
2.2.3 Label:类别标注数据类型
分类任务旨在赋予目标语义信息。因此,我们通常需要使用类别标注来描述目标属于的类别。在DSDL中,类别标注是类型指定为Label
的字符串。
在实际当中,不同的分类任务中的类别也应该是不同的。DSDL引入了类别域(class domain)的概念,来描述不同分类任务中不同的上下文信息。每个类别域提供了一个类别列表或是一个类别层级关系。给定要给类别域,类别标注则可以通过下面四种形式之一来描述:
- 基于类别名:格式为
"<class-domain>::<class-name>"
,比如COCO::cat
表示了COCO类别域内的类别cat。 - 基于类别索引:格式为
"<class-domain>::<class-index>"
,比如COCO::3
表示COCO类别域内第三个类别 - 直接输入类别名:格式为
<class-name>
,比如cat
表示了在该Label的class domain中为cat
的类别 - 直接输入类别索引:格式为
<class-index>
,比如3
表示了在该Label的class domain中索引为3的类别
对于一个有层级关系的类别的类别域,我们需要在class_dom
中定义,具体参见2.5.3 定义具有层级关系的类别域
注意:我们正在试图统一各种任务类型的类别标注系统。因此我们将预留一个域名
std
,用于在以后描述标准的分类任务的分类域。
2.2.4 Loc:对象定位数据类型
对象定位器的作用是作为对图像,视频,文本等非结构化对象的引用。目标定位器的数据类型即为Loc
数据类型,目标定位器的具体值通过一个特殊形式的字符串来表示。具体来讲,DSDL支持下面方式来描述一个对象定位器:
- relative path:相对于数据集的根路径的路径。对象定位器默认情况下使用的就是相对路径。当对象定位器字符串没有特殊的前缀时,他就会被当作是一个相对路径。例如,
"abc/001.jpg"
将会被解析为"<data-root>/abc/001.jpg"
,其中data-root
为根目录,所有的数据对象都存储其中,并且根目录可以在环境配置文件中指定。
2.2.5 使用类型参数
从DSDL编译器的视角来看,元素的类型决定了该元素如何被解析与验证。除了类型名称以外,DSDL还允许用户提供类型参数来自定义元素如何被表示,解析与验证。
使用类型参数的Label数据类型
在快速入门中的的例子中,ImageClassificationSample
中的label
字段的数据类型指定为了Label[dom=MyClassDom]
。
这里,Label
就是一个含参的数据类型(parametric type),指定了一个类型参数dom
。这里的dom
参数指定了label属于的类别域。
当类别域被显示地指定之后(例子中指定为MyClassDom
),就不需要再在数据对象中指明标注类别的类别域了。举例来说,数据对象中的标注类别MyClassDom::cat
此时可以直接简写为cat
;数据对象中的标注类别MyClassDom[2]
此时可以直接简写为2
。
使用类型参数的Date和Time数据类型
对于Date
和Time
数据类型,当没有显示地指定类型参数的话,它的字符串类型的值应该遵循ISO 8601格式。解析器会date.fromisoformat
和time.fromisoformat
来解析字符串。
用户还可以通过指定类型参数fmt
来自定义格式。举例来说,用户可以使用数据类型Time[fmt="%H:%M"]
来要求数据值遵循%H:%M
的格式,例如"15:32"
。当fmt
被显示地指定了,fmt
的值会被传入strptime
函数来解析时间字符串。Data
数据类型同样可以指定该参数。
2.2.6 列表数据类型
DSDL提供了含参数据类型List
来表示无序或有序的列表。具体来说,List
数据类型的实例是包含了多个数据类型相同的元素的列表。
含参数据类型List
有两个参数:
etype
:列表中单个元素的数据类型。这个参数必须被显示地指定。ordered
:列表中的元素之间是否有顺序关系。这个参数是可选的,默认值为false
。只有当序列是有序的情况下,该参数才应该被设为true
,比如视频帧序列与时间序列。
举例来说,对于元素为整型的列表,我们可以将该列表数据类型表示为List[Int]
;对于元素为类别域为MyClassDom
的类别标注的列表,我们可以将该列表数据类型表示为List[Label[MyClassDom]]