3D目标检测有很多种玩法,有纯基于RGB图像的,这种往往需要多个视角的图像作为输入;有纯基于3D点云的,如接下来要介绍的PointNet,PointNet++和VoteNet都是基于纯点云数据的;也有使用2D目标检测驱动3D检测的,如frustum-PointNet,就是先完成2D目标检测确定object位置,再找3D box。
输入: 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类么?是不是因为分割任务可能会分割成其他物体?)
在PointNet中, 直接对输入的点云数据整体进行卷积和max_pooling,忽略了局部特征. 且特征提取忽略了密度不均匀的问题, PointNet++解决了这2个问题.
1. sampling layer: 该层的输入是原始点集N*(d+C), d为xyz坐标数据,C是点特征数据. 使用FPS算法从数据集中选出中心点集
FPS算法: 随机选取一个点加入中心点集合, 之后选择离中心点集合里的点最远的点加入中心点集合中, 迭代选取中心点(后面选取的点需要和之前中心点集合中所有的点做距离计算metric distance),直到中心点集中点的个数达到阈值.
2. grouping layer: 该层的输入是原始点集N*(d+C)和sampling出的中心点集N'*d(N'是中心点个数,中心点只需要d坐标信息,不需要特征信息). 该层的输出是点集(point sets)的groups, 每个点集的shape是N'*K*(d+C), 每个group对应一个局部区域, 共有N'个局部区域, K是中心点周围的点的个数. 不同的group的K的值不一样. 虽然每个group含有的点的数量可能不同,但是使用pointnet结构提取出来的特征是维度一致的(每层特征图使用了全局max pooling)
Ball query: 使用KNN选取中心点周围的点集也没有考虑到密度不均匀的问题. 文章使用了一种Ball query的方法,就是在中心点周围取一定半径里的所有点.
3. PointNet layer: 使用pointnet的网络提取局部区域的特征, 输入是grouping出的groups, 每个group的shape是N'*K*(d+C), 输出是N'*(d+C'), 邻点的坐标减去中心点的坐标,作为他们的新坐标. 点特征shape C被embedding成shape C', K个邻点被抽象成一个特征.
点云数据有密度不均匀的问题, 近多远少, 对于密度不均匀的数据使用相同尺寸的特征提取是不合适的(如卷积的感受野对远处的点集应该更大),文章使用了两种特征提取方法:
1. MSG(multi-scale grouping多尺度组合) 对每个group都用不同尺度大小的网络来提取特征,再叠加在一起
2. MRG (multi-resolution grouping多分辨率组合)每层对某个局部区域的特征提取由两部分组成: 基于上一层输出的特征提取到的特征+该区域对应的原始点集提取出的特征. 前者经过了两层特征提取,感受野更大, 适用于比较稀疏的点集. 而后者只做了一次适用于比较稠密的点集.
PointNet和PointNet++基于3D点云数据做分类和分割,f-pointnets基于RGB图像+深度信息使用pointnet和pointnet++的结构做了目标检测。f-pointnets考虑了室内和室外的场景,基于KITTI数据集和SUN RGB-D 3D detection benchmarks数据集进行了训练。
使用到2D RGB图像的原因是当时基于纯3D点云数据的3D目标检测对小目标检测效果不佳,所以f-pointnets先基于2D RGB做2D的目标检测来定位目标,再基于2d目标检测结果用其对应的点云数据视锥进行bbox回归的方法来实现3D目标检测。使用纯3D的点云数据,计算量也会特别大,效率也是这个方法的优点之一。
下图是该算法的架构图:
官方使用了两种网络来训练,v1是基于pointnet架构训练的模型,v2是基于pointnet++训练的模型。
f-pointnet 使用2D转3D的方法找object的中心,进行了一系列的坐标系转换。直接基于3D点云找中心比较困难,因为3D点云往往是object表面的点,且具有稀疏性,3D object的中心可能离这些点很远。本文使用了含有类似于传统Hough Voting机制的网络,来通过投票生成新的邻近中心点的点,再基于这些点分组和聚合,最后生成3D box。
参考:霍夫变换和霍夫投票
霍夫变换一般适用于有解析表达式的几何形状目标检测,例如直线、圆、椭圆等。变换的过程是将解析表达式表达的图像空间转换成参数空间,对于直线来说,直线上的每个点变换到参数空间中都是一条直线,这些直线共同的交点在参数空间中的坐标就是图像空间中的参数。寻找这个交点的方法就是霍夫投票,即统计参数空间中每个点被运用的次数(以空间中每个点的坐标为key,使用的次数为value),峰值点即为参数点,霍夫空间中的峰值点可能不严格的在同一个坐标上,需要允许一部分误差。
参考:广义霍夫投票,论文
广义霍夫变换可用于没有解析表达式、不规则形状的目标检测。没有解析表达式,无法直接将图像空间转换到参数空间进行投票;即使找到对应解析式,参数也必定很多,参数越多参数空间的复杂度指数增长。以下是广义霍夫变换的做法:
霍夫投票很适合点云数据,一是因为投票针对稀疏集合设计,二是因为其积累少量的局部信息以形成可靠的检测。为了将霍夫投票用于3D点云数据,本文做了以下调整:
本文将以上步骤融合到了一个end-to-end的神经网络里:VoteNet。
输入N*3的点云数据,输出M个种子点,每个种子点通过独立的投票模块独立生成一个投票,包含3D坐标值和一个high dimensional feature vector。这个过程主要分两步:
学习点云特征:使用PointNet++的网络架构
使用deep network完成Hough voting:不再使用创建codebook的方法,而是使用神经网络生成,这种方法更效率,且因为是end-to-end训练,也更准确。voting模块由一个MLP实现(FC+ReLU+BN),MLP输入种子点的feature(不包含种子点的坐标),输出三维坐标∆xi+特征offset,三维坐标由监督学习学得: 由seeds生成的votes比seeds本身更相近,这让聚合工作更容易。