注:调试项目代码可以根据本文提出的运行流程进行。


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配置,例如:


  1. evaluation = dict(interval=1, save_best=‘mAP_3d’) # 保存3D AP最高的那个epoch对应的模型
  2. # save_best需要是DATASET.evaluate的输出字典中的一个键,eval_hook会根据这个键含有的指标名称(如mAP或loss)保存这个键对应的值最高或最低(模型在验证集上最优)时候的模型
  3. # 该项仅在work_flow包含’val’时有效
  4. # 可增加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项进行设置。

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


        若想保存某项指标最高/最低时的模型,可以在配置文件中的evaluation项设置save_best为’auto’或指标名称。其中指标名称需要是输出字典中的键;’auto’等价于选择输出字典中的第一项作为保存指标。