借着使用BRNET工程之际,了解下MMDetection3D框架相关的内容
1. MMDetection3D的数据处理的类
对于数据处理,MMDetection3D针对每种3D数据集,在代码中实现了一个类来进行数据的处理。在工程【test/test_data/test_datasets/】路径下,存放着数据读取处理的测试脚本。接下来以【test_scannet_dataset.py】为例。 最核心的代码为 scannet_dataset = ScanNetDataset(root_path, ann_file, pipelines) 其中入参: root_path:数据路径 ann_file:标签文件名 pipeline:处理数据的列表,其中每个元素都是一个类,详细内容后面讲述 然后通过 data = scannet_dataset[0] 来获取具体的数据,其中入参为数据的索引,即根据索引来获取该数据集中的数据。这也能看出,该类下,肯定使用了【__getitem__】来实现该功能。 接下来具体看下处理流程。 在该工程中,很多函数无法通过跳转找到定义。只能通过全局搜索,个人使用的是vscode阅读该工程,只需要在vscode界面左边的搜索里查找,即可找到类的定义。 我们在定义出可以看到【类ScanNetDataset】继承了【类Custom3DDataset】,然后再跳转该类,并找到【__getitem__】,该部分为数据处理功能函数的起始位置。 具体函数如下:由此我们可以查看具体的实现内容。值得说的有两点: 1. 【入参pipeline】在初始化位置,使用了框架内的函数将入参转换成自动的处理数据的函数。该函数的入参为一个字典,已放置了需要的数据内容的名字,作为关键字。经过该函数,会将具体数据放置在字典内对应位置的value上。在【prepare_train_data】等函数中被使用,如下代码: input_dict = self.get_data_info(index) if input_dict is None: return None self.pre_pipeline(input_dict) example = self.pipeline(input_dict) pipeline是一个列表,每个元素是一个字典。字典的关键字"type"的元素为处理数据的类的名称,后面的元素为初始化该类的入参,具体如下: pipelines = [ dict( type='LoadPointsFromFile', # 处理数据的类的名字 coord_type='DEPTH', # 初始化类的入参 shift_height=True, # 初始化类的入参 load_dim=6, # 初始化类的入参 use_dim=[0, 1, 2]), # 初始化类的入参 dict( type='LoadAnnotations3D', with_bbox_3d=True, with_label_3d=True, with_mask_3d=True, with_seg_3d=True), dict(type='IndoorPointSample', num_points=5), dict( type='RandomFlip3D', sync_2d=False, flip_ratio_bev_horizontal=1.0, flip_ratio_bev_vertical=1.0), ...... ] 每一个类下都存在【__call__】函数,也是被调用用作 具体处理数据的函数。其中处理逻辑,就是将pipeline转换成一个处理函数,然后将数据字典作为入参传入其中,然后就会按照pipeline中元素的顺序,对输入数据依次进行处理,上一个类的处理的返回数据,为接下来的类处理函数的入参。 2. 在【类Custom3DDataset】下的【函数get_data_info】中调用了【self.get_ann_info】,【self.get_ann_info】函数无法在编辑器页面进行定义跳转,该函数的实现在【类ScanNetDataset】中实现的。
2. api:build_dataset
同样是在路径【test/test_data/test_datasets/】下,脚本【test_dataset_wrappers.py】,可以看到MMDetection中数据处理的时,一个重要的api【build_dataset】 nus_dataset = build_dataset(dataset_cfg) 其中入参 dataset_cfg:字典,关键字"type"的值,是要进行处理数据的类名,其他关键字是该类初始化时的入参
使用【build_dataset】,也就是完成了【类CBGSDataset】的初始化,返回的变量 nus_dataset也可以通过nus_dataset[index]进行获取具体的数据