一个工具搞定标注数据格式转换

openlab_4276841a 更新于 10月前

作者:杨亦诚

前言

通常情况下,新模型发布后,其对应的 github 仓库中都会有提供自定数据集训练的任务脚本,开发者可以基于自己的数据集,快速实现对该模型结构的训练与验证。但往往这些训练脚本仅支持部分的数据集格式,例如 YOLOv8 的官方仓库,就是需要开发者的数据集格式满足 Ultralytics 标准,或是手动编写脚本进行,将原本的数据集格式转化为 Ultralytics 格式,但这部分工作其实并不影响模型训练后的部署效果,因此如果有一个工具帮助我们非常便捷地进行训练数据的管理与格式转换,将大大提升模型训练的生产效率。

Datumaro 套件介绍

项目地址:https://github.com/openvinotoolkit/datumaro

Datumaro 是一个支持 Python 和命令行调用两种调用方式的标注数据管理工具。它可以支持以下功能:

· 标注数据格式双向转换

可以适用于分类,分割,检测,关键点检测,文本定位,文本识别、重识别以及点云任务的数据处理,支持以下标注数据格式的互相转换:

Ø CIFAR-10/100 (classification)

Ø Cityscapes

Ø COCO (image_infoinstancesperson_keypointscaptionslabelspanopticstuff)

Ø CVAT

Ø ImageNet

Ø Kitti (segmentationdetection3D raw / velodyne points)

Ø LabelMe

Ø LFW (classificationperson re-identificationlandmarks)

Ø MNIST (classification)

Ø Open Images

Ø PASCAL VOC (classificationdetectionsegmentationaction_classificationperson_layout)

Ø TF Detection API (bboxesmasks)

Ø YOLO (bboxes)

· 构建并修改数据集

Ø 多个数据**并

Ø 数据集标签过滤,例如删除特定标签的图片

Ø 修改数据集标签

Ø 数据集分割,例如训练集、验证集与测试集

Ø 数据集采样,例如基于 Entropy 的方法筛选合适的训练集样本

Datumaro 套件实践

Datumaro 是支持命令行调用的模式,因此我们可以非常方便地使用 1 行命令完成 2 种不同格式数据的转换,下面我将基于命令行模式,演示一下 Datumaro 处理标注数据格式转化时的基本方法。

· Datumaro 安装与基本使用方法

Datumaro 支持基于 PyPI 的安装方式,如果想在第一时间体验最新的功能也可以基于 github 仓库直接安装

# From PyPI:

$ pip install datumaro[default]

$ pip install 'git+https://github.com/openvinotoolkit/datumaro[default]'

Datumaro 的命令行调用方法非常简单,如果你已经有了一组标准格式的数据集,只需要在命令行中定于原始数据格式和路径,以及转换后的数据格式及路径即可:

$ datum convert -if voc -i <path/to/voc> -f coco -o <output/dir>

· YOLOv8 目标检测数据集实战

正好最近在准备表计识别的项目,这里借用一下飞桨提供的表计检测数据集,目标是使用 YOLOv8 模型构建表盘目标检测任务。

数据集下载地址: https://bj.bcebos.com/paddlex/example***eter_reader/dataset***eter_det.tar.gz

下载数据集后可以看到文件目录结构如下:

├── meter_det

│   ├── annotations

│   ├── instance_train.json

│   └── instance_test.json

│   ├── test

│   └── train

其实中 train 和 test 目录下分别保存了图片格式的训练数据和验证数据:

├── test

│   ├── 20190822_105.jpg

│   ├── 20190822_110.jpg

│   ├── 20190822_123.jpg

│   ├── 20190822_124.jpg

│   ├── 20190822_127.jpg

│   ├── …

我们可以随机打开一张图片验证:

图:图片数据示例

第一步我们可先先使用 datum 命令自动识别一下该数据集的格式:

$ datum detect './meter_det'

输出:Detected format: image_dir

可以看到由于该数据集并没有符合某类标准的格式规范,因此 Datumaro 将其判断为普通的图片文件夹。这里我可以手动查询几种数据集的标准格式,找到和原始数据集最相似的一种,然后进行手动修改。通过对于 Datumaro 支持的几种数据格式标准进行查询https://openvinotoolkit.github.io/datumaro/latest/docs/data-formats/supported_formats.html,我们发现原始数据的格式和COCO最为类似:

└─ Dataset/

    ├── dataset_meta.json # a list of custom labels (optional)

    ├── images/

    │   ├── train/

    │   │   ├── <image_name1.ext>

    │   │   ├── <image_name2.ext>

    │   │   └── ...

    │   └── val/

    │       ├── <image_name1.ext>

    │       ├── <image_name2.ext>

    │       └── ...

    └── annotations/

        ├── <task>_<subset_name>.json

        └── ...

图:COCO数据格式示例

所以我们手动对原始目录进行略微改造,增加一个images目录用于单独存放图片数据,改造结果如下:

├── meter_det_coco

│   ├── annotations

│   ├── instances_train.json

│   └── instances_val.json

│   └── images

    ├── train

└── val

这里有个容易被忽略的点,因为  Datumaro 会根据 .json 标签文件的文件名来判断该数据集的用途,例如检测或者分割,所以我们一定要将示例中 <subset> 部分的名字改为 “instances”,接下来我们再使用 detect 方法检测下修改后的数据集类型:

$ datum detect './meter_det_coco'

输出:Detected format: coco

可以看到 Datumaro 已经将其识别为标准的 COCO 格式类型。最后我们就可以调用之前提到的命令一键完成对数据集从 COCO 到 Ultralytics 标准的转换:

$ datum convert -if coco -i '/home/ethan/intel/data/meter_det_coco' -f yolo_ultralytics -o '/home/ethan/intel/data/meter_det_yolo' -- --save-media

P.S: --save-media 自动将图片文件**到新的数据集目录下

转换后的数据集目录如下:

├── meter_det_yolo

│   ├── data.yaml

│   ├── images

│   │   ├── train

│   │   └── val

│   ├── labels

│   │   ├── train

│   │   └── val

│   ├── train.txt

│   └── val.txt

└── table.jpg

有了这样一个 Ultralytics 标准数据集后,我们就可以直接将其对应的路径放到 YOLOv8 仓库中的配置文件中,然后开启训练脚本进行模型创建。

model.train(data=' data.yaml ', epochs=100, imgsz=640)

总结

Datumaro 是一个非常强大的标注数据管理工具,帮助开发者在各种数据标准间轻松实现格式的互相转换,并实现对这些数据集的有效管理和改造,大大提升了既有数据集的复用性,完成对新模型效果进行快速验证。

0个评论