1.builder.build_xxx()
该函数根据配置字典实例化相应的类。使用格式(以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, ...)

2.multi_apply()
先从简单用法开始介绍:

2.1 用法1:仅输入非键值对参数
基本格式:

# 设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, ...

2.2 用法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, ...