3D物体建模在计算机辅助设计系统、医疗系统、机器人以及物体自动检测中扮演了越来越重要的角色。在这其中,八叉树是一种非常有效的储存数据的方法,尤其是对于像流形物体、点云图(point cloud)、体素(voxel)这样的稀疏化(sparse)数据来说,八叉树可以更好地展示数据的结构特性。
图1 八叉树结构的数据存储原理
图片来源:Figure 3, Riegler, G., Ulusoy, A. O., & Geiger, A. (2017, July). Octnet: Learning deep 3d representations at high resolutions. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (Vol. 3).
首先我们看一下八叉树结构是如何有效储存稀疏化数据的。如图1左所示,我们把一个物体用最小的立方体包裹起来,然后我们对这个立方体使用八叉树的方式进行分割。因为是立体空间,所以每次划分都会把一个方块分为8个等分的子方块。如果某个子方块中没有包含这个物体,那么就把这个小方块储存的数据置为0,表示这是一个空的区域。反之,就置为1,并且继续分割下去,直到子方块的大小低于我们设定的某一预设值,或者达到预设的八叉树最大深度后停止分割。
如图1左所示,在第一次分割完成后,我们发现只有两个方块不是空的,于是这两个位置的数据被置为1,其他全为0,这就是我们在图1右第二行所看到的那串数字,然后我们继续分割值为1的子方块,直到达到最大深度后停止分割。图1右展示了八叉树最大深度为3时的分割情况。根据图1右,我们最终需要用73位(bit)来存储这种八叉树结构:1 01010000 00000000 01010000 01010000 0...。第一位的数字1代表了根节点是被分割的,第二位到第九位数字01010000表示了八叉树分割深度达到2时的子节点的分割情况,以此类推下去,深度为3时我们需要一共8*8=64位来储存相应的子节点的分割情况。
这样我们可以看到,我们一共需要1+8+64=73位(bit)来建立图1右所示的八叉树结构的索引,换言之,为了看清楚物体的形状,我们只需要找到这73个位置对应的数值就行了。而对于同样的分辨率的体素来说,因为是3维空间,每一点都有3个坐标,所以建立同样的空间我们需要多达8*8*8=512个坐标的索引,因此也就需要记录512个位置的数据。这种思想叫做位表示(Bit-representation),它能帮助我们更加高效地存储稀疏化数据。
通过上面的例子我们可以看出,八叉树数据结构可以更高效地储存数据,减少计算机内存和磁盘空间的占用,这一特点使得其在3D模型等稀疏化数据处理中逐渐受到学者的青睐。同时八叉树也是一种对数据的特征提取,因为八叉树一层一层不断划分子空间的过程也包含了物体的空间信息,这也给我们后续的数据进一步处理(比如说计算机视觉领域的物体分类等)提供了便利。
[描述来源:Meagher, D. J. (1980).
Octree encoding: A new technique for the representation, manipulation and display of arbitrary 3-d objects by computer
. Electrical and Systems Engineering Department Rensseiaer Polytechnic Institute Image Processing Laboratory.
URL:
https://www.researchgate.net/publication/238720460_Octree_Encoding_A_New_Technique_for_the_Representation_Manipulation_and_Display_of_Arbitrary_3-D_Objects_by_Computer
描述来源:
Riegler, G., Ulusoy, A. O., & Geiger, A. (2017, July). Octnet: Learning deep 3d representations at high resolutions. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (Vol. 3).
URL:
https://arxiv.org/abs/1611.05009]
自从上个世纪以来,物体建模就是一个非常热门的领域,它被广泛使用在计算机辅助设计(Computer-Aided Design, CAD)、医疗系统、机器人、有限元素建模(Finite element modeling)以及自动物体识别。在八叉树出现前,学者们提出过很多种建模方法。
1972年,Sidhu和Boute构建了四叉树(Quadtree),并将其应用在图像处理领域。
1974年,Freeman提出了一种2D编码方法,这种思想后来被学者们拓展至3D编码领域。
1978年,Gomez和Guzman提出了一种用三角形分割2D平面的方法,类似于八叉树的思想,如果一个三角形超过预设值,就会被分割成4个子三角形。
1979年,Baer等人发表综述论文《Geometric modelling: a survey》,研究了11种3D建模方法,这些建模方法都从边缘-面-顶点(edge-face-vertex)的角度出发,通过合并(union)、插值(intersection)和差分(difference)的方式构建3D模型。
1980年,Meagher提出了Octree数据结构,并且针对平移(translation)、调幅(scaling)、旋转(rotation)、合并(union)、插值(intersection)、差分(sections)操作提供了相应的算法,而且这些算法可以并行运算,使得八叉树结构可以通过大型计算机网络提高计算效率,今年来,随着计算机CPU和GPU硬件的提升,并行已经成为现在大数据时代不可缺少的重要运算方法。
年份
|
事件
|
相关论文/Reference
|
1972
|
Sidhu和Boute构建了四叉树(Quadtree)
|
Sidhu, G. S., & Boute, R. T. (1972). Property encoding: Application in binary picture encoding and boundary following.
IEEE Transactions on Computers
,
100
(11), 1206-1216.
|
1974
|
Herbert Freeman提出一种2D编码方法
|
Freeman, H. (1974). Computer processing of line-drawing images.
ACM Computing Surveys (CSUR)
,
6
(1), 57-97.
|
1978
|
Gomez和Guzman提出了一种用三角形分割2D平面的方法
|
Gomez, D., & Guzman, A.(1978) Digital Model for Three-Dimensinoal Surface Representation.
Comunicaciones Tecnicas
, Vol. 9, No. 167
|
1979
|
Baer等人研究了11种3D建模方法
|
Baer, A., Eastman, C., & Henrion, M. (1979). Geometric modelling: a survey.
Computer-Aided Design
,
11
(5), 253-272.
|
1980
|
Donald Meagher提出了Octree数据结构
|
Meagher, D. J. (1980).
Octree encoding: A new technique for the representation, manipulation and display of arbitrary 3-d objects by computer
. Electrical and Systems Engineering Department Rensseiaer Polytechnic Institute Image Processing Laboratory.
|
2017
|
Wang等人提出了基于八叉树机构的卷积神经网络
|
Wang, P. S., Liu, Y., Guo, Y. X., Sun, C. Y., & Tong, X. (2017). O-cnn: Octree-based convolutional neural networks for 3d shape analysis.
ACM Transactions on Graphics (TOG)
,
36
(4), 72.
|
①Octree对于3D物体建模编码非常有效,但是对于非稀疏化的数据来说,并没有明显的效率上的提升。
②Octree不具有旋转不变形(rotational invariance),这影响了Octree结构数据的泛化性,比如影响了计算机视觉领域的神经网络训练的准确性。
③Octree并不是3D物体的直观表达,数据的可视化往往还需要经过大量的运算进行还原,在很多应用场景中是数据处理的一个中间的表达。
④现代图像处理方法多以卷积神经网络为基础,Octree虽然在稀疏化数据编码中有优势,但是不能天然地应用在像素、体素的卷积运算中。
未来发展方向
①构建Octree和普通像素、体素图像的快速转换,因为Octree结构的本身就是一种特征提取,因此Octree更接近于物体本身的结构。如果这种转换效率足够高,那么可以获得更好的数据结构。
②直接在Octree的数据结构上定义新型的深度神经网络,这样可以免去数据转换带来的效率损失,充分把Octree和深度神经网络的优势结合在一起。
3D物体建模在计算机辅助设计系统、医疗系统、机器人以及物体自动检测中扮演了越来越重要的角色。在这其中,八叉树是一种非常有效的储存数据的方法,尤其是对于像流形物体、点云图(point cloud)、体素(voxel)这样的稀疏化(sparse)数据来说,八叉树可以更好地展示数据的结构特性。图1 八叉树结构的数据存储原理图片来源:Figure 3, Riegler, G., Ulusoy, A. O., & Geiger, A. (2017, July). Octnet: Learnin.
http://hi.baidu.com/onlywater/blog/item/905c5e162ed18f4021a4e9c1.html
一、八
叉树
基本
原理
:
用八
叉树
来
表示
三维形体,并研究这种
表示
下的各种操作以及应用,是进入80年代后开展起来的。这种方法,既可以看成是四
叉树
方法在三维空间的推广,也可以认为是三维体素阵列
表示
形体方法的一种改进。
八
叉树
的逻辑结构如下:
假设要表...
八
叉树
这块的代码,在别人的基础上,把有问题的地方稍作改动,以及不懂得地方多加了注释,当作以后的学习资料。
#include <iostream>
using namespace std;
//定义八
叉树
节点类
template<class T>
struct OctreeNode
T data; //节点
数据
T xmin, xmax; //节点坐标,即六面体个顶点的坐标
T ymin, ymax;
T zmin, zmax;
OctreeNode <
(1)三维和四维
数据
结构的提出。前面介绍的
数据
结构都是二维的,然而在有些信息系统中,需要有真三维的空间
数据
结构。例如矿山开采中的地下资源埋藏和采矿巷道的空间分布,如果用二维的坐标体系就根本无法很好表达。此外,矿山空间目标往往随时间不断变化着,这就提出了空间和时间信息系统的问题。
在时间信息系统中不考虑时间,是把时间看作不变的常数,即为当前的时间。而在时间和空间信息系统中,则把时间看作有过...
八
叉树
及应用八
叉树
的定义如何搭建一颗八
叉树
八
叉树
的作用八
叉树
的实际应用
上一次介绍了KD树及应用,这次介绍一下八
叉树
,主要从定义、结构、作用及应用几个方面进行理解。
八
叉树
的定义
八
叉树
是在描述三维空间坐标场景中常用的一种
数据
结构。如下图所示,一个空间自身作为根节点,当需要细分内部区域时,将空间划分为八个小空间,即八个子节点,若某个小节点还需要细分,则继续往下划分八个子节点,就这样将一个空间不断的...
八
叉树
和k-d树都经常用来处理三维空间
数据
,k-d树的使用范围更宽泛些,适用于k维空间的
数据
,在Sift算法中,k-d树被用于在k维的空间内搜索邻近特征点。
1. 八
叉树
、k-d树的
原理
wiki或百科上面都有详细的介绍。
http://en.wikipedia.org/wik
### 回答1:
KNN(K近邻)方法是一种基于实例的学习算法,它的基本思想是:如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN方法可以用于
数据
回归预测,它的
原理
是:先找出距离待预测点最近的K个点,然后根据这K个点的输出值,计算待预测点的输出值。
### 回答2:
KNN(K-Nearest Neighbors)方法是一种基本的非参数化监督学习算法,用于解决回归问题。它的
原理
如下:
1.
数据
准备:首先,需要准备训练集,其中包含已知的输入特征和对应的输出标签。
2. 距离计算:对于给定的一个未知样本,计算它与训练集中每个样本的距离。通常使用欧式距离或曼哈顿距离等度量方法来进行距离计算。
3. 邻居选择:根据距离值,选择与未知样本最近的K个训练样本作为邻居。
4. 输出预测:对于回归问题,K个邻居的输出标签可以看作是该未知样本的预测输出。通常采用平均值或加权平均值来确定最终的预测值。
5. 评估模型:使用训练集来训练KNN回归模型后,可以使用测试集或交叉验证方法来评估模型的性能。常见的评估指标包括均方误差(MSE)和决定系数(R^2)等。
KNN方法的
原理
简单直观,它基于“近朱者赤、近墨者黑”的思想,认为离未知样本越近的样本越有可能具有相似的输出标签。通过比较样本之间的距离,找到最近的若干邻居,从而进行预测。它没有对
数据
做任何假设,因此适用于各种类型的
数据
和问题。然而,KNN方法在处理大规模
数据
时会面临计算复杂度高、
存储
空间大的问题,同时对于
数据
的特征选择和归一化也具有一定的要求。
### 回答3:
K最近邻(KNN)方法是一种常用的机器学习方法,可以用于
数据
回归预测。其
原理
如下:
1. 训练集:首先,我们需要有一个已经标记好的训练集,其中包含了输入变量和对应的输出值。这些输入变量可以是多维的,也可以是连续或离散的。
2. 距离度量:接下来,我们需要定义一个距离度量方法,用来度量输入变量之间的相似性。常见的距离度量方法包括欧氏距离、曼哈顿距离等。
3. 邻居选择:对于每一个要预测的输入变量,KNN方法会计算它与训练集中每个输入变量之间的距离,并选择与其最近的K个邻居。这里的K是一个预先设定的正整数。
4. 输出预测:对于每个要预测的输入变量,KNN方法会取其K个最近邻居的输出值的平均值作为预测输出。如果输出值是连续的,则直接取平均值;如果输出值是离散的,则可以取众数作为预测输出。
总结起来,KNN方法的
数据
回归预测
原理
是基于训练集中输入变量之间的距离度量,选择与要预测变量最近的K个邻居,并根据邻居的输出值进行预测。其核心思想是相似的输入变量对应的输出值也应该相似。使用KNN方法进行
数据
回归预测时,需要选择合适的K值和距离度量方法,以获得较好的预测效果。
编译出错,出现 vfs_read[******.ko] undefined !
何以忘言:
计算机那些事(5)——多个目标文件的链接、静态链接、动态链接
linux对已经存在的文件中间修改或者删掉几个字节后磁盘上数据的变化情况
u011039780: