人工智能|【金猿技术展】模块注册机制——打造AI算法流水线( 二 )


跨库调用
OpenMMLab 使用一系列算法库支持了视觉领域绝大部分任务。这些任务之间在模块组件上存在着一定的共通之处,比如在检测、分割等任务中,网络包含一个用于提取图片特征的主干网络,该主干网络的权重在不同任务间有通用性。因此在进行检测、分割等任务之前,可以首先使用主干网络进行分类任务的训练。利用分类任务庞大的 ImageNet 数据集,可以提高主干网络的特征提取能力,并提高模型训练的收敛速度。
利用 Registry 机制,OpenMMLab 的算法库能够便捷地完成如上所述的,跨算法库的训练流程,使各个算法库开发的模块有机结合在一起。以检测任务的主干网络跨库调用为例,在 MMDetection 中,检测算法 Yolo V3 的一种默认配置是使用 MobileNet V2 主干网络进行图像特征提取。在实验中,如有需求使用其他主干网络进行特征提取,如 MobileNet V3,而 MMDetection 算法库中没有该主干网络的实现,我们可以利用跨库调用,直接从实现了该主干网络的算法库中调用对应的模块,而不必重新实现需要的网络。在这里,MobileNet V3 主干网络在分类代码库 MMClassification 中有对应的实现,使用如下配置即可完成模型的跨库调用:
# 直接继承 yolo v3 的原始配置_base_ = "./yolov3_mobilenetv2_320_300e_coco.py"# 因为 MMDetection 中没有导入 MMClassification 算法库# 为了完成相关的模块注册,需要调用 custom_imports 来指定额外的导入custom_imports=dict(imports='mmcls.models', allow_failed_imports=False)model = dict(backbone=dict(# 使用 "scope.type" 的语法,指定从 MMClassification 中寻找需要的模块type='mmcls.MobileNetV3',# MobileNet V3 的其他设置arch='large',out_indices=(5, 11, 14),init_cfg=dict(type='Pretrained',checkpoint='mmcls://mobilenet_v3_large'),# 配置文件与继承的配置文件中相同字段的字典,默认会融合# 这里使用 `_delete_` 来删除继承的配置文件中的其他配置_delete_=True),# 主干网络发生变化,其他相应的配置也需要改变neck=dict(in_channels=[160, 112, 40])跨代码库调用机制
自定义模块导入
利用注册器机制,在导入相对应的模块时,模块中所包含类自动地被注册到 Registry 中的。而具体导入模块的操作,被放在了代码执行的入口程序中,一般为 tools/train.py 和 tools/test.py,分别对应了训练和测试。
以 MMClassification 中的 tools/train.py 为例:
...from mmcv.runner import get_dist_info, init_dist...from mmcls.datasets import build_datasetfrom mmcls.models import build_classifier? 通过导入 mmcv.runner 包,完成了 mmcv/runner/__init__.py 中一系列执行器、钩子、优化器等类的注册。
? 通过导入 mmcls.datasets 包,完成了mmcls/datasets/__init__.py 中一系列数据集的注册。
? 通过导入mmcls.models 包,完成了mmcls/models/__init__.py中一系列主干网络、颈部头部函数的注册。
模块的的导入和类的注册不一定仅发生在入口程序的最外层,比如与数据处理和增强相关的注册器 PIPELINES 是入口程序在执行 build_dataset 时,在 mmcls/datasets/base_dataset.py 中进行相关类的注册。
通常,如果不存在明显的依赖,一个代码库中的入口程序不会导入其他代码库的模块,因而其他代码库中的类也不会被注册。为了实现跨库调用,MMCV 在解析配置文件时,提供了显式导入自定义模块的 custom_imports 接口。
custom_imports=dict(imports='mmcls.models', allow_failed_imports=False)
通过在配置文件中加入上述代码,MMCV 会在解析时借助 Python 内置的 importlib 包中的import_module 函数实现其他代码库模块的导入,进而完成对应的一系列类的注册。
Regsitry 中的 scope 机制
在进行跨库调用时,需要使用 scope.type 的语法显示指明要调用的类所在的 scope,例如在type='mmcls.MobileNetV3' 中,scope 为 “mmcls”。