我是靠谱客的博主 活力太阳,最近开发中收集的这篇文章主要介绍PaddleDetection数据处理模块,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2021SC@SDUSC本周分析

PaddleDetection的数据处理模块是一个Python模块,所有代码逻辑在ppdet/data/中,数据处理模块用于加载数据并将其转换成适用于物体检测模型的训练、评估、推理所需要的格式。 数据处理模块的主要构成如下架构所示:

ppdet/data/
├── reader.py
# 数据处理模块的总接口
├── shared_queue
# 共享内存管理模块
│
├── queue.py
# 定义共享内存队列
│
├── sharedmemory.py # 负责分配内存
├── source
# 数据源管理模块
│
├── dataset.py
# 定义数据源基类,各类数据集继承于此
│
├── coco.py
# COCO数据集解析与格式化数据
│
├── voc.py
# Pascal VOC数据集解析与格式化数据
│
├── widerface.py
# WIDER-FACE数据集解析与格式化数据
├── tests
# 单元测试模块
│
├── test_dataset.py # 对数据集解析、加载等进行单元测试
│
│
...
├── transform
# 数据预处理模块
│
├── batch_operators.py
# 定义各类基于批量数据的预处理算子
│
├── op_helper.py
# 预处理算子的辅助函数
│
├── operators.py
# 定义各类基于单张图片的预处理算子
├── parallel_map.py
# 在多进程/多线程模式中对数据预处理操作进行加速

PaddleDetection目前支持COCO、Pascal VOC 和WIDER-FACE数据源,默认数据集可自动下载,请参考默认数据集安装方法。 同时我们还支持自定义数据源,包括(1)自定义数据源转换成COCO数据集;(2)定义新的数据源。

数据准备分为三步:

  • (1)数据解析
  • (2)数据预处理
  • (3)组建Reader迭代器

数据解析逻辑在source目录中,其中,dataset.py是数据源定义的基类,所有数据集继承于此,DataSet基类里定义了如下等方法:

方法输入输出备注
load_roidb_and_cname2cid()加载DataSet中Roidb数据源list, 类别名到id的映射dict
get_roidb()list[dict], Roidb数据源获取数据源
get_cname2cid()dict,类别名到id的映射获取标签ID
get_anno()str, 标注文件路径获取标注文件路径
get_imid2path()dict, 图片路径获取图片路径

  • load_roidb_and_cname2cid()在Dataset基类中并没有做实际的操作,需要在子类中重写实际操作。
  • roidbs:代表数据源列表。load_roidb_and_cname2cid方法中根据数据集标注文件(anno_path),将每张标注好的图片解析为字典coco_recvoc_rec等:
xxx_rec = {
'im_file': im_fname,
# 一张图像的完整路径
'im_id': np.array([img_id]), # 一张图像的ID序号
'h': im_h,
# 图像高度
'w': im_w,
# 图像宽度
'is_crowd': is_crowd,
# 是否是群落对象, 默认为0 (VOC中无此字段,为了使个别模型同时适配于COCO与VOC)
'gt_class': gt_class,
# 标注框标签名称的ID序号
'gt_bbox': gt_bbox,
# 标注框坐标(xmin, ymin, xmax, ymax)
'gt_score': gt_score,
# 标注框置信度得分 (此字段为了适配Mixup操作)
'gt_poly': gt_poly,
# 分割掩码,此字段只在coco_rec中出现,默认为None
'difficult': difficult
# 是否是困难样本,此字段只在voc_rec中出现,默认为0
}

然后将所有xxx_rec字典封装到records列表中,最后传入self.roidbs中方便后续调用。

  • cname2cid:保存了类别名到id的映射的一个dict。
    • COCO数据集中:会根据COCO API自动加载cname2cid。
    • VOC数据集中:如果在yaml配置文件中设置use_default_label=False,将从label_list.txt中读取类别列表, 反之则可以没有label_list.txt文件,PaddleDetection会使用source/voc.py里的默认类别字典。 label_list.txt的格式如下所示,每一行文本表示一个类别:
    • aeroplane
      bicycle
      bird
      ...

COCO数据源目前分为COCO2014和COCO2017,主要由json文件和image文件组成,其组织结构如下所示: 

dataset/coco/
├── annotations
│
├── instances_train2014.json
│
├── instances_train2017.json
│
├── instances_val2014.json
│
├── instances_val2017.json
│
│
...
├── train2017
│
├── 000000000009.jpg
│
├── 000000580008.jpg
│
│
...
├── val2017
│
├── 000000000139.jpg
│
├── 000000000285.jpg
│
│
...

source/coco.py中定义并注册了COCODataSet数据源类,它继承自DataSet基类,并重写了load_roidb_and_cname2cid

根据标注文件路径(anno_path),调用COCO API加载并解析COCO格式数据源roidbscname2cid

Pascal VOC数据源目前分为VOC2007和VOC2012,主要由xml文件和image文件组成,其组织结构如下所示:

dataset/voc/
├── trainval.txt
├── test.txt
├── label_list.txt (optional)
├── VOCdevkit/VOC2007
│
├── Annotations
│
├── 001789.xml
│
│
...
│
├── JPEGImages
│
├── 001789.jpg
│
│
...
│
├── ImageSets
│
|
...
├── VOCdevkit/VOC2012
│
├── Annotations
│
├── 2011_003876.xml
│
│
...
│
├── JPEGImages
│
├── 2011_003876.jpg
│
│
...
│
├── ImageSets
│
│
...

source/voc.py中定义并注册了VOCDataSet数据源类,它继承自DataSet基类,并重写了load_roidb_and_cname2cid,解析VOC数据集中xml格式标注文件,更新roidbscname2cid

最后

以上就是活力太阳为你收集整理的PaddleDetection数据处理模块的全部内容,希望文章能够帮你解决PaddleDetection数据处理模块所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部