跳转至

旋转目标检测任务

我们通过对旋转目标检测任务进行调研,并总结数据集描述中的字段信息,从而制定出旋转目标检测任务DSDL模板,供大家参考使用。

1. 任务调研

1.1 任务定义

旋转目标检测任务是指在图像中用旋转矩形框、四边形甚至任意形状的形式检测出物体的位置,并识别其所属类别,示意图如下:

img

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
        }
        ...
    ]
}