[论文阅读] SalsaNet: Fast Road and Vehicle Segmentation in LiDAR Point Clouds for Autonomous Driving

该博客介绍了利用图像道路标注和车辆分割映射到点云上的方法,通过Unet类似网络在前视图和俯视图进行分割。数据处理中,使用MultiNet进行地面分割,MaskRCNN处理车辆,然后在两种视图上进行映射。模型设计包括添加dropout和pooling,以应对3D数据的噪声。为解决类别不平衡问题,采用了类别比例的开方作为损失权重。实验表明,这种方法在性能和速度上都有所表现。关键词涉及点云分割、图像映射和深度学习应用。

paper 原论文的链接
code: 源代码链接

1. 主要思想

通过什么方式,解决了什么问题

利用图像的道路标注的掩码,映射到点云地面点,然后生成训练集; 然后将点云前视图俯视图映射,用类似Unet进行分割; 效果如下:
在这里插入图片描述

2. 具体方法

说明怎么解决的,具体设计是什么, 有什么启发性思考(作者的创新点)

2.1 数据准备过程

  • 如下图所示,整个数据处理过程
  • 1)先用MultiNet进行Kitti的地面分割, 为什么用MultiNet,因为作者说只有这个模型是在Kitti道路图像上训练过模型参数, 然后将图像上分割的映射到点云上。
  • 2)然后再用MaskRCNN进行车辆的语义分割,然后映射到3D点云上
  • 如图中间的效果, 考虑俯视图丢失了高度信息, 然后考虑了两种映射方式,将点云在前视图和俯视图上分别映射,然后用网络去预测学习;

俯视图

  • 1)俯视图范围w=[-6, 12], L=[0,50] --> 映射为256x64大小的2D; cell_size(0.2, 0.3)
    1. 每个cell的编码:Similar to the work in 论文[4], in each grid cell, we compute the mean and maximum elevation, average reflectivity (i.e. intensity) value, and number of projected points.
    1. Compared to 论文[4], we avoid using the minimum and standard deviation values of the height as additional features since our experiments showed that there is no significant contribution coming from those channels.

前视图

  • 1)和SqueezeSeg一样的投射方式
  • 2)前视图一个不好的特性:遮挡,弯曲和变形:Although SFV returns more dense representation compared to BEV, SFV has certain distortion and deformation effects on small objects, e.g. vehicles. It is also more likely that objects in SFV tend to occlude each other. We, therefore, employ BEV representation as the main input to our network.
    在这里插入图片描述2.2 模型
  • 在conv_block中的最后一层添加dropout和pooling; dropout对与3D这种噪声大的数据可能有好处;
  • 下采样16x;
  • dropout放置的位置作者给出了说明,参考的是文献[26],We here emphasize that dropout needs to be placed right after batch normalization. As shown in [26], an early application of dropout can otherwise lead to a shift in the weight distribution and thus minimize the effect of batch normalization during training.
    在这里插入图片描述2.3 类别不平衡问题
  • 用类别比例的开方作为loss weight的比例
    在这里插入图片描述2.4 训练超参数配置
  • 数据增强的特殊方式: adding random pixel noise with probaility of 0.5, random rotation [-5,5]

3. 实验支撑

记录一些关键实验的结论分析,具有启发性的实验和结论

  • 性能对比(外部)
    在这里插入图片描述- 俯视图和前视图的性能对比 (内部)
    在这里插入图片描述
    在这里插入图片描述- 速度对比
    在这里插入图片描述
    在这里插入图片描述

4. 总结启示

针对中心思想和实验结论的总结和扩展思考
扩展思考 : 也就是用自己已有的知识或者自己的“土话”,重新理解paper(费曼学习法的精髓-便于记忆和举一反三的应用)

  • 下面引用[11]需要学习一下, 如何半自动标注
  • 这个论文的揭露了我们不一定把所有地面标出来,可以只标注freespace
  • 这个论文loss weight的设计有一定参考价值
  • 性能对比,不仅仅IOU, precision和recall的性能对比

5. 相关文献

主要的比较贴近的文献,关键性文献

### Frustum-PointPillars 的具体方法 Frustum-PointPillars 是一种高效的多模态融合算法,它结合了相机和激光雷达的优势,在自动驾驶场景中实现了实例分割任务。该方法的核心在于通过投影的方式将二维图像信息与三维点云数据相结合,从而减少计算复杂度并提升性能。 #### 方法概述 Frustum-PointPillars 将 2D 图像中的感兴趣区域 (ROI) 投影到 3D 点云的空间范围(即 frustum),随后仅对该子集内的点云进行处理[^1]。这种方法显著减少了需要处理的点云数量,同时保留了来自图像的语义信息。以下是其实现的关键部分: 1. **基于图像的目标检测** 使用 CNN 对输入的 RGB 图像进行目标检测,生成一组边界框(bounding boxes)。这些边界框定义了可能包含对象的 ROI 区域[^2]。 2. **Frustum 提取** 利用相机内外参矩阵,将每个 2D 边界框映射至对应的 3D 坐标系下的锥形空间(frustum)。此操作筛选出了与当前目标相关的点云子集。 3. **PointPillars 编码器** PointPillars 是一种高效点云编码方式,采用动态体素化技术将点云划分为固定尺寸的小柱状单元(pillars)。对于提取出的 frustum 数据,应用相同的编码流程以生成 BEV 特征图[^2]。 4. **特征融合与分类** 结合从图像中提取的高级语义特征以及由 PointPillars 得到的几何特征,构建一个多通道特征向量。最终送入全连接层完成类别预测与边界的回归运算[^2]。 --- ### 实现代码示例 以下为 Python 和 PyTorch 下的一个简化版实现框架: ```python import torch from torchvision import models from point_pillars_encoder import PillarEncoder # 自定义或第三方库 class FrustumPointPillars(torch.nn.Module): def __init__(self, num_classes=3): super(FrustumPointPillars, self).__init__() # 加载预训练的图像特征提取模型 self.image_feature_extractor = models.resnet18(pretrained=True) self.image_feature_extractor.fc = torch.nn.Identity() # 移除最后的 FC 层 # 初始化 PointPillars 编码器 self.pillar_encoder = PillarEncoder() # 融合后的分类头 self.classifier_head = torch.nn.Sequential( torch.nn.Linear(512 + 64, 128), # 合并图像特征与点云特征 torch.nn.ReLU(), torch.nn.Dropout(p=0.5), torch.nn.Linear(128, num_classes) ) def forward(self, image, lidar_points, camera_intrinsics, extrinsics): """ :param image: 输入的RGB图像 [batch_size, C, H, W] :param lidar_points: 激光雷达点云 [num_points, 3] :param camera_intrinsics: 相机内参数矩阵 [3, 3] :param extrinsics: 外参数矩阵 [4, 4] """ # Step 1: 图像特征提取 img_features = self.image_feature_extractor(image) # 输出维度取决于 ResNet 配置 # Step 2: 计算 frustums 并过滤点云 frustums = compute_frustums(camera_intrinsics, extrinsics, img_features.shape[-2:]) # 获取 frustum 子集 filtered_lidar_points = filter_points_in_frustums(lidar_points, frustums) # 只保留相关点 # Step 3: PointPillars 编码 pillar_features = self.pillar_encoder(filtered_lidar_points) # Step 4: 特征拼接与分类 combined_features = torch.cat((img_features.flatten(start_dim=1), pillar_features.flatten(start_dim=1)), dim=-1) predictions = self.classifier_head(combined_features) return predictions def compute_frustums(intrinsics, extrinsics, roi_shape): """根据相机内外参及 ROI 形状计算 frustums""" pass # 具体逻辑省略 def filter_points_in_frustums(points, frustums): """筛选位于指定 frustums 中的点云""" pass # 具体逻辑省略 ``` --- ### 性能优化建议 为了进一步提高效率,可以考虑以下几个方面: - **稀疏张量加速**: 在 GPU 上使用稀疏张量表示 pillars,降低内存占用。 - **轻量化网络设计**: 替代标准 ResNet 或 VGG,选用 MobileNet 等更适合嵌入式设备的架构。 - **硬件支持**: 如果部署环境允许,可借助 NVIDIA Jetson AGX Xavier 等专用芯片运行推理过程[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值