大家好,又见面了,我是你们的朋友全栈君。
SGPN [CVPR 2018]:点云的实例分割与物体检测。(SGPN: Similarity Group Proposal Network for 3D Point Cloud Instance Segmentation。
RSNet [CVPR 2018]:点云的语义分割。(Recurrent Slice Networks for 3D Segmentation on Point Clouds)
以下为雷锋网 AI 科技评论整理的分享内容:
大家好,我是来自南加州大学的在读 phd 王薇月,我的主要研究方向是 computer vision(主要侧重于 3D 的 vision),今天我们介绍的是深度学习在点云分割中的应用。我们知道三维物体和场景有很多种的表达方式,比如 3D 的 mesh,还有 Volumetric data,distance field 等等。点云是比较直接,而且很简单的一种表示方式。首先介绍一下什么是点云(Pinot Cloud),点云是很多三维的点的坐标的集合,这整个集合可以反映场景或者物体的几何信息,在计算机里面,它就是一个 N*3 维的一个矩阵,N 代表的是点的个数,三维就是 x、y、z 的坐标(当然也可以是 N*6,即 x、y、z、r、g、b),随着激光、雷达和深度摄像头等硬件设备的发展,我们就能更好地捕捉 3D 的场景,处理 3D 信息也是现在的一个非常关注、非常火的话题。采集点云的主要方式就是激光雷达、深度摄像头(深度摄像头采集来的 depth map 可以通过照相机的参数计算出 3D 的点云)。我们今天的讲课专注点云的分割。
所谓点云的分割,今天我想介绍的有两层,一层是语义分割和实例分割,所谓语义分割就是给每个点 assign 一个 label,比如说这个点是桌子还是椅子。实例分割就是在 assign 语义分割的同时,把每个不同的物体给分割出来,比如一个房间里有很多椅子,每个点标 label 成椅子 1、椅子 2。实例分割与物体检测,即 object detection 是紧密相连的,object detection:给一个场景,把你想要的物体检测出来并给一个 bounding box。实例分割是比物体检测要稍微难一点的问题,因为它需要给每个点都要标出来。今天主要介绍在最新的 CVPR 上的两个工作,一个是对点云进行实例分割的网络:similarity group proposal network,还有一个是对点云进行语义分割的网络,recurrent slice network。
首先介绍 SGPN:实例分割的网络
在此之前,我想先回顾一下 2D 是怎么做实例分割和物体检测的。
我们都知道 2D CNN 在物体检测上取得了比较好的成果,就是 R-CNN 一系列的工作,包括 fast R-CNN,都是从 R-CNN 开始的,R-CNN 是使用 selective search 从图片中提取一些用 Region Proposal,然后把每一个 proposal fit 到 CNN 的网络里面,然后再进行分类,它用这种方法来进行物体检测。根据 R-CNN 的工作,faster R-CNN 替代了 selective search,通过 Region Proposal network 来 regress 每个 Region Proposal 的相对 anchor 的 offset 来获取 proposal,然后这整个是一个 end-to-end 的网络,出来的就是一些 pixel 的 bounding box,还有每个 bounding box 代表的每个物体的概率。根据 faster R-CNN 的 ICCV 的 best paper 是 Mask R-CNN,它是通过做图像 level 的实例分割来实现,它们沿用了 faster R-CNN 的 Region Proposal network,然后在生成了 bounding box 的基础上又生成了 object mask,我们也使用这种 Region Proposal 的概念,然后对点云进行分割,随后我会对此进行详细的介绍。
还有一个相关的工作是 3D 的 deep learning,从 2D 的 CNN 到 3D 的 CNN,最直接的方法就是 Volumetric CNN,当然这个是因为受到 GPU 内存的限制,没有办法做到很高的精度。去年 CVPR 上斯坦福的研究者们提出了 PointNet,是针对 point cloud 的网络,他们把 N*3 的点云 feed 到网络里面,然后在最后一层用 max pooling 提取 global feature,然后把这个 global feature concat 到每一个点云,然后进行分割,我们的网络建立在 pointnet 和它的后续工作 pointnet 的基础上提取出来 feature。
我们还有一个相关的工作是,deep metric learning,中文:度量学习,在 deep learning 里面比较典型的 metric learning 就是 siamese network,比如说有两张图片,我们想让它做分类的话,同一类在 feature space 里面很相近,不同类就是在 feature space 里面相差比较远,它们的两张图片 feed 到的 CNN,是 share 的 weight,project 到同一个 feature space 上,训练的时候用的是 Hinge Loss(即图右公式)。
注:公式讲解可回放视频至第 7 分钟查看
之后会讲我们的工作跟 simaese network 的关系,先简单介绍一下背景,之前说过,我们的任务是想生成一个 instance label 和一个 semantic segmentation label,也就是说对于每个点云有两个 label,一个 label 代表着这个点云是属于椅子 1 还是椅子 2 的,另一个 label 代表它是椅子还是桌子,还是电视等等,背景知识已经介绍完毕了。我们是建立在 pointnet 和 pointnet 基础上进行 feature 提取,然后借用 R-CNN 等工作的 Region Proposal 的思想,提出了一个叫 similarity group proposal 的 network,我们现在把它简化为 SGPN。
SGPN 的大体思路是这样的,我们首先是用 pointnet 提取 feature,也可用 pointnet ,提起完 feature 之后,之后有 3 部分(下图中间部分),similarity matrix,confidence map,semantic prediction,我下面会对这三个部分进行一一介绍。
首先是 semantic prediction,semantic prediction 跟 pointnet 的 semantic segmentation 是一样的,对于每个点生成的是一个 classic 的 probability,就是对于每个 class 它的概率是多大,比如说我们有 Np 个点,就生成了 Np*NC 的 matrix,NC 就是有多少个 object class,下面的这个结果就是 semantic prediction 的结果,比如下图(右)黄色区域代表桌子,蓝色区域代表椅子。
下面来介绍 similarity matrix,similarity matrix 就是对于每一个点,我们想生成 N 个点相对于它的位置,也就是说对于 similarity matrix 是通过 pointnet 生成的那个 feature,我们管它叫 Fsim,通过它进行计算它的 pointwise 的 distance,对于这个 similarity matrix,假设它叫做一个 ij 的元素,Sij 就是 point i 和 point j 在 feature space 的距离,如果它距离越远,说明它们两个就不在同一个 group,如果距离越近,就说明在同一个 group,也就是说如果两个点都是椅子 1 的话,它们
注:该公式详细解读可回放视频至第 10 分钟查看
两个在 feature 里的距离比较近。如果椅子 1 和椅子 2 在 feature space 里面距离比较远,或者说它们是椅子和桌子的话,它们两个在 feature space 里面的距离也要非常远。然后,我们有这样一个 Np(点的个数),有这样一个 Np*Np 的 similarity matrix,就是说每一行都可以是一个 group proposal,我们要设一个 threshold,如果小于这个 threshold,对于每一个小于这个 threshold,表示这些点在一个 group 里面,也就是说我们现在有 Np 个 group proposal,现在的问题就是我们怎么去 train 这个 matrix,它的 Ground Truth 是什么?
我们刚才讲过了 siamese network,就是说两个图片如果是一类的话,就让它们在 feature specs 里面的距离很小。如果它们不是一类的话,就让它们距离比较大,所以我们通过采用这种方式,借用这个思想,来训练我们的 similarity matrix,如果两个点属于不同类的话,我们就让它们的距离很大。如果它们是相同类的话,我们就让它们在 feature specs 里面的距离比较小,我们同样得使用的是 Hingle loss,两个点都是椅子 1 的话,我们就 minimize 这个 term(下图右下公式),在这里介绍一个 double hinge loss,也就是说两个点,一个椅子 1、一个椅子 2 的话,我们让它们的 margin 比 K1 大。如果两个点是一个桌子、一个椅子的话,我们就让它们的距离比 K2 大,在训练的时候 K1 要比 K2 小一点,在实验中我们发现用这种 double hinge loss 的方式,会让结果更好一点,比 K1=K2 的时候结果好一点,这样我们就训练出了 similarity matrix。
注:该公式详细解读可回放视频至第 12 分钟查看
大家可以来看一下这些 visualize 的结果,这些代表的是 similarity,越黑的表示 feature specs 它们的距离越近,颜色越浅,就表示它们 feature specs 距离越远。
注:此处详细讲解可回放视频至第 14 分钟时查看
介绍完了 similarity matrix,我们再来介绍另一个部分:confidence map。
因为 similarity matrix 是个 Np*Np 的矩阵,也就是说我们有 Np 个 group proposal,这样就有很多冗余,我们想用这个 confidence map 削减一些 group proposal,confidence map 的定义,也就是说它的 ground truth 是如下定义的。
对于 similarity matrix 的每一个行,我们是一个 group proposal,对于这一个 group proposal,我们有一个 ground truth,然后我们把这个通过 similarity matrix 预测出来的 prediction 的结果和 ground truth 进行比较,我们计算 IoU,IoU 就是 inter section over union,也就是说,如果 IoU 越大的话,表示这一行,也就是这个 similarity propose 出来的结果更可信。如果 IoU 更小的话,是更不可信的,这样我们就 regress 出来 confident map,然后在这里,我们也 visualize 这些 confidence,颜色越深表示 confidence 越高,颜色越浅表示 confidence 越低,我们可以看到着一些 connection part,连接处的 confidence 比较低,通过这些方式去排除掉一些噪声,相当于在 similarity matrix 的预测削减掉一些 similarity matrix confidence 比较低的 group proposal。
之后,像 R-CNN、faster R-CNN 它们有一些 post processing,它们会多预测出来一些 region proposal,然后就会用 threshold 的方法去 prove 这些结果,我们也同样用一个比较简单的贪婪法去 prove 这个结果,效果也是非常不错的,对于网络预测出来的一些 group proposal,对于每一个,先 initialize 一个大的 group set,如果这个 group proposal 是没有出现在这个 group set 里面,我们就把它放进去,如果出现了的话,我们就进行下一个,这样就做了一个 post processing,就得到了最终的结果,下面是一些实验结果。
在介绍实验结果之前,我们先简单介绍一种非常简单的均类方法,就是在所有的点里面选一些种子,然后进行 BFS 去 search 到最近的零点,然后去寻找跟它最近的相同的 label,如果它们有一个 threshold,如果大于这个 threshold 就停止,如果小于这个 threshold,就继续寻找。相同的 label group 起来,就形成了一个新的 instance,就是我们的一个 group,然后通过跟这个方法进行比较,因为在 literature 上面进行点云实例分割的文章比较少,我们就用这种比较简单的方法进行比较。
可以看到,这个是 stanford 3D indoor semantic dataset 上面,然后我们取得的结果比 seg-cluster 好很多。我们有了 instance segmentation 之后,就很容易得到 3D 的 object detection 结果,因为我们有了每个 instance,每个点的位置,我们就可以计算 bounding box,然后去跟 Ground Truth 的 bounding box 比较,pointnet 也给了一个 framework 去做 instance segmentation,可以看到我们比它们也是好很多。
注:此放大部分的详细讲解可回放视频至第 19 分钟查看,不同的颜色代表不同的 group,即不同的 instance。
seg-cluster 有不同的 threshold,hreshold 变大的时候,也就是说两个相同 label 的物体更容易连接在一起,如果 threshold 变小的时候就更不容易连接在一起,threshold 变小的时候,结果就如上图(右部)所示,将它分成了两个部分,但是在 SGPN 中就会避免这个问题,通过 similarity matrix 的方法,建立了上面和下面的联系。
除此之外,还在 NYU dataset 上面做了实验,因为 NYU 有很多 2D 的图像数据,包括 depth 信息,然后我们通过 2D 的 CNN 去 refine SGPN 的结果,因为通过相机参数,我们可以把深度图像换成点云,也就是说每一个点和每一个图像的坐标是有联系的,于是我们通过几个 CNN layer,然后联系相同的位置的 feature,把 CNN 里的 feature concatenate 到 pointnet 的相同 point 的 feature 里面,然后再进行几个 pointnet 的 layer,再生成 SGPN 的 3 个 sub module 去进行 point 的 instance segmentation,在 NYU 的 dataset 上面。
这是我们的结果(图上),SGPN 比 seg-cluster 好很多,我们还进行了 3D detection 跟 literature 的比较,因为 literature 有 Ground Truth 的 bounding box,像床、桌子一些大型的物体,它们的 bounding box 是 loose 的,也就是说,扫描的时候只是扫描一部分点,像有些?clusion,像床、桌子这些点其实都很小,存在的我们能看到的点,在点云中其实很少的,所以计算 bounding box,不是很准确,就是一个 tide 的 bounding box,没有办法跟大的 bounding box 去比,所以我们在这里(图右下)只比较了一些小的物体,比 literature 都好一些。
然后我们看一些更多的 visualize 的 result,这里有在 stanford 3D indoor semanticdataset 上面的,我们还在 scannet 上面做了很多实验,大家感兴趣的话,可以去阅读我们的 paper,有更多的实验和 application study。
这个工作主要是针对,使用深度学习的方法去做点云的实例分割的问题,据我们所知,应该是第一个用深度学习去做这件事情的。
下面来介绍我们组的另一个工作,第一作者是我的朋友黄乾桂,我们的这个工作是做点云的 semantic segmentation,刚才我已经介绍了 semantic segmentation,就是给一个 input 的点云,给每一个桌子、椅子的 label。
在此之前,我们先简单介绍一下相关的工作。刚刚我已经介绍了 pointnet,我们也知道 pointnet 就是经过几层 mlp 生成了一个大的矩阵 feature,然而对于使用 max pooling 提取 global feature,把每个 global feature concatenate 到 feature 上去,然后进行 semantic segmentation。我们可以看到所有的点只有一个 global feature,点与点之间没有什么联系,这样就丧失了很多 local 的信息,很近的点,像 CNN 是可以一层一层传递的,这个就没有办法做到这一点。
斯坦福他们组同样的人,去年在 NIPS 上提出了 pointnet ,他们是用了 farthest point sample 和 query KNN 来提取 local 的信息,也就是说对每个点,去找它的 neighborhood,然后去 sample 一些点,这样以此类推,这样去进行 local 信息的获取。但是我们也知道像 KNN 的话,它的复杂度是 O(KN) 的,而且它需要每个点进行 query,复杂度比较高,我们就提出了如下的方法去更好地去做 local dependence 的事情。
因为点云有 3D 的 structure,我们根据这种 structure 提出了 recurrent slice network,比如点云是有 x,y,z 三个方向的信息,我们对 x,y,z 三个方向进行 slice 的切割,然后把点云分成一片、一片的。然后对每一片用 pointnet 提取 feature,然后通过 RNN 去 update 相邻片的信息。在 pointnet 提取完特征之后,我们通过 RNN 去 update,然后再通过… 这里我们介绍三个 module 来介绍 local dependence 的信息的建立,下面我一一介绍。
进来一个点云,沿 z 方向进行切割,然后分成好几片(slice),然后把每一个 slice 单独放进每一个 pointnet 里面去 proper?信息和 feature,同样的方法去 max pool 整个 global feature,每一片有一个小的 global feature。x,y,z 三个方向都做同样的操作(如上图 slice 所示),通过 x 方向 slice,通过 y 方向 slice,同样的方式做三遍。
提取完这样的 feature 之后,我们使用 bidirectional RNN 去 update 这个 feature,因为相邻的 slice 有 local dependence,所以这样 update feature 的时候,可以考虑到 local 的信息,而且因为是 bidirectional 的,所以不同层的信息也可以相互传递,我们通过 bidirectional 传递来的、update 过的 feature 是呈现在这个地方(上图右),在文章中,我们也对不同的 RNN 的 module 做了 application study,比如 GRU、STM 等等,大家感兴趣可以阅读我们的?part。
通过 RNN update 过信息之后,我们通过?,也就是像 pointnet 一样的方法去把每一层对应的信息、每一 slice 对应的信息提取 propogate 到每一个点上。这样子每一个点就既有了 local 的信息,也有了 global 的信息,然后我们再通过 pointnet 的几个 layer 进行 output 做 segmentation。
同样是在 stanford indoor 3D data 上面做的,不同的颜色就表示不同的类别。图(中)是 predict 的结果,图(右)是 ground truth,我们得到的结果还是非常不错的。
这个是在 stanford indoor 3D 的结果,3D cnn 是在这个数据库做这个工作的 state-of-the-art,seg-cluster 是用 3D volumatric 的方法去做的,我们的结果可以看出来比 pointnet 好很多,都比 3D CNN 也好很多。
我们在 scanNet 上面也进行了很多的实验,可以看出来我们比 pointnet 和 pointnet 都要好一些。
刚才我们也说了,因为 pointnet 是有 KNN 或者是 ball query 的方法,会让它们的速度下降很多,我们在这里进行速度和 memory 的比较,像我们的 rsnet 是比 pointnet 速度要快很多。这里(上图)显示的是,以 pointnet 为一个 unit,先与 pointnet 比较,再与其他方法进行速度上的比较。这两篇工作的代码都已经 release 了,大家可以参看我们的 github。
3D learning 也获得了大家越来越多的关注,近期的一些比较有趣的 work 在 3D 的形式上,(上图)第一个和第三个都是在 mesh 上操作的,第一个是把 mesh 当成一个球,然后通过学习的方法把 mesh 捏成它们想要的 single RGB 的样子,第三个就是对不同的 catergory 学一个 mesh,它的 mesh 也是要 manifold,然后生成一个 mesh 以及它的一个 texture 的信息,然后把 texture map 到 mesh 上,使得它跟它的 image 更相近。第二个工作是通过 sample 在 surface 上的点来生成 mesh,这个也是进行根据 2D image 来进行 3D reconstruction 的,大家感兴趣可以都去再看一下。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172417.html原文链接:https://javaforall.cn