该函数根据配置字典实例化相应的类。使用格式(以build_dataset函数为例):
# dataset_cfg为数据集配置字典
dataset = bulider.build_dataset(dataset_cfg)
# 返回数据集类的实例
其中配置字典的格式如下:
dataset_cfg = dict(
type='XxxDataset', # 该项是必要的,表示类的名称,需要进行对应的注册
# 例如函数为build_dataset,需要将XxxDataset类注册为DATASETS
param_1=xxx, # 类的初始化参数
param_2=xxx,
...
)
对应类的__init__函数定义如下:
@DATASETS.register_module() # 例如函数为build_dataset,需要将XxxDataset类注册为DATASETS
class XxxDataset(Custom3DDataset):
def __init__(self, param_1=xxx, param_2=xxx, ...):
...
总的来说,该函数可以看作与下列代码等价:
DatasetClassName = dataset_cfg.pop('type') # DatasetClassName = 'XxxDataset'
DatasetClass = eval(DatasetClassName) # 根据类的名字找到该类
dataset = DatasetClass(**dataset_cfg) # 即XxxDataset(param_1=xxx, param_2=xxx, ...)
先从简单用法开始介绍:
基本格式:
# 设func为函数名称,input为函数的输入(按顺序排列),其中每个input_i为相同长度的列表
output_1, output_2, ... = multi_apply(func, input_1, input_2, ...)
# 输出的output_i也均为列表,长度与输入列表的长度相同
其中func函数的定义如下:
def func(in_1, in_2, ...):
...
return out_1, out_2, ...
可以将multi_apply()函数理解为与如下代码等价:
def multi_apply(func, input_1, input_2, ...):
output_1, output_2, ... = [], [], ...
for i in range(N): # N为输入列表的长度
out_1, out_2, ... = func(input_1[i], input_2[i], ...)
output_1.append(out_1)
output_2.append(out_2)
...
return output_1, output_2, ...
参考:mmdetection multi_apply_broad-sky的博客-CSDN博客_multi_apply
如果每次调用函数时,有些参数的值不会改变,则可以用键值对形式输入这些参数。基本格式:
output_1, output_2, ... = multi_apply(func, input_1, input_2, ..., kwarg_1=xxx, kwarg_2=xxx, ...)
# 其中kwarg_i为每次调用func函数时均不变的输入,为func函数的kwarg_i要求的格式
其中func函数的定义如下:
def func(in_1, in_2, ..., kwarg_1, kwarg_2, ...):
...
return out_1, out_2, ...
可以将multi_apply()函数理解为与如下代码等价:
def multi_apply(func, input_1, input_2, ..., kwarg_1=xxx, kwarg_2=xxx, ...):
output_1, output_2, ... = [], [], ...
for i in range(N): # N为输入列表的长度
out_1, out_2, ... = func(input_1[i], input_2[i], ..., kwarg_1=xxx, kwarg_2=xxx, ...)
output_1.append(out_1)
output_2.append(out_2)
...
return output_1, output_2, ...