最近在看mmdetection框架的源代码,许多的文章的源码都是基于这个框架写的。很有借鉴意义,所以我便在仔细看看,记录一下自己看的时候不太懂的问题及一些解决的办法。
安装
这个没啥好说的,就按get_started文档来操作就好,只是在跑demo.py的时候我遇到了一个问题:import CV2与ros冲突了,解决办法网络上很多,直接在demo.py加一句话移除到python2.6即可。
数据集准备
对于kitti数据集而言,我们主要要将数据集整理成如下的格式,方便代码调用及运行操作:
和openpcdet是一样的,作者给出了一些下载的命令行,不过不知道为何我在ubuntu下载老是超时,所以我干脆去kitti官网下载了。还是给出官方的源码:
这也没啥好说的 说一下最后一行命令:
由于不同数据集上的原始数据有不同的组织方式,我们通常需要用 .pkl 或者 .json 文件收集有用的数据信息。在准备好原始数据后,我们需要运行脚本 create_data.py,为不同的数据集生成数据。如,对于 KITTI 数据集,我们需要执行:
随后 data目录里的文件进行了改变:
讲一下一些文件的含义:
-
kitti_gt_database/xxxxx.bin: 训练数据集中包含在 3D 标注框中的点云数据
-
kitti_infos_train.pkl:训练数据集的信息,其中每一帧的信息包含下面的内容:
-
info[‘point_cloud’]: {‘num_features’: 4, ‘velodyne_path’: velodyne_path}.
info[‘annos’]: {
位置:其中 x,y,z 为相机参考坐标系下的目标的底部中心(单位为米),是一个尺寸为 Nx3 的数组维度: 目标的高、宽、长(单位为米),是一个尺寸为 Nx3 的数组
旋转角:相机坐标系下目标绕着 Y 轴的旋转角 ry,其取值范围为 [-pi…pi] ,是一个尺寸为 N 的数组
名称:标准框所包含的目标的名称,是一个尺寸为 N 的数组
困难度:kitti 官方所定义的困难度,包括 简单,适中,困难
组别标识符:用于多部件的目标 }
(optional) info[‘calib’]: {
P0:校对后的 camera0 投影矩阵,是一个 3x4 数组
P1:校对后的 camera1 投影矩阵,是一个 3x4 数组
P2:校对后的 camera2 投影矩阵,是一个 3x4 数组
P3:校对后的 camera3 投影矩阵,是一个 3x4 数组
R0_rect:校准旋转矩阵,是一个 4x4 数组
Tr_velo_to_cam:从 Velodyne 坐标到相机坐标的变换矩阵,是一个 4x4 数组
Tr_imu_to_velo:从 IMU 坐标到 Velodyne 坐标的变换矩阵,是一个 4x4 数组 }
(optional) info[‘image’]:{‘image_idx’: idx, ‘image_path’: image_path, ‘image_shape’, image_shape}.
PS:获取 kitti_infos_xxx.pkl 和 kitti_infos_xxx_mono3d.coco.json 的核心函数分别为 get_kitti_image_info 和 get_2d_boxes.
训练
使用单块gpu的命令如下:
如果想指定工作空间的话可以在后面加上:–work-dir ${YOUR_WORK_DIR}
使用多gpu进行训练:
可选择的参数:
–no-validate(不推荐):默认情况下,代码在训练阶段每 k(默认值是1,可以像这里一样修改)个周期做一次评测,如果要取消评测,使用 --no-validate。
–work-dir ${WORK_DIR}:覆盖配置文件中的指定工作目录。
–resume-from ${CHECKPOINT_FILE}:从之前的模型权重文件中恢复。
–options ‘Key=value’:覆盖使用的配置中的一些设定。
resume-from 和 load-from 的不同点:
resume-from 加载模型权重和优化器状态,同时周期数也从特定的模型权重文件中继承,通常用于恢复偶然中断的训练过程。
load-from 仅加载模型权重,训练周期从0开始,通常用于微调。
训练时常出现“RuntimeError: CUDA out of memory”的问题 这个时候我们可以把batchsize改小一些,改小的文件在:
测试
单块显卡进行测试:
多块gpu进行测试:
例子:
可选参数:
RESULT_FILE:输出结果(pickle 格式)的文件名,如果未指定,结果不会被保存。
EVAL_METRICS:在结果上评测的项,不同的数据集有不同的合法值。具体来说,我们默认对不同的数据集都使用各自的官方度量方法进行评测,所以对 nuScenes、Lyft、ScanNet 和 SUNRGBD 这些数据集来说在检测任务上可以简单设置为 mAP;对 KITTI 数据集来说,如果我们只想评测 2D 检测效果,可以将度量方法设置为 img_bbox;对于 Waymo 数据集,我们提供了 KITTI 风格(不稳定)和 Waymo 官方风格这两种评测方法,分别对应 kitti 和 waymo,我们推荐使用默认的官方度量方法,它的性能稳定而且可以与其它算法公平比较;同样地,对 S3DIS、ScanNet 这些数据集来说,在分割任务上的度量方法可以设置为 mIoU。
–show:如果被指定,检测结果会在静默模式下被保存,用于调试和可视化,但只在单块GPU测试的情况下生效,和 --show-dir 搭配使用。
–show-dir:如果被指定,检测结果会被保存在指定文件夹下的 ***_points.obj 和 ***_pred.obj 文件中,用于调试和可视化,但只在单块GPU测试的情况下生效,对于这个选项,图形化界面在你的环境中不是必需的。