【Cylinder3D论文解读及代码略解】

Cylinder3D论文解读及代码略解

论文解读

Abstract

在大规模行车场景分割的问题下,对于点云的处理方法通常是将点云投影到2维空间,然后使用2D卷积进行处理,但是这样做会忽视点云的3D拓扑和几何关系。自然的想法是利用3D体素划分和卷积网络,然而对于室外场景,由于点云稀疏性(sparsity)和密度可变性(varying density),这种方法效果并不太好。受上面研究的启发,我们提出了一种用于户外激光雷达分割的新框架,该框架设计了圆柱形分割(cylinder partition)和非对称三维卷积网络(asymmetry 3D convolution network),以探索三维几何模式,同时保持这些固有特性。此外,还引入逐点细化模块(point-wise refinement module)来降低有损体素标签编码的干扰。我们在SemanticKITTI和nuScenes两个大规模数据集上评估了所提出的模型。我们的方法在SemanticKITTI排行榜上获得了第一名,并且在nuScenes上以4%的显著优势超过了现有的方法。此外,所提出的三维框架对激光雷达全景分割和激光雷达三维检测也有很好的推广意义。

Introduction

  • 柱坐标系划分:离原点越远,点云越稀疏,但是cell的体积是较大的,保证了cell中点云分布的均匀性
  • 非对称三维卷积网络:通过增强水平核和垂直核来匹配驾驶场景中物体的点分布,增强了点云稀疏性的鲁棒性
  • point-wise refinement module:柱划分导致不同类别的点在相同的cell中,导致cell的label在编码时出现信息损失,由此提出point-wise增强模块
  • point-wise模块:在论文中有提及思想,但是没有具体的工程代码
  • 本文贡献:
  • 将室外LiDER场景分割从二维映射转为3维结构,考虑了点云固有的两个特性
  • 提出一种新的框架,利用圆柱体分割和非对称卷积网络克服点云固有特性
  • 在两个数据集上达到sota

Related work

室内点云分割

主流方法有两种:

  • 基于直接点云数据的,eg:PointNet
  • 基于聚类算法提取层次特征的

室内点云分割的方法依赖于点云分布的 均匀性密度不变性,不适用于直接迁移到室外点云分割

室外点云分割

  • 现有的主流方法主要是集中在将3D点云转换为2D网格,在此基础上使用2D卷积,eg:SqueezeSeg,Darknet,rangenet++
  • 这种3D-to-2D的方法会损失点云的3D几何特征

3D体素划分

这种方法将点云分割成一个个体素,可以保持点云的3D特性,也能适用3D卷积神经网络

Methodology(本文方法)

框架

  • step1 :圆柱体素划分,将点云划分到每一个柱体cell
  • step2:应用非对称3D卷积网络,得到cell-label的输出
  • step3:使用point-wise module,细化cell-label(代码无体现)

Cylindrical Partition

【Cylinder3D论文解读及代码略解】
  • 流程:
  • 直角坐标系转柱坐标系,然后进行柱坐标系划分
  • 根据分区的情况重新划分MLP得到的特征,生成圆柱体特征
  • 输入:点云数据
  • 输出:3D柱体划分(C ∗ H ∗ W ∗ L CHW*L C ∗H ∗W ∗L),C是特征维度,H是半径,W是方位角度,L是高度
  • 划分方式:划分成个数为480 ∗ 360 ∗ 32 48036032 4 8 0 ∗3 6 0 ∗3 2的体素

; Asymmetrical 3D Convolution Network

  • 3个关键模块:
  • 非对称上采样(AU)
  • 非对称下采样(AD)
  • 基于上下文的维度分解(DDCM)
    【Cylinder3D论文解读及代码略解】

Asymmetrical Residual Block

  • 非对称残差模块增强了水平和垂直的kernel,增加鲁棒性
  • 将非对称残差块和上下采样块进行堆叠,得到了非对称卷积网络
  • 对应代码:
    【Cylinder3D论文解读及代码略解】

; DDCM

  • 用3个rank-1的kernel得到低等级的特征,然后聚合得到高级特征。这是因为直接得到高级的上下文特征需要耗费很大的算力和内存,因此采用低级特征聚合成高级特征的方式。
  • 对应代码:
    【Cylinder3D论文解读及代码略解】

Point-wise Refinement Module

  • 基于分割的方法会对每一个cell都打上一个label,但由于分割时会把不同种类的点分在同一个cell,导致label不标准,基于此引入point-wise module进行矫正
  • 过程
  • 基于point-voxel 映射图将voxel特征投影到点上
  • 然后此模块将进入3D卷积网络前后的点特征融合起来作为输入来细化label
  • 无对应代码

目标函数

  • 包含两个部分:lovasz loss 和 交叉熵loss
  • 优化器:Adam
  • 学习率:1e-3

实验部分

在本节中,我们首先提供详细的实验设置,然后评估所提出的方法在两个大规模的数据集,即SemanticKITTI和nuScenes。此外,还进行了广泛的消融研究来验证每个成分。最后将该方法推广到Li- DAR全景分割和三维检测中,验证了该方法的可扩展性和泛化能力。

Dataset and Metric

semantic KITTI:

  • 包括语义分割和场景分割
  • 有22个序列,00-10是训练集,11-21是测试集,08可以用作验证集
  • 进行整合后留下19个类别用于训练和验证

nuScenes:

  • 32束激光雷达传感器采集了20秒内的1000个场景,总帧数为40000,采样频率为20Hz
  • 整合后有16个种类用于语义分割

Evaluation Metric(评价指标):

  • mIoU:mean intersection-over-union
  • 表达式:IoU=TP/(TP+FP+FN)

ablation studies(消融实验)

网络的影响

【Cylinder3D论文解读及代码略解】

; 非对称卷积的影响

采用了三种方式,常规,1D和非对称

【Cylinder3D论文解读及代码略解】
可以看到,不同卷积方式下,mIoU值升高比例不同,非对称卷积影响比较大

泛化实验

在两个不同的领域进行实验:全景分割和3D检测,结果相比baseline都有很大提升
全景分割:对背景进行语义分割,对前景进行实例分割,分别称为stuff类和class类
3D检测:定位和识别多种类的目标

论文不足(个人角度)

1、体素化提取中心点的方法导致很多点云信息丢失
2、point-wise也是选取Max代表一个体素内所有点云,仍会导致信息丢失
3、DDCM改善label部分只提出了思想,没有进行实验

代码略解

以sementic数据集语义分割为主

开源代码GitHub地址

https://github.com/xinge008/cylinder3d

环境配置

  • pytorch = 1.3.0
  • pyyaml(无版本限制,pyyaml=3.13 pyyaml=5.4.1)
  • Cython(无版本限制,Cython=0.28.5 Cython=0.29.24)
  • torch-scatter(无版本限制,但是不指定版本容易安装失败,torch-scatter=1.1.2)
  • nuScenes-devkit (optional for nuScenes,无版本限制,nuScenes-devkit=1.1.9),此安装包主要是为了使用nuScenes数据集,不实用数据集也可以不安装
  • spconv (spconv1.2.1 and cuda10.2)

代码结构

主要关注网络的部分:

  • MLP的网络部分:cylinder_fea_generator.py:
    3层MLP(64-128-256)实现point-wise特征提取,输入点云维度为9维,输出为256维特征
  • 3D卷积提取特征部分:segmentator_3d_asymm_spconv.py
  • class ResContextBlock(nn.Module): 上图A模块
  • class ResBlock(nn.Module): 上图AD模块
  • class UpBlock(nn.Module): 上图AU模块
  • class ReconBlock(nn.Module): 上图DDCM模块
  • class Asymm_3d_spconv:总体网络结构堆叠模块(括号里是网络层的输入输出)
    • 1层Asymm模块(32):非对称卷积,两个卷积特征相加
    • 4层AD模块(64,128,256,512):8倍下采样,Asymm模块+SparseConv3d层
    • 4层AU模块(512,256,128,64):8倍上采样,3 ∗ 3 ∗ 3 333 3 ∗3 ∗3稀疏卷积+反卷积层+特征融合(反卷积特征+skip特征)+1 ∗ 3 ∗ 3 133 1 ∗3 ∗3+3 ∗ 1 ∗ 3 313 3 ∗1 ∗3+3 ∗ 3 ∗ 3 333 3 ∗3 ∗3
    • 1层DDCM模块(64):3 ∗ 1 ∗ 1 + 1 ∗ 3 ∗ 1 + 1 ∗ 1 ∗ 3 311+131+113 3 ∗1 ∗1 +1 ∗3 ∗1 +1 ∗1 ∗3卷积
    • 1层logistic模块(64,20):实际上是一个卷积层SubMConv3d,输入64,输出维度20
  • 模型拼接模块:cylinder_spconv_3d.py

点云处理代码

dataloder文件夹中的两个dataset文件,主要看点云数据怎么从x,y,z三个坐标数据转变成9维的带有体素信息的数据

寄语

这是自己读论文和复现代码的一点真实记录,可能有很多纰漏,希望大家有问题可以多交流

Original: https://blog.csdn.net/sunny_ran123/article/details/124590505
Author: sunny_ran123
Title: 【Cylinder3D论文解读及代码略解】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/520364/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球