旋转目标检测任务
我们通过对旋转目标检测任务进行调研,并总结数据集描述中的字段信息,从而制定出旋转目标检测任务DSDL模板,供大家参考使用。
1. 任务调研
1.1 任务定义
旋转目标检测任务是指在图像中用旋转矩形框、四边形甚至任意形状的形式检测出物体的位置,并识别其所属类别,示意图如下:
1.2 评价指标:
旋转目标检测的评价指标与目标检测相同,最常用的评价指标就是mAP(mean Average Precision)和AP(Average Precision),详细内容请参考 目标检测评价指标。
1.3 主流数据集调研:
我们对5个旋转目标检测数据集进行调研,对相关数据集描述文件(主要是标注字段)进行分析汇总,相同含义的标注字段会以统一命名进行展示,汇总信息如下表所示:
旋转目标检测数据集 | 共享字段 | 独立字段 | |||||||
---|---|---|---|---|---|---|---|---|---|
image_id | label_id | rbbox | bbox | istruncated | isdifficult | pose | theta | head | |
DOTAv2.0 | Y | Y | Y | Y | Y | ||||
HRSC2016 | Y | Y | Y | Y | Y | Y | Y | ||
UCAS_AOD | Y | Y | Y | Y | Y | ||||
SZTAKI-INRIA | Y | Y | Y | ||||||
SSDD+ | Y | Y | Y | Y | Y | Y |
对共享字段和独立字段进行汇总,得到下表:
字段类型 | 字段名称 | 含义 |
---|---|---|
共享字段 | image_id | 定位到唯一图片,比如用图片名或者图片路径表示 |
label_id | 单个目标所属的类别 | |
rbbox | 定位单个旋转目标框,比如用[x1, y1, x2, y2, x3, y3, x4, y4]表示 | |
独立字段 | bbox | 定位单个目标的普通矩形框,比如用[xmin, ymin, xmax, ymax]表示,一般用于普通目标检测任务,做旋转目标检测任务时,并不使用该字段 |
istruncated | 目标是否被截断,即目标部分处于图片之外 | |
isdifficult | 是否为检测困难的目标 | |
theta | 物体尾部到头部的向量与x轴正方向的夹角 | |
head | 物体头部坐标 | |
pose | 拍摄角度,取值为 Unspecified,Frontal,Rear,Left,Right |
可以看到,如果要描述一个旋转检测数据集的样本,image_id、label_id和rbbox是最基础的字段,此外还包含了各种描述边界框信息的特殊字段。
2. 模板展示
根据上述调研,旋转目标检测任务中一张图像对应不定数量的目标,每个目标用边界框RotatedBBox来定位目标位置,每个RotatedBBox同时提供语义标签,由此我们定义旋转目标检测模板如下:
$dsdl-version: "0.5.0"
LocalObjectEntry:
$def: struct
$params: ['cdom']
$fields:
rbbox: RotatedBBox[mode="xyxy"]
label: Label[dom=$cdom]
OrientedObjectDetectionSample:
$def: struct
$params: ['cdom']
$fields:
image: Image
objects: List[LocalObjectEntry[cdom=$cdom]]
在检测模板中的一些字段含义如下(详细学习请参考 DSDL语言教程)
- $dsdl-version: 描述了该文件对应的dsdl版本
- LocalObjectEntry: 定义了边界框的描述方式的嵌套结构体,包含四个字段:
- $def: struct,表示这是一个结构体类型
- $params: 定义了形参,在这里即class domain
- $fields: 结构体类所包含的属性,具体包括:
- label 边界框的类别
- rbbox 边界框的位置,目前有两种模式
- RotatedBBox[mode="xyxy"]:代表以四边形表示标注框,具体标注值示例:[x1,y1,x2,y2,x3,y3,x4,y4],xi,yi代表四边形的四个顶点坐标。
- RotatedBBox[mode="xywht", measure="degree"]:代表以旋转矩形表示标注框,具体标注值示例:[x, y, w, h, t],x,y:矩形框的中心点坐标,w,h:矩形框的宽和高,t:矩形框旋转的角度。
- 当measure="degree" 时,t代表角度,范围是(-180,180);当measure="radian"时,t代表弧度,范围是(-pi,pi)。
- measure的默认值是弧度。即RotatedBBox[mode="xywht"]代表t只能填写弧度值。
- OrientedObjectDetectionSample: 定义了旋转目标检测任务sample的结构体,包含四个字段:
- $def: struct, 表示这是一个结构体类型
- $params: 定义了形参,在这里即class domain
- $fields: 结构体类所包含的属性,具体包括:
- image 图片的路径
- objects 标注信息,检测任务中,为前面的LocalObjectEntry构成的一个列表
3. 完整示例
我们以DOTAv2.0数据集为例,展示目标检测数据集DSDL描述文件具体内容。
3.1 DSDL语法描述类别信息
class-dom.yaml
$dsdl-version: "0.5.2"
DOTAV2ClassDom:
$def: class_domain
classes:
- large_vehicle
- small_vehicle
- ship
- ground_track_field
- soccer_ball_field
- tennis_court
- swimming_pool
- harbor
- baseball_diamond
- plane
- storage_tank
- roundabout
- basketball_court
- bridge
- helicopter
- container_crane
- airport
- helipad
ExampleClassDomDescr:
$def: struct
$params: ['cdom']
$fields:
dsdl_name: Label[dom=$cdom]
original_name: Str
ClassMapInfo:
$def: struct
$params: ['cdom']
$fields:
class_info: List[ExampleClassDomDescr[cdom=$cdom]]
上面的文件中给出了DOTAV2ClassDom的定义,具体包含下列字段:
- $def: 描述了DOTAV2ClassDom的dsdl类型,这里即class_domain
- classes: 描述了该类别域中所包含的类别及其顺序,在DOTAV2ClassDom数据集中,则依次为large_vehicle、small_vehicle等等
从class_domain可以获取当前数据集所有类别信息,熟悉DOTA数据集的用户可以看出,当前的类别名与原始DOTA数据集存在一定差异,这是因为DOTA数据集类别命名存在特殊字符,我们对齐进行规范化转换。我们将原始命名到DSDL命名的映射关系存储在ClassMapInfo中,需要的用户可以自行获取,关于全局信息存储方式的具体信息可以查看DSDL语言教程的Global-Info字段用法。
3.2 数据集yaml文件定义
train.yaml
$dsdl-version: "0.5.2"
$import:
- ../defs/class-dom
- ../defs/rotated-detection
meta:
dataset_name: "DOTAv2.0"
subset-name: "train"
creator: "Wuhan University·Cornell University·Huazhong University of Science and Technology"
dataset-version: "2.0"
home-page: "https://captain-whu.github.io/DOTA/dataset.html"
opendatalab-page: "https://opendatalab.com/DOTA_V2.0"
task_type: "Rotated Object Detection"
data:
global-info-type: ClassMapInfo[cdom=DOTAV2ClassDom]
global-info-path: ../defs/global-info.json
sample-type: OrientedObjectDetectionSample[cdom=DOTAV2ClassDom]
sample-path: samples.json
上面的描述文件train.yaml中,首先定义了dsdl的版本信息,然后import了两个模板文件,包括任务模板和类别域模板,接着用meta和data字段来描述自己的数据集,具体的字段说明如下所示:
- $dsdl-version: dsdl版本信息
- $import: 模板导入信息,这里导入旋转目标检测任务模板和DOTAV2的class domain。
- meta: 主要展示数据集的一些元信息,比如数据集名称,创建者等等,用户可以自己添加想要备注的其它信息
- data: 其内容就是按照前面定义好的结构所保存的样本信息,具体如下:
- global-info-type: 数据集的全局信息类型定义,在这里用的是从class-dom.yaml中导入的ClassMapInfo类,同时指定了采用的cdom为DOTAV2ClassDom.
- global-info-path: 全局信息global-info.json的存放路径.
- sample-type: 数据的类型定义,在这里用的是从旋转目标检测任务模板中导入的OrientedObjectDetectionSample类,同时指定了采用的cdom为DOTAV2ClassDom.
- sample-path: samples的存放路径,如果实际是一个路径,则samples的内容从该文件读取(此处是当前目录下的samples.json文件),如果是$local,则从本文件的data.samples字段中直接读取.
- samples: 保存数据集的样本信息,注意只有在sample-path是$local的时候该字段才会生效,否则samples会优先从sample-path中的路径去读取
train.yaml中出现的文件和内容如下所示:
rotated-detection.yaml
$dsdl-version: "0.5.2"
LocalObjectEntry:
$def: struct
$params: ['cdom']
$fields:
rbbox: RotatedBBox[mode="xyxy"]
label: Label[dom=$cdom]
isdifficult: Bool
bbox: BBox
$optional: ['bbox']
OrientedObjectDetectionSample:
$def: struct
$params: ['cdom']
$fields:
image: Image
imageshape: ImageShape
objects: List[etype=LocalObjectEntry[cdom=$cdom]]
acquisition_dates: Str
imagesource: Str
gsd: Num
$optional: ['objects','acquisition_dates', 'imagesource', 'gsd']
此模板中使用到了“$optional”字段,该字段的值是一个列表,列表中的值只能来源于“$fields”中。列表中出现的字段在样本中是可以不出现的。具体用法请参考DSDL语言教程中Optional的用法。
global-info.json
{
"global-info": {
"class_info": [
{
"dsdl_name": "roundabout",
"original_name": "roundabout"
},
{
"dsdl_name": "large_vehicle",
"original_name": "large-vehicle"
},
{
"dsdl_name": "small_vehicle",
"original_name": "small-vehicle"
},
...
]
}
}
samples.json
{
"samples": [
{
"image": "train/images/P0000.png",
"imageshape": [
5502,
3875
],
"objects": [
{
"rbbox": [
2244.0,
1791.0,
2254.0,
1795.0,
2245.0,
1813.0,
2238.0,
1809.0
],
"label": "small_vehicle",
"isdifficult": true,
"bbox": [
2238.0,
1791.0,
16.0,
22.0
]
},
...
],
"acquisition_dates": "2016-05-04",
"imagesource": "GoogleEarth",
"gsd": 0.146343590398
}
...
]
}