mm3dtest / projects /NeRF-Det /prepare_infos.py
giantmonkeyTC
2344
34d1f8b
# Copyright (c) OpenMMLab. All rights reserved.
"""Prepare the dataset for NeRF-Det.
Example:
python projects/NeRF-Det/prepare_infos.py
--root-path ./data/scannet
--out-dir ./data/scannet
"""
import argparse
import time
from os import path as osp
from pathlib import Path
import mmengine
from ...tools.dataset_converters import indoor_converter as indoor
from ...tools.dataset_converters.update_infos_to_v2 import (
clear_data_info_unused_keys, clear_instance_unused_keys,
get_empty_instance, get_empty_standard_data_info)
def update_scannet_infos_nerfdet(pkl_path, out_dir):
"""Update the origin pkl to the new format which will be used in nerf-det.
Args:
pkl_path (str): Path of the origin pkl.
out_dir (str): Output directory of the generated info file.
Returns:
The pkl will be overwritTen.
The new pkl is a dict containing two keys:
metainfo: Some base information of the pkl
data_list (list): A list containing all the information of the scenes.
"""
print('The new refactored process is running.')
print(f'{pkl_path} will be modified.')
if out_dir in pkl_path:
print(f'Warning, you may overwriting '
f'the original data {pkl_path}.')
time.sleep(5)
METAINFO = {
'classes':
('cabinet', 'bed', 'chair', 'sofa', 'table', 'door', 'window',
'bookshelf', 'picture', 'counter', 'desk', 'curtain', 'refrigerator',
'showercurtrain', 'toilet', 'sink', 'bathtub', 'garbagebin')
}
print(f'Reading from input file: {pkl_path}.')
data_list = mmengine.load(pkl_path)
print('Start updating:')
converted_list = []
for ori_info_dict in mmengine.track_iter_progress(data_list):
temp_data_info = get_empty_standard_data_info()
# intrinsics, extrinsics and imgs
temp_data_info['cam2img'] = ori_info_dict['intrinsics']
temp_data_info['lidar2cam'] = ori_info_dict['extrinsics']
temp_data_info['img_paths'] = ori_info_dict['img_paths']
# annotation information
anns = ori_info_dict.get('annos', None)
ignore_class_name = set()
if anns is not None:
temp_data_info['axis_align_matrix'] = anns[
'axis_align_matrix'].tolist()
if anns['gt_num'] == 0:
instance_list = []
else:
num_instances = len(anns['name'])
instance_list = []
for instance_id in range(num_instances):
empty_instance = get_empty_instance()
empty_instance['bbox_3d'] = anns['gt_boxes_upright_depth'][
instance_id].tolist()
if anns['name'][instance_id] in METAINFO['classes']:
empty_instance['bbox_label_3d'] = METAINFO[
'classes'].index(anns['name'][instance_id])
else:
ignore_class_name.add(anns['name'][instance_id])
empty_instance['bbox_label_3d'] = -1
empty_instance = clear_instance_unused_keys(empty_instance)
instance_list.append(empty_instance)
temp_data_info['instances'] = instance_list
temp_data_info, _ = clear_data_info_unused_keys(temp_data_info)
converted_list.append(temp_data_info)
pkl_name = Path(pkl_path).name
out_path = osp.join(out_dir, pkl_name)
print(f'Writing to output file: {out_path}.')
print(f'ignore classes: {ignore_class_name}')
# dataset metainfo
metainfo = dict()
metainfo['categories'] = {k: i for i, k in enumerate(METAINFO['classes'])}
if ignore_class_name:
for ignore_class in ignore_class_name:
metainfo['categories'][ignore_class] = -1
metainfo['dataset'] = 'scannet'
metainfo['info_version'] = '1.1'
converted_data_info = dict(metainfo=metainfo, data_list=converted_list)
mmengine.dump(converted_data_info, out_path, 'pkl')
def scannet_data_prep(root_path, info_prefix, out_dir, workers):
"""Prepare the info file for scannet dataset.
Args:
root_path (str): Path of dataset root.
info_prefix (str): The prefix of info filenames.
out_dir (str): Output directory of the generated info file.
workers (int): Number of threads to be used.
version (str): Only used to generate the dataset of nerfdet now.
"""
indoor.create_indoor_info_file(
root_path, info_prefix, out_dir, workers=workers)
info_train_path = osp.join(out_dir, f'{info_prefix}_infos_train.pkl')
info_val_path = osp.join(out_dir, f'{info_prefix}_infos_val.pkl')
info_test_path = osp.join(out_dir, f'{info_prefix}_infos_test.pkl')
update_scannet_infos_nerfdet(out_dir=out_dir, pkl_path=info_train_path)
update_scannet_infos_nerfdet(out_dir=out_dir, pkl_path=info_val_path)
update_scannet_infos_nerfdet(out_dir=out_dir, pkl_path=info_test_path)
parser = argparse.ArgumentParser(description='Data converter arg parser')
parser.add_argument(
'--root-path',
type=str,
default='./data/scannet',
help='specify the root path of dataset')
parser.add_argument(
'--out-dir',
type=str,
default='./data/scannet',
required=False,
help='name of info pkl')
parser.add_argument('--extra-tag', type=str, default='scannet')
parser.add_argument(
'--workers', type=int, default=4, help='number of threads to be used')
args = parser.parse_args()
if __name__ == '__main__':
from mmdet3d.utils import register_all_modules
register_all_modules()
scannet_data_prep(
root_path=args.root_path,
info_prefix=args.extra_tag,
out_dir=args.out_dir,
workers=args.workers)