图像分类任务
为了制定图像分类任务数据集描述文件的模板,我们对主流的分类任务数据集进行了调研,分析其任务的目的和常见标注信息所包含的字段,从中整理出通用共享和独立字段,并在此基础上制定分类任务数据集描述文件的通用模板。
1. 任务调研
1.1 任务定义
图像分类是指给定一张输入图像,输出其语义类别。
1.2 评价指标
任务的评价指标一般有两个:top-5的准确率和top-1的准确率,准确率=(正确分类图片个数)/(所有图片个数)。top-5准确率指的是前5个得分最高的预测类别里有一个是正确的,就算这个样本被正确分类了,而top-1准确率计算时必须要满足预测分数最高的预测类别是正确的,才算这个样本被正确分类了。
1.3 主流数据集调研
我们调研了10个主流分类数据集,其中包含了ImageNet-1K、MNIST、CIFAR10等常见数据集。为了使得模板更加通用,同时也具备拓展能力,我们着重关注各个数据集之间的共性和特性,此外,调研过程会遇到一些名称不同,但是实际含义相同或类似的字段,这些字段我们也视为同一字段,并统一去命名,比如image_id字段一般表示图片的路径或者id,是图片的唯一标识;label_id则表示图片的类别,可以用数字表示,也可以用字符串表示。完整的字段调研结果如下表所示:
图像分类数据集 | 共享字段 | 独立字段 | ||
---|---|---|---|---|
image_id | label_id | superclass | ||
ImageNet-21K | Y | Y | Y | |
ImageNet-1K | Y | Y | Y | |
CIFAR10 | Y | Y | ||
CIFAR100 | Y | Y | Y | |
MNIST | Y | Y | ||
Fashion-MNIST | Y | Y | ||
Caltech-256 | Y | Y | ||
Oxford Flowers-102 | Y | Y |
经过整理,分类任务的共享字段和独立字段如下表所示:
字段类型 | 字段名称 | 含义 |
---|---|---|
共享字段 | image_id | 定位到唯一图片,比如用图片名或者图片路径表示 |
label_id | 图片所属的类别,类型为int表示为单标签,类型为List[int]表示多标签 | |
独立字段 | superclass | 图片所属类别的父类别,比如"dog"的父类可能是"animal" |
可以看到,如果要描述一个分类数据集的样本,image_id和label_id是最基础的字段,同时,也会有类似superclass的特有字段。
2. 模板展示
根据上述的调研结果,我们知道对于分类任务,一个样本最重要的属性是图片的id(或路径)以及图片的类别,因此我们在分类任务结构体(结构体的概念请参考DSDL入门文档-语言定义-结构体部分)的fields 属性中定义了image和label两个字段;其次,不同的数据集所蕴含的类别是各不相同的,所以在sample中需要有一个形参,来对类别域进行限定(在dsdl中,我们将类别域描述为class domain,或者cdom,具体可以参考DSDL入门文档-语言定义-类别域中更详细的定义);最后,我们考虑到对于一些无监督或半监督分类任务,可能部分样本不包含类别信息,所以我们设计了$optional
字段,并将label字段涵盖进去,同时一些数据集特有的字段也可以包含到$optional
字段当中。基于上述考虑,我们制定了分类任务的模板,如下所示:
$dsdl-version: "0.5.0"
ClassificationSample:
$def: struct
$params: ['cdom']
$fields:
image: Image
label: Label[dom=$cdom]
$optional: ['label']
- $dsdl-version: 描述了该文件对应的dsdl版本
-
ClassificationSample: 定义了分类任务的样本格式,其包含了四个属性:
- $def: 表示ClassificationSample是一个struct(结构体类)
- $params: 定义了形参,在这里即class domain
-
$fields: 结构体类所包含的属性,对于分类任务,具体包括:
- image 图片路径
- label 类别信息
-
$optional: 用来涵盖结构体类的属性中的可选属性,这里只定义了一个字段即label,表示单个样本,label的存在是可选的,另外也可以将数据集的特有字段涵盖在
$optional
字段里
对于模板中提到的类别域cdom,这里给出cifar10数据集的class domain作为示例:
$dsdl-version: "0.5.0"
Cifar10ImageClassificationClassDom:
$def: class_domain
classes:
- airplane
- automobile
- bird
- cat
- deer
- dog
- frog
- horse
- ship
- truck
- $def: 描述了Cifar10ImageClassificationClassDom的类型,这里即class_domain
- classes: 描述了该类别域中所包含的类别及其顺序,在cifar10数据集中,则依次为airplane、automobile等等
这一章节介绍的分类任务模板和cdom模板都可以在我们的模板库中直接调用,具体调用方法请查看数据集转换部分,其他任务类型和类别域的模板也欢迎大家尝试使用。
3. 使用说明
在这个章节介绍一下如何通过import的方式来引用我们的模板。以cifar10数据集为例,首先是描述cifar10数据集中所有样本的模板train.yaml,举例如下:
$dsdl-version: "0.5.0"
$import:
- ../defs/class-dom
- ../defs/classification-cifar10
meta:
name: "cifar10"
subdata-name: "train"
data:
sample-type: Cifar10Sample[cdom=Cifar10ImageClassificationClassDom]
sample-path: $local
samples:
- image: "images/000000000000.png"
label: frog
- image: "images/000000000001.png"
label: truck
...
上面的描述文件中,首先定义了dsdl的版本信息,然后import了两个模板文件,包括任务模板和类别域模板,接着用meta和data字段来描述自己的数据集,具体的字段说明如下所示:
- $dsdl-version: dsdl版本信息
- $import: 模板导入信息,这里导入分类任务模板和cifar10的class domain,也就是章节2. 模板展示中展示的两部分内容
- meta: 主要展示数据集的一些元信息,比如数据集名称,创建者等等,用户可以自己添加想要备注的其它信息
-
data: 其内容就是按照前面定义好的结构所保存的样本信息,具体如下:
- sample-type: 数据的类型定义,在这里用的是从分类任务模板中导入的ClassificationSample类,同时指定了采用的cdom为Cifar10ImageClassificationClassDom
- sample-path: samples的存放路径,如果实际是一个路径,则samples的内容从该文件读取,如果是$local(这个例子),则从本文件的data.samples字段中直接读取
- samples: 保存数据集的样本信息,注意只有在sample-path是$local的时候该字段才会生效,否则samples会优先从sample-path中的路径去读取