evaluation是最直观反映模型性能和问题的步骤,也是检验运行环境是否有错的重要一换,下面依托detr3d与custom waymo dataset类,介绍一下mmdet3d+waymo在eval的流程。
调用eval有两种流程,一种是training过程中eval,另一种是调用test.py,test.py支持validation set和test set的处理。无论哪种,其核心都是调用dataset类下的evaluate方法。下面主要讲调用test.py的流程。
evaluation
调用bash
bash tools/dist_test.sh \
projects/configs/detr3d/detr3d_res101_gridmask_waymo.py \
work_dirs/detr3d_res101_gridmask_waymo/epoch_10.pth \
8 --eval=waymo
其中 --eval代表evaluate的时候用哪种style的metric,比如waymo,在mmdet3d里支持kitti和waymo两种style。
tools/dist_test.sh
CONFIG=$1
CHECKPOINT=$2
GPUS=$3
PORT=${PORT:-29500}
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT \
$(dirname "$0")/test.py $CONFIG $CHECKPOINT --launcher pytorch ${@:4}
就是用torch的distributed.launch方法来启动我们的test.py。这里有个巨坑是之后可能会调用tensorflow,环境配置不好的话就会出现cuda error,解决方法后面说。
tools/test.py
和tools/train.py类似。首先处理命令行参数,读config文件,初始化dataset,dataloader,载入model。
值得注意的是dataset = build_dataset(cfg.data.test)
,也就是config文件的‘data’里,‘test’的部分;data里还有’train’和’eval’,这个都是在training流程里使用的。
初始化后,就是把image放进model里,然后进行evaluate了,核心代码如下:
outputs = single_gpu_test(model, data_loader, args.show, args.show_dir)
#list of dict where dict['pts_bbox']=dict(bboxes scores labels)
if args.format_only:
dataset.format_results(outputs, **kwargs)
if args.eval:
print(dataset.evaluate(outputs, **eval_kwargs))