【深度学习】:一文入门3D计算机视觉

一.导论

目前深度学习已经在2D计算机视觉领域取得了非凡的成果,好比使用一张图像进行目标检测,语义分割,对视频当中的物体进行目标跟踪等任务都有很是不错的效果。传统的3D计算机视觉则是基于纯立体几何来实现的,而目前咱们使用深度学习在3D计算机视觉当中也能够获得一些不错的效果,目前甚至有超越传统依靠立体几何识别准确率的趋势。所以我们如今来介绍一下深度学习在3D计算机视觉当中的应用吧!本博文参考了前几天斯坦福大学最新出的CS231n课程(2020/8/11新出),新课增长了3D计算机视觉视频/动做分类的lecture,同时丰富了生成对抗网络(GAN)的内容,但暂时国内还无人翻译,所以小编将其翻译整理成博文的形式供你们参考,若有错误之处,请你们见谅,同时欢迎你们讨论。网络

二.3D计算机视觉训练集以及表示方法

 

 

 在3D计算机视觉当中,咱们能够采用于训练的模型共有以上几种,分别是:函数

1.Depth Map(深度图)学习

2.Voxel Grid(翻译过来很奇怪,所以就保留原英语)编码

3.Implicit Surface(隐表面)人工智能

4.PointCloud(三维点云)spa

5.Mesh翻译

那么什么是Depth Map(深度图)呢?我们来看看设计

三.Depth Map(深度图)

深度图的图像以下所示:3d

 

 

 在左上角有一张关于斯坦福大学寝室的图片,咱们能够将其转化为右上角的深度图,其中深度图当中不一样的颜色表示了不一样物体距离摄像头的距离,距离摄像头的距离越大,则显示出来的颜色则越红。咱们假设有一个神经网络,咱们只须要输入一张图片,就能够获得图片当中的全部位置距离摄像头的距离,这样是否是很酷呢?那么咱们如何使用神经网络对一系列的图片训练成为深度图的形式呢?一些研究人员便立马想到可使用全卷积神经网络(Fully convolutional Network)来实现这个过程,全卷积神经网络(Fully convolutional Network)是咱们以前在2D计算机视觉当中所采用的用于图像分割的神经网络,以前图像分割获得的是每个像素点显示的是属于某一个物体类别的几率值,而如今咱们把一样的神经网络用于深度图当中就能够获得图像当中某一个像素距离摄像头的远近大小。这样就能够完美获得我们的深度图训练模型了,咱们甚至能够把这个全卷积神经网络替换成U-net以期在一些特定数据集上获得更好的效果。模型以下所示:
code

 

 

这个模型首先也是输出一个3通道的彩色图片,通过一个全卷积神经网络(FCN)而后对深度图进行估计,输出的深度图仅仅具备两个维度,由于第三个维度为1,意味着咱们输出的深度图其实是黑白的,用黑色或者白色的深度来表示距离摄像头的距离,图像当中使用了彩色仅仅是由于看起来更加方便。同时这里的loss使用了L2距离进行损失函数的编写。

可是!!!!细心的同窗确定会发现其中有必定的问题,那就是同一个物体,拥有不一样的大小,他们若是仅仅经过一张图片来断定他们离摄像头的距离是不必定准确的。由于图片当中并无包含物体有关深度的信息。

好比咱们有两只形状彻底相同的鸟,可是其中一只鸟是另外一只鸟大小的2倍,咱们把小鸟放到离摄像头更近的位置,将大鸟放到离摄像头更远的位置,那么仅仅经过一张图片咱们就会认为这两只鸟离咱们的摄像头距离是同样大的!以下图所示:

 

 

 那么这样咱们又该如何解决呢?聪明的研究人员设计了一个具备尺寸不变特征的的loss function来解决了这个问题,这个loss function的写法以下:

 

 

 至于这个公式为何会让图片的深度信息得以保留,这里再也不赘述,感兴趣的同窗能够翻看一下提出这个loss的论文,在2016年的世界顶级人工智能会议论文NIPS上发表,于纽约大学(New York University)提出,论文的连接以下:https://papers.nips.cc/paper/5539-depth-map-prediction-from-a-single-image-using-a-multi-scale-deep-network.pdf

同时呢,在深度图当中还有一种图叫作垂直表面法向量图,它的图像以下所示:

 

 

 最后输出图像当中的不一样颜色表明了这个物体的表面所朝空间当中的方向,好比绿色表明这个物体的表面是朝向右边的,而红色则表明这个物体的表面是朝向左边的。咱们也可使用全卷积神经网络(Fully convolutional Network)对这种输出的图像进行处理,其中的结构以下所示:

 

 最后的Loss采用了(x*y)/(|x|*|y||)的方法,由于咱们所预测的图像具有图像的方向和深度的信息,而图像的方向和大小正好能够由向量表示,岂不美哉?每个训练集当中的图片的其中一个像素点均可以由一个向量来表示,同时具有深度(长度)和方向的信息。而原图当中某个像素点的大小能够表示为向量x,经过神经网络推测以后的同一个像素点则能够表示为向量y,所以咱们可使用公式(x*y)/(|x|*|y||)来衡量这两个向量之间的差距,其中(x*y)中的乘法使用了点乘,所以上下相除可得cos(theta)也就是图片当中某个像素点所具有的loss的大小,将整个图片当中全部像素点的大小加起来则能够获得整个图像当中loss的大小了。

 

四.Voxel Grid网格表示法

 

 

 如上图所示,咱们能够将一张二维的图片转为一张三维的Voxel grid图,什么是Voxel grid图呢?Voxel grid图就是在一个三维的,大小为V*V*V的空间立体当中,由一系列1*1*1正方体网格堆砌出来的三维立体图形,Voxel grid图当中的每个网格只具备两个值,1或者0,1表示这个地方有正方体,0表示这个地方没有正方体。一个Mesh图当中只保留物体的形状和大小信息,而不保留物体的颜色以及纹理的信息。

咱们先来看一个有趣的问题,用什么方法能够对三维Voxel grid图进行分类呢?咱们暂时不考虑将二维图像恢复到三维Voxel grid图的状况的话,常见的手段是使用立体3D卷积,以下图所示:

 

 

 3D立体卷积和咱们的2D卷积有一点不一样之处,那就是卷积核的神奇之处是它居然是一个正立方体!而不是一个二维的平面!在上图当中,咱们的输入是一个四通道的1*30*30*30的Voxel grid图,输入的图像多是一个椅子,也多是一个床。咱们经过三维卷积,不断地进行卷积以及池化的操做,接着使用全链接神经网络将其展开,最后使用softmax函数将其继续拧分类。咱们使用3D卷积可以对立体图像的特征进行更为有效的检测,由于一个立体的图像不只仅有长和宽上面的信息,还有其有关深度的相关信息,所以须要采用3D卷积。3D卷积的动态图以下所示,这个例题动态图当中卷积核的大小为3*3*3

 

 

 再回到咱们刚才的问题,如何将一个二维的图像转化为Voxel grid图呢,咱们能够采用的卷积神经网络以下所示:

 

 首先咱们将二维的图像首先送入到一个2D卷积神经网络当中,用于提取这个二维图像的特征,而后经过全链接神经网络或者Flatten层将其展平一个一维的向量,这样就能够更加方便地转化reshape为四通道进行三维卷积的形式,前面咱们已经说过三维卷积可以更好地抽象地还原和提取到图像在三维空间上的个特征,所以咱们对刚才二维图像抽象出来的特征经过三维卷积进行还原,这是一个经过三维卷积进行上采样的过程。最后输出的结果就能够获得咱们的Voxels grid图啦!

可是使用三维卷积经常就会用更为昂贵的代价来换取更为准确的结果,由于三维卷积使用的参数过多,以下图所示:

 

 咱们仅仅储存1024^3个Voxels grid网格就须要电脑4GB的显存,实在是太大了!好多电脑的显存尚未这么大呢!所以有些研究人员则直接使用二维卷积对图像进行三维的还原,固然效果确定没这么好啦,以下图所示:

 

 这个思想就很和咱们的自编码器(Auto-Encoders)很像了。

 

五.采用隐函数

咱们还能够采用物体在三维空间当中的函数图像来表示一个立体物体,咱们再用神经网络来从新拟合出这个函数就好啦,我的以为在这种方法不太合理,以下所示:

 

 六.采用3D点云

采用3D点云应该是目前比较靠谱的方案,

 

 在3D点云当中每个点,都有三个参数,分别是每一个点在x,y,z轴上的位置,对3D点云进行分类的话和对Mesh分类的方法差很少,也是通过必定的神经网络再通过softmax函数就能够获得最后的分类了!以下图所示

 

这就是小编今天分享的所有内容了,终于写完啦,若是以为读了小编的文章您有收获的话,不要忘记了点击下方的“推荐哦!您的支持就是对小编创做最大的动力!

相关文章
相关标签/搜索