1. 程式人生 > 實用技巧 >點雲的幀間預測

點雲的幀間預測

目錄

一、前言

這篇部落格是我寫的一個筆記總結,主要是對MPEG的m42520提案做的簡單總結,該提案是有關於點雲幀間預測,寫了如何使用預測點集來對點雲幾何資訊進行編碼。

二、視訊預測與點雲預測

動態點雲可以在時間上和空間上有高度的相關性,如下圖所示

在這裡插入圖片描述
左圖是第F幀的點雲,右圖是第F+1幀的點雲,黃色部分就是這兩幀點雲中相近的部分,而每幅點雲內可以看到也有很多相近的部分。

在視訊編解碼標準中,有幀間預測幀內預測這樣的技術來使用視訊影象中的時間和空間相關性,這些技術在H.264/AVC和H.265/HEVC中都有很詳細的描述。

在視訊壓縮中的幀間預測,是通過使用2D運動向量移動參考幀的一部分以預測當前幀的一部分,這一部分通常是正方形或者矩形塊。而在3D點雲中,可以考慮移動3D點雲塊的3D運動向量來預測要編碼的另一個3D點雲塊。

在視訊中,預測可以理解為在RGB空間或YCbCr空間中對三個顏色分量的預測。而在點雲中,預測不僅僅可以解決視訊中點的顏色問題,也可以解決其幾何形狀,即3D位置問題(因為在視訊中,畫素在螢幕上的位置是固定的,是一一對應的,只需要傳輸每個畫素的顏色即可,而點雲是一個3D的物體,在螢幕上可以從不同角度來觀看它,所以對於點雲不僅僅要傳輸屬性(顏色和反射率)資訊,還要傳輸位置資訊)。

在視訊中,競爭性的 率失真優化(RDO)

過程通過將率失真代價降至最低來選擇最佳的預測模式。該速率是通過將用於發訊號通知模式的位數獲得的,失真是根據預測塊和要編碼的當前塊的顏色之間畫素的差異而獲得的。

在點雲中也可以使用同樣的技術。例如,關於幀內預測,可以使用區域性平面估計來延長當前點雲的參考部分,以獲得作為一組彩色點的預測器(predictor)。在幀間預測時,從幀F到幀F + 1,通過移動幀F的點來預測F + 1。F幀和F + 1幀之間的運動以獲得一組預測點 = 預測器

那我們應該如何獲取這個預測器呢?
對於幀內預測:

  • 從已經編碼的相鄰點
  • 佔用的來自不同樹深的節點

對於幀間預測:

  • 運動向量
  • 剛體變換=平移+旋轉
  • 通用矩陣公式下的非剛體變換

對於3D物件,幀間預測可能比3D運動向量的簡單轉換要複雜。使用下面的矩陣公式,可以將其擴充套件為表示平移和旋轉的剛體變換(只有物體的位置(平移變換)和朝向(旋轉變換)發生改變,而形狀不變),甚至可以是非剛體變換。

在這裡插入圖片描述
如果3x3矩陣為單位矩陣,則相當於沿著向量V獲得3D平移。如果矩陣為正交,則獲得剛體變換而不會使點集區域性變形。更通用的矩陣允許非剛體變換。

三、如何使用預測

一旦選擇從幀內和/或幀間預測模式的過程中獲得了預測點集,就必須使用該集合來改善點雲的壓縮,即幫助算術編碼器更好地編碼佔用模式。那這該如何執行呢?

預測點集可能使用的一般框架如下圖所示。基本上,預測點將有助於壓縮與代表當前幀幾何結構的樹的每個節點(TM3中的八叉樹)相關的佔用資訊。

在這裡插入圖片描述
在上圖中,左側是對編碼模式(個人理解,是當前節點對子節點的劃分方式)以及運動向量(MVs)的編碼(這一部分在提案m42521中會有介紹),它是通過RDO(率失真優化)來進行確定,模式選擇被編碼為附帶資訊。對於每一種編碼模式都會生成預測點子集,預測點的所有子集的集合就是預測器。

右側是對當前點雲的編碼,它主要取決於左圖中生成的預測器,通過算術編碼器,來表示當前幀幾何結構的樹的佔用模式。

m42520這一篇提案提出一種用預測點集來驅動算術編碼器的特定方法。在另一篇提案m42521中,更詳細地描述瞭如何使用幀間預測來獲得預測點集。在提案m42238中,提出使用TM3中的相鄰資訊來改善用於第三類點雲的幾何編碼的壓縮效能。該技術提供了很好的收益,同時它提出的方法相容了預測器和鄰近資訊,這顯得非常重要。因為在理想情況下,預測器將和鄰近資訊一起工作。

四、技術方案

使用預測點集(預測器(predictor))來幫助在八叉樹中編碼表示要編碼的點雲的幾何圖形的8位佔用模式,然後使用算術編碼器對佔用模式進行編碼。

一方面,要編碼的8位模式由位b0…b7組成,這些位表示當前節點的八個子節點i的佔用率(bi)。另一方面,還可以通過使用相同的八叉樹獲得一個8位預測器的佔用模式bP0…bP7來計算八個子節點i的預測佔用率(bPi),來通過使用至少預測器中的一個點來計算預測器的佔用率。

如果預測器不太差,則應該可以通過bPi來預測bi,因為當前點雲佔用率和預測器佔用率之間應該存在相關性,即在熵方面

在這裡插入圖片描述
通過使用如下圖所示的XOR運算子來利用這種相關性。對於八叉樹的每個節點,獲得預測佔用模式Pp和將要進行編碼的佔用模式Pc,執行XOR運算,然後通過熵編碼器對Pp XOR Pc結果進行編碼。

在這裡插入圖片描述
但是,異或運算很難與鄰近資訊相結合。人們期望,一旦引入鄰近資訊N來幫助壓縮模式,預測和鄰居就可以一起工作。就熵而言,這可以寫成

在這裡插入圖片描述
並且,如果預測和鄰居是互補的,則可以寫成

在這裡插入圖片描述
建議使用幾組上下文來驅動熵編碼器。選擇一組要編碼的位元bi取決於預測器的佔用率bP。在每組上下文的結構中自然會考慮鄰近資訊。第一種可行方案是使用如下圖所示的三組上下文,即:no predpred0pred1

在這裡插入圖片描述
這三組上下文選擇如下所示:

  • 如果上一幀點雲對應節點(參考點雲幀,當前只有前向預測)沒有預測(bp = 0)(比如預測的佔用模式全為零(在父節點的預測器中沒有點)或者因為停用預測,下文會提到),選用上下文為不預測 (no pred)
  • 如果上一幀點雲對應節點的子節點i為空,則當前節點的子節點i被預測為空(bPi = 0),選用上下文為預測0 (pred0)
  • 如果上一幀點雲對應節點的子節點i被佔用,則當前節點的子節點i被預測被佔用(bPi = 1),選用上下文為預測1 (pred1)

在該想法的更高階實現中,使用了四組上下文,如果子節點i被預測為佔用(bPi = 1)並且子節點中有很多預測點(Npred>閾值)(上一幀點雲對應子節點中有很多點,而不是一兩個點(一兩個點的情況可能是因為噪聲等原因),所以當前子節點中有很大概率有很多點),則新增新的選擇集predL集(強預測模式)

此外,引入預測停用功能以自動修剪從預測八叉樹中預測不好的區域。 實際上,如果對父節點進行了錯誤的預測,則停用預測。對於給定的節點,不良的預測標準是不良預測的位元數(bi≠bPi)(八叉樹中的8個)大於閾值Nbad(在我們的測試中設定為4)。在這種情況下,給定節點的所有8個子節點都停用預測。

如下圖所示,每組上下文集具有576(包含幀內幀間預測的上下文,當前不用太關注)個上下文。現在我們有四個集合,這導致總共576 * 4 = 2304個上下文。這太多了,所以必須新增上下文減少的額外步驟以保持請求的上下文數量合理。

在這裡插入圖片描述

五、總結

提出使用預測器的佔用模式來驅動熵編碼器,該熵編碼器對要壓縮的點雲的佔用模式進行編碼。“驅動”是指在(四)組上下文之間進行選擇。為了保持合理數量的上下文,必須新增使用全域性蠻力縮減(global brute force reduction)的進一步上下文縮減(下降到596個上下文)。