【PCL自学:ocTree】八叉树(octree)的原理及应用案例(点云压缩,搜索,空间变化)

article/2025/10/29 7:49:32

PCL中八叉树(octree)的原理及应用案例

  • 一、什么是八叉树ocTree?
    • 1.八叉树原理
  • 二、八叉树应用案例
    • 1.点云压缩
    • 2.用八叉树进行空间划分和搜索操作
    • 3.无序点云数据的空间变化检测

一、什么是八叉树ocTree?

1.八叉树原理

  上世纪80年代,八叉树结构被提出来,用来表示空间中的区域划分,简单来说,空间可以被分为8个象限,想象一下假设空间中存在一个笛卡尔坐标系,则该坐标系将空间分为了8个象限,每个象限又可以按照这种方式再建立一个笛卡尔坐标系,再划分为8个象限,以此类推,空间中任何一块区域都可以被n个笛卡尔坐标划分。
在这里插入图片描述
  以上图为例:
  如果所生成的八叉树的节点可分为三类:

灰节点: 它对应的立方体部分的为V所占据;
   白节点: 它对应的立方体没有V的内容;
   黑节点: 它对应的立方体全部为V所占据。

后两类又称为叶节点。立方体的八叉树的逻辑结构是这样的:将立方体内的空间划分,并记录成树结构,其上的节点要么是叶节点,要么是有八个子节点的灰节点。
  因此任意空间都可以被划分为树状结构,而如果要找到某子空间,只需遍历八叉树即可找到,且效率较高。
  关于八叉树的存储结构,有兴趣深入研究的同学可以参考这篇文章:
  https://blog.csdn.net/qq_37855507/article/details/90957798

二、八叉树应用案例

1.点云压缩

  点云由巨大的数据集组成,这些数据集描述了与距离、颜色、法线等附加信息相关的三维点。此外,它们可以以很高的速度创建,因此会占用大量内存资源。一旦点云必须在速率受限的通信信道上存储或传输,就必须想办法对这类数据进行压缩。点云库提供点云压缩功能。它允许编码所有类型的点云,包括无组织的点云,其特征是不存在点索引、分辨率、密度和/或点顺序。此外,底层的八叉树数据结构能够有效地合并来自多个数据源的点云数据。
在这里插入图片描述
  下面,我们将解释如何有效地压缩单点云和点云流。在给出的示例中,我们使用OpenNIGrabber捕获点云,并使用PCL点云压缩技术进行压缩。请看如下示例代码:

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/openni_grabber.h>
#include <pcl/visualization/cloud_viewer.h>#include <pcl/compression/octree_pointcloud_compression.h>#include <stdio.h>
#include <sstream>
#include <stdlib.h>#ifdef WIN32
# define sleep(x) Sleep((x)*1000)
#endifclass SimpleOpenNIViewer
{
public:SimpleOpenNIViewer () :viewer (" Point Cloud Compression Example"){}//在OpenNIGrabber捕获循环执行的回调函数中(以下部分代码),首先将捕获的点云压缩到stringstream缓冲区中。接下来是一个解压步骤,该步骤将压缩的二进制数据解码为一个新的点云对象。然后将解码后的点云发送到点云查看器。voidcloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud){if (!viewer.wasStopped ()){// 存储被压缩后点云的流std::stringstream compressedData;// 创建输出的解压缩后点云指针pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudOut (new pcl::PointCloud<pcl::PointXYZRGBA> ());// 压缩点云PointCloudEncoder->encodePointCloud (cloud, compressedData);// 解压缩点云PointCloudDecoder->decodePointCloud (compressedData, cloudOut);// 显示解压缩后的点云viewer.showCloud (cloudOut);}}voidrun (){// 布尔值:是否显示统计信息(是)bool showStatistics = true;// 配置文件列表查看这个头文件: /io/include/pcl/compression/compression_profiles.h// 此处是枚举类型,包括压缩配置(分辨率,在/离线,颜色信息)pcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;// 实例化八叉树点云压缩用于编码和解码PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> (compressionProfile, showStatistics);PointCloudDecoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> ();// 创建OpenNI设备的抓取器pcl::Grabber* interface = new pcl::OpenNIGrabber ();// 定义回调函数,用于回调点云采集设备std::function<void(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f =[this] (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr& cloud) { cloud_cb_ (cloud); };// 注册链接回调函数.此例子中是带有颜色信息的点云。boost::signals2::connection c = interface->registerCallback (f);// 开始接收点云,interface->start ();while (!viewer.wasStopped ()){sleep (1);}interface->stop ();// 删除点云压缩实例delete (PointCloudEncoder);delete (PointCloudDecoder);}pcl::visualization::CloudViewer viewer;pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudEncoder;pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudDecoder;};int
main ()
{SimpleOpenNIViewer v;v.run ();return (0);
}

  在run()函数中,我们创建了用于编码和解码的OctreePointCloudCompression类的实例。他们可以将压缩文件作为配置压缩算法的参数。所提供的压缩文件为openNI设备捕获的点云预定义了公共参数集。在本例中,我们使用MED_RES_ONLINE_COMPRESSION_WITH_COLOR它的意思是采用坐标编码精度为5立方毫米的轮廓线,并能进行颜色编码。它是进一步优化的快速在线压缩参数。压缩配置文件的完整列表,包括它们的配置,可以在文件/io/include/pcl/compression/compression_profiles.h找到。
这里列举一些参数以供参考:
第一个参数LOW,MED,HIGH代表的是压缩程度。
第二个ONLINE/OFFLINE代表是否在线压缩。
最后WITH.WITHOUT代表是否压缩颜色信息。

LOW_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 	1立方厘米分辨率(八叉树体素体积),无颜色,快速在线编码
LOW_RES_ONLINE_COMPRESSION_WITH_COLOR 		1立方厘米分辨率,彩色,快速在线编码
MED_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 	5立方毫米分辨率,无色彩,快速在线编码
MED_RES_ONLINE_COMPRESSION_WITH_COLOR 	
HIGH_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 	1立方毫米分辨率,无色彩,快速在线编码
HIGH_RES_ONLINE_COMPRESSION_WITH_COLOR 		以下以此类推
LOW_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 	
LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR 	
MED_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 	
MED_RES_OFFLINE_COMPRESSION_WITH_COLOR 	
HIGH_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 	
HIGH_RES_OFFLINE_COMPRESSION_WITH_COLOR 	启用高级参数化的手动配置

  当然也可以选择手动更改压缩配置,为了能够完全访问所有与压缩相关的参数,OctreePointCloudCompression类的构造函数可以初始化附加的压缩参数。请注意,为了启用高级参数化,compressionProfile_arg参数需要设置为MANUAL_CONFIGURATION。

pcl::io::OctreePointCloudCompression< PointT, LeafT, BranchT, OctreeT >::OctreePointCloudCompression	(	compression_Profiles_e 	compressionProfile_arg = MED_RES_ONLINE_COMPRESSION_WITH_COLOR,//定义压缩配置文件
bool 	showStatistics_arg = false,//获取压缩统计信息
const double 	pointResolution_arg = 0.001,//点坐标精度
const double 	octreeResolution_arg = 0.01,//最低八叉树级别的八叉树分辨率
bool 	doVoxelGridDownDownSampling_arg = false,//是否进行体素网格降采样
const unsigned int 	iFrameRate_arg = 30,//编码率
bool 	doColorEncoding_arg = true,//颜色编码
const unsigned char 	colorBitResolution_arg = 6 //颜色位分辨率
)		

  高级参数说明如下:
  compressionProfile_arg:启用高级参数时,需要将该参数设置为MANUAL_CONFIGURATION。showStatistics_arg:将压缩相关的统计数据打印到命令窗口。
  pointResolution_arg:定义点坐标的编码精度。该参数应设置为低于传感器噪声的值。
  octreeResolution_arg:该参数定义部署的八叉树的体素大小。较低的体素分辨率可以使压缩速度更快,但压缩性能下降。这在高帧/更新速率和压缩效率之间实现了平衡。
  doVoxelGridDownDownSampling_arg:如果激活,则只对层次八叉树数据结构进行编码。解码器在体素中心生成点。这样,点云在压缩时得到下采样,同时获得较高的压缩性能。
  iFrameRate_arg:点云压缩方案对点云进行区别编码。通过这种方式,传入点云和之前编码的点云之间的差异被编码,以实现最大的压缩性能。iFrameRate_arg允许指定流中进入点云不进行差异编码的帧速率(类似于视频编码中的I/ p帧)。
  doColorEncoding_arg:该选项启用颜色组件编码。
  colorBitResolution_arg:这个参数定义了每个颜色组件需要编码的位数。

2.用八叉树进行空间划分和搜索操作

  八叉树是一种基于树的数据结构,用于管理稀疏的三维数据。每个内部节点正好有8个子节点。在本节中,我们将学习如何在点云数据中使用八叉树进行空间划分和邻居搜索。特别是,我们解释了如何在体素搜索、K近邻搜索和半径搜索中执行邻点搜索。
  请看如下示例代码:

 #include <pcl/point_cloud.h>#include <pcl/octree/octree_search.h>#include <iostream>#include <vector>#include <ctime>intmain (){srand ((unsigned int) time (NULL));// [1]创建点云指针pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);// [2] 构造1000个随机的点云数据cloud->width = 1000;cloud->height = 1;cloud->points.resize (cloud->width * cloud->height);for (std::size_t i = 0; i < cloud->size (); ++i){(*cloud)[i].x = 1024.0f * rand () / (RAND_MAX + 1.0f);(*cloud)[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);(*cloud)[i].z = 1024.0f * rand () / (RAND_MAX + 1.0f);}float resolution = 128.0f;// [3]八叉树点云搜索实例pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree (resolution);// [4]将点云设置成八叉树结构octree.setInputCloud (cloud);octree.addPointsFromInputCloud ();// [5]随机定义一个要查找的点pcl::PointXYZ searchPoint;searchPoint.x = 1024.0f * rand () / (RAND_MAX + 1.0f);searchPoint.y = 1024.0f * rand () / (RAND_MAX + 1.0f);searchPoint.z = 1024.0f * rand () / (RAND_MAX + 1.0f);//**************************体素搜索(搜索相同体素内的点)************************// [6]创建点云索引容器std::vector<int> pointIdxVec;// [7]开始进行体素内近邻点搜索if (octree.voxelSearch (searchPoint, pointIdxVec)){// [8] 将查找点所在体素内的邻点全都输出打印到命令窗口std::cout << "Neighbors within voxel search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z << ")" << std::endl;for (std::size_t i = 0; i < pointIdxVec.size (); ++i)std::cout << "    " << (*cloud)[pointIdxVec[i]].x << " " << (*cloud)[pointIdxVec[i]].y << " " << (*cloud)[pointIdxVec[i]].z << std::endl;}//*************************K近邻搜索(搜索K个最近点)************************int K = 10;// 创建点索引容器,用于按距离保存搜索到的点std::vector<int> pointIdxNKNSearch;// 创建点距离容器 std::vector<float> pointNKNSquaredDistance;std::cout << "K nearest neighbor search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z<< ") with K=" << K << std::endl;// 开始最近K邻搜索if (octree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0){for (std::size_t i = 0; i < pointIdxNKNSearch.size (); ++i)std::cout << "    "  <<   (*cloud)[ pointIdxNKNSearch[i] ].x << " " << (*cloud)[ pointIdxNKNSearch[i] ].y << " " << (*cloud)[ pointIdxNKNSearch[i] ].z << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;}//*************************K近邻搜索(搜索半径范围内的点)************************// 创建半径范围内点索引的容器std::vector<int> pointIdxRadiusSearch;// 创建搜索到的点的距离容器std::vector<float> pointRadiusSquaredDistance;float radius = 256.0f * rand () / (RAND_MAX + 1.0f);std::cout << "Neighbors within radius search at (" << searchPoint.x << " " << searchPoint.y << " " << searchPoint.z<< ") with radius=" << radius << std::endl;// 开始半径搜索if (octree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0){for (std::size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)std::cout << "    "  <<   (*cloud)[ pointIdxRadiusSearch[i] ].x << " " << (*cloud)[ pointIdxRadiusSearch[i] ].y << " " << (*cloud)[ pointIdxRadiusSearch[i] ].z << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;}}

  附加内容:
PCL八叉树组件提供了几种八叉树类型。它们的主要区别在于它们的单个叶节点特征。

OctreePointCloudPointVector(等于OctreePointCloud):这个八叉树可以在每个叶节点上保存一个点索引列表。
OctreePointCloudSinglePoint:这个八叉树类在每个叶节点上只有一个单点索引。仅存储分配给叶节点的最近的点索引。
OctreePointCloudOccupancy:这个八叉树在它的叶子节点上不存储任何点信息。它可以用于空间占用检查。
OctreePointCloudDensity:这个八叉树计算每个叶节点体素内的点的数量。它允许空间密度查询。
  如果需要高速创建八叉树,请查看八叉树双缓冲实现(Octree2BufBase类)。这个类同时在内存中保存两个并行的八叉树结构。除了搜索操作之外,这还支持空间变化检测。此外,高级内存管理减少了八叉树构建过程中的内存分配和回收操作。双缓冲八叉树实现可以通过模板参数OctreeT赋值给所有的OctreePointCloud类。
  所有八叉树都支持八叉树结构和八叉树数据内容的序列化和非序列化。

3.无序点云数据的空间变化检测

  八叉树是一种基于树的数据结构,用于组织稀疏的三维数据。在本节中,我们将学习如何使用八叉树实现来检测多个无序点云之间的空间变化,这些点云可以在大小、分辨率、密度和点顺序上变化。通过递归地比较八叉树的树结构,可以识别由体素配置差异表示的空间变化。此外,我们解释了如何使用pcl八叉树双缓冲技术,使我们能够在一段时间内有效地处理多个点云。

 #include <pcl/point_cloud.h>#include <pcl/octree/octree_pointcloud_changedetector.h>#include <iostream>#include <vector>#include <ctime>intmain ()
{srand ((unsigned int) time (NULL));// 设置八叉树分辨率 即体素边长float resolution = 32.0f;// 实例化基于八叉树的点云变化检测类pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree (resolution);// 创建点云A的指针pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA (new pcl::PointCloud<pcl::PointXYZ> );// 为点云A生成一些随机点云数据cloudA->width = 128;cloudA->height = 1;cloudA->points.resize (cloudA->width * cloudA->height);for (std::size_t i = 0; i < cloudA->size (); ++i){(*cloudA)[i].x = 64.0f * rand () / (RAND_MAX + 1.0f);(*cloudA)[i].y = 64.0f * rand () / (RAND_MAX + 1.0f);(*cloudA)[i].z = 64.0f * rand () / (RAND_MAX + 1.0f);}// 将点云A变成八叉树状结构octree.setInputCloud (cloudA);octree.addPointsFromInputCloud ();// 点云A是我们的参考点云,用八叉树结构描述它的空间分布。
// OctreePointCloudChangeDetector类继承自Octree2BufBase类,
// 后者允许同时在内存中保存和管理两棵八叉树。
// 此外,它实现了一个内存池,可以重用已经分配的节点对象,因此在生成多个点云的八叉树时减少了昂贵的内存分配和回收操作。
//通过调用octree. switchbuffers(),我们重置了八叉树类,同时在内存中保留了之前的八叉树结构。// 八叉树缓冲区:重置八叉树,但在内存中保留以前的树结构。octree.switchBuffers ();// 创建点云B的指针pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB (new pcl::PointCloud<pcl::PointXYZ> );// 为点云B生成一些随机点云数据cloudB->width = 128;cloudB->height = 1;cloudB->points.resize (cloudB->width * cloudB->height);for (std::size_t i = 0; i < cloudB->size (); ++i){(*cloudB)[i].x = 64.0f * rand () / (RAND_MAX + 1.0f);(*cloudB)[i].y = 64.0f * rand () / (RAND_MAX + 1.0f);(*cloudB)[i].z = 64.0f * rand () / (RAND_MAX + 1.0f);}// 将点云B设置成八叉树结构octree.setInputCloud (cloudB);octree.addPointsFromInputCloud ();// 为了检索存储在当前八叉树结构体素(基于clouddB)中的点,这些点在之前的八叉树结构(基于clouddA)中不存在,我们可以调用getPointIndicesFromNewVoxels方法,它返回结果点索引的向量。// 创建输出点云的索引容器std::vector<int> newPointIdxVector;// 从八叉树体素中获取点索引向量,这在之前的缓冲区中不存在octree.getPointIndicesFromNewVoxels (newPointIdxVector);// Output pointsstd::cout << "Output from getPointIndicesFromNewVoxels:" << std::endl;for (std::size_t i = 0; i < newPointIdxVector.size (); ++i)std::cout << i << "# Index:" << newPointIdxVector[i]<< "  Point:" << (*cloudB)[newPointIdxVector[i]].x << " "<< (*cloudB)[newPointIdxVector[i]].y << " "<< (*cloudB)[newPointIdxVector[i]].z << std::endl;}

  由以上代码可知,点云A生成八叉树结构后,使用
pcl::octree::OctreePointCloudChangeDetectorpcl::PointXYZ octree (resolution);
和 octree.switchBuffers ();来分析无组织的点云的空间变化,将又一次生成的点云B放入之前点云A的树状结构中,并检索出点云B中没在之前点云A创建的树状结构中的点。
   通俗来说可以这样理解,假设A是一片人型点云,由人型点云创建了一个八叉树状结构,此时八叉树涵盖了A中所有点的位置,当第二片人形点云B出现,B和A的唯一区别就是B的左臂向上抬,此时利用上述方式,将B也放入之前A的树状结构,但是B的左臂上的点肯定不在之前A的树状结构中,因此会产生额外的树叶,这些额外的树叶内的点就是变化的点,即左臂的点。
例如下图中红色区域。
在这里插入图片描述
  有人会问,为什么黑色的影子部分的点明明消失了,为何不变红?因为点虽然消失了,但是左图中点创建的树状结构依然存在,因此不被判定为变化的点。
  需要注意的是,使用OcTree进行无组织的点的差分分析确实能起到较好结果,但是并不建议用在有序点的差分上,对于通常基于固定宽度和高度的单一2D深度/视差图像的有组织点云,直接对相应的2D深度图像进行差分分析可能会更快。


【博主简介】
  斯坦福的兔子,男,天津大学机械工程工学硕士。毕业至今从事光学三维成像及点云处理相关工作。因工作中使用的三维处理库为公司内部库,不具有普遍适用性,遂自学开源PCL库及其相关数学知识以备使用。谨此将自学过程与君共享。
博主才疏学浅,尚不具有指导能力,如有问题还请各位在评论处留言供大家共同讨论。
若前辈们有工作机会介绍欢迎私信。


http://chatgpt.dhexx.cn/article/18GiksmM.shtml

相关文章

十进制小数化为二进制小数的方法是什么_十进制转成二进制的两种方式

第一种&#xff1a;用2整除的方式。 用2整除十进制整数&#xff0c;得到一个商和余数&#xff1b;再用2去除商&#xff0c;又会得到一个商和余数&#xff0c;如此重复&#xff0c;直到商为小于1时为止&#xff0c;然后把先得到余数作为二进制数的低位有效位&#xff0c;后得到的…

Python 利用内置函数把二进制小数转换为十进制

如果需要把一个二进制整数转换为十进制整数&#xff0c;只需要简单的一行&#xff1a; int(1101,2) 但如果有一个二进制小数的话&#xff0c;就需要自己实现一个函数了。 不过&#xff0c;许多人是这样写的&#xff1a;(图片取自这里) 可是&#xff0c;由于python本身并不适…

[学习笔记] 二进制小数表示方法

文章目录 科学计数法二进制推广计算机中的小数EXCESS表示系统特殊情况举例&#xff08;float&#xff09;普通情况最大正实数普通情况最小负实数普通情况最小正实数特殊情况最大正实数 科学计数法 科学计数法想必大家都很熟悉了&#xff0c;往往通过如下形式表示一个实数&…

十进制小数化为二进制小数的方法是什么_二进制的转换

二进制是在计算机中常用的一种进制数&#xff0c;其数据用0和1两个数码来表示数据。我们人类常用的是十进制&#xff0c;那么二进制和十进制之间是有一个转换方法的。 二进制转换十进制 一个二进制数转换为十进制数&#xff0c;是比较简单的&#xff0c;其方法就是用每一个位置…

二进制小数的意义

回忆小学学的十进制小数的意义&#xff1a; 15.23这个小数&#xff0c;1是十位&#xff0c;5是个位&#xff0c;2是十分位&#xff0c;3是百分位。这个小数的意义为&#xff1a;&#xff0c;因为最低位为百分位&#xff0c;所以分母是100。 小数末尾加上0或去掉0&#xff0c;小…

浮点数(小数)在计算机中如何用二进制存储?

浮点数在计算机中如何用二进制存储&#xff1f; 前言 前面我有篇博文详解了二进制数&#xff0c;以及如何同二进制数表示整数。但是&#xff0c;计算机处理的不仅仅是整数&#xff0c;还有小数&#xff0c;同样小数在计算机也是用二进制进行存储的&#xff0c;但是&#xff0…

二进制小数的表示

二级制小数分为两大类&#xff1a;1、定点数&#xff1b;2、浮点数。 定点数 定点数&#xff1a; &#xff08;1&#xff09;小数点位置固定不变的数。 &#xff08;2&#xff09;定点数有定点整数和定点小数。 &#xff08;定点整数&#xff1a;小数部分为0&#xff1b;定点…

腾讯TDSQL全时态数据库系统论文入选VLDB

当地时间2019年8月26至30日&#xff0c;VLDB 2019会议在美国加利福尼亚召开&#xff0c;腾讯分布式数据库TDSQL与中国人民大学最新联合研究成果被VLDB 2019接收并将通过长文形式发表。VLDB是国际数据管理与数据库领域顶尖的学术会议之一&#xff0c;这是继去年腾讯TDSQL相似度计…

顶会VLDB‘22论文解读:CAE-ENSEMBLE算法

摘要&#xff1a;针对时间序列离群点检测问题&#xff0c;提出了基于CNN-AutoEncoder和集成学习的CAE-ENSEMBLE深度神经网络算法&#xff0c;并通过大量的实验证明CAE-ENSEMBLE算法能有效提高时间序列离群点检测的准确度与效率。 本文分享自华为云社区《VLDB22 CAE-ENSEMBLE论文…

【轨迹压缩】Trajectory Simplification: On Minimizing the Direction-based Error [2015] [VLDB]

一、一个动机 保护方向信息的方向保持轨迹简化&#xff08;DPTS&#xff09;已被证明表现良好&#xff0c;而现有关于 DPTS 的研究 要求用户指定一个容错&#xff0c;在某些情况下用户可能不知道如何正确设置&#xff08;例如&#xff0c;容错只能在未来某个时间知道&#xff…

VLDB 2021 EAB最佳论文:深度解析机器学习的基数估计为何无法实现?

©作者 | 曲昌博单位 | 西蒙菲莎大学近日&#xff0c;IEEE 数据工程新星奖王健楠团队论文《Are We Ready for Learned Cardinality Estimation?》夺得数据库顶会 VLDB 2021 年度的 EA&B 最佳论文奖。 数据库是企业管理和查询数据的复杂软件系统。 近年来随着机器学习以…

Transformers如何处理表格数据?【VLDB2022教程】Transformer表格数据表示:模型和应用...

来源&#xff1a;专知 本文为教程介绍&#xff0c;建议阅读5分钟最近的研究工作通过开发表格数据的神经表示扩展了语言模型。 在过去的几年中&#xff0c;自然语言处理界见证了基于transformer的语言模型(LM)在自由文本的神经表示方面的进展。鉴于关系表中可用知识的重要性&…

openGauss亮相VLDB2020,展示内存优化研究成果

VLDB&#xff08;Very Large Data Base&#xff09;作为数据库领域的三大顶级国际会议之一&#xff0c;是面向数据库研究人员&#xff0c;内核开发人员&#xff0c;开发商以及用户的年度国际会议论坛&#xff0c;代表数据库系统领域最杰出的研究和工程进展。在2020年&#xff0…

VLDB 2023 | 北大河图发布分布式训练神器Galvatron,一键实现大模型高效自动并行...

©作者 | 北京大学河图团队 单位 | 北京大学数据与智能实验室 北大河图团队提出了一套面向大模型的自动并行分布式训练系统 Galvatron&#xff0c;相比于现有工作在多样性、复杂性、实用性方面均具有显著优势&#xff0c;论文成果已经被 VLDB 2023 接收。 最近一段时间&…

利用 Map-Reduce 从文件中找到出现频率最高的 10 个 URL(2021 VLDB Summer School Lab0)

这篇博文主要是对 2021 VLDB Summer School Lab0 的一个总结 这个lab与MIT 6.824 的 lab1 相似&#xff0c;个人感觉比MIT 6.824 的 lab1 要稍微简单些&#xff0c;更容易上手。通过这个lab&#xff0c;可以学习到一些 Golang 的基础知识并对分布式系统有一个基础的了解&#…

Flink OLAP 助力 ByteHTAP 亮相数据库顶会 VLDB

复杂查询 QPS 破百&#xff0c;字节跳动 Flink OLAP 助力 ByteHTAP 亮相数据库顶会 VLDB。 2022 年 9 月 5 日至 9 月 9 日&#xff0c;VLDB 2022 在澳大利亚悉尼举行。字节跳动基础架构研究成果《ByteHTAP: ByteDance’s HTAP System with High Data Freshness and Strong Dat…

湖南大学计算机专业硕士研究导师,湖南大学研究生导师李睿科研论文被世界顶级数据库学术会议VLDB刊发...

李睿老师的论文被国际数据库顶级会议Very Large Data Bases接受并发表。 刊发的论文。 日前&#xff0c;以湖南大学信息科学与工程学院计算机科学系研究生导师李睿为第一作者&#xff0c;湖南大学为第一作者单位的科研论文“Fast Range Query Processing with Strong Privacy P…

PM-LSH: A Fast and Accurate LSH Framework for High-Dimensional Approximate NN Search(VLDB)

由于维数灾难的影响&#xff0c;高维空间中的最近邻(NN)搜索本质上是计算开销巨大的。局部敏感哈希(locality-sensitive hashing, LSH)是一种著名的近似神经网络搜索算法&#xff0c;能够以恒定概率在亚线性时间内回答c-近似神经网络(c-ANN)查询。现有的LSH方法主要基于哈希桶建…

Updatable Learned Index with Precise Positions(VLDB2022)

在现代数据库引擎中&#xff0c;索引在加速查询处理方面起着至关重要的作用。“学习索引”的新范式极大地改变了DBMS中索引结构的设计方式。关键的见解是&#xff0c;索引可以被视为预测数据集中查找键位置的学习模型。虽然这类研究在查找时间和索引大小方面都显示出良好的结果…

VLDB 2023 | 北大河图发布分布式训练神器Galvatron, 一键实现大模型高效自动并行...

关注公众号&#xff0c;发现CV技术之美 本文转自机器之心。 北大河图团队提出了一套面向大模型的自动并行分布式训练系统Galvatron&#xff0c;相比于现有工作在多样性、复杂性、实用性方面均具有显著优势&#xff0c;论文成果已经被 VLDB 2023 接收。 最近一段时间&#xff0c…