本篇博客中,我们以推理为例。
首先进入Runer类中的test函数:
然后进入Runer类中的build_test_loop函数:
然后经过Registry中的build_from_cfg等函数,进入TestLoop类的__init__进行初始化。初始化的时候,会进入父类BaseLoop,在BaseLoop中,会对Dataloader进行build,关于mmcv2.0是如何构建Dataloader的,可以参考:mmcv2.0中build dataloader的流程 - Picassooo - 博客园 (cnblogs.com)。
build完test_loop之后,继续运行Runer类中的test函数剩余代码,包括执行一些带有before_run的钩子函数、load checkpoint等,然后是开始跑test_loop的run函数了:
test_loop的run函数包括需要执行一些钩子函数、从Dataloader中取样本数据、执行run_iter函数等:
这里对从从Dataloader中取样本数据的流程进行展开介绍。在执行enumerate(self.dataloader)时,会进入到Dataloader的__iter__函数:
这个__iter__函数会初始化一个迭代器_MultiProcessingDataLoaderIter:
执行上图中第988行代码的时候,会跳转到_BaseDataLoaderIter类中,执行__init__函数,对这个类初始化:
在初始化完_BaseDataLoaderIter和_MultiProcessingDataLoaderIter之后,将会回到Dataloader的__iter__函数,执行这个函数的retrun的时候,也就是执行第433行的时候,会跳转到_BaseDataLoaderIter的__next__函数,这个函数将会返回读取到的data,这个data是经过pipeline处理之后的images和meta_infos。
标签:mmcv2.0,__,run,函数,Dataloader,build,loop From: https://www.cnblogs.com/picassooo/p/18384917