mmdetection中的pipeline

问题描述

在mmdetection中,pipeline是一个非常重要的步骤,它负责对原始的图像进行一系列的处理,完成一系列的操作,最终提供给深度神经网络。

我在看mmdetection源代码的时候,尤其在阅读pipeline代码的时候,发现类的实例方法返回的都是results。而results是从哪里来的呢?此外,pipeline中的预处理方法是在何处调用的呢?

带着这些问题,我看到了一篇不错的博客,里面回答了我的一些困惑,我在它的基础上进行了一些总结,形成了自己的内容。

版本与环境

mmcv (0.2.16)
mmdet (1.0rc0+unknown)
torch (1.4.0)
torchvision (0.5.0)
CUDA 10.1

我的总结归纳

首先,我们要明确2个不同的对象:dataset和dataloader。在tools/train.py中,先进行的是build_dataset然后是build_dataloader。需要注意的是输入图像resize等图像预处理工作和pipeline都是在build_dataset阶段完成的,相反build_dataloader阶段做的事儿很少(mmdet/datasets/loader/build_loader.py)。

经过我仔细的研究和思考,我个人认为在dataset阶段并没有真正的开始处理数据,而是走了一遍pipeline的流程,“走了个过场”;在dataloader阶段,根据之前的流程,按照配置文件的imgs_per_gpuworkers_per_gpu参数真正地进行图像读入,预处理等操作。此外,在dataset阶段,其实是相当于build,将代码中的类实例化,即执行__init__方法;而在dataloader阶段,其实是执行类的实例的__call__方法。

在研究pipeline之前,需要先研究mmdet/datasets/coco.py,我之前就是漏了这一个部分,直接去研究pipeline了。这部分内容在博客中有详细介绍,省略不表。

本文主要讲2个内容,一个是pipeline是从哪里开始加载的(mmdet/datasets/custom.py第82行和mmdet/datasets/pipelines/compose.py第24行 ),还有一个是results是从哪里诞生的(mmdet/datasets/custom.py第140行)

pipeline是从哪里开始加载的

对于COCO数据集(mmdet/datasets/coco.py),其定义的类是CoCoDataset,继承自CustomDataset。因此,mmdetection在实例化CoCoDataset前,已经实例化了CustomDataset类。需要说明的是,CustomDataset类继承自torch.utils.data中的Dataset类。对于Dataset类,最重要的就是__len__和__getitem__这两个实例方法。这篇博客对Pytorch中的Dataset和Dataloader介绍得比较详细。

class Dataset(object)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值