知识点回顾
什么是点云,如何获得点云。
- 点云包含了很多信息,除了3维坐标数据之外,还可能包括颜色、分类值、强度值、时间等。
- 点云数据可以由多种方法获得:1.直接由Lidar激光扫描出点云数据。 2.不同角度的2D图像组合成点云 3.由深度图(Depth Map)生成点云,即将图像坐标+深度信息从图像坐标系转换为世界坐标系。
- 点云和深度图都会出现深度信息的缺失,因为往往传感器只能捕捉物体表面的信息。
- .obj .off .ply格式都是3D mesh格式,即物体被划分成若干个微小单元(三角形,或其他形状)。点云格式有*.las ;*.pcd; *.txt等。
- voxel体素与2D中的pixel对应,是3D空间里一种标准的可处理的单位格式
- 点云数据有三大问题:无序性、稀疏性、信息有限(和稀疏性也相关,只能提供片面的几何信息)。
从3D点云到网格
点云数据与鸟瞰图
3D数据集汇总
ModelNet40
KITTI
SUN-RGBD
ScanNet
3D目标检测有很多种玩法,有纯基于RGB图像的,这种往往需要多个视角的图像作为输入;有纯基于3D点云的,如接下来要介绍的PointNet,PointNet++和VoteNet都是基于纯点云数据的;也有使用2D目标检测驱动3D检测的,如frustum-PointNet,就是先完成2D目标检测确定object位置,再找3D box。
PointNet
输入: B*N*3. B是batch size, n是点的个数, 3是每个点的特征数, 有些传感器或数据集可能还有点属性(旋转, 反射强度等)。训练的数据集是ModelNet40(包含40种室内家具的点云,由其CAD模型的surface数据得来)
T-net: 用于生成transformation矩阵(3*3尺寸用于对初始点云的处理,64*64用于对中间feature做处理), 接着和原始点云数据矩阵相乘做转换. T-net中有3层卷积+1层max_pool+2层FC+1层输出层, 输入shape B*N*3, 输出shape B*3*K (注:第一个transform里K=3, 第二个transform里K=64) .
input transform: 输入shape B*N*3, T-net shape B*3*K, 相乘之后输出shape B*N*K, 即B*N*3,与原始点云数据shape相同. input transform的作用相当于提取了原始点云数据或特征层里的特征, 对坐标空间进行了变换.(个人认为这么做是因为点云数据本身没有很强的顺序关系,对于卷积来说,相当于设定了点云数据的顺序关系,transform之后对位置空间进行了一个调整,有点类似于hough vote的图像空间转成坐标空间).
mlp: 两层卷积, filter都=64, 第一层kernel=[1,3], 第二层kernel=[1,1], 输出shape B*N*64
feature transform:与input transform类似,除了K=64
分类任务最后输出的output score shape为40(40类分类任务), 分割任务将global feature复制n份, 如图接在之前的特征层后, 最后输出shape为B*N*50 (我没有弄懂这里为啥是50不是40, 不应该是40类么?是不是因为分割任务可能会分割成其他物体?)