Try   HackMD

具形視覺筆記

Pinhole Camera

把 3D 空間中的點,投影到某個點後面距離

f 的 2D 平面上。

Homogeneous Coordinates

n+1 維來表示
n
維座標,在最後加一個維度,成倍數的點對應到同一個
n
維座標,相當於一條過原點的直線。
用來表示針孔相機:
x=fXZ,y=fYZ[100001000010][XYZ1]=[XYZ][X/ZY/Z1]
也可能需要縮放和平移:
[f0px0fpy001][X/ZY/Z1]=[f X/Z+pxf Y/Z+py1]
可以比一般二維矩陣線性變換做到更多事,除了 Euclidean(平移、旋轉)、Similarity(加上縮放)、Affine(加上推移),還可以做Projective(透視變換,比如正方形變成梯形)。

會發現 2D 到 3D 是不明確的,

x=PX=PHH1X=P~X~

Image Rectification with Projective Transformations

Task: 把一張 2D 圖片轉正到與另一張不同角度拍的 2D 圖片一樣。

作法:先找出對應點(correspondence),用特徵提取的演算法,比如 SIFT、CNN,再用 The Direct Linear Transformation Algorithm 找出 Transformation matrix

H

Simple Stereo System

像人眼一樣,知道兩個相機的位置,則只需要兩張圖就能定位一個點。
兩個相機未必要都往正前方看,因為可以校正到正前方。

Epipolar Geometry

知道相機位置和姿勢(角度等),則搜尋 Pixel Correspondence 時能夠限制在一條直線上。

概念

  • Baseline: 兩個相機的光心連線
  • Epipole: Baseline 與影像平面的交點
  • Epipolar Line: 對於某物體,其在影像平面的投影與 Epipole 連線的直線。
  • Epipolar Plane: 對於某物體,其與兩相機光心連線的平面。

把對於某個點 p,把相機 A 的 Epipolar Line 對應到相機 B 的影像平面上,就能夠限制搜尋範圍在 Epipolar Line (一條直線)上,也就是在空間中 p 與相機 A 的連線上。

把兩個相機的圖片校正後,可以發現 Baseline 與影像平面交在無窮遠處。

數學表示

假設對於一個點 x,相機 A 中對應到 X(以各自相機光心作為原點,自己的座標系),相機 B 中對應到 X',則有:

X=RX+T,其中
R
為兩個相機間的旋轉矩陣,
T
為兩個相機間的平移向量。

T×X=T×(RX+T)=T×RX,因此
X(T×X)=X(T×RX)=0

當表示外積

a×b,可以變成 skew matrix
[a]x
b
相乘,即
[a]xb

Essential Matrix: Let

E=TxR、與 X 平行的
p
、與 X; 平行的
p
,則有 Epipolar constraint
pTEp=0
。其中
Ep=TxRp=T×Rp

Reconstruct 3D Model from Random Images

可以從網路上各種角度拍羅馬競技場的圖片,重建 3D 模型。

初始方法

先找 correspondence、estimate 3D、再 optimize。

SIFT 的大致方法

找出一張圖的有趣的點(光影變化大之類的?),並轉換成特徵向量,並把有重疊的圖片兩兩配對。

RANSAC Algorithm

隨機找出一些 correspondence,算出 Fundamental Matrix,如果其他 correspondence 也符合那代表是個好的 Fundamental Matrix。

Bundle Adjustment

對於所有 3D 空間中的點,讓它投影到平面上的位置與實際結果最接近。Minimize RMS error。

DUSt3R

Arxiv,用神經網路,原理待補。

甚至可以用影片建構一個環境及動作(4D)

3D Representation

要考慮的點

表示平面的方式

  • Depth Map: 一個 2D 圖片,每個 pixel 代表一個深度值。
    • 是一個 2.5D 表示法,離不開 2D 的圖像。
    • Surface Normal Maps: 一個 2D 圖片,每個 pixel 的三原色代表法向量的方向。可以用 Depth Map 做微分得到。
    • 缺點:只能得到可見部分。
  • Point Cloud: 一堆 3D 點的集合,沒有順序。
    • 可能在物體上並不是均勻分布、無法表示連接性,同個物體的不同 Point Cloud 之間可能有很大差異,無法簡單的以 L2 等方式來比較。
    • Metics:
      • Chamfer Distance: 兩個 Point Cloud 之間的最小距離,對於
        S1,S2
        兩個 Point Cloud,
        d(S1,S2)=xS1minyS2xy2+yS2minxS1xy2
    • 點可以Render,把點壓成圓盤就行,但還是會有問題。
  • Mesh: 表面以一堆三角形的集合表示,相當於把 Point Cloud 連起來,用另一個列表紀錄每個三角形的面是哪三個點。
    • 點的順序不重要,但面裡面的點順序很重要,代表面的方向。
    • 修改 Mesh 是一個大的研究問題

    • Remeshing: 重新生成 Mesh,可能在更不細緻的地方用更少的點表示。

  • Parametric Model: 用數學參數式表示。
    • 例如貝茲曲線、貝茲曲面。
    • 缺點
      • 沒有全局資訊,例如無法知道一個點是否在形狀內。
      • 無法簡單 render。

表達物體的材質的資訊

  • Parametric Model(Implicit Surfaces),比如
    x2+y2=32
    ,函數值的正負表示在表面的哪一邊。也可以用 min、max 表示集合操作
  • Signed Distance Function(SDF): 一個函數,對於每個點,給出最近表面的距離。與 Parametric Model(Implicit Surfaces) 相似。但不用學具體函數,比較好一點。
  • Voxel Grid: 3D 網格,每個格子有一個值。
    • 優點:很好 sample、適合 Convolution
    • 缺點:需要很多記憶體、可能需要很高解析度來表示細節。
    • 改進:octree,把需要細節的部分才細分。但不能微分,神經網路無法輸出 Octree。若要 sample 需要經過很多層。
  • Constructive Solid Geometry(構造實體幾何):建模人員用布林操作建模。
  • Tetrahedral Mesh: 用四面體表示。

表示間的轉換

  • Continuous to Voxels: Sampling
  • Voxels to Continuous: Interpolation 插值
  • Voxels to Mesh: 用 Marching Cubes Algorithm
    • 對於每個方格,找出八個頂點的組合類型,並給出對應的 mesh
    • 優點:可平行化、不用學習
    • 缺點:Ambiguity 導致有問題,可能需要 remesh 等
  • Mesh to Point Cloud: Sample points on triangles
    • 隨機 sample 會導致不均勻,不夠好
    • Farthest Point Sampling: 選擇離已選點最遠的點,這邊的距離要是 Geodesic,在平面上的距離,而不是 Euclidean。結果會好一點。
  • Point Cloud to Mesh? Inherently an ill-posed Problem(本質上不適定)
  • Point Cloud to Implicit Surface: 找出最近的點,並算出法向量,進而得出距離。
    • 找法向量過程相當於 to Surface Normals
  • Implicit Surface to Mesh,先 Discritize,再用 Marching Cubes Algorithm

Volume Rendering

可參考知乎文章以及疑似原文

現實現象的觀察

  • Absorption: 霧等介質會吸收光線,使得物體看起來暗
  • Emission: 物體自己發光
  • Scattering: 散射,使光線變模糊
    • Forward: 來自別的方向的光被散射到這個方向
    • Backward: 來自這個方向的光被散射到別的方向

Prerequisite: Solid Angle 立體角

一般的角度可以定義為圓弧長度除以半徑,而立體角就可以類似的定義為表面積除以半徑平方。
因此會說一個圓有

2π 的弧度,而一個球有
4π
球面度(sr)

可以用積分計算表面積。

描述光的方式

Radiant Intensity

輻射強度

I,從一個來源發出的光

一個點光源的光功率(輻射通量)為

Φ,就是把輻射強度
I
對表面積分。因此在均勻的點光源,
I=Φ4π

Irradiance

輻照度

E,在某個點每單位面積吸收的功率

E(x)=dΦdA
dA
是一個小面積,
dΦ
是這個小面積上吸收的光。

若平面的法向量與光線呈現一個夾角

θ,則因為面積乘以
cosθ
,但輻射通量不變,輻照度也會乘以
cosθ

輻照度會隨著距離平方反比衰減。

Radiance

輻射率

L(x,ω),在某位置(
x
)、某方向(
ω
)上,通過(或發出、吸收)單位面積(與光線垂直)、單位立體角的輻射通量。

L(x,ω)=dI(x,ω)dA=d2Φ(x,ω)dωdAcosθ

  • 發射時,常常會以輻射強度
    I
    來表示,所以再除以單位面積
    Lo(x,ω)=dI(x,ω)dAcosθ
  • 吸收時,常常會以輻照度
    E
    來表示,所以再除以單位立體角
    Li(x,ω)=dE(x,ω)dωcosθ
環境的輻照度

知道輻射率

Li(x,ω),則對於立體角在一個半球上積分,可以得到半球的輻照度
E

均勻半球對於一個水平的小平面,因為有些光線是斜的,因此其實輻照度是

E=Lπ

Light Field

描述空間中所有光線的輻射率的分布。若知道物體的每個點以什麼強度發射光線、以及介質的資料,則可以用這些光線來 render 圖片,這就是 Volume Rendering。

vs multi-view stereo

multi-view stereo(也就是前面提到的用 correspondence 重建 3D 模型)相當於假設物體散射的光線是均勻的,從任何角度看到的顏色、強度都一樣,但事實顯然不是如此。

在一個點的光線變化

吸收率

σa 的定義為:經過單位長度被吸收的機率。類似的,散射率
σs
為經過單位長度被散射的機率。

探討不同情況輻射率的變化量:

  • Absorption
    經過一塊長度
    dz
    、吸收率
    σa
    的介質
    dL=σa(x)L(x,ω)dz
  • Emission
    某段介質會發出光,輻射率
    Le
    ,則通過長度
    dz
    的介質
    dL=σa(x)Le(x,ω)dz
  • Out Scattering 和吸收類似,但要用散射率
    dL=σs(x)L(x,ω)dz
  • In Scattering 和發射類似,但要用散射率
    dL=σs(x)Ls(x,ω)dz
    其中 L_s 代表從所有方向進來的輻射率。

Radiative Transfer Equation

減掉吸收、減掉外散射、加上發射、加上內散射,就是一小塊介質產生的光線變化。
(以下省略

(x),(x,ω)
dL=σaLdzσsLdz+σaLedz+σsLsdz=σaLdz+σaLdz=σa(LL)dz其中 L=Le+σsσa(LsL)

Transmittance (Absorption-only)

T(x,y): 有多少比例的輻射率從 x 往 y 的方向(
ω
)會到達 y?只考慮吸收。

  • 非均勻介質: 用積分表示
    dL(x,ω)=σa(x)L(x,ω)dzL(x0+ωz,ω)=exp(t=0zσ(x+ωt)dt)L(x0,ω)T(x,y)=exp(t=0xyσ(x+ωt)dt)
  • 均勻介質:
    eσxy

均勻介質 - Volume Rendering

考慮背景光(

xz)經過吸收後,加上中途發射的光線經過吸收的總和。

L(x,ω)=T(x0,xz)L(xz,ω)+0zT(x0,xt)σtLe(xt,ω)dt≈≈i=1NT(x0,xti)(emissionti+1ti)

非均勻介質 - Volume Rendering

Volume Rendering with Voxel Grid

Spherical Harmonics Model View-Dependent Lighting

NEural Radiance Field (NERF)

直接叫模型學習:輸入位置、方向,輸出顏色、透明度。再進行 Volume Rendering,與圖片相比算出梯度後訓練模型。

3D Gaussian Splatting

EWA Splatting

之前的方法都是對於相機看出去的每個像素計算,但其實可以在有物體的地方再計算就好。
3D Gaussian 代表一個橢球,由中心座標(

μ)、3x3 的 Covariance matrix(
Σ
)、顏色、透明度表示,其中 Covariance matrix 代表了橢球的長度、形狀、方向等。
可理解為
Σ=RSSR
,其中
R
是旋轉矩陣,
S
是縮放矩陣。

3D Gaussian 的 PDF:

G(x)=e1/2(xμ)Σ1(xμ)

(實際上會乘上一個正規化的常數:

12π|V|1/2)
簡報中表示為
GV(xt)
V
是 Covariance matrix,
t
是 Gaussian 的中心。

簡報中

t,p 實際上有混用的情況,因此我一律使用
t
代表中心,
p
代表 C2W 的位移。

大致具體過程

  • 先以 SfM 等方式,產生一些點,用來初始化 Gaussian 的位置,作為 Gaussian 的中心。
  • 投影到圖像上,與原本圖像對比,用誤差來更新 Gaussian 的位置、大小、顏色、透明度等參數。

渲染

無腦的方式:對於每個像素對應到 world space 中的方向,對深度積分,但太花時間。

加速渲染

如果能把 Gaussian 投影到一個 2D 平面,那就可以很簡單的加總,不用對於每個像素、每個深度無論有無物體積分。

投影時需要有一個 space,使得以相機為中心的射線會與平面的法向量正交,實際上會以第三維度作為平面的法向量,這就是 ray space。

積分會變成:

q(x^)=RGV3(xt)dx2=GV^2(x^t^) 其中
V^2×2
V3×3
的左上角
2×2
的部分。

過程是先把 world space 轉換成 camera space,再轉換為 ray space。

Notation
  • hat:去掉第三維度,上方的 hat 即為此意思。
  • u
    :camera space 的座標
  • x
    :ray space 的座標
  • tk
    :world space 的 Gaussian 中心
  • uk
    :camera space 的 Gaussian 中心
  • xk
    :ray space 的 Gaussian 中心
  • Vk
    :world space 的 covariance matrix
  • Vk
    :camera space 的 covariance matrix,
    Vk=WVkW
  • Vk
    :ray space 的 covariance matrix,
    Vk=JVkJ=JWVkWJ
  • ϕ
    :camera-to-world transformation
1. world space 到 camera space

把 Gaussian 從 world space 轉換到 camera space:由於 camera space 到 world space 是以 camera-to-world matrix 轉換,因此可以用它的反矩陣來轉換。

若 C2W 是

ϕ(x)=Wx+p
GVk(ϕ1(u)tk)=1|W1|GVk(uuk)

2. camera space 到 ray space

可惜 camera space 轉換到 ray space 不是 affine mapping:

x=(x0x1x2)=m(u)=(u0/u2u1/u2u) 但其實可以用它的 Jacobian 來近似:
x=muk(u)=xk+Juk(uuk)Juk=mu(uk)
uk
:中心在 camera space 的座標。

因此 Gaussian 為:

1|W1||J1|GVk(xxk)

3. Integrate

qk(x^)=RGVk(x^xk^,x2xk2)dx2=1|W1||J1|GVk^(x^xk^)

好處

把物體以很多 3D Gaussian 表示後,可以

  • 追蹤每個橢圓體的移動,進而做預測
  • 明確、互相獨立:隨意縮放、貼上任意模型到任意場景
  • particle-based:可以使用既有的物理模擬

4D Modeling

動作額外加了很多資訊,通常會是互動時所必須的。

如何描述運動?簡單的作法是像小球一樣當成剛體運動,但背景的移動難以表達,可以切分得很細,比如用每個粒子、像素的移動來表示。這也是模擬流體的方式。

人則是 Articulated Body,也就是具有關節,每個肢體會彼此牽連。

描述運動方式

  • Particle motion(Lagrangian representation): 在河裡丟樹葉,紀錄樹葉的運動。
  • Vector field(Eulerian representation): 在河裡放固定的偵測器,紀錄水流的運動。

Optical Flow

如何從 2D 影像中找出動作?用 Optical Flow,就是要知道像素如何運動。

Brightness Constancy Constraint

同一個點移動時通常顏色不太會變,假設有個點從

(x,y)
(u,v)
的速度移動:

I(x+uΔt,y+vΔt,t+Δt)I(x,y,t)

多變數泰勒展開:

f(x,y)f(a,b)+fx(a,b)(xa)+fy(a,b)(yb)I(x+uΔt,y+vΔt,t+Δt)I(x,y,t)+Ix(x,y,t)uΔt+Iy(x,y,t)vΔt+It(x,y,t)ΔtIx(x,y,t)uΔt+Iy(x,y,t)vΔt+It(x,y,t)Δt0Ixxt+Iyyt+It0

Ix 可以用右邊像素減去左邊像素,y 也一樣。
It
可以用下一個時間的像素減去現在的像素。

但有 u v 兩個未知數,需要其他限制。

Lucas-Kanade

改進 Brightness Constancy Constraint,使用 Spatial Consistency Constraint:假設鄰近的點有類似的運動。有 n 個點,則變成:

[I(x1,y1)xI(x1,y1)yI(xn,yn)xI(xn,yn)y][xtyt]=[I(x1,y1)tI(xn,yn)t]

寫成

Ad=b,則可能會用
d=(AA)1Ab
近似,但當
AA
病態(Pathological)時(eigenvalue 是 0 或很小),解會數值不穩定。

與圖像連結,低紋理區域(如天空)的空間梯度很小,因此

AA 的 eigenvalue 很小,讓解不穩定。

此方法其實基於三個假設:

  • 一階泰勒展開,假設運動幅度不大
  • Brightness constancy constraint: 假設運動不會改變亮度
  • Spatial consistency constraint: 假設運動在空間上是連續的

在運動太大時會失敗,因此可以先把影像畫質變低(相當於附近的點取平均),這樣運動就變小,再縮放回原本的大小。

如果 Spatial consistency 抓的點實際上是不同物體或景深,則效果會很差。如果能做物體的 segmentation 會好很多。

這個年代的作法

用個神經網路,直接輸出 x y 軸的運動量。

3D Motion (4D)

給定單相機(monocular)的 2D 影片,希望能

  • 在固定時間模擬不同視角
  • 在固定視角模擬不同時間
  • 在不同時間模擬不同視角

第一個想法,在每個時刻做 3D Volume Rendering 以 fit 出好的模型,不太好,因為沒有考慮隨時間的變化

Model the Motion Explicitly

Arxiv

Model 空間中每個點的運動

NERF to SpatioTenporal NERF

NERF 是輸入 Position+Direction 輸出 Color+Density。只要在輸入加上時間的維度就行了。

問題

  • 但由於單相機,每個時刻只有一個視角的影像。可以用 Depth Loss 來改善。
  • 被遮蔽的部分還是沒有被 Constain。用 Static scene loss,因為很大部分是靜態的,把其他時間的像素拿來用:
    F(x,t)F(x,t)22
  • 還是沒有追蹤每個點隨時間的變化

Neural Scene Flow Fields

Arxiv

用某時間的每個點對應到其他時刻並 render。

問題:物體可能被遮蔽,比較難跟蹤點的移動。
解法:

  • 發生遮蔽的部分忽略掉,比如讓 Model 預測 i 到 j 哪些點會被遮蔽。把 Color loss 乘上遮蔽的機率,但還要加一項使遮蔽比例盡量低。

還有一個 Constraint 能利用:Cycle consistency constraint,預測 i 到 j 的運動,加上預測 j 到 i 的運動,應該要接近 0。

還是不太夠,如果能把靜態與動態區域分開,動態以上面講的方法做,靜態用原本的 NeRF,會更好一點。

4D-Rotor Gaussian Splatting

Arxiv

用 4D Gaussian,因為 Gaussian 是局部連續的,所以可能需要切成很多塊。可以用 2D 平面加上時間變成 3D Gaussian 來想像。

這樣原生就支援了 Optical Flow,因為如果一個 Gaussian 斜斜的,也就是在不同時間的位置不太一樣,就代表了它的運動。

Dynamic 3D Gaussians

Arxiv

用同一個集合的 3D Gaussian 表示整個動態場景。大小(縮放矩陣)、顏色、透明度、background logit(上面提到作為背景的機率)不能改變,每個 Gaussian 只能改中心位置(三維)、旋轉角度(以四元數表示角度,避免 Gimbal Lock,可參考 3b1b)。

但位置能隨意改變還是太自由,會為了 fit 而太不穩定。可以用基於物理的假設,因為鄰近的 Gaussian 通常會像是剛體一樣,相對位置與旋轉不太會變。

還可以加上 Local-orientation loss: 相鄰的 Gaussian 有類似的旋轉角度。Local-translation loss: 相鄰的 Gaussian 有類似的位移。雖然與剛體假設有點重複,但會讓學習變得更快。

DynaDUSt3R

Arxiv

聽不太懂

Generative Model

Arxiv: Generative Model 可以作為 Discriminative Model,把圖片加上噪音,讓模型針對某個分類,預測加入的噪音為何,與真實值比較。

Arxiv: 結合

Lagrangian Incremental Potential

Contact Modeling

問題

  1. 如何讓物體只有在接觸時才有摩擦力?
  2. 如何讓物體在接觸時不會穿過去?
  3. 在有摩擦力、不能穿過去的情況下,要如何解 Optimization?

Incremental Potential Contact

Paper on ACM

Contraint 太多,那不如把它們都變成 Optimization 問題。

  • Barrier Energy:防止穿透,距離很近時,才有影響。

b(d,d^)={(dd^)2ln(dd^),0<d<d^0,dd^

  • 摩擦力:記得有動摩擦力與靜摩擦力的差別。對於一個接觸 k,令其 Oriented sliding bases 為
    Tk(x)