Skip to content

三維點雲與立方體

用帶朝向的三維立方體、點、折線與逐點分割來標註 PCD、PLY、LAS 與 KITTI 點雲。八叉樹細節層次、正交切片面板,以及能在往返轉換中保真的四元數旋轉。

Potato 可以在瀏覽器中,用帶朝向的三維立方體、點、折線與逐點分割來標註雷射雷達與攝影測量點雲。 八叉樹細節層次讓數百萬點的掃描件在筆記本上依然可互動,而相機標定會把每一個框投影到影像上,使你可以在三維中編輯、在二維中核驗。

yaml
annotation_schemes:
  - annotation_type: spatial_annotation
    name: objects
    description: "Put a 3D box around every vehicle and pedestrian."
    source_field: point_cloud
    tools: [cuboid_3d, point_3d]
    labels:
      - {name: car, color: "#FF6B6B", key_value: "1"}
      - {name: pedestrian, color: "#FFD93D", key_value: "2"}
    color_mode: height
    point_size: 2.0
    max_points: 400000

可執行示例:examples/spatial/kitti-cuboids/

格式

點雲在服務端讀取,並轉換為瀏覽器可理解的一種緊湊二進位制格式。若在 JavaScript 中逐一解析各種格式,就意味著四套解析器、四套位元組序與記錄佈局的缺陷,而且每次頁面載入都要重新解析一份兩百萬點的掃描件。

格式說明
KITTI velodyne .binfloat32 的 x、y、z、強度,無檔案頭
PCDasciibinarybinary_compressed(LZF)
PLYasciibinary_little_endianbinary_big_endian
LAS1.0 至 1.4,點記錄格式 0 至 3 與 6 至 8
.xyz / .pts每行 x y z [r g b]
LAZ不直接讀取。請先轉換:laszip -i scan.laz -o scan.las

格式中若帶有顏色則會讀取顏色;KITTI、PCD 與 LAS 會讀取強度。若對一個沒有顏色的檔案請求 color_mode: rgb,系統會回退到按高度著色,並在狀態列中說明,而不是悄悄渲染出一個看起來像你所請求模式的結果。

工具

工具繪製內容
cuboid_3d一個帶朝向的三維框
point_3d單個三維點
polyline_3d穿過點雲的一條路徑
segment_3d對選中點集的逐點標籤

旋轉用四元數儲存,而非偏航角

Potato 把立方體的旋轉存為完整的四元數。多數格式只存單個偏航角,因此這看起來像是過度設計——直到某次往返轉換丟了東西為止。

正是它讓 KITTI 匯入做到無損,包括那約 0.85° 的相機相對雷射雷達的安裝傾角,而只有偏航角的欄位會把它丟掉且不作宣告。匯出回 KITTI 時確實必須捨棄俯仰與滾轉——但系統會報告捨棄了多少朝向資訊,而不是悄悄把框壓平。

Potato 能表達的內容與某種格式能儲存的內容之間的落差,是在格式相關的程式碼中、明確地跨越的,而不是在儲存層中、悄無聲息地跨越的。

一致性使用精確的帶旋轉三維 IoU

兩位標註者給同一輛車畫框,不會得到相同的框。Potato 用精確的帶旋轉三維 IoU 計算一致性,它在任意旋轉下都成立,而不只適用於軸對齊的框。

只要資料不是水平的,這一點就變得重要:無人機、手持與室內掃描都會產生具有真實俯仰與滾轉的框,而軸對齊的近似所報告的分歧,是度量方式的產物,而非標註者的分歧。參見幾何形狀上的一致性

大規模場景下的工作方式

  • 八叉樹細節層次預設開啟(lod: true)。點按區域與距離載入,因此大型掃描件仍可互動。
  • max_points 用於限制抽稀程度。它是檢視器設定,不是資料設定。
  • 正交切片面板mpr: true)提供三個軸對齊檢視,便於精確、完全鍵盤驅動的編輯。拖動其中一個面時,對面保持固定。

有一個值得知道的缺陷,因為它影響的是已儲存的資料而非顯示:segment_3d 的點索引過去假定了固定的抽稀比例,因此調低 max_points 會悄悄讓已有的逐點標籤指向不同的點。現在索引指向的是原始檔,所以檢視器設定不可能挪動一份標註。

相關內容