最近在看mmdetection框架的源代码,许多的文章的源码都是基于这个框架写的。很有借鉴意义,所以我便在仔细看看,记录一下自己看的时候不太懂的问题及一些解决的办法。
安装这个没啥好说的,就按get_started文档来 *** 作就好,只是在跑demo.py的时候我遇到了一个问题:import CV2与ros冲突了,解决办法网络上很多,直接在demo.py加一句话移除到python2.6即可。
数据集准备对于kitti数据集而言,我们主要要将数据集整理成如下的格式,方便代码调用及运行 *** 作:
mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│ ├── kitti
│ │ ├── ImageSets
│ │ ├── testing
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── velodyne
│ │ ├── training
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── label_2
│ │ │ ├── velodyne
│ │ │ ├── planes (optional)
和openpcdet是一样的,作者给出了一些下载的命令行,不过不知道为何我在ubuntu下载老是超时,所以我干脆去kitti官网下载了。还是给出官方的源码:
mkdir ./data/kitti/ && mkdir ./data/kitti/ImageSets
wget -c
https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/test.txt
–no-check-certificate --content-disposition -O ./data/kitti/ImageSets/test.txt wget -c
https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/train.txt
–no-check-certificate --content-disposition -O ./data/kitti/ImageSets/train.txt wget -c
https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/val.txt
–no-check-certificate --content-disposition -O ./data/kitti/ImageSets/val.txt wget -c
https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/trainval.txt
–no-check-certificate --content-disposition -O ./data/kitti/ImageSets/trainval.txtpython tools/create_data.py kitti --root-path ./data/kitti --out-dir
./data/kitti --extra-tag kitti --with-plane
这也没啥好说的 说一下最后一行命令:
由于不同数据集上的原始数据有不同的组织方式,我们通常需要用 .pkl 或者 .json 文件收集有用的数据信息。在准备好原始数据后,我们需要运行脚本 create_data.py,为不同的数据集生成数据。如,对于 KITTI 数据集,我们需要执行:
python tools/create_data.py kitti --root-path ./data/kitti --out-dir ./data/kitti --extra-tag kitti
随后 data目录里的文件进行了改变:
mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│ ├── kitti
│ │ ├── ImageSets
│ │ ├── testing
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── velodyne
│ │ ├── training
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── label_2
│ │ │ ├── velodyne
│ │ ├── kitti_gt_database
│ │ ├── kitti_infos_train.pkl
│ │ ├── kitti_infos_trainval.pkl
│ │ ├── kitti_infos_val.pkl
│ │ ├── kitti_infos_test.pkl
│ │ ├── kitti_dbinfos_train.pkl
讲一下一些文件的含义:
-
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的命令如下:
python tools/train.py ${CONFIG_FILE} [optional arguments]
例如:
python tools/train.py configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py
如果想指定工作空间的话可以在后面加上:–work-dir ${YOUR_WORK_DIR}
使用多gpu进行训练:
./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]
可选择的参数:
–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改小一些,改小的文件在:
测试configs/base/datasets/kitti-3d-3class.py文件中99行改小sample_per_gpu
单块显卡进行测试:
python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [–out ${RESULT_FILE}] [–eval ${EVAL_METRICS}] [–show] [–show-dir ${SHOW_DIR}]
多块gpu进行测试:
./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [–out ${RESULT_FILE}] [–eval ${EVAL_METRICS}]
例子:
python tools/test.py configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py checkpoints/epoch_80.pth --eval mAP --options ‘show=True’ ‘out_dir=./data/pointpillars/show_results’
可选参数:
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测试的情况下生效,对于这个选项,图形化界面在你的环境中不是必需的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)