用于点云的二进制熵编解码的方法和设备

文档序号:639582 发布日期:2021-05-11 浏览:41次 >En<

阅读说明:本技术 用于点云的二进制熵编解码的方法和设备 (Method and apparatus for binary entropy encoding and decoding of point clouds ) 是由 S·拉瑟雷 于 2019-10-02 设计创作,主要内容包括:用于对点云进行编码的方法和设备。使用二进制熵编解码来对表示体积的子体积的占用模式的比特序列进行编解码。针对比特序列中的给定比特,上下文可以基于对应于该比特的子体积的子体积邻居配置。子体积邻居配置依赖于体积的邻近体积的一组子体积的占用模式,这组子体积与对应于给定比特的子体积邻近。上下文还可以基于比特序列的先前编解码的比特的部分序列。(Method and apparatus for encoding a point cloud. A binary entropy codec is used to codec a bit sequence representing an occupancy pattern of a sub-volume of the volume. For a given bit in the bit sequence, the context may be based on a sub-volume neighbor configuration of the sub-volume corresponding to the bit. The sub-volume neighbor configuration depends on the occupancy pattern of a set of sub-volumes of the volume&#39;s neighboring volume, which set of sub-volumes is neighboring the sub-volume corresponding to a given bit. The context may also be based on a partial sequence of previously coded bits of the bit sequence.)

具体实施方式

本申请描述了对点云进行编码和解码的方法和用于对点云进行编码和解码的编码器和解码器。可以使用熵编解码(例如二进制熵编解码)来对表示当前体积的子体积的占用模式的比特序列进行编解码。用于熵编解码的概率(例如上下文)可以基于当前体积的邻居配置和比特序列的先前编解码的比特的部分序列。这些概率还可以基于当前体积的至少一个邻近体积的子体积的占用数据。具体地,可以至少部分地基于子体积邻居配置,选择用于对比特序列中的比特进行编解码的概率,该子体积邻居配置依赖于至少一个邻近体积的一组子体积的占用模式,这组子体积与对应于比特序列中的比特的当前体积的子体积邻近。

在对理解本申请有用的示例中,可以做出关于是否要应用上下文约简操作的确定,且如果确定要应用上下文约简操作,那么该操作约简可用上下文的数量。示例上下文约简操作包括:基于通过与先前编解码的比特相关联的子体积进行的屏蔽来约简邻居配置、对空邻居配置的特殊处理以及基于统计的上下文合并。可以在编解码之前应用约简,并且可以在编解码期间做出关于是否满足用于使用约简的上下文集合的情况的确定。

在一个方面,本申请提供了一种对点云进行编码以生成压缩后的点云数据的比特流的方法,该点云在具有多个节点的树形结构中被定义,多个节点具有父子关系并且其表示体积空间的几何形状,该体积空间的几何形状被递归地拆分成子体积并且包含点云的点,其中使用比特序列来指示体积的子体积的占用,其中比特序列的每个比特指示了相应子体积在体积内按扫描顺序的占用,并且其中体积具有多个邻近体积。该方法包括:针对与拆分成子体积的当前体积相关联的当前节点,其中每个子体积对应于当前节点的子节点,确定指示了当前体积的子体积的占用的比特序列。该方法还包括:针对当前体积的比特序列中的至少一个比特,基于当前体积的至少一个邻近体积的子体积的占用数据,确定子体积邻居配置,该子体积邻居配置依赖于至少一个邻近体积的一组子体积的占用模式,这组子体积与对应于比特序列中的比特的当前体积的子体积邻近。该方法还包括:选择用于比特序列中的比特的熵编码的概率(例如上下文),其中选择至少部分地基于子体积邻居配置。该方法还包括:使用二进制熵编码器基于所选择的概率来对比特序列中的比特进行熵编码,以产生用于比特流的编码数据。

另一方面涉及一种对压缩后的点云数据的比特流进行解码以产生重构的点云的方法,该点云在具有多个节点的树形结构中被定义,多个节点具有父子关系并且其表示体积空间的几何形状的多个节点,该体积空间被递归地拆分成子体积并且包含点云的点,其中使用比特序列来指示体积的子体积的占用,其中比特序列的每个比特指示了相应子体积在体积内按扫描顺序的占用,并且其中体积具有多个邻近体积。该方法包括:针对与拆分成子体积的当前体积相关联的当前节点,其中每个子体积对应于当前节点的子节点,且针对当前体积的比特序列中的至少一个比特,基于当前体积的至少一个邻近体积的子体积的占用数据,确定子体积邻居配置,该子体积邻居配置依赖于至少一个邻近体积的一组子体积的占用模式,这组子体积与对应于比特序列中的比特的当前体积的子体积邻近。该方法还包括:选择用于比特序列中的比特的熵解码的概率(例如上下文),其中选择至少部分地基于子体积邻居配置。该方法还包括:使用二进制熵解码器基于所选择的概率来对所述至少一个比特进行熵解码,以根据比特流产生重构比特。

在一些实施方式中,确定子体积邻居配置可以涉及:基于当前体积的至少一个邻近体积的子体积的占用数据,确定至少一个邻近体积的子体积的数量,该至少一个邻近体积的子体积与对应于比特序列中的比特的当前体积的子体积邻近。所述确定还可以涉及:向所确定的数量应用阈值函数。

在一些实施方式中,给定体积中的给定子体积的子体积邻居配置可以对应于给定体积的邻近体积中的与给定子体积邻近的子体积的占用模式。

在一些实施方式中,确定子体积邻居配置可以基于当前体积的已经被编解码的那些邻近体积的子体积的占用数据。

在一些实施方式中,选择概率还可以基于比特序列的已经被编解码的比特的部分序列和/或当前体积的邻近配置。当前体积的邻近配置可以对应于当前体积的邻近体积的占用模式。

在一些实施方式中,确定子体积邻居配置可以涉及:基于当前体积的至少一个邻近体积的子体积的占用数据,确定至少一个邻近体积的所有那些子体积,那些子体积与对应于比特序列中的比特的当前体积的子体积相交。所述确定还可以涉及:向所确定的子体积应用相应权重因子,其中每个权重因子依赖于相应的所确定的子体积与对应于比特序列中的比特的当前体积的子体积的交集。所述确定还可以涉及:基于所确定的子体积及其相应权重因子,确定至少一个邻近体积的、与当前体积的对应于比特序列中的比特的子体积相交的子体积的加权数量。

在一些实施方式中,用于确定指示了占用模式的比特序列的当前体积内的扫描顺序可以被确定为使得按扫描顺序从一个子体积到下一个子体积,当前体积的已经被编解码的邻近体积中的邻近子体积的最大可能数量不会增加。

在一些实施方式中,当前体积的给定邻近体积的子体积的占用数据可以包括给定邻近体积的子体积中的每个子体积的占用状态。

在一些实施方式中,树形结构可以表示八叉树。

在一些实施方式中,编码方法还可以包括:对标记进行编码,该标记指示了用于至少一个比特的熵编码的概率已经至少部分地基于子体积邻居配置而被选择。

在一些实施方式中,解码方法还可以包括:对来自比特流的标记进行解码,该标记指示了用于至少一个比特的熵解码的概率应该至少部分地基于子体积邻居配置而被选择。

在另一方面中,本申请提供了一种对点云进行编码以生成压缩后的点云数据的比特流的方法,该点云在具有多个节点的树形结构中被定义,多个节点具有父子关系并且其表示体积空间的几何形状的多个节点,该体积空间被递归地拆分成子体积并且包含点云的点,其中使用比特序列来指示体积的子体积的占用,其中该比特序列的每个比特指示了相应子体积在体积内按扫描顺序的占用,并且其中体积具有多个邻近体积,邻近体积的占用模式是邻居配置。该方法包括:针对体积的比特序列中的至少一个比特,确定满足上下文约简条件,且在此基础上,选择约简的上下文集合,该上下文集合包含的上下文比邻居配置的计数与序列中的若干先前编解码的比特的乘积少;基于邻近体积中的至少一些邻近体积的占用状态和比特序列的至少一个先前编解码的比特,从约简的上下文集合中选择上下文,用于对至少一个比特进行编解码;使用二进制熵编码器基于所选择的上下文,对至少一个比特进行熵编码以产生用于比特流的编码数据;以及更新所选择的上下文。

在另一方面中,本申请提供了一种对压缩后的点云数据的比特流进行解码以产生重构的点云的方法,该点云在具有多个节点的树形结构中被定义,多个节点具有父子关系并且其表示体积空间的几何形状,该体积空间被递归地拆分成子体积并且包含点云的点,其中使用比特序列来指示体积的子体积的占用,其中该比特序列的每个比特指示了相应子体积在体积内按扫描顺序的占用,并且其中体积具有多个邻近体积,邻近体积的占用模式是邻居配置。该解码方法包括:针对体积的比特序列中的至少一个比特,确定满足上下文约简条件,且在此基础上,选择约简的上下文集合,该上下文集合包含的上下文比邻居配置的计数与序列中的若干先前编解码的比特的乘积少;基于邻近体积中的至少一些邻近体积的占用状态和比特序列的至少一个先前编解码的比特,从约简的上下文集合中选择上下文,用于对至少一个比特进行编解码;使用二进制熵解码器基于所选择的上下文来对至少一个比特进行熵解码,以根据比特流产生重构比特;以及更新所选择的上下文。

在一些实施方式中,上下文约简条件可以包括:确定一个或多个先前编解码的占用比特与一个或多个相应子体积相关联,该相应子体积定位于与至少一个比特相关联的子体积和邻近体积中的一个或多个邻近体积之间。在一些情况下,这可以包括:确定与先前编码的比特相关联的四个子体积与特定邻居体积共享面。

在一些实施方式中,上下文约简条件可以包括:确定先前已经对比特序列的至少四个比特进行了编解码。

在一些实施方式中,确定满足上下文约简条件可以包括:确定邻近体积的占用模式指示多个邻近体积是未占用的。在那些情况中的一些情况下,所选择的约简的上下文集合可以包括对应于比特序列中的先前编解码的比特的数量的若干上下文,并且可选地,选择上下文可以包括基于比特序列中的先前编解码的比特之和来选择上下文。

在一些实施方式中,上下文约简条件可以包括:确定先前已经对比特序列中的至少阈值数量的比特进行了编解码,并且约简的上下文集合可以包括查找表,该查找表将邻居配置与比特序列中的先前编解码的比特的模式的每个可能组合映射到较少上下文。在一些示例中,在确定了相应的可用上下文对之间的距离测量小于阈值的基础上,可以基于将可用上下文迭代地分组为多种类别来生成查找表,并且多种类别中的每种类别可以在较小集合中包括相应上下文,并且针对邻居配置与比特序列中的先前编解码的比特的模式的每个可能组合,都可以存在可用上下文。

在一些实施方式中,邻近体积中的至少一些邻近体积是与体积共享至少一个面的邻近体积。

在另一方面,本申请描述了配置为实施这种编码和解码方法的编码器和解码器。

在再一方面,本申请描述了存储计算机可执行程序指令的非瞬态计算机可读介质,该计算机可执行程序指令在被执行时使一个或多个处理器执行所描述的编码和/或解码方法。

在又一方面中,本申请描述了一种包含程序指令的计算机可读信号,该程序指令在被计算机执行时使计算机执行所描述的编码和/或解码方法。

本申请还描述计算机实施的应用,包括地形应用、制图应用、汽车工业应用、自动驾驶应用、虚拟现实应用以及文化遗产应用等。这些计算机实施的应用包括以下进程:接收数据流或数据文件、将数据流或数据文件解包以获得压缩后的点云数据的比特流、以及对如在以上方面及其实施方式中所描述的比特流进行解码。由此,这些计算机实施的应用根据贯穿本申请所描述的方面及其实施方式利用点云压缩技术。

本申请还描述对点云进行编码和解码的方法和用于对点云进行编码和解码的编码器和解码器。在一些实施方式中,接收单元接收通过对编解码的点云数据与其他编解码的数据类型(诸如元数据、图像、视频、音频和/或图形)进行复用而获得的复用数据。接收单元包括用于将复用数据分离成编解码的点数据和其他编解码数据的解复用单元和用于对编解码的点云数据进行解码的至少一个解码单元(或解码器)。在一些其他实施方式中,发射单元发射通过对编解码的点云数据与其他编解码的数据类型(诸如元数据、图像、视频、音频和/或图形)进行复用而获得的复用数据。发射单元包括用于对点云数据进行编码的至少一个编码单元(或编码器)和用于将编解码的点云数据和其他编解码数据组合成复用数据的复用单元。

本领域的普通技术人员将通过结合附图对示例的以下描述进行回顾来理解本申请的其他方面和特征。

也可以相对于一个或多个其他方面/实施例来使用相对于本发明的一个方面或实施例描述的任何特征。本发明的这些和其他方面将根据本文中所描述的实施例而变得显而易见并且参考本文中所描述的实施例加以说明。

有时,在以下描述中,术语“节点”、“体积”以及“子体积”可以互换地使用。应了解,节点与体积或子体积相关联。节点是树上的可为内部节点或叶节点的特定点。体积或子体积是节点表示的有界物理空间。在一些情况下,术语“体积”可以用于指指代被定义用于包含点云的最大有界空间。出于构建互连节点的树形结构以对点云数据进行编解码的目的,可以将体积递归地划分为子体积。

在本申请中,术语“和/或”旨在涵盖所列元件的所有可能组合和子组合,包括单独列出的元件中的任何一个、任何子组合或所有元件,但不必排除附加元件。

在本申请中,短语“……或……中的至少一个”旨在涵盖所列元件中的任何一个或多个,包括单独列出的元件中的任何一个、任何子组合或所有元件,但不必排除任何附加元件,也不一定需要所有元件。

点云是三维坐标系中的点集合。这些点通常旨在表示一个或多个物体的外部表面。每个点具有三维坐标系中的一个地点(位置)。该位置可以由三个坐标(X、Y、Z)表示,其可以是笛卡尔或任何其他坐标系。这些点可以具有其他相关联的属性(诸如颜色),在一些情况下,这些属性也可以是三个分量值,诸如R、G、B或Y、Cb、Cr。依赖于点云数据的期望应用,其他相关联的属性可以包括透明度、反射率、法线向量等。

点云可以是静态的或动态的。例如,物体或地形的详细扫描或映射可以是静态点云数据。出于机器视觉目的的基于LiDAR的环境扫描可以是动态的,这是由于点云(至少潜在地)随着时间而改变,例如随着对体积的每次连续扫描。因此,动态点云是点云的时间顺序的序列。

点云数据可以在若干应用中被使用,给出一些示例,包括保护(对历史或文化物体的扫描)、地图绘制、机器视觉(诸如自主或半自主汽车)和虚拟现实系统。用于如机器视觉等应用的动态点云数据可以与用于保护目的静态点云数据完全不同。例如,汽车视觉通常涉及通过LiDAR(或类似)传感器以高捕获频率获得的相对小的分辨率、无色、高度动态的点云。此类点云的目的不用于人类消耗或查看,而是用于决策进程中的机器物体检测/分类。作为示例,典型的LiDAR帧包含数以万计的点,而高质量的虚拟现实应用需要数百万个点。可以预期随着时间的流逝,随着运算速度的增加和新应用的发现,将需要更高分辨率的数据。

虽然点云数据是有用的,但缺乏有效且高效的压缩(即,编码和解码进程)可能会妨碍采用和部署。在对点云进行编解码时在其他数据压缩(比如音频或视频)的情况下不会出现的特定挑战是对点云的几何形状进行编解码。点云往往分布稀疏,这使得高效地对点的地点进行编解码更具挑战性。

用于对点云数据进行编解码的更普遍的机制中的一种机制是通过使用基于树的结构。在基于树的结构中,将点云的有界三维体积递归地划分为子体积。树的节点对应于子体积。可以基于树的分辨率和/或是否存在子体积中所包含的任何点,来决定是否要进一步划分子体积。叶节点可以具有占用标记,该占用标记指示其相关联的子体积是包含点还是不包含点。拆分标记可以表示节点是否具有子节点(即,当前体积是否已经进一步被拆分成子体积)。在一些情况下,可以对这些标记进行熵编解码,且在一些情况下,可以使用预测编解码。

常用的树形结构是八叉树。在该结构中,体积/子体积都是立方体,并且子体积的每次拆分都产生八个其他子体积/子立方体。另一种常用的树形结构是KD树,在KD树中,体积(立方体或长方体)被与轴中的一个轴正交的平面递归地划分为两个部分。八叉树是KD树的特殊情况,其中体积被三个平面划分,三个平面分别与三个轴中的一个轴正交。这两个示例都涉及立方体或长方体;然而,本申请不限于此类树形结构,并且在一些应用中,体积和子体积可以具有其他形状。体积并不一定要被分成两个子体积(KD树)或八个子体积(八叉树),而是可以涉及其他分区,包括划分为非矩形形状或涉及不相邻的子体积。

为了便于解释,并且由于八叉树是用于汽车应用的流行的候选树形结构,因此本申请可以参考八叉树,但应理解,本文中所描述的方法和设备可以使用其他树形结构来实施。

现在参考图1,其示出了根据本申请的方面的点云编码器10的简化框图。点云编码器10包括用于接收点云数据并且产生树(在该示例中为八叉树)的树构建模块12,该树表示包含点云的体积空间的几何形状并指示来自该几何形状中的点云的点的地点或位置。

用于创建八叉树以对点云进行编解码(code)的基本进程可以包括:

1.从包含坐标系统中的点云的有界体积(立方体)开始

2.将体积拆分成8个子体积(八个子立方体)

3.针对每个子体积,如果子体积为空,那么用0标记子体积,或如果在子体积中存在至少一个点,那么用1标记子体积

4.针对用1标记的所有子体积,重复(2)以拆分这些子体积,直到达到最大拆分深度为止

5.针对最大深度的所有叶子体积(子立方体),如果其是非空,那么用1标记叶立方体,否则用0标记叶立方体。

以上进程可以被描述为占用等于拆分进程,其中拆分暗示占用,约束是存在最大深度或分辨率,超过该最大深度或分辨率将不会发生进一步拆分。在这种情况下,单个标记表示节点是否被拆分,因此表示该节点是否被至少一个点占用,反之亦然。在最大深度处,标记表示占用,其中不可能进行进一步拆分。

在一些实施方式中,拆分和占用是独立的,使得节点可以被占用并且可以被拆分或可以不被拆分。存在该实施方式的两种变型:

1.拆分后占用。信号标记指示节点是否被拆分。如果被拆分,那么节点必须包含点——即,拆分暗示占用。否则,如果节点不被拆分,那么另一占用标记表示节点是否包含至少一个点。因此,当节点不被进一步拆分(即,该节点是叶节点)时,叶节点必须具有相关联的占用标记,以指示该叶节点否包含任何点。

2.占用后拆分。信号标记指示节点是否被占用。如果不被占用,那么不发生拆分。如果被占用,那么对拆分标记进行编码,以指示节点是被进一步拆分还是不被进一步拆分。

不管使用上述进程中的哪个进程来构建树,都可以按预定义顺序(宽度优先或深度优先以及根据每个划分后的子体积内的扫描模式/顺序)遍历树,以根据标记(占用和/或拆分标记)产生比特序列。这可以被称为树的序列化或二进制化。如图1中所示出,在该示例中,点云编码器10包括用于对八叉树进行二进制化以产生表示树的二进制化数据的比特流的二进制化器14。

然后可以使用熵编码器16对该比特序列进行编码,以产生压缩后的比特流。熵编码器16可以使用上下文模型18对比特序列进行编码,该上下文模型基于熵编码器16的上下文确定来指定用于对比特进行编解码的概率。在对每个比特或所定义的比特集合进行编解码之后,可以自适应地更新上下文模型18。在一些情况下,熵编码器16可以是二进制算术编码器。在一些实施方式中,二进制算术编码器可以采用上下文自适应二进制算术编解码(CABAC)。在一些实施方式中,可以使用除算术编解码器以外的编解码器。

在一些情况下,熵编码器16可以不是二进制编解码器,而是可以对非二进制数据进行操作。来自树构建模块12的输出的八叉树数据可以不以二进制形式被评估,而是可以被编码为非二进制数据。例如,在八叉树的情况下,可以将子体积内的按其扫描顺序的八个标记(例如占用标记)视为28-1比特数(例如具有在1与255之间的值的整数,这是由于对于拆分的子体积而言,值0是不可能的,即,如果子体积完全未被占用,那么将不会拆分该子体积)。在一些实施方式中,可以通过熵编码器使用多符号算术编解码器来对该数进行编码。在子体积(例如立方体)内,定义了该整数的标记的序列可以被称为“模式”。

如同视频或图像编解码,点云编解码可以包括预测性操作,在该预测性操作中,努力预测子体积的模式。预测可以是空间的(依赖于相同点云中的先前编解码的子体积)或时间的(依赖于点云的时间顺序序列中的先前编解码的点云)。

在图2中示出了对应于编码器10的示例点云解码器50的框图。点云解码器50包括使用由编码器10使用的相同上下文模型54的熵解码器52。熵解码器52接收压缩数据的输入比特流,并对数据进行熵解码以产生解压缩比特的输出序列。然后通过树重构器56将序列转换为重构的点云数据。树重构器56根据解压缩的数据和对树数据进行二进制化的扫描顺序的知识来重建树形结构。因此,树重构器56能够重构来自点云的点的地点(受树编解码的分辨率限制)。

在图3中示出了示例部分子体积100。在该示例中,为了易于说明,以二维方式示出了子体积100,并且子体积100的大小为16×16。应注意,已经将子体积划分为四个8×8子正方形,并且已经将这四个子正方形中的两个子正方形进一步细分为4×4子正方形,将4×4子正方形中的三个4×4子正方形进一步划分为2×2子正方形,并且然后将2×2子正方形中的一个2×2子正方形划分为1×1正方形。1×1正方形是树的最大深度并且表示针对位置点数据的最高分辨率。将来自点云的点示出为图中的圆点。

在子体积100的右侧示出了树102的结构。在树102的右侧示出了以预定义的宽度优先扫描顺序获得的拆分标记104的序列和占用标记106的对应序列。将观察到,在该说明性示例中,针对未被拆分(即,具有设置为零的相关联的拆分标记)的每个子体积(节点)存在占用标记。可以对这些序列进行熵编码。

在图4中示出了采用占用≡拆分条件的另一示例。图4图示了八叉树150的递归拆分和编解码。图中仅示出了八叉树150的一部分。将FIFO 152示出为处理用于拆分的节点,以图示本进程的宽度优先性质。FIFO 152输出在FIFO 152中排队的占用节点154,以便在处理其父节点156之后进行进一步拆分。树构建器将与占用节点154相关联的子体积拆分成八个子体积(立方体)并且确定其占用。可以通过每个子体积的占用标记来指示占用。按规定的扫描顺序,标记可以被称为节点154的占用模式。可以通过表示与呈预定义扫描顺序的子体积相关联的占用标记的序列的整数来指定模式。在八叉树的情况下,模式是在范围[1,255]内的整数。

熵编码器然后基于由上下文模型指定的概率来使用非二进制算术编码器对该模式进行编码。在该示例中,概率可以基于初始分布模型的模式分布并且被自适应地更新。在一种实施方式中,模式分布实际上是已经在编解码期间遇到每种模式(从1到255的整数)的次数的计数器。可以在对每个子体积进行编解码之后更新模式分布。由于模式的相对频率与概率评估有密切关系并且与绝对计数无密切关系,因此可以根据需要对模式分布进行归一化。

基于模式,然后将被占用(例如具有标记=1)的那些子节点推送到FIFO 152中,以便依次进行进一步拆分(倘若节点不是树的最大深度)。

现在参考图5,其示出了来自八叉树的示例立方体180。将立方体180细分为八个子立方体。用于读取标记的扫描顺序产生八比特字符串,可以将该八比特字符串读取为呈二进制形式的整数[1,255]。基于扫描顺序和字符串中的每个子立方体的标记的所得比特位置,子立方体具有图5中所示出的值。倘若编码器和解码器两者使用相同的扫描顺序,那么扫描顺序可以是子立方体的任何序列。

作为示例,图6示出了占用四个“前”子立方体的立方体180。在所占用的子立方体是立方体1+4+16+64的基础上,这将对应于模式85。整数模式编号指定子立方体中的占用模式。

因为树倾向于因式分解点坐标的高阶比特,所以八叉树表示或更一般地任何树表示在表示具有空间相关性的点时是高效的。针对八叉树,每个深度层级针对每个分量将子体积内的点的坐标细化一个比特,每次细化需要花费八个比特。通过对与每个树节点相关联的拆分信息(即,模式)进行熵编解码来获得进一步压缩。因为模式分布是不均匀的(不均匀性是相关性的另一结果),所以该进一步压缩是可能的。

当前系统中的一种潜在的低效率在于,在对点云进行编解码的过程中发展了模式分布(例如在树的先前编解码的节点中看到的模式编号的直方图)。在一些情况下,模式分布可以被初始化为等概率的,或可以被初始化为某种其他预定分布;但是使用一种模式分布意味着上下文模型没有考虑或不利用局部几何相关性。

在欧洲专利申请第18305037.6号中,本申请人描述了用于基于来自特定节点附近的先前编解码的节点的一些占用信息来在用于对特定节点的占用模式进行编解码的可用模式分布之间进行选择的方法和设备。在一种示例实施方式中,从父节点到特定节点的占用模式获得占用信息。在另一种示例实施方式中,从与特定节点邻近的一个或多个节点获得占用信息。欧洲专利申请第18305037.6号的内容通过引用的方式并入本文。

现在参考图7,其以流程图形式示出了对点云进行编码的一种示例方法200。在该示例中,方法200涉及对占用节点(子体积)的递归拆分和用于编解码的树的宽度优先的遍历。

在操作202中,编码器确定当前节点的占用模式。当前节点是占用节点,其已经被拆分成八个子节点,每个子节点对应于一个相应的子立方体。当前节点的占用模式以扫描顺序指定八个子节点的占用。如上文所描述,可以使用在1与255之间的整数(例如八比特二进制字符串)来指示该占用模式。

在操作204中,编码器从概率分布集合中选择概率分布。对概率分布的选择基于来自附近的先前编解码的节点(即,作为当前节点的邻居的至少一个节点)的一些占用信息。在一些实施例中,如果两个节点与共享至少一个面的相应子体积相关联,那么这两个节点是邻近的。在更广义的定义中,如果节点共享至少一个边缘,那么这些节点是邻近的。在又一更广义的定义中,如果两个节点共享至少一个顶点,那么这两个节点是邻近的。当前节点是子节点的父模式将当前节点和七个同级节点的占用数据提供给当前节点。在一些实施方式中,占用信息是父模式。在一些实施方式中,占用信息是邻居节点集合的占用数据,该邻居节点集合包括在与当前节点处于相同的树深度层级处但具有不同父节点的节点。在一些情况下,这些的组合是可能的。例如,邻居节点集合可以包括一些同级节点和一些非同级节点。

如由操作206所指示的,一旦已经选择了概率分布,编码器然后使用所选择的概率分布来对当前节点的占用模式进行熵编码。编码器然后基于占用模式来在操作208中更新所选择的概率分布,例如编码器可以对对应于该占用模式的计数进行增量。在操作210中,编码器评估是否存在要编解码的其他节点,如果存在,那么返回至操作202以对下一个节点进行编解码。

在操作204中的概率分布选择将基于附近的先前编解码的节点的占用数据。这允许编码器和解码器两者独立地进行相同选择。针对概率分布选择的以下讨论,将参考图8,其以图表方式图示了包括当前节点302的部分八叉树300。当前节点302是占用节点并且正在进行评估以用于进行编解码。当前节点302是父节点306的八个子中的一个子,该父节点又是祖父节点(未示出)的子。将当前节点302划分为八个子节点304。当前节点302的占用模式基于子节点304的占用。例如,如所图示的,使用黑色圆点是占用节点的规范,占用模式可以是00110010,即,模式50。

当前节点302具有同级节点308,该同级节点具有相同的父节点306。父模式是父节点306的占用模式,如所图示的,占用模式将为00110000,即,模式48。父模式可以充当用于选择合适的概率分布以对当前节点的占用模式进行熵编码的基础。

图9图示了在当前节点周围的邻居集合,其中邻居被定义为共享面的节点。在该示例中,节点/子体积是立方体,并且在图像的中心处的立方体具有六个邻居,每个面存在一个邻居。在八叉树中,应了解,当前节点的邻居将包括三个同级节点。当前节点的邻居还将包括不具有相同的父节点的三个节点。因此,邻近节点中的一些邻近节点的占用数据将是可用的,这是因为他们是同级的,但是一些邻近节点的占用数据可以是或可以不是可用的,这依赖于是否先前已对那些节点进行编解码。可以将特殊处理应用于处理缺失的邻居。在一些实施方式中,缺失的邻居可以被假定为被占用或可以被假定为未占用。应了解,可以将邻居定义扩展为包括基于共享边缘或基于共享顶点的邻近节点,以在评估中包括附加的相邻子体积。

应了解,前述进程着眼于附近节点的占用,以试图确定当前节点302的占用的可能性,以便选择更合适的(多个)上下文并且使用更准确的概率以用于对当前节点302的占用数据进行熵编解码。应理解,与以关于同级节点的占用状态的评估为基础相比,与当前节点302共享面的邻近节点的占用状态可以是对当前节点302是否有可能会被隔离的更准确的评估,这些同级节点中的三个同级节点将仅共享边缘,并且这些同级节点中的一个同级节点将仅共享顶点(在八叉树的情况下)。然而,对同级的占用状况的评估具有模块化的优点,这是由于用于评估的所有相关数据都是父节点的一部分,这意味着其具有较小存储器占用来用于实施,而对邻居占用状态的评估涉及对树占用数据进行缓冲,以防在结合对未来的附近节点进行编解码来确定邻居占用状态时需要该树占用数据。

可以按有效地向每个邻居指派值的扫描顺序读取邻居的占用,这与上文相对于占用模式所描述的非常相似。如所图示的,邻近节点有效地采取值1、2、4、8、16或32,且因此,存在64(0至63)个可能的邻居占用配置。该值在本文中可以被称为“邻居配置”。作为示例,图10图示了邻居配置15的示例,在该邻居配置中,邻居1、2、4以及8被占用,而邻居16和32为空。

在一些情况下,两种上述准则(父模式和邻居配置)可以同时应用或可以在其间进行选择。例如,如果邻居可用,那么可以基于邻近节点来进行概率分布选择;然而,如果邻居中的一个或多个邻居因其来自尚未编解码的节点而不可用,那么概率分布选择可以恢复为基于同级节点的分析(父模式)。

在又一实施例中,备选地或附加地,概率分布选择可以基于祖父模式。换言之,概率分布选择可以基于作为父节点306的同级的叔父节点的占用状态。

在再一实施方式中,可以在概率分布选择中将附加或备选评估考虑进去。例如,概率分布选择可以着眼于父节点的邻居节点或祖父节点的邻居节点的占用状态。

可以在一些实施方式中组合地使用用于评估局部占用状态的上述准则中的任何两种或更多种准则。

在非二进制熵编解码器的情况下,可以通过选择概率分布来对当前节点的占用数据进行编解码。概率分布包含对应于当前节点的可能的占用模式的数量的一些概率。例如,在对八叉树的占用模式进行编解码的情况下,存在28-1=255种可能模式,这意味着每种概率分布包括255种概率。在一些实施例中,概率分布的数量可以等于选择准则中的可能占用结果的数量,即,使用邻居、同级和/或父占用数据。例如,在将八叉树的父模式用作用于确定要使用的概率分布的选择准则的情况下,将存在分别涉及255种概率的255种概率分布。在邻居配置的情况下,如果将邻居定义为共享面,那么将存在64种概率分布,其中每种分布包含255种概率。

应理解,太多的分布可以由于数据不足(即,上下文稀释)而导致缓慢的适应。因此,在一些实施例中,可以对类似模式进行分组,以便使用相同的概率分布。例如,单独分布可以用于对应于完全占用、垂直定向、水平定向、大部分为空,然后是所有其他情况的模式。这可以将概率分布的数量约简为约五个。应了解,可以形成模式的不同分组以导致不同数量的概率分布。

现在参考图11,其以图表方式示出了使用依赖于父模式的上下文的点云熵编码的进程400的一个说明性实施例。在该示例中,已经将当前节点402拆分成八个子节点,并且将使用非二进制熵编码器406对当前节点的占用模式404进行编码。非二进制熵编码器406使用从六种可能概率分布408中的一种可能概率分布中选择的概率分布。该选择基于父模式——即,该选择基于从父节点到当前节点402的占用信息。父模式通过在1与255之间的整数标识。

对概率分布的选择可以是决策树,该决策树评估了模式是否对应于整个节点(例如模式=255)、水平结构(例如模式=170或85;假设Z轴是垂直的)、垂直结构(例如模式=3、12、48、192)、稀疏填充的分布(例如模式=1、2、4、8、16、32、64或128;即,同级节点中没有一个同级节点被占用)、半稀疏填充的分布(当前节点和同级节点之间的所占用的节点的总数≤3)以及所有其他情况。针对不同类别指示的示例模式仅仅是示例。例如,“水平”类别可以包括涉及相同水平层级上的两个或三个所占用的立方体的模式。“垂直”类别可以包括涉及呈壁状布置的三个或四个所占用的立方体的模式。还应了解,可以使用更精细的分级。例如,可以将“水平”类别进一步细分为立方体的上部部分中的水平和立方体的下部部分中的水平,其中每种情况存在不同的概率分布。可以进行对具有某种相关性的占用模式的其他分组,并且将其分配给对应概率分布。下文进一步阐述了关于邻居配置的上下文中的模式分组和邻居配置之间的不变性的进一步讨论。

图12示出了使用依赖于邻居配置的上下文的点云熵编码的进程500的说明性实施例。该示例假设上文结合图9所使用的邻居和邻居配置编号的定义。该示例还假定了每个邻居配置具有专用的概率分布,这意味着存在64种不同的概率分布。当前节点502具有待编码的占用模式504。基于当前节点502的邻近节点来选择概率分布。即,找到[0,63]中的邻居配置NC并且将其用于选择相关联的概率分布。

应了解,在一些实施例中,可以对邻居配置进行分组,使得一个以上的邻居配置基于模式中的类似性来使用相同概率分布。在一些实施例中,进程可以使用邻居的不同布置来进行对分布的上下文分析(选择)。可以添加附加邻居,诸如在所有的三个轴上对角相邻的八个邻居、或在两个轴上对角相邻的十二个邻居。还可以使用避开特定邻居的实施例,例如以避免使用在深度优先的扫描中引入附加依赖性的邻居或仅引入对特定轴的依赖性以便约简大树的编解码器状态。

在该示例中,以特定方式处理NC=0的情况。如果不存在被占用的邻居,那么可以指示当前节点502被隔离。因此,进程500进一步检查当前节点502的占用子节点的数量。如果只有一个子节点被占用(即,NumberOccupied(NO)等于1),那么对标记进行编码,该标记指示了单个子节点被占用并且使用3个比特对节点的索引进行编解码。如果一个以上的子节点被占用,那么进程500使用NC=0种概率分布来对占用模式进行编解码。

现在参考图13,其以流程图形式示出了用于对编码的点云数据的比特流进行解码的一种示例方法600。

在操作602中,解码器基于来自当前节点附近的一个或多个节点的占用信息来选择概率分布中的一种概率分布。如上文所描述,占用信息可以是从父节点到当前节点的父模式(即,当前节点及其同级的占用),或其可以是当前节点的邻近节点的占用,这些邻近节点可以包括同级节点中的一些同级节点。在一些实施方式中可以使用其他或附加占用信息。

一旦已经选择了概率分布,则在操作604中,解码器就使用所选择的概率分布来对比特流的一部分进行熵解码,以重构当前节点的占用模式。占用模式由解码器用于重构树,以便重构编码的点云数据。一旦对点云数据进行了解码,就可以从解码器输出这些点云数据以供使用,诸如用于渲染视图、分割/分类或其他应用。

在操作606中,解码器基于重构的占用模式来更新概率分布,然后如果存在要解码的其他节点,那么其移动至缓冲器中的下一个节点并返回操作602。

已经证明上述方法的示例实施方式提供了压缩改进,其中编解码复杂度的增加可忽略不计。尽管基于邻居的选择具有更高的运算复杂度和更大的存储器使用量,但是基于邻居的选择显示出比基于父模式的选择更好的压缩性能。在一些测试中,每点比特数相对于MPEG点云测试模型的相对改进在4%与20%之间。已经注意到,与利用均匀分布进行初始化相比,基于利用测试数据得出的分布来初始化概率分布致使性能提高。

以上示例中的一些示例是基于树编解码进程的,该树编解码进程使用非二进制编解码器来表示占用模式。下文进一步提出了采用二进制熵编解码器的新发展。

在基于邻居的概率分布选择的一种变型中,可以通过利用邻域的对称性来约简分布的数量。通过置换邻域或置换模式分布,具有对称线的结构类似的配置可以重新使用相同分布。换言之,可以将可使用相同模式分布的邻居配置分组为类别。包含一个以上的邻居配置的类别在本文中可以被称为“邻居配置”,这是由于这些邻居配置中的一个邻居配置通过反射或置换那些其他配置的方式来将其他邻居配置有效地归入于内。

作为示例,考虑了分别表示拐角邻居模式的对称性的八种拐角模式NC∈[21,22,25,26,37,38,41,42]。NC的这些值有可能与节点的特定但不同的模式良好地相关。这些相关模式还有可能遵循与邻居模式相同的对称性。作为示例,可以实施重新使用单个分布表示NC的多种情况的方法,该重新使用是通过置换该分布的概率来实现的。

编码器基于子节点的占用来导出节点的模式编号。编码器根据邻居配置来选择分布和置换函数。编码器根据置换函数对包含在分布内的概率进行重新排序,随后使用经过置换的分布对模式编号进行算术编码。算术编码器对置换分布的概率的更新通过逆置换函数而被映射回原始分布。

对应解码器首先根据邻居配置来选择相同的分布和置换函数。以与编码器相同的方式产生置换分布,其中经过置换的分布由算术解码器用于对模式编号进行熵解码。然后将包括模式编号的比特分别指派给对应子。

应注意,可以实现相同置换,但不重新排序分布本身的数据,而是引入间接层级并且使用置换函数来置换对分布中的给定索引的查找。

备选实施例考虑模式本身的置换而非分布,从而允许分别在熵编码/解码之前或之后进行重排。这种方法有可能更适合于通过逐比特的重排操作进行高效实施。在这种情况下,编码器或解码器中任一者均不执行分布的重新排序,而是将编码模式编号的运算修改为其中ci是第i个子的占用状态,并且σ(i)是置换函数。一个这种示例置换函数允许将NC=22的分布用于NC=41的分布。置换函数可以由解码器用来使用从编码的模式编号中导出子节点的占用状态。

用于导出所需置换的方法可以基于邻居配置的旋转对称性或可以基于沿着特定轴的反射。此外,不必使置换根据例如对称性来置换所有位置;相反,可以使用部分置换。例如,当将NC=22置换为NC=41时,对称轴中的位置可能不会被置换,从而产生了映射其中位置0、2、4、6不会被置换。在其他实施例中,仅调换了对1和7。

在下文中针对具有与当前立方体共享公共面的六个邻居的八叉树的特殊情况提供了基于旋转对称性和反射的实施例的示例。在不损失一般性的情况下,如图16中所示出,Z轴相对于查看图的方向垂直地延伸。然后,应该将邻居的相对位置、诸如“上方”(相应地“下方”)理解为沿着Z轴在增大(相应地减小)的Z方向上。相同注释适用于沿着X轴的左/右以及沿着Y轴的前/后。

图16分别示出了沿着Z、Y以及X轴的三种旋转2102、2104以及2106。这三种旋转的角度为90度,即,这三种旋转沿着其相应的轴执行四分之一圈的旋转。

图17示出了在沿着Z轴的旋转2102的一次或数次迭代下的邻居配置的不变性类别。该不变性表示沿着属于XY平面的任何方向的点云几何形状的相同统计行为。对于在通过XY平面局部近似的地球表面上移动的汽车的用例尤其如此。独立于上方邻居(2202)和下方邻居(2204)的占用,水平配置是四个邻居(位于当前立方体的左、右、前以及后)的给定占用。在旋转2102下,四个水平配置2206、2208、2210以及2212属于相同类别的不变性。类似地,两个配置2214和2216属于相同类别的不变性。在旋转2102下仅存在六种类别的不变性(在类别集合2218下进行分组)。

独立于位于当前立方体的左、右、前以及后的四个邻居的占用,垂直配置是两个邻居2202和2204的给定占用。如图18中所示出,存在四种可能的垂直配置。因此,如果人们考虑到相对于沿着Z轴的旋转2102的不变性,那么存在6×4=24个可能配置。

在图16中示出了沿着Z轴的反射2108。图18中所描绘的垂直配置2302和2304在反射2108下属于相同类别的不变性。在反射2108下存在三种类别的不变性(在类别集合2306下进行分组)。在反射2108下的不变性意味着在点云几何形状统计方面,向上方向和向下方向的行为基本上相同。这是对在道路上的正在移动的汽车的准确假设。

如果人们假设了在旋转2102和反射2108两者下的不变性,那么存在由两个集合2218与2306的乘积得到的18种类别的不变性。在图19中表示了这18种类别。

在两个其他旋转2104和2106下应用另外的不变性,这两个配置2401和2402属于相同类别的不变性。此外,两个配置2411和2412、两个配置2421和2422、三个配置2431、2432以及2433、两个配置2441和2442、两个配置2451和2452以及最后两个配置2461和2462都属于相同类别。因此,在三种旋转(2102、2104以及2106)和反射2108下的不变性引起10种类别的不变性,如图20中所示出。

根据在上文中所提供的示例,假设或不假设在三种旋转和反射下的不变性,有效邻居配置的数量(即,可以对64个邻居配置进行分组的类别)为64、24、18或10中的任一者。

在熵编解码之前,模式经历相同变换(即,旋转和反射),这是由于邻居配置确实属于不变性类别中的一种不变性类别。这保留了不变的邻居配置与编解码模式之间的统计一致性。

还应理解,在遍历树期间,子节点将具有在相同的树深度下的某些邻近节点,这些邻近节点先前已经被访问并且可以有因果地用作依赖关系。针对这些相同层级的邻居,代替咨询父并置邻近,可以使用相同层级的邻居。由于相同层级的邻居具有父的减半尺寸,因此如果四个直接相邻的邻近子节点(即,与当前节点共享面的四个子节点)中的任何邻近子节点被占用,那么一个配置考虑了所占用的邻居。使用二进制编解码来对树占用模式进行熵编解码

在欧洲专利申请第18305037.6号中详述了使用邻居占用信息来对树占用进行编解码的上述技术。所描述的实施例将重点放在使用占用模式的非二进制熵编解码上,其中基于邻居占用信息来选择模式分布。然而,在一些情况下,使用二进制编解码器就硬件实施而言可以是更高效的。而且,对许多概率的运行中更新可能需要在算术编解码器的心脏内的快速接入存储器和运算。因此,找到用于使用二进制算术编解码器对占用模式进行熵编码的方法和设备可以是有利的。如果可以在不显著地降低压缩性能的情况下完成使用二进制编解码器且同时防范要跟踪的上下文数量过多,那么使用二进制编解码器将是有利的。

在熵公式中反映了使用二进制编解码器代替非二进制编解码:

H(X1,X2|Y)=H(X1|Y)H(X2|Y,X1)

其中X=(X1,X2)是要编解码的非二进制信息,且Y是用于编解码的上下文,即,邻居配置或所选择的模式分布。为了将X的非二进制编解码转换为二进制编解码,将信息(X1,X2)拆分成信息X1和X2,可以在不增加熵的情况下分别对这些信息进行编解码。为此,两种信息中的一种信息必须依赖于另一种信息来编解码,此处X2依赖于X1。这可以扩展为X中的n个比特的信息。例如,针对n=3:

H(X1,X2,X3|Y)=H(X1|Y)H(X2|Y,X1)H(X3|Y,X1,X2)

应理解,随着占用模式(即,比特序列X)变得越长,存在用于对序列中的较后的比特进行编解码的更多条件。针对二进制编解码器(例如CABAC),这意味着要跟踪和管理的上下文的数量大大增加。以八叉树为例,其中占用模式是八比特序列b=b0…b7,可以将比特序列拆分成八个二进制信息比特b0…b7。编解码可以使用邻居配置N(或NC)来确定上下文。假设如上文所描述,可以通过将邻居配置分组为不变性类别来将邻居配置约简至10个有效邻居配置,则N是属于{0,1,2,…,9}的整数。出于简写起见,“不变的邻居配置的类别”在本文中有时可以被简称为“邻居配置”,但应了解,可以基于根据不变性来对邻居配置进行基于类别的分组,进而实现该数量约简的邻居配置。

图21图示了将八比特模式或序列拆分成八个单独比特以用于进行二进制熵编解码。应注意,基于邻居配置来对序列的第一比特进行编码,因此存在总共十个上下文可用。基于邻居配置和任何先前编码的比特(即,比特b0)来对序列的下一个比特进行编码。这包含总共20个可用上下文:作为来自N的10与来自b0的2的乘积而获得。使用从1280个可用上下文中选择的上下文来对最终比特b7进行熵编码:作为来自N的10与来自由先前编码的比特b0、......、b6给定的部分模式的128的乘积而获得。即,针对每个比特,上下文的数量(即,条件/依赖性的可能组合)是所定义的邻居配置的数量(在此示例中为10个,基于将64个邻居配置分组为类别)与来自n-1个先前编码的比特的有序序列(由2n-1给定的)的可能的部分模式的数量的乘积。

因此,总共存在要结合占用模式的二进制编解码维持的2550个上下文。这是要跟踪的大量上下文,并且相对不足可以由于上下文稀释而导致不佳性能,尤其是对于序列中的较晚的比特。

因此,在一个方面中,本申请公开了确定是否可以约简上下文集合的编码器和解码器,并且如果确定可以,那么应用上下文约简操作以实现更小的可用上下文集合,以便使用二进制编解码器来对占用模式的至少部分进行熵编解码。在另一方面中,本申请还公开了编码器和解码器,该编码器和解码器使用相同的上下文约简操作来应用一轮或多轮状态约简,以便从固定数量的上下文中执行有效的上下文选择。在一些实施方式中,在生成上下文和/或算法条件的查找表时先验地应用上下文约简,然后通过编码器或解码器在选择合适的上下文时使用该查找表。约简基于可测试的条件,编码器和解码器评估可测试的条件以确定要从哪个查询表中进行选择或如何从该查询表中进行索引/选择以获得所选择的上下文。

现在参考图22,其以流程图方式示出了用于使用二进制编解码在基于树的点云编解码器中对占用模式进行编解码的一种示例方法3000。方法3000可以通过编码器或解码器来实施。在编码器的情况下,正在对编解码操作进行编码,且在解码器的情况下,正在对编解码操作进行解码。编码和解码是基于上下文的熵编码和解码。

示例方法3000用于对特定节点/体积的占用模式(即,比特序列)进行熵编解码。占用模式表示节点/体积的子节点(子体积)的占用状态。在八叉树的情况下,存在八个子节点/子体积。在操作3002中,确定邻居配置。邻居配置是一个或多个体积的占用状态,该体积邻近占用模式将要为其进行编解码的体积。如上文所讨论的,存在用于确定邻居配置的各种可能的实施方式。在一些示例中,存在10个邻居配置,并且基于与当前体积共享面的六个体积的占用来标识当前体积的邻居配置。

在操作3004中,将当前体积的子节点的索引i设置为0。然后,在操作3006中,评估上下文约简是否为可能的。下文更详细地讨论了不同的可能上下文约简操作。可以基于例如正在对比特序列中的哪个比特(例如索引值)进行编解码,评估上下文约简是否为可能的。在一些情况下,对于序列中的较晚的比特而非对于前几个比特,上下文约简可以是可能的。评估上下文约简是否为可能的可以例如基于邻居配置,这是由于某些邻居配置可以实现简化。在一些实施方式中,可以使用附加因素来评估上下文约简是否为可能的。例如,可以提供上限Bo作为二进制编解码器可以用于对比特进行编解码的上下文的最大数量,并且如果用于对比特进行编解码的上下文的初始数量高于Bo,那么应用上下文约简(否则不应用上下文约简),使得在约简之后的上下文数量最多为Bo。这种界限Bo可以在编码器和/或解码器规范中进行定义,以便确保能够处理Bo上下文的软件或硬件实施将始终能够在不生成就上下文的数量而言的上溢的情况下对点云进行编码和/或解码。预先知道界限Bo还允许预期由二进制熵编解码器引起的复杂度和存储器占用,因而有助于硬件的设计。Bo的典型值是从十到几百。

如果将上下文约简确定为可用,那么在操作3008中,应用上下文约简操作。上下文约简操作将可用上下文集合中的可用上下文的数量约简为包含更少的总上下文的更小集合。将回顾的是,由于上下文可以依赖于来自比特序列的先前编解码的比特的部分模式,因此可用上下文的数量可以部分地依赖于序列中的比特位置,即,索引。在一些实施方式中,在约简之前,在集合中可用的上下文的数量可以基于邻居配置的数量乘以可能的部分模式的数量连同先前编解码的比特。针对索引i处的比特(其中i的范围介于0至n),部分模式的数量将由2i给定。

如上文所提及,在一些实施方式中,在编解码之前进行上下文约简操作,并且所产生的约简的上下文集合是在编解码操作期间可供编码器和解码器使用的上下文集合。在编解码期间使用和/或选择约简的上下文集合可以基于评估一个或多个条件,该评估一个或多个条件先于使用那些约简集合,这些约简集合对应于在用于确定可以约简上下文的数量的操作3006中评估的条件。例如,在允许使用约简的上下文集合的特定邻居配置的情况下,编码器和/或解码器可以首先确定是否满足该邻居配置条件,然后如果满足该邻居配置条件,那么使用对应的约简的上下文集合。

在操作3010中,基于邻居配置和比特序列中的先前编解码的比特的部分模式来确定比特bi的上下文,即,从可用上下文的集合(或约简集合,若存在)中选择比特bi的上下文。然后在操作3012中,通过熵编解码器使用所选择的上下文来对当前比特进行熵编码。

在操作3014中,如果索引i指示当前编解码的比特是序列中的最后一个比特(即,i等于imax),那么编解码进程前进到下一个节点。否则,在操作3016中使索引i递增,并且进程返回至操作3006。

应了解,在一些实施方式中,上下文选择可以不依赖于邻居配置。在一些情况下,可以仅依赖于序列中的先前编解码的比特的部分模式(若存在)。

在图23中图示了示例编码器3100的一部分的简化框图。在该图示中,应理解,在对应体积被分成子节点并且循环通过保留点云的几何形状的FIFO缓冲器3104时获得占用模式3102。将占用模式3102的编码图示为涉及二进制编码器3106的级联,模式的每个比特存在一个二进制编解码器。在二进制编解码器3106中的至少一些二进制编解码器之间的是上下文约简操作3108,其操作以将可用上下文约简为更小的可用上下文集合。

尽管图23图示了一系列二进制编解码器3106,但在一些实施方式中,仅使用一个二进制编解码器。在使用一个以上的编解码器的情况下,可以使编解码(部分地)并行化。考虑到一个比特对比特序列中的前述比特的上下文依赖性,模式的编解码可能并不一定完全并行化,但有可能通过针对模式使用级联的二进制编解码器来改进流水线化,以实现一定程度的并行化和速度提高。

基于子体积邻居配置的上下文确定

在上文中,基于比特序列中的先前编解码的比特的邻居配置和部分模式,确定、即从可用上下文的集合(或若存在,约简集合)中选择比特序列中的当前占用比特bi的上下文(即,与将用于熵编解码的相应熵编解码器相关联的概率)。然后通过二进制编解码器使用所选择的上下文(概率)来对当前比特进行熵编码。附加地或备选地,可以考虑当前节点的邻近节点(例如已经被编解码的占用邻近节点)的子节点的占用状态,以确定用于对当前节点的比特序列中的比特bi进行编解码的上下文(例如概率)。接下来将描述考虑到当前节点的邻近节点的子节点的占用状态以确定上下文的实施方式。

在一些实施方式中,对比特序列进行编码或解码的方法可以使用当前节点的邻近节点的子节点的占用状态的知识来确定上下文。即,可以使用已经被编解码的占用邻近节点(可能地所有邻近节点或所有已经被编解码的邻近节点)的子节点的占用的知识来驱动(可能地连同邻居配置N、例如约简为十个配置N10一起)对当前节点的占用比特bi进行编解码的熵编解码器。

在下文中,在没有既定限制的情况下,将参考八叉树和作为与八叉树的节点相关联的体积的立方体,描述使用当前节点的邻近节点的子节点的占用状态的知识来确定上下文的对比特序列进行编码或解码的方法。

现在参考图27,其示出了当前节点(即,其相关联的体积或当前体积)4000及其六个邻居4010、4020、4030、4040、4050以及4060。针对八叉树的当前示例,当前节点的邻居可以被定义为如下那些节点(在树的相同层级或深度处):其相关联的体积与当前体积共享面。彼此共享面的体积也可以被称为彼此接触的体积。邻近节点的其他定义也是可行的。例如,当前节点的邻居可以是如下那些节点(在树的相同层级或深度处):其相关联的体积与当前体积共享边缘(或顶点)。通常,不考虑树形结构如何,邻近节点可以是如下那些节点(在树的相同层级或深度处):其相关联的体积与当前体积相交(例如至少在一些预定义的非空集合中)。

在本申请的上下文中,应理解,彼此相交的体积(节点)是相邻体积(节点)。因此,在本申请的上下文中可以将术语“与……相交”和“与……相邻”视为是同义的。

值得注意的是,在每个子体积本身是可以细分为子体积的体积的意义上,表达“体积”和“子体积”可以在某种程度上互换地使用。在任何情况下,通过指定所涉及的节点/体积之间的父子关系,可以清楚地理解体积/子体积关系。

假设按宽度优先的方式,以增加X顺序、然后以增加Y顺序且最后以增加Z顺序来执行节点的扫描顺序。这样做,已经对具有最低X坐标(即,邻居4010)、最低Y坐标(即,邻居4030)以及最低Z坐标(即,邻居4050)的三个邻居进行了编解码。因此,如果这三个邻居中的一个邻居被占用,那么与所占用的邻居相关联的占用子体积的配置是已知的。虽然本示例以增加X顺序、然后以增加Y顺序且最后以增加Z顺序定义了扫描顺序,但其他宽度优先的扫描顺序也可以用于本目的。不考虑所使用的特定的宽度优先的扫描顺序如何,已经针对不位于3D空间的边界处的当前节点对三个邻居进行了编解码。

现在参考图28,其示出了所有的三个已经被编解码的邻居(即,邻居4010、4030以及4050)都被占用的示例性当前体积。邻居4010的占用子体积是子体积4011、4012以及4013;邻居4030的占用子体积是子体积4031、4032以及4033;且邻居4050的占用子体积是子体积4051和4052。在该示例中,所有的三个已经被编解码的邻居都被占用,但是应理解,通常实际上只有两个邻居或两个邻居中的一个邻居可以被占用,或甚至他们中没有一个邻居被占用。

可以使用已经被编解码的占用邻居的占用子体积的知识来定义子体积邻居配置的集合,例如,针对当前体积的每个子体积存在一个子体积邻居配置。可以将子体积邻居配置用作用于选择上下文(例如与相应二进制熵编解码器相关联的概率)以对当前体积的比特序列的比特bi进行熵编解码的判据。确定当前体积的给定子体积的子体积邻居配置可以基于当前体积的已经被编解码的那些邻近体积的子体积的占用数据。另外,当前体积中的给定子体积的子体积邻居配置可以对应于给定体积的邻近(已经被编解码的)体积中的与给定子体积邻近的所有那些子体积的占用模式。

现在参考图29,其以流程图形式示出了对点云进行编码以生成压缩后的点云数据的比特流的方法4100的示例。点云在具有多个节点的树形结构中被定义,多个节点具有父子关系并且其表示体积空间的几何形状,该体积空间被递归地拆分成子体积并且包含点云的点。使用比特序列来指示体积的子体积的占用,其中该比特序列的每个比特指示了体积内的按扫描顺序的相应子体积的占用,并且体积具有多个邻近体积。下文所描述的方法4100的操作分别针对与拆分成子体积的当前体积相关联的当前节点而执行,其中每个子体积对应于当前节点的子节点。在操作4110中,确定指示了当前体积的子体积的占用的比特序列。然后,针对当前体积的比特序列中的至少一个比特,执行以下操作。在操作4120中,基于当前体积的至少一个邻近体积的子体积的占用数据,确定子体积邻居配置。子体积邻居配置依赖于至少一个邻近子集的与当前体积的给定子体积邻近的一组子体积的占用模式。当前体积的给定子体积是对应于比特序列中的比特的子体积。例如,针对比特序列的比特bi,给定子体积是对应于所述比特bi的当前体积的子体积,即,给定子体积是比特bi指示了占用状态的子体积。然后针对当前体积的所考虑的子体积确定子体积邻居配置。值得注意的是,可以针对比特序列的任何、一些或所有比特执行操作4120。在操作4130中,选择用于比特序列中的比特的熵编码的概率(例如上下文)。此处,选择至少部分地基于已经为对应于比特序列中的比特的子体积确定的子体积邻居配置。在操作4140中,使用二进制熵编码器基于所选择的概率(例如上下文)来对比特序列中的比特进行熵编码,以产生用于比特流的编码数据。

在一些实施方式中,方法4100还可以包括更新所选择的概率(例如上下文)的操作(在图29中未示出)。

如上文已经描述的,可以使用一个或多个二进制熵编解码器的级联来对当前节点的占用模式进行熵编解码。因此,方法4100的操作4130可以涉及:针对比特序列的至少一个比特,至少部分地基于已经为对应于要熵编解码的比特的子体积确定的子体积邻居配置,选择用于对该比特进行编解码的相应概率(且对应地,相关联的熵编解码器)。此外,选择该概率可以基于比特序列的已经被编解码的比特的部分序列和/或当前体积的邻居配置。换句话说,针对比特序列的每个比特,可以基于子体积邻居配置来选择上下文,并且此外,选择上下文可以基于比特序列的已经被编解码的比特的部分序列和/或当前体积的邻居配置。就上下文而言,可以说方法4100的操作4130涉及至少部分地基于已经为对应于要编解码的比特的子体积确定的子体积邻居配置来选择用于对比特进行熵编解码的上下文。然后,在一些实施方式中,可以在操作4140之后更新该上下文。

现在参考图30,其以流程图形式示出了对压缩后的点云数据的比特流进行解码以产生重构的点云的方法4200的示例。点云在具有多个节点的树形结构(例如八叉树)中被定义,多个节点具有父子关系并且表示体积空间的几何形状,该体积空间被递归地拆分成子体积并且包含点云的点。使用比特序列来指示体积的子体积的占用,其中该比特序列的每个比特指示了体积内的按扫描顺序的相应子体积的占用,并且体积具有多个邻近体积。下文所描述的方法4200的操作分别针对与拆分成子体积的当前体积相关联的当前节点而执行,其中每个子体积对应于当前节点的子节点,并且针对当前体积的比特序列中的至少一个比特而执行。在操作4210中,基于当前体积的至少一个邻近体积的子体积的占用数据来确定子体积邻居配置。子体积邻居配置依赖于至少一个邻近子集的与当前体积的给定子体积邻近的一组子体积的占用模式,给定子体积是对应于比特序列中的比特的当前体积的子体积。例如,针对比特序列的比特bi,给定子体积是对应于所述比特bi的当前体积的子体积,即,给定子体积是对其考虑了比特bi指示了占用状态的子体积。然后针对当前体积的所考虑的子体积确定子体积邻居配置。值得注意的是,可以针对比特序列的任何、一些或所有比特执行操作4120。在操作4220中,选择用于比特序列中的比特的熵解码的概率(例如上下文)。该选择至少部分地基于子体积邻居配置。在操作4230中,使用二进制熵解码器基于所选择的概率(例如上下文)来对所述至少一个比特进行熵解码,以根据比特流产生重构比特。

在某一实施方式中,方法4200还可以包括更新所选择的概率(例如上下文)的操作(在图30中未示出)。

按照与编码相同的方式,方法4200的操作4220可以涉及:针对表示占用模式的比特序列的至少一个比特,至少部分地基于已经为对应于要熵编解码的比特的子体积确定的子体积邻居配置来选择用于对该比特进行编解码的相应概率(且对应地,相关联的熵编解码器)。此外,选择该概率可以基于比特序列中的已经被编解码的比特的部分序列和/或当前体积的邻居配置。换句话说,针对比特序列的每个比特,可以基于子体积邻居配置来选择上下文,并且此外,选择上下文可以基于比特序列中的已经被编解码的比特的部分序列和/或当前体积的邻居配置。就上下文而言,可以说方法4200的操作4220涉及至少部分地基于已经为对应于要编解码的比特的子体积确定的子体积邻居配置来选择用于对比特进行熵编解码的上下文。然后,在一些实施方式中,可以在操作4230之后更新该上下文。

在下文中将描述确定子体积邻居配置的示例。

在一些实施方式中,这可以涉及:基于当前体积的至少一个邻近体积的子体积的占用数据,确定至少一个邻近体积(可能地所有邻近体积或所有已经被编解码的邻近体积)的子体积的数量,该至少一个邻近体积的子体积与对应于比特序列中的比特的当前体积的子体积邻近。该数量在下文中将被称为NT[i],其中i是指示当前体积(或比特序列中的对应比特bi)的子体积的索引。在这个意义上,可以说在方法4100的操作4130中和在方法4200的操作4220中选择概率涉及:选择概率至少部分地基于数量NT[i]。

在一些实施方式中,确定子体积邻居配置还可以涉及:向所确定的数量NT[i]应用阈值函数。

参考图31,其示出了将当前体积(当前节点)B拆分成八个子体积(子节点)SB0至SB7的示例。针对该示例,邻近体积被定义为彼此共享面(即,彼此“接触”)的体积。当前体积B的子体积(sub-volume/child volume)中的每个子体积与当前体积的邻居的三个子体积邻近(接触)。每个子体积SB0至SB7(SBi,i=0、……、7)的子体积邻居配置可以依赖于接触当前体积的相应子体积SBi的子体积组的占用模式。依赖于当前体积的所占用的邻居的占用模式,当前体积的所占用的邻居的至多三个占用子体积可以与相应子体积SBi邻近(或接触,其中接触/邻近被定义为共享面)。

使用邻近体积的以上定义确定当前体积的给定子体积SBi的子体积邻居配置的一个示例进程涉及:确定当前体积的与相应子体积SBi接触的邻居中的子体积的数量0≤NT[i]≤3。换句话说,当前体积的子体积SBi的数量NT[i]指示当前体积的邻居中的与子体积SBi邻近(接触,即,与子体积SBi共享面)的占用子体积的数量。

通过以上定义,当前体积的子体积SBi的整数数量0≤NT[i]≤3是占用子体积(子节点)的数量,这些占用子体积位于当前体积的(已经被编解码的)邻居中,并且与子体积SBi在面(即,接触子体积SBi的面)上相交。

在优选实施方式中,邻居是与当前立方体共享面的六个邻居,并且当且仅当所占用的邻居的子节点的面中的一个面被包括在与子节点SBi相关联的立方体的面中时(即,在所占用的邻居的子节点与子节点SBi在面中相交的情况下),才将所占用的邻居的子体积称为与子节点SBi邻近。然而,应理解,本申请不限于八叉树的前述实施方式,并且不限于将邻居定义为相关联的体积与当前的相同层级节点的相关联的体积共享面的节点。实际上,本申请涉及表示点云的几何形状的任何树。此外,当前节点的邻居通常可以被定义为与当前节点处于相同深度或层级(相对于树的根节点)处的节点,并且这些节点的相关联的体积与当前节点的体积相交(例如至少在预定义的非空集合中)。在与节点相关联的体积是立方体(诸如八叉树,举例而言)的树中,该交集可以是面、边缘、顶点或点的任何非空集合。

类似地,如果与子节点相关联的体积同与子节点SB相关联的体积的交集是点的非空集合,那么将当前节点的邻居的占用子节点称为与当前节点B的子节点SB相交。此外,在与节点相关联的体积是立方体(诸如(例如)八叉树)的树中,该交集可以是面、边缘、顶点或点的任何非空集合。

还应理解,针对邻居和邻居的子节点的邻居定义可以是不同的。例如,在八叉树中,邻居可以被定义为与当前节点共享面的节点,从而产生六个邻居;然而,数量NT[i]可以对与子节点SBi共享至少一个边缘的已经被编解码的占用邻居的子节点的数量进行计数。然而,优选实施方式可以将交集的定义用作邻居和邻居的子节点两者的“共享面”。

如上文所提及,在本申请的上下文中可以使用邻近节点或体积的不同定义。依赖于邻居定义,数量NT[i]的可能范围将与0≤NT[i]≤3不同(这适用于将邻近体积定义为共享面或“接触”的体积的情况)。例如,如果邻近体积被定义为至少在边缘中彼此相交的体积,那么将具有0≤NT[i]≤12。同样,如果邻近体积被定义为至少在顶点中相交的体积,那么将具有0≤NT[i]≤19。

如上文所提及,依赖于当前体积的所占用的邻居的占用模式,使用邻居体积(其为共享面的体积)的邻近定义,当前体积的所占用的邻居的至多三个占用子体积可以与相应子体积(子节点)SBi邻近。图32显示,针对当前节点B的子节点SB0,假设上文参考图27所描述的扫描顺序,存在邻居节点的可以与关联于子节点SB0的子体积(即,其可以在面中与关联于子节点SB0的子体积相交)邻近的至多三个占用子节点。图中描绘了八个可能的占用子节点配置以及为0、1、2或3的相关联的值NT[0]。

图33显示,针对当前节点B的子节点SB1,存在邻居节点的可以与关联于子节点SB1的子体积邻近(即,在面中相交)的至多两个占用子节点。图中描绘了四个可能的占用子节点配置以及为0、1或2的相关联的值NT[1]。

图34显示,针对当前节点B的子节点SB3,存在邻居节点的可以与关联于子节点SB3的子体积邻近(即,在面中相交)的至多一个占用子节点。图中描绘了两个可能的占用子节点配置以及为0或1的相关联的值NT[3]。

图35显示,针对当前节点B的子节点SB7,不存在邻居节点的可以与关联于子节点SB7的子体积邻近(即,在面中相交)的占用子节点。因此,仅存在如图中所描绘的一个可能的占用子节点配置,即,NT[7]的值必须为0。在这种情况下,子节点在子节点SB7的占用信息的编解码中不提供用于上下文确定的额外信息。

一旦已经为当前节点的子节点SBi确定了数量NT[i],就可以通过应用阈值函数根据NT[i]确定子体积邻居配置值C[i]。阈值函数可以是如下函数:输出其输入值直至特定阈值,并且针对超过阈值的输入值输出阈值。例如,阈值可以被设置为2,使得

·C[i]=0if NT(i)=0

·C[i]=1if NT(i)=1

·C[i]=2if NT(i)>=2

运用该阈值化操作,C[0]的可能值包括0、1或2,而C[7]始终为0。应理解,其他阈值化操作和阈值函数也是可行的。具体地,针对其他邻居定义,数字NT[i]的值范围将与0≤NT[i]≤3不同,并且可以应用不同阈值。

然后,在方法4100的操作4130中和在方法4200的操作4220中选择概率(例如上下文)可以涉及:至少部分地基于子体积邻居配置值C[i]来选择概率。在这个意义上,子体积邻居配置值C[i]可以据称对应于子体积邻居配置。

现在参考图36,其以流程图形式示出了确定当前体积的子体积的数量NT[i]和子体积邻居配置值C[i]的方法4300的一个示例。即,方法4300对当前体积的子体积进行操作。在操作4310中,针对当前体积的所有子体积,将数量NT[i]初始化为零。然后,在操作4320中,选择当前体积的邻居。在操作4330中,检查所选择的邻居是否被占用。如果所选择的邻居被占用(在操作4330中为“是”),那么方法继续进行至操作4340。在操作4340中,检查是否已经对所选择的占用邻居进行了编解码。如果已经对所选择的占用邻居进行了编解码(在操作4340中为“是”),那么方法继续进行至操作4350。在操作4350中,针对邻居的每个占用子节点(子体积)确定当前体积的哪些子体积与该子节点邻近(依赖于邻居定义;例如至少在预定义的非空集合处相交)。针对与子节点邻近的当前体积的每个子体积,对应数量NT[i]的增量为1。随后,方法继续进行至操作4360。如果所选择的邻居未被占用(在操作4330中为“否”)或尚未被编解码(在操作4340中为“否”),那么方法也会继续进行至操作4360。在操作4360中,检查是否存在当前体积的尚未选择的邻居。如果存在尚未选择的邻居(在操作4320中为“是”),那么方法返回到操作4320以选择当前体积的下一个邻居。一旦已经处理了所有邻居(在操作4360中为“否”),就在操作4370中针对当前体积的每个子体积计算子体积邻居配置值C[i]。这可以涉及应用阈值函数。然后,在操作4380中,可以使用概率(例如上下文)基于子体积邻居配置值C[i]、并且可能地基于比特序列中的已经被编解码的比特的部分序列和/或(约简的)邻居配置,对比特序列的相应比特bi进行熵编解码。

在备选实施方式中,代替对当前体积的邻居的循环,可以执行对当前体积的子体积SBi(或等效地,对索引i)的循环。然后,针对每个子体积SBi,测试已经被编解码的邻居的占用子节点,以确定其是否与子体积SBi邻近(例如至少在预定义的非空集合中相交),且获得NT[i]作为与子体积SBi邻近的此类子节点的数量。

在对NT[i]的以上确定中,当前体积的子体积的所有邻居均被同等对待,而不考虑其与所述子体积的交集如何。在一些实施方式中,可以将不同权重应用于与所讨论的子体积具有不同交集的邻居。例如,当应用较广泛的邻居定义时,与所讨论的子体积共享面的邻近子体积可以具有比与所讨论的子体积(仅)共享边缘的邻近子体积更高的权重,这由可以具有比与所讨论的子体积(仅)共享顶点的邻近子体积更高的权重。然后可以在确定加权数量NT’[i]时应用这些不同的权重,其中所讨论的子体积的每个邻居都以其相应的权重计入产生加权数量NT’[i]的总和中。

因此,在方法4100的操作4120中和在方法4200的操作4210中确定子体积邻居配置可以涉及:基于当前体积的至少一个邻近体积的子体积的占用数据,确定至少一个邻近体积(可能地所有邻近体积或所有已经被编解码的邻近体积)的所有那些子体积,这些子体积与对应于比特序列中的比特的当前体积的子体积相交。另外,可以将相应权重因子应用于所确定的子体积。每个权重因子可以依赖于相应的所确定的子体积与当前体积的对应于比特序列中的比特的子体积的交集。例如,与所讨论的子体积在面中相交的子体积可以具有最高权重,与(仅)所讨论的子体积在边缘中相交的子体积可以具有中等权重,且与(仅)所讨论的子体积在顶点中相交的子体积可以具有最低权重。在一些实施方式中,可以仅考虑三个邻居定义中的两个邻居定义(这实际上对应于将第三邻居定义的邻居的权重因子设置为零)。例如,可以将应用于与子体积在面、边缘以及顶点中相交的子体积的相应权重因子分别设置为2、1和0。

然后,确定子体积邻居配置还可以涉及:基于所确定的子体积及其相应权重因子,确定与当前体积的对应于比特序列中的比特的子体积相交的至少一个邻近体积的子体积的加权数量NT’[i]。即,当对至少一个邻近体积的与当前体积的对应于比特序列中的比特的子体积相交的所确定的子体积求和时,每个所确定的子体积可以以其相应的权重因子进行计数。另外,可以将阈值化应用于加权数量NT’[i],以获得加权的子体积邻居配置值C’[i]。

在一些实施方式中,可以依赖于以下值来选择与对比特序列中的给定占用比特bi进行编解码的二进制熵编解码器相关联的概率(例如上下文):

·b0,…,bi-1

·N10

·C[i]

即,一旦确定,就可以将子体积邻居配置值C[i](或加权的子体积邻居配置值C'[i])用作对(多个)熵编解码器的输入,该熵编解码器对与当前节点B的子节点SBi相关联的占用比特bi进行编解码。

上下文约简操作

以上示例提出,编解码进程包括相对于占用模式的至少一个比特的上下文约简操作,以便将可用上下文集合约简为更小的可用上下文集合。在此意义上,可以将“上下文约简操作”理解为标识和合并在特定比特bi的情况下被视为重复或冗余的上下文。如上文所提及,可以在编解码之前确定约简的上下文集合,并且可以将该约简的上下文集合提供给编码器和解码器,并且编码器和解码器基于下文所描述的用于约简上下文集合的相同条件来确定是否要使用约简的上下文集合。

通过筛选/屏蔽的邻居配置约简

第一示例上下文约简操作涉及基于筛选/屏蔽来约简邻居配置的数量。原则上,在邻近体积帮助指示当前体积或子体积是否有可能会被占用的基础上,邻居配置将邻近体积的占用状态纳入上下文选择进程的考虑中。在对与当前体积中的子体积相关联的比特进行解码时,则也将他们纳入上下文选择的考虑中;然而,来自附近的子体积的信息可以比位于来自当前子体积的子体积的另一侧上的邻近体积的占用信息更为重要且更具信息性。在此意义上,先前解码的比特与“筛选”或“屏蔽”邻近体积的子体积相关联。这可以意味着在此类情况下,可以忽略邻近体积的占用,这是由于其占用状态的相关性由当前子体积与邻近体积之间的子体积的占用状态归入于内,从而允许约简邻居配置的数量。

现在参考图24,其以图表方式示出了基于邻居筛选的示例上下文约简操作。示例涉及对体积3200的占用模式进行编解码。占用模式表示体积3200内的八个子体积的占用状态。在该示例中,已经对体积3200的上半部分中的四个子体积进行了编解码,因此这四个子体积的占用状态是已知的。正在编解码的占用模式的比特与第五子体积3204相关联,该第五子体积位于体积3200的在四个先前编解码的子体积下方的下半部分中。

在该示例中,编解码包括:基于邻居配置来确定上下文。示出了10个邻居配置3202。包含要编解码的第五子体积3204的体积3200以浅灰色示出并且利用附图标记3200进行指示。邻居配置3202基于与体积3200相邻并且与该体积3200共享面的体积的占用状态。邻近体积包括顶部邻近体积3206。

在该示例中,可以通过忽略配置中的至少一些配置中的顶部邻近体积3206将邻居配置的数量从10个约简到7个。如图24中所示出,可以将示出了顶部邻近体积3206的四个配置中的三个配置归入于不计入顶部邻近体积3206中的等效配置下,从而将邻居配置的数量约简为总共7个。保持示出了所有的六个邻近体积的配置仍然可以是有利的,这是由于不存在可以合并6体积配置的现有5体积邻居配置(已经消除了一个5元素),这意味着即使移除了顶部邻近体积,也会产生新的5元素邻居配置,并且不会发生上下文中的整体约简。

在该示例中,可以从邻居配置中消除顶部邻近体积3206,这是因为用于对与第五子体积3204相关联的占用比特进行编解码的上下文确定将已经考虑到其正上方的四个先前编解码的子体积的占用状态,与更远的顶部邻近体积3206的占用状态相比,该四个先前编解码的子体积更好地指示了第五子体积的占用的可能性和方向性。

通过先前编解码的子体积在对与第五子体积3204对应的占用比特进行编解码时筛选或屏蔽顶部邻近体积3206的以上示例仅仅是一个示例。依赖于体积3200内的编解码顺序,可以实现并利用多种其他可能的筛选/屏蔽情况来约简可用邻居配置。

现在参考图25,其示出了筛选/屏蔽的第二示例。在该示例中,体积3200的占用模式几乎被完全编解码。要编解码的子体积是第八子体积并且在后方的底部拐角(不可见)处隐藏于图中。在这种情况下,已经对所有的七个其他子体积的占用状态进行编解码。具体地,沿着顶部(因此将邻居配置约简为总共七个)以及沿着右侧和前侧的子体积。因此,除了筛选顶部邻近体积之外,具有先前编解码的占用比特的子体积屏蔽了前方邻近体积3210和右侧邻近体积3212。这可以允许将邻居配置从总共七个约简为总共五个,如所图示的。

应了解,屏蔽的两个前述示例是说明性的,并且在一些情况下,可以合并不同配置以解决不同的屏蔽情况。基于通过先前编解码的子体积进行的屏蔽/筛选的上下文约简操作是一般性的,并且不限于这两个示例,但应了解,在要编解码的第一子体积的情况下无法应用该上下文约简操作,这是由于需要存在与附近子体积相关联的至少一个先前编解码的占用比特,以便用于进行任何屏蔽/筛选。

还应了解,在不同实施方式中,证明邻居配置约简的屏蔽/筛选的程度可以是不同的。在两个上述示例中,在将邻近体积视为屏蔽/筛选且因此从邻居配置中移除该邻近体积之前,与邻近体积共享面的所有的四个子体积已经预先进行了编解码。在其他示例中,部分屏蔽/筛选可以是足够的,例如,从一个先前编解码的子体积到共享面的三个先前编解码的子体积

通过特殊情况处理的上下文约简

存在可以在不损失有用信息的情况下发生上下文约简的某些情况。在上文所描述的示例上下文确定进程中,用于对占用比特进行编解码的上下文基于邻居配置(即,与当前体积邻近的体积的占用模式)和可归因于当前体积中的先前编解码的子体积的占用的部分模式。后一种情况产生要相对于占用模式比特序列中的第八比特跟踪的27=128个上下文。即使将邻居配置约简为总共五个,这意味着要跟踪640个上下文。

比特序列的先前编解码的比特具有顺序并且该顺序在评估上下文时相关,基于上述事实,上下文的数量庞大。然而,在一些情况下,顺序可以不包含有用信息。例如,在邻居配置为空(即,N10=0)的情况下,可以将体积内的任何点假定为是稀疏填充的,这意味着这些点具有的方向性并不强到足以将追踪同级子体积中的不同占用模式的单独上下文适当化。在空邻域的情况下,针对点云不存在局部定向或拓扑,这意味着可以将基于比特序列的先前编解码的比特的2j个条件约简为j+1个条件。即,用于对比特序列的比特中的一个比特进行编解码的上下文基于先前编解码的比特,但并不基于先前编解码的比特的有序模式,而是基于先前编解码的比特的总和。换言之,在该特殊情况下的熵表达式可以表达为:

H(b|n)≈H(b0|0)H(b1|0,b0)H(b2|0,b0+b1)…H(b7|0,b0+b1+…+b6)

在一些实施方式中,可以相对于完全邻居配置进行类似观察。在一些示例中,完全邻居配置缺乏方向性,这意味着在确定上下文时不需要考虑先前编解码的比特的顺序。在一些示例中,该上下文约简操作可以仅应用于比特序列中的比特中的一些比特,诸如序列中的较晚的比特中的一些比特。在一些情况下,将该上下文约简操作应用于较晚的比特,可以以确定与先前编解码的子体积相关联的较早比特也全部都被占用作为条件。

基于统计的上下文约简

统计分析可以用于通过确定哪些上下文引起大致相同的统计行为,并且然后组合这些上下文来约简上下文。可以使用测试数据来先验地执行该分析以开发约简的上下文集合,然后将其提供给编码器和解码器两者。在一些情况下,可以使用两回合编解码来对当前点云执行分析,以开发针对特定点云数据的定制约简的上下文集合。在一些此类情况下,可以通过使用编解码成比特流的专用句法,将从非约简的上下文集合到定制约简的上下文集合的映射表示给解码器。

可以通过“距离”的概念来比较两个上下文。第一上下文c具有比特b的等于零的概率p,且第二上下文c’具有比特b’的等于零的概率。c与c’之间的距离由下式给出:

d(c,c’)=|p log2p–p’log2p’|+|(1-p)log2(1-p)–(1-p’)log2(1-p’)|

使用对类似性(距离)的这种测量,上下文然后可以在进程中进行分组,诸如:

1.从M1个上下文开始并且固定阈值水平ε

2.针对给定上下文,将与给定上下文相距了小于阈值水平ε的距离的所有上下文重新分组为类别

3.针对所有未重新分组的上下文重复2,直到所有未重新分组的上下文都被放入类别中为止

4.标记从1到M2的M2种类别:这产生蛮力约简函数,该蛮力约简函数映射{1,2,…,M1]→[1,2,…,M2],其中M1≥M2

可以将用于将上下文集合映射到更小的上下文集合的蛮力约简函数存储在存储器中,以通过编码器/解码器作为在编解码期间的上下文约简操作来应用。可以存储映射作为查找表或其他数据结构。例如,蛮力约简函数可以仅应用于比特序列(模式)中的较晚的比特。上下文约简操作的组合和子组合

上文描述了三个示例上下文约简操作。在一些实施方式中可以单独地且独立地应用这些上下文约简操作中的每个上下文约简操作。在一些实施方式中可以组合这些上下文约简操作中的任意两个或更多个上下文约简操作。附加上下文约简操作可以单独地实施或与上文所描述的上下文约简操作中的任何一个或多个上下文约简操作组合地实施。

图26以流程图形式示出了涉及组合上下文约简的占用模式二进制编解码的方法3300的一个示例。给定了在{0,1,2,…,9}中的10元素邻居配置N10,方法3300对8比特二进制模式b0,b1,…,b7进行编解码。所评估的第一条件是邻居配置是否为空,即,N10=0。如果邻居配置为空,那么在不参考比特的顺序的情况下对比特进行编解码,如利用附图标记3302所指示。否则,按照正常方式对比特进行编解码,直到比特b4为止,在比特b4处,编码器和解码器开始应用蛮力上下文约简函数BRi,以通过将由邻居配置和先前编解码的比特的部分模式定义的上下文集合映射到具有基本上类似的统计结果的更小的上下文集合,来约简上下文的数量。

在该示例中,基于屏蔽/筛选,使用约简的邻居配置来对最后两个比特b6和b7进行编解码。

所以函数都可以被实施为用于约简上下文集合的大小的查找表(LUT)。在一种实际实施方式中,将所有约简都纳入约简函数(即,简称为LUT)的考虑中,该约简函数将上下文视为输入并且提供约简的上下文作为输出。在该示例实施例中,上下文的总数已经从2550个约简到576个,其中每个约简函数BRi的输出大小分别是70、106、110以及119。

总之,条件熵中的依赖性(或条件)

H(bi|b0,…,bi-1,N10)

可以由约简函数BRi约简以经由下式获得不太具有依赖性的条件熵关系:

H(bi|BRi[b0,…,bi-1,N10])。

如上文所描述,子体积邻居配置(例如子体积邻居配置值C[i]或加权的子体积邻居配置值C’[i])可以用于对占用比特bi进行编解码。在这种情况下,条件熵关系变为

H(bi|b0,…,bi-1,N10,C[i])

且类似于上文可以执行约简以获得

H(bi|BRi[b0,…,bi-1,N10],C[i])。

在上文中,约简函数BRi经由BRi[b0,…,bi-1,N10]应用于部分比特序列b0,…,bi-1和10元素邻居配置N10。在一些实施方式中,可以例如经由BRi[b0,…,bi-1,N10,C[i]]将约简函数BRi附加地应用于子体积邻居配置(例如应用于子体积邻居配置值C[i]或加权的子体积邻居配置值C’[i]),以获得条件熵关系:

H(bi|BRi[b0,…,bi-1,N10,C[i]])。

在这种情况下,可以依赖于(BRi[b0,…,bi-1,N10],C[i])的值来选择对占用比特bi进行编解码的二进制熵编解码器的概率p(例如上下文)的选择。

如果在对占用比特bi进行熵编解码时考虑了子体积邻居配置,那么上文所描述的图26将被修改为图37,其以流程图形式示出了基于涉及组合的上下文约简的子体积邻居配置(例如子体积邻居配置值C[i]或加权子体积邻居配置值C’[i])的占用模式二进制编解码的方法4400的一个示例。在给定{0,1,2,…,9}中的10元素邻居配置N10和子体积邻居配置值C[i](或加权的子体积邻居配置值C’[i])的情况下,方法4400对8比特二进制模式b0,b1,…,b7进行编解码。所评估的第一条件是邻居配置是否为空,即,N10=0。如果邻居配置为空,那么在不参考比特的顺序的情况下对比特进行编解码,如利用附图标记4402所指示。否则,按照正常方式对比特进行编解码,直到比特b4为止,在该处,编码器和解码器开始应用蛮力上下文约简函数BRi,以通过将由邻居配置和先前编解码的比特的部分模式定义的上下文集合映射到具有基本上类似的统计结果的较小上下文集合来约简上下文的数量。

在该示例中,基于屏蔽/筛选,使用约简的邻居配置来对最后两个比特b6和b7进行编解码。

所以函数都可以被实施为用于减小上下文集合的大小的查找表(LUT)。在一种实际实施方式中,将所有约简都纳入约简函数(即,简称为LUT)的考虑中,该约简函数将上下文视为输入并且提供约简的上下文作为输出。

当前体积内的扫描顺序的选择

在熵编解码器中引入子体积邻居配置(例如子体积邻居配置值C[i]或加权的子体积邻居配置值C’[i])增加了用于条件编解码的可能配置。

然而,通过仔细地选择当前体积B内的子节点SBi的扫描顺序的顺序来确定占用模式,从而确定要编解码的比特序列,可以限制这种增加。即,比特bi的编解码依赖于

·比特b0至比特bi-1,从而产生2i配置,

·10个邻居配置N10

·以及子体积邻居配置值C[i](或加权的子体积邻居配置值C’[i])

上文已经显示如何将子体积SB0至SB7的10·2i个配置从前两个项目符号点分别约简到10个、20个、39个、76个、149个、294个、391个以及520个配置。

现在,首先扫描C[i]的可能值的数量为最大值(例如在以上示例中的一些示例中为三个)的那些子节点明显是有利的。这样做,第一次扫描的子节点的配置的数量变为10·3=30,这可以被视为小增长。然而如果子节点SB0将在最后被扫描,则将获得520·3=1560个配置。因此,通过仔细地选择当前体积内的扫描顺序(来确定占用模式,从而确定要编解码的比特序列),在熵编解码器中引入子体积邻居配置(例如子体积邻居配置值C[i]或加权的子体积邻居配置值C’[i])在熵编解码时对配置(上下文)的数量具有有限影响。

因此,在一些实施方式中,当前体积内的扫描顺序可以被确定为使得从扫描顺序中的一个子体积到下一个子体积,当前体积的已经被编解码的邻近体积中的邻近子体积的最大可能数量不会增加。换言之,扫描顺序可以被确定为使得从扫描顺序中的一个子体积到下一个子体积,数量NT[i](或加权数量NT’[i])的最大可能值不会增加。

指示子体积邻居配置的使用的标记

为了允许编解码器的低复杂度分布,对标记进行编解码可以是有利的,该标记在确定对比特序列进行熵编解码的概率(例如上下文)时表示考虑子体积邻居配置的激活/去激活。

因此,在一些实施方式中,编码方法还可以包括:对标记进行编码,该标记指示了用于至少一个比特的熵编码的概率已经至少部分地基于子体积邻居配置而被选择。同样,解码方法还可以包括:对来自比特流的标记进行解码,该标记指示了用于至少一个比特的熵解码的概率应该至少部分地基于子体积邻居配置而被选择。

具有固定数量的上下文的系统中的上下文选择

先前所描述的上下文约简操作中的每个上下文约简操作可以在具有静态(固定)最小数量的上下文的压缩系统中进一步使用。在这种设计中,针对在8比特二进制模式中的给定符号,应用一个或多个约简操作以确定用于对符号进行编码或解码的上下文概率模型。

对压缩性能的影响

使用10个邻居配置和非二进制编解码通过用于点云编解码的MPEG测试模型的当前实施方式来提供压缩增益。然而,使用2550个上下文的级联二进制编解码的10个邻居配置的上文所建议的使用引起了压缩效率的甚至更佳的改进。即使在使用上下文约简时(诸如使用上文详述的三种技术)将上下文约简为总共576个,二进制编解码压缩仍比使用非二进制编解码的实施方式略微更佳并且比测试模型好得多。已经表明这种观察在不同测试点云数据之间是一致的。

现在参考图14,其示出了编码器1100的示例实施例的简化框图。编码器1100包括处理器1102、存储器1104以及编码应用1106。编码应用1106可以包括存储在存储器1104中并且包含指令的计算机程序或应用,该指令在被执行时使处理器1102执行操作,诸如本文中所描述的操作。例如,编码应用1106可以根据本文所描述的过程对比特流进行编码和输出编码的比特流。应理解,可以将编码应用1106存储在非瞬态计算机可读介质(诸如光盘、闪存设备、随机存取存储器、硬盘驱动器等)上。当执行指令时,处理器1102执行指令中所指定的操作和功能,以便作为实施所描述的(多个)进程的专用处理器而运行。在一些示例中,此处理器可以被称为“处理器电路”或“处理器电路系统”。

现在还参考图15,其示出了解码器1200的示例实施例的简化框图。解码器1200包括处理器1202、存储器1204以及解码应用1206。解码应用1206可以包括存储在存储器1204中并且包含指令的计算机程序或应用,该指令在被执行时使处理器1202执行操作,诸如本文中所描述的操作。应理解,可以将解码应用1206存储在计算机可读介质(诸如光盘、闪存设备、随机存取存储器、硬盘驱动器等)上。当执行指令时,处理器1202执行指令中所指定的操作和功能,以便作为实施所描述的(多个)进程的专用处理器而运行。在一些示例中,此处理器可以被称为“处理器电路”或“处理器电路系统”。

应了解,根据本申请的解码器和/或编码器可以被实施在若干计算设备(包括但不限于服务器、适当编程的通用计算机、机器视觉系统以及移动设备)中。解码器或编码器可以通过包含用于配置一个或多个处理器以进行本文中所描述的功能的指令的软件来实施。可以将软件指令存储在任何合适的非瞬态计算机可读存储器(包括CD、RAM、ROM、闪存等)中。

应理解,可以使用标准计算机编程技术和语言来实现本文中所描述的解码器和/或编码器以及实施所描述的用于配置编码器或解码器的方法/进程的模块、例程、进程、线程或其他软件组件。本申请不限于特定处理器、计算机语言、计算机编程规范、数据结构、其他此类实施细节。本领域的技术人员应认识到,所描述的进程可以被实施为存储在易失性或非易失性存储器中的计算机可执行代码的一部分,作为专用集成芯片(ASIC)的一部分等。

本申请还提供一种计算机可读信号,该计算机可读信号对通过根据本申请应用编码处理而产生的数据进行编码。

可以进行所描述的实施例的某些适应和修改。因此,将以上讨论的实施例视为说明性的而非限制性的。

65页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:用于点云的二进制熵编解码的方法和设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类