代码复现 :SECOND pytorch版本 ①

本项目提供了一个基于PyTorch实现的稀疏卷积网络SECOND,用于3D目标检测,特别针对自动驾驶场景中的KITTI和NuScenes数据集。支持多GPU和混合精度训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码: https://github.com/traveller59/second.pytorch

“ Alpha”表示可能存在许多错误,配置格式可能会更改,spconv API可能会更改。

仅支持python 3.6 +,pytorch 1.0.0+。 在Ubuntu 16.04 / 18.04 / Windows 10中进行了测试。我们只关注KITTI数据集

News

  • 2019-4-1:发布了SECOND V1.6.0 alpha:New Data
    API,NuScenes支持,PointPillars支持,fp16和multi-gpu支持。
  • 2019-3-21:SECOND V1.5.1(较小的改进和错误修复)发布了!
  • 2019-1-20:SECOND V1.5发布! 基于稀疏卷积的网络。

有关更多详细信息,请参见发行说明。
警告:您应在每次更新代码后重新运行信息生成。

KITTI验证集中的性能 (50/50 split)

car.fhd.config + 160 epochs (25 fps in 1080Ti):

Car AP@0.70, 0.70, 0.70:
bbox AP:90.77, 89.50, 80.80
bev  AP:90.28, 87.73, 79.67
3d   AP:88.84, 78.43, 76.88

car.fhd.config + 50 epochs + 超收敛 (6.5 hours) + (25 fps in 1080Ti):

Car AP@0.70, 0.70, 0.70:
bbox AP:90.78, 89.59, 88.42
bev  AP:90.12, 87.87, 86.77
3d   AP:88.62, 78.31, 76.62

car.fhd.onestage.config + 50 epochs + 超收敛 (6.5 hours) + (25 fps in 1080Ti):

Car AP@0.70, 0.70, 0.70:
bbox AP:97.65, 89.59, 88.72
bev  AP:90.38, 88.20, 86.98
3d   AP:89.16, 78.78, 77.41

NuScenes验证集中的性能(all.pp.config,NuScenes微型训练集,3517个样本,而非v1.0-mini)

car Nusc dist AP@0.5, 1.0, 2.0, 4.0
62.90, 73.07, 76.77, 78.79
bicycle Nusc dist AP@0.5, 1.0, 2.0, 4.0
0.00, 0.00, 0.00, 0.00
bus Nusc dist AP@0.5, 1.0, 2.0, 4.0
9.53, 26.17, 38.01, 40.60
construction_vehicle Nusc dist AP@0.5, 1.0, 2.0, 4.0
0.00, 0.00, 0.44, 1.43
motorcycle Nusc dist AP@0.5, 1.0, 2.0, 4.0
9.25, 12.90, 13.69, 14.11
pedestrian Nusc dist AP@0.5, 1.0, 2.0, 4.0
61.44, 62.61, 64.09, 66.35
traffic_cone Nusc dist AP@0.5, 1.0, 2.0, 4.0
11.63, 13.14, 15.81, 21.22
trailer Nusc dist AP@0.5, 1.0, 2.0, 4.0
0.80, 9.90, 17.61, 23.26
truck Nusc dist AP@0.5, 1.0, 2.0, 4.0
9.81, 21.40, 27.55, 30.34

安装

1. Clone code

git clone https://github.com/traveller59/second.pytorch.git
cd ./second.pytorch/second

2.安装依赖项python软件包

建议使用Anaconda软件包管理器。

conda install scikit-image scipy numba pillow matplotlib

pip install fire tensorboardX protobuf opencv-python

If you don’t have Anaconda:

pip install numba scikit-image scipy pillow

按照spconv中的说明安装spconv。

如果要以fp16混合精度进行训练(在RTX系列,Titan V / RTX和Tesla V100中训练得更快,但我只有1080Ti),则需要安装apex

如果要使用NuScenes数据集,则需要安装nuscenes-devkit

3.为numba设置cuda(将在1.6.0版中删除)

您需要为numba.cuda添加以下环境变量,您可以将它们添加到~/.bashrc中:

export NUMBAPRO_CUDA_DRIVER=/usr/lib/x86_64-linux-gnu/libcuda.so
export NUMBAPRO_NVVM=/usr/local/cuda/nvvm/lib64/libnvvm.so
export NUMBAPRO_LIBDEVICE=/usr/local/cuda/nvvm/libdevice

4.将second.pytorch/ 添加到PYTHONPATH

KITTI数据集准备

下载KITTI数据集并首先创建一些目录:

└── KITTI_DATASET_ROOT
       ├── training    <-- 7481 train data
       |   ├── image_2 <-- for visualization
       |   ├── calib
       |   ├── label_2
       |   ├── velodyne
       |   └── velodyne_reduced <-- empty directory
       └── testing     <-- 7580 test data
           ├── image_2 <-- for visualization
           ├── calib
           ├── velodyne
           └── velodyne_reduced <-- empty directory

Then run 数据生成:

python create_data.py kitti_data_prep--data_path=KITTI_DATASET_ROOT

NuScenes数据集暂不用。。。

修改配置文件

在配置文件中需要配置一些路径:

train_input_reader: {
  ...
  database_sampler {
    database_info_path: "/path/to/dataset_dbinfos_train.pkl"
    ...
  }
  dataset: {
    dataset_class_name: "DATASET_NAME"
    kitti_info_path: "/path/to/dataset_infos_train.pkl"
    kitti_root_path: "DATASET_ROOT"
  }
}
...
eval_input_reader: {
  ...
  dataset: {
    dataset_class_name: "DATASET_NAME"
    kitti_info_path: "/path/to/dataset_infos_val.pkl"
    kitti_root_path: "DATASET_ROOT"
  }
}

使用

训练

我建议使用script.py进行训练和评估。 有关更多详细信息,请参见script.py

使用单个GPU训练

python ./pytorch/train.py train --config_path=./configs/car.fhd.config --model_dir=/path/to/model_dir

使用多个GPU进行训练(需要测试,我只有一个GPU)

假设您有4个GPU,并希望使用3个GPU进行训练:

CUDA_VISIBLE_DEVICES=0,1,3 python ./pytorch/train.py train --config_path=./configs/car.fhd.config --model_dir=/path/to/model_dir --multi_gpu=True

注意:配置文件中的batch_size和num_workers是每个GPU的,如果使用multi-gpu,它们将乘以GPU的数量。 不要手动修改它们。

您需要在配置文件中修改总计步骤。 例如,car.lite.config和单个GPU的50个epochs= 15500步,如果使用4个GPU,则需要将stepsteps_per_eval除以4。

用fp16训练(混合精度)

修改配置文件,将enable_mixed_precision设置为true。

  • 如果要训练新模型,请确保 "/path/to/model_dir"不存在。如果model_dir不存在,将创建一个新目录,否则将读取其中的checkpoints。
  • 训练过程对于1080Ti默认使用batchsize = 6作为默认值,如果GPU的内存较少,则需要减小batchsize。
  • 目前仅支持单GPU训练,但在单个1080Ti中训练模型仅需要20小时(165个epoch),并且仅需要50个epoch以达到78.3 AP,with super converge in car moderate 3D in Kitti validation dateset。

评估

python ./pytorch/train.py evaluate --config_path=./configs/car.fhd.config --model_dir=/path/to/model_dir --measure_time=True --batch_size=1

检测结果将作为result.pkl文件保存在model_dir / eval_results / step_xxx中,或者如果使用--pickle_result = False,则另存为官方KITTI标签格式。

预训练模型

您可以在Google云端硬盘中下载经过预训练的模型。 car_fhd模型对应于car.fhd.config

请注意,此预训练模型在稀疏卷积错误修复之前进行了训练,因此评估结果可能会稍差一些。

Docker(不建议使用。由于网络问题,我无法推送Docker。)

您可以使用prebuilt docker进行测试:

docker pull scrin/second-pytorch 

Then run:

nvidia-docker run -it --rm -v /media/yy/960evo/datasets/:/root/data -v $HOME/pretrained_models:/root/model --ipc=host second-pytorch:latest
python ./pytorch/train.py evaluate --config_path=./configs/car.config --model_dir=/root/model/car

尝试 Kitti Viewer Web

主要步骤

推理步骤

首先,必须单击加载按钮并成功加载。

  1. 输入checkpointPath和configPath。
  2. 单击buildNet。
  3. 点击inference。
    在这里插入图片描述

尝试Kitti Viewer(不建议使用)

训练之前,应使用基于pyqt和pyqtgraph的kitti查看器检查数据。

运行python ./kittiviewer/viewer.py,检查以下图片以使用kitti查看器:
在这里插入图片描述

概念

  • Kitti激光雷达box

Kitti激光雷达盒由7个元素组成:[x,y,z,w,l,h,rz],见图。
在这里插入图片描述
所有训练和推理代码均使用kitti框格式。 因此,我们需要在训练之前将其他格式转换为KITTI格式。

  • Kitti相机box

Kitti相机盒包含7个元素:[x,y,z,l,h,w,ry]。

<think>好的,用户想要从头开始复现PVRCNN的代码,并希望得到PyTorch实现的详细解释。首先,我需要明确PVRCNN是什么,以及它的主要组成部分。PVRCNN是基于PointVoxel-RCNN的3D目标检测模型,结合了体素和点云的特征提取方法。根据用户提供的引用,Faster R-CNN的关键部分可能对理解PVRCNN有帮助,比如特征提取网络和区域建议网络(RPN)[^1]。 接下来,我需要考虑用户的实际需求。用户可能具备定的PyTorch基础,但需要详细的步骤指导,包括数据预处理、模型架构、训练流程等。此外,用户可能还需要相关的代码示例和资源链接,类似于引用中提到的ViT实现[^2]。 然后,我需要整理复现PVRCNN的关键步骤。首先,数据预处理部分,处理KITTI数据集,进行点云体素化和数据增强。然后,构建PVRCNN的模型架构,包括体素特征编码(VFE)、3D稀疏卷积、关键点特征提取等模块。接着是损失函数的设计,包括分类和回归损失。最后,训练流程和参数调整。 在思考过程中,需要注意用户可能遇到的难点,比如3D稀疏卷积的实现,点云和体素特征的融合,以及训练时的优化技巧。可能需要参考现有的开源实现或论文中的细节,确保复现的准确性。同时,代码示例应尽量简洁,并附有解释,帮助用户理解每个模块的作用。 最后,生成相关问题时要围绕PVRCNN的实现细节、优化方法、应用场景以及与其他模型的对比,这样可以帮助用户更全面地掌握相关知识。</think>### 从头复现PVRCNN的PyTorch实现详解 #### 、PVRCNN核心原理 PVRCNN是结合体素(Voxel)与点云(Point)特征的多阶段3D目标检测框架,其核心流程如下: 1. **体素特征编码(VFE)**:将无序点云转换为规则体素网格,提取局部几何特征 2. **3D稀疏卷积**:通过卷积层生成高语义特征图 3. **关键点特征提取**:在原始点云中采样关键点,融合体素与点特征 4. **RoI Pooling**:在区域建议上聚合多尺度特征 #### 二、代码实现步骤 ```python # 数据预处理模块(示例) class Voxelization: def __init__(self, voxel_size=(0.05, 0.05, 0.1)): self.voxel_size = np.array(voxel_size) def process(self, points): # 将点云转换为体素坐标 coords = np.floor(points[:, :3] / self.voxel_size) return coords.astype(np.int32) ``` ```python # 骨干网络关键组件 class VFELayer(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.fc = nn.Linear(in_channels, out_channels) self.bn = nn.BatchNorm1d(out_channels) def forward(self, x): # x: (N, C) return F.relu(self.bn(self.fc(x))) ``` #### 三、训练关键点 1. **损失函数设计**: - 分类损失:Focal Loss - 回归损失:Smooth L1 Loss $$ L_{total} = \lambda_{cls}L_{cls} + \lambda_{reg}L_{reg} $$ 2. **数据增强策略**: - 全局旋转(±45°) - 随机翻转(X/Y轴) - 缩放扰动(0.95-1.05倍) #### 四、推荐参考资源 1. 官方论文实现:https://github.com/open-mmlab/OpenPCDet/blob/master/pcdet/models/detectors/pv_rcnn.py 2. 简化版复现教程:https://zhuanlan.zhihu.com/p/367218813 3. KITTI数据处理工具:https://github.com/traveller59/second.pytorch
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值