View-of-Delft(以下简称VoD)的官方数据集简介与Dev-kit的github页面:GitHub - tudelft-iv/view-of-delft-dataset
Dataset Preparation | The View of Delft dataset
VoD数据集文件介绍:View-of-Delft数据集文件学习
VoD数据集采用了和KITTI数据集相同的评估指标(AP与AOS),其评估函数位于vod/evaluation/evaluate.py中。
观察Evaluation.evaluate函数:
class Evaluation:
def __init__(self, test_annotation_file):
self.test_annotation_file = test_annotation_file
def evaluate(self, result_path, current_class=None, score_thresh=-1):
...
dt_annotations = kitti.get_label_annotations(result_path, val_image_ids) #获取预测结果
...
gt_annotations = kitti.get_label_annotations(self.test_annotation_file, val_image_ids) # 获取标注信息
... # 进行评估
可以看到,评估前使用同一函数(get_label_annotations)获取了预测和标注信息,可推测预测文件和标注文件应该具有相同的名称和排布格式。因此,模型的预测需要被保存在一个文件夹下,每一帧对应一个txt文件,其中每一行包含16项,代表一个预测边界框,详见View-of-Delft数据集文件学习的2.3节。
具体观察上面提到的get_label_annotations函数,可知输出的gt_annotations/dt_annotations应该均是长度为总帧数的列表,且每一个元素是一个字典:
{
'name': List[str], # 列表长为M
'truncated': array(M,1),
'occluded': array(M,1),
'alpha': array(M,1),
'bbox': array(M,4),
'dimensions': array(M,3), # HWL->LHW 相机坐标系下的边界框尺寸顺序
'location': array(M,3),
'rotation_y': array(M,1),
'score': array(M,1)
}
其中为预测/真实边界框数。注意边界框是表示在相机坐标系下的。
Evaluation.evaluate函数中调用评估函数的代码为:
get_official_eval_result(gt_annotations, dt_annotations, current_class, custom_method=0)
其中current_class为需要评估的类别名称列表;custom_method可为0或3(1和2暂未实现),分别代表在整个标注区域内评估以及在可驾驶区域内评估。
观察get_official_eval_result函数,发现其输出的格式为{'entire_area':dict()}(custom_method=0)或{'roi':dict()}(custom_method=3)。其中内层字典dict()含有各类别的3D/BEV AP值和AOS值,键值对的形式为
f'{类别名}_{指标}_all': float # 指标为aos/3d/bev之一
若输入current_class的长度为,则内层字典含有项元素。
观察get_official_eval_result函数能够进一步发现,VoD数据集仅能对前6个类别(Car, Pedestrian, Cyclist, rider, bicycle, bicycle_rack)进行评估,且仅考虑了低标准(overlap_0_5)下的、11点插值的BEV AP/3D AP/AOS评估结果,高标准(overlap_0_7)下的、40点插值的评估结果以及图像2D边界框的AP值均未考虑。