pcdet版本:
指令
运行结果
问题所在:
无法生成gt_database
解决方案:
在函数部分,也需要对路径进行修改,不然在执行create_groundtruth_database的时候会找不到pkl,导入样本为0。
nuscens_dataset.py里面的主函数
if __name__ == '__main__':
import yaml
import argparse
from pathlib import Path
from easydict import EasyDict
parser = argparse.ArgumentParser(description='arg parser')
parser.add_argument('--cfg_file', type=str, default=None, help='specify the config of dataset')
parser.add_argument('--func', type=str, default='create_nuscenes_infos', help='')
parser.add_argument('--version', type=str, default='v1.0-trainval', help='')
parser.add_argument('--with_cam', action='store_true', default=False, help='use camera or not')
args = parser.parse_args()
if args.func == 'create_nuscenes_infos':
#此处的路径也应该要修改,不然在生成gt_database的时候会检索不到对应的pkl
dataset_cfg = EasyDict(yaml.safe_load(open(args.cfg_file)))
ROOT_DIR = Path('/mnt/windows/dataset/nuscenes').resolve()
dataset_cfg.VERSION = args.version
create_nuscenes_info(
version=dataset_cfg.VERSION,
data_path=ROOT_DIR / 'v1.0-trainval',
save_path=ROOT_DIR / 'v1.0-trainval',
max_sweeps=dataset_cfg.MAX_SWEEPS,
with_cam=args.with_cam
)
nuscenes_dataset = NuScenesDataset(
dataset_cfg=dataset_cfg, class_names=None,
root_path=ROOT_DIR / 'v1.0-trainval',
logger=common_utils.create_logger(), training=True
)
nuscenes_dataset.create_groundtruth_database(max_sweeps=dataset_cfg.MAX_SWEEPS)
处理部分nuscenes数据集:
nuscenes完整数据集太大,可以下载part1或者其他部分数据集进行训练。
可能遇到的问题1:
生成的val.pkl是针对850个场景,所有样本的,在评估的时候会报错在samples找不到某个数据
解决方案:
找到nuscenes_dataset.py这个部分,进入fill_trainval_infos函数
train_nusc_infos, val_nusc_infos = nuscenes_utils.fill_trainval_infos(
data_path=data_path, nusc=nusc, train_scenes=train_scenes, val_scenes=val_scenes,
test='test' in version, max_sweeps=max_sweeps, with_cam=with_cam
)#在这里都是正常的 val_scenes有八个场景
nuscenes_utils.fill_trainval_infos函数这个位置
if sample['scene_token'] in train_scenes:
train_nusc_infos.append(info)
else:
val_nusc_infos.append(info)
可以看到,它会遍历所有的train_scenes尝尽并append训练的Infos,剩下的场景全部都添加到了val的Infos中,这是不正确的,可以改成:
if sample['scene_token'] in train_scenes:
train_nusc_infos.append(info)
elif sample['scene_token'] in val_scenes:
val_nusc_infos.append(info)
else:
pass
这样可以保证val.pkl读取的是你下载的数据集的内容,而非整个数据集的内容。
可能遇到的问题2:
在评估的时候,可能会报错
""Samples in split doesn't match samples in predictions.""
解决方案:
这是因为gt生成和predict生成不匹配造成的。
参考了
https://github.com/nutonomy/nuscenes-devkit/issues/823
对nuscenes源代码进行修改,进入nuscenes/eval/common/loaders.py,在开头的地方加上
在load_prediction函数的最后一个循环处加上
同时要记得修改\nuscenes\utils\splits里面val的场景名称,part1中的val只保留了103-110,故修改如下:
同时也要对函数进行修改,我嫌麻烦,直接注释了
方可正常评估