1.数据集准备工作

        通常会从create_data.py(或名字类似的自定义文件)开始,运行得到{train/val/test}_info.pkl文件,其中包含每一帧的文件路径、相关信息以及标注信息(部分数据集不提供测试集的标注,故测试集pkl文件可能不含标注信息)。

2.训练流程

        通常会从train.py(或名字类似的自定义文件开始),根据配置文件进行数据集类和模型类的初始化,以及完成模型的训练。

        下面依次介绍整个过程中会进行的、比较关键的部分。

2.1 数据集类(DATASET)的get_data_info方法

        pkl文件中每一帧的数据信息均会通过DATASET.get_data_info方法,进行数据读取、增广和预处理的准备。该方法的输出字典会输入到第一个pipeline中。

2.2 pipelines(数据读取、增广与预处理)

        第一个pipeline会接收来自DATASET.get_data_info方法的输出字典,然后输出更新后的字典会传递给下一个pipeline。最后一个pipeline(一般为Collect3D)的输出字典会经过一定的处理,将其中的项输入到检测器的forward函数中。

2.3 检测器类(DETECTOR)的forward方法

        该部分的流程与使用pytorch编程的流程一致,只是可能会进一步进入到主干、颈部或检测头的forward函数以及检测头的get_loss函数中,嵌套调用比较复杂。

        训练时,DETECTOR.forward函数的输出是各项损失的字典。MMDetection3D会自动进行反向传播更新模型权重。

3. 验证流程

        若要在训练的同时进行验证,需要满足两个条件:一是配置文件中需要包含验证数据集的设置;二是在train.py文件的最后,train_model()函数的输入validate项需要为True。此外还可按需设置evaluation配置,例如:

evaluation = dict(interval=1, save_best='mAP_3d')  # 保存3D AP最高的那个epoch对应的模型
# save_best需要是DATASET.evaluate的输出字典中的一个键,eval_hook会根据这个键含有的指标名称(如mAP或loss)保存这个键对应的值最高或最低(模型在验证集上最优)时候的模型
# 该项仅在work_flow包含'val'时有效
# 可增加DATASET.evaluate函数的参数

        验证时同样会经过DATASET.get_data_info方法、pipelines以及DETECTOR.forward函数,区别在于

  1. DATASET.get_data_info方法不会读取标注信息(因为test_mode为True);
  2. pipelines无标注信息相关的处理;
  3. DETECTOR.forward函数的执行中,会进一步进入到主干、颈部或检测头的forward函数以及检测头的get_boxes函数,最终返回的是检测结果的字典。

        在所有验证集数据上都进行预测以后,预测结果会进入到DATASET.evaluate方法。

3.1 数据集类(DATASET)的evaluate方法

        该方法除检测结果外的输入均可以在配置文件中的evaluation项进行设置。

        该方法输出评估结果并返回评估结果的字典。

11-15 12:49