Skip to content

CS231N L15:3D 視覺——同一個形狀,五種存法

2026年9月30日1 分鐘
TL;DRCS231N 第 15 講用一個問題貫穿全場:3D 形狀要用什麼資料結構存,神經網路才吃得進、吐得出?投影片依序走過 depth map/surface normal、voxel、point cloud、triangle mesh、implicit surface 五種表示,每種各配一個代表架構(全卷積深度預測、3D 卷積、PointNet、Pixel2Mesh 與 Mesh R-CNN、DeepSDF),再到 NeRF 與 3D Gaussian Splatting 的速度取捨,最後點名 VGGT、TRELLIS、Marble 等 2025–2026 的新模型。2025 錄影用的是另一套投影片,順序與重點不同。

🌏 English version

來源年份:投影片依據 CS231N Spring 2026 的 Lecture 15 投影片(87 頁,封面日期 2026-05-21);錄影是 Spring 2025 的 Lecture 15(YouTube,約 1 小時 11 分,講者 Jiajun Wu)。要特別注意:2025 年那堂用的是 Jiajun Wu 自己的 105 頁投影片,編排跟 2026 版不同,錄影不能逐頁對照 2026 投影片。2026 錄影只放在 Canvas,限修課生。

這是 Stanford CS231N 導讀系列的第 19 篇。

系列位置:上一篇 A3 導讀:Transformer Captioning、SSL、DDPM、CLIP & DINO|下一篇 收尾:World Modeling/Robot Learning、Human-Centered AI 與期末專題|系列總覽

課表上 L15 排在 L14 與 L16 中間。本系列把它移到 A3 之後,因為它跟 A3 的四題都沒有關係,放在這裡能讓「生成→多模態→作業」連成一串。

前面十幾講處理的都是 2D 影像,頂多加上時間軸變成影片(L10)。這一講多加一個空間維度。投影片開頭先列出 3D 視覺有多少子題:3D 表示、對應點計算、多視角立體、structure from motion、姿態估計、SLAM、可微渲染、3D 感測器。一堂課講不完,所以 2026 版只挑第一個:3D 形狀怎麼表示。

課表的三個關鍵字是 3D shape representations、shape reconstruction、neural implicit representations。整講可以用一句話串起來:每一種存法,都決定了神經網路要長什麼樣子、損失函數要怎麼寫。

先繞過 3D:Multi-View CNN

投影片的第一個例子最偷懶,也最有啟發:不處理 3D,直接從多個角度渲染 2D 圖片,每張過同一個 CNN,再對所有視角的特徵做逐元素 max-pooling,接第二個 CNN 輸出形狀描述子(Su et al., ICCV 2015)。

在 ModelNet40 的分類與檢索上,它勝過投影片表格裡的非深度方法與 3D ShapeNets。訊息很清楚:2D CNN 已經很強,能借就借。但它也迴避了問題本身,接下來五種表示才是這講的主體。

五種表示,一張總表

表示存什麼優點麻煩投影片的代表作
Depth map(加 surface normal)每個像素到相機的距離(或表面法向量)就是一張 2D 圖,全卷積網路直接用只看得到正面,是 2.5DEigen & Fergus 的深度預測;DepthAnything
Voxel gridV×V×V 的佔據格子概念最簡單,像 3D 版的分割遮罩解析度一高記憶體爆炸3D ShapeNets、3D-R2N2、octree
Point cloudP 個 3D 點的集合用少量點也能表現細節沒有表面,要後處理才能渲染PointNet、Point Transformer
Triangle mesh頂點與三角面圖學標準格式、平面省面、細節處多給面神經網路不好處理Pixel2Mesh、Mesh R-CNN、MeshAnything
Implicit surface一個判斷「點在內或外」的函數解析度不受格子限制要取樣、要查很多次DeepSDF、NeRF

下面每一節只講這張表裡「麻煩」那一欄怎麼被處理。

Depth map:單張圖看不出大小

用 RGB 影像預測深度圖,架構就是全卷積網路加逐像素 L2 損失。問題在物理上:一個近而小的物體,和一個遠而大的物體,在單張影像上長得一模一樣,絕對尺度與深度從單圖本來就無法判定。

投影片的對策是 scale-invariant loss,讓整體尺度差一個倍數時不被懲罰。surface normal 的預測也用同一套架構,損失換成預測向量與真實向量的 cosine(投影片順手複習了 x·y = |x||y|cos θ)。最後點名現代的 Depth Anything 系列。

Voxel:簡單,但立方成長

voxel 把形狀存成 V×V×V 的佔據格子,處理它就用 3D 卷積,訓練照樣用分類損失。投影片的缺點寫得很直白:要細節就要高解析度,但記憶體隨 V 的立方成長。它舉的數字是:存一個 1024³ 的 voxel 格子要 4 GB。

解法之一是 octree:只在需要細節的地方細分格子(Tatarchenko et al., ICCV 2017)。

Point cloud:順序不該有意義

點雲就是一組點。難處在於它是集合:同一組點換個順序,應該還是同一個形狀。

PointNet 的做法是對每個點各自跑同一個 MLP,再用 max-pool 把所有點的特徵合成一個向量。max 不在乎順序,網路因此天生對排列不變。投影片接著列出它的應用(分類、部件分割、場景語意分割),以及把點雲和 RGB 逐點融合的 DenseFusion。

反過來生成點雲時,要一個能比較兩個點集的損失。投影片給的是 Chamfer distance:每個點找另一集合最近的點,平方距離加總,雙向各算一次。它不需要一一對應,而且可微。現代的代表是 Point Transformer 系列。

Mesh:拓撲是固定的

三角網格是圖學的標準格式,頂點上還能掛顏色、貼圖座標、法向量。代價是神經網路不好處理。

Pixel2Mesh 從單張 RGB 影像輸出網格,投影片列了它的四個關鍵:從初始網格反覆變形、graph convolution、把影像特徵對齊到頂點、用 Chamfer loss 訓練。

變形法有一個根本限制:拓撲由初始網格決定,一個球怎麼變形都長不出把手的洞。Mesh R-CNN(Gkioxari、Malik、Johnson,ICCV 2019)的答案是混合表示:在 Mask R-CNN 上加一個 mesh head,先預測 voxel 得到拓撲正確的粗網格,再變形細修。輸出是每個偵測物件的框、類別、實例分割,加上一個 3D 網格。

這一段把 L9 的偵測與分割直接延伸到 3D。現代的代表是用自迴歸 Transformer 生成網格的 MeshAnything。

Implicit surface:把形狀變成一個函數

前四種都是「列出形狀在哪裡」。implicit function 反過來:學一個函數 o(x),輸入任一 3D 點,輸出它在形狀裡面的機率,表面就是 o(x) = ½ 的等值面。投影片借了 Berkeley CS184 Ren Ng 的 constructive solid geometry 投影片說明這個想法由來已久,再接到 DeepSDF:用網路學 signed distance function。

NeRF 的輸入輸出

NeRF(Mildenhall et al., ECCV 2020)的網路輸入一個位置 (x, y, z) 和觀看方向 (θ, φ),輸出顏色 (r, g, b) 與密度 σ。渲染一個像素時,沿著相機光線取很多點查詢這個 MLP,再把結果合成。它的任務是 novel view synthesis:看過一個場景的多張照片後,渲染出沒拍過的角度。

NeRF 之後,投影片快速列了三個延伸:可變形場景的 Nerfies、處理高動態範圍的 RawNeRF、把一整個舊金山街區拼起來的 Block-NeRF。

然後是它的主要問題:非常慢。投影片的數字是單一場景在一張 V100 上訓練要 1–2 天;渲染一張 256×256 的圖、每像素取 224 個樣本,要跑 1,460 萬次 MLP 前向。

3D Gaussian Splatting 的解法是改回顯式表示:場景是一群 3D 高斯,沿光線混合離散的高斯,而不是查詢連續的 MLP。投影片的對照表是:NeRF 擬合用最好的 GPU 也要好幾個小時(前一頁那個 1–2 天是 V100 的數字)、中等解析度渲染約 10 秒一幀;3DGS 擬合幾分鐘、可以即時渲染。延伸還有追蹤動態場景的 Dynamic 3D Gaussians。

投影片最後點名的新模型

總結頁之後,投影片用幾頁列出「進階用例」,每頁只有一個名字與一張圖:

  • SLAM:VGGT 系列
  • 3D 物件生成:TRELLIS 系列
  • 3D 世界生成:World Labs 的 Marble

投影片沒有展開這些模型的原理,本文也不替它補。它們的作用是告訴你:前面五種表示不是歷史,現在的大模型仍在它們之上選邊。

2025 錄影講了什麼不一樣的

如果你配 2025 錄影看,會發現順序完全不同。Jiajun Wu 的 2025 投影片從圖學出發:先分 explicit(點雲、多邊形網格、參數曲面、Bézier、subdivision)與 implicit(代數曲面、CSG、distance function、level set)兩大類,比較兩者在取樣與內外判斷上各自容易什麼;接著講 ShapeNet 等資料集,再走 voxel、octree、PointNet、DeepSDF、Occupancy Networks、NeRF、Gaussian splatting,還有樹狀與圖狀結構的生成。

兩套投影片的核心詞彙重疊(voxel、point cloud、mesh、implicit、NeRF),但 2026 版多了 Mesh R-CNN、深度與法向量預測,以及 2025–2026 的新模型。建議以 2026 投影片為主線,錄影當作「同一主題的另一位老師」來看。

自學怎麼讀這一講

  1. 先把總表背起來。後面每個模型,都先問「它用哪一種表示、那種表示的麻煩它怎麼處理」。
  2. PointNet 那頁值得停下來:用紙筆驗證「逐點 MLP 加 max-pool」為什麼對點的順序不敏感。
  3. Chamfer distance 自己寫一次。兩個 (N, 3) 與 (M, 3) 的張量,用 torch.cdist 幾行就能寫完,寫完就懂它為什麼不需要對應。
  4. NeRF 與 3DGS 的對照不是「新的比較好」,而是隱式與顯式的取捨,回頭對照 voxel 和 implicit 那兩列的優缺點。

今晚可以做的一件事:拿任一個手邊的 3D 物件(杯子就行),寫下它用五種表示各自要存多少資料,哪一種最能表現杯把的洞。

延伸閱讀

參考資料