把 3D 空間中的點,投影到某個點後面距離 的 2D 平面上。
用 維來表示 維座標,在最後加一個維度,成倍數的點對應到同一個 維座標,相當於一條過原點的直線。
用來表示針孔相機:
也可能需要縮放和平移:
可以比一般二維矩陣線性變換做到更多事,除了 Euclidean(平移、旋轉)、Similarity(加上縮放)、Affine(加上推移),還可以做Projective(透視變換,比如正方形變成梯形)。
會發現 2D 到 3D 是不明確的,。
Task: 把一張 2D 圖片轉正到與另一張不同角度拍的 2D 圖片一樣。
作法:先找出對應點(correspondence),用特徵提取的演算法,比如 SIFT、CNN,再用 The Direct Linear Transformation Algorithm 找出 Transformation matrix 。
像人眼一樣,知道兩個相機的位置,則只需要兩張圖就能定位一個點。
兩個相機未必要都往正前方看,因為可以校正到正前方。
知道相機位置和姿勢(角度等),則搜尋 Pixel Correspondence 時能夠限制在一條直線上。
把對於某個點 p,把相機 A 的 Epipolar Line 對應到相機 B 的影像平面上,就能夠限制搜尋範圍在 Epipolar Line (一條直線)上,也就是在空間中 p 與相機 A 的連線上。
把兩個相機的圖片校正後,可以發現 Baseline 與影像平面交在無窮遠處。
假設對於一個點 x,相機 A 中對應到 X(以各自相機光心作為原點,自己的座標系),相機 B 中對應到 X',則有:,其中 為兩個相機間的旋轉矩陣, 為兩個相機間的平移向量。
,因此 。
當表示外積 ,可以變成 skew matrix 與 相乘,即 。
Essential Matrix: Let 、與 X 平行的 、與 X; 平行的 ,則有 Epipolar constraint 。其中
可以從網路上各種角度拍羅馬競技場的圖片,重建 3D 模型。
先找 correspondence、estimate 3D、再 optimize。
找出一張圖的有趣的點(光影變化大之類的?),並轉換成特徵向量,並把有重疊的圖片兩兩配對。
隨機找出一些 correspondence,算出 Fundamental Matrix,如果其他 correspondence 也符合那代表是個好的 Fundamental Matrix。
對於所有 3D 空間中的點,讓它投影到平面上的位置與實際結果最接近。Minimize RMS error。
Arxiv,用神經網路,原理待補。
甚至可以用影片建構一個環境及動作(4D)
修改 Mesh 是一個大的研究問題
Remeshing: 重新生成 Mesh,可能在更不細緻的地方用更少的點表示。
一般的角度可以定義為圓弧長度除以半徑,而立體角就可以類似的定義為表面積除以半徑平方。
因此會說一個圓有 的弧度,而一個球有 的球面度(sr)。
可以用積分計算表面積。
輻射強度 ,從一個來源發出的光
一個點光源的光功率(輻射通量)為 ,就是把輻射強度 對表面積分。因此在均勻的點光源,。
輻照度 ,在某個點每單位面積吸收的功率
, 是一個小面積, 是這個小面積上吸收的光。
若平面的法向量與光線呈現一個夾角 ,則因為面積乘以 ,但輻射通量不變,輻照度也會乘以 。
輻照度會隨著距離平方反比衰減。
輻射率 ,在某位置()、某方向()上,通過(或發出、吸收)單位面積(與光線垂直)、單位立體角的輻射通量。
知道輻射率 ,則對於立體角在一個半球上積分,可以得到半球的輻照度 。
均勻半球對於一個水平的小平面,因為有些光線是斜的,因此其實輻照度是
描述空間中所有光線的輻射率的分布。若知道物體的每個點以什麼強度發射光線、以及介質的資料,則可以用這些光線來 render 圖片,這就是 Volume Rendering。
multi-view stereo(也就是前面提到的用 correspondence 重建 3D 模型)相當於假設物體散射的光線是均勻的,從任何角度看到的顏色、強度都一樣,但事實顯然不是如此。
吸收率 的定義為:經過單位長度被吸收的機率。類似的,散射率 為經過單位長度被散射的機率。
探討不同情況輻射率的變化量:
減掉吸收、減掉外散射、加上發射、加上內散射,就是一小塊介質產生的光線變化。
(以下省略 )
: 有多少比例的輻射率從 x 往 y 的方向()會到達 y?只考慮吸收。
考慮背景光()經過吸收後,加上中途發射的光線經過吸收的總和。
直接叫模型學習:輸入位置、方向,輸出顏色、透明度。再進行 Volume Rendering,與圖片相比算出梯度後訓練模型。
之前的方法都是對於相機看出去的每個像素計算,但其實可以在有物體的地方再計算就好。
3D Gaussian 代表一個橢球,由中心座標()、3x3 的 Covariance matrix()、顏色、透明度表示,其中 Covariance matrix 代表了橢球的長度、形狀、方向等。
可理解為 ,其中 是旋轉矩陣, 是縮放矩陣。
3D Gaussian 的 PDF:
(實際上會乘上一個正規化的常數:)
簡報中表示為 , 是 Covariance matrix, 是 Gaussian 的中心。
簡報中 實際上有混用的情況,因此我一律使用 代表中心, 代表 C2W 的位移。
無腦的方式:對於每個像素對應到 world space 中的方向,對深度積分,但太花時間。
如果能把 Gaussian 投影到一個 2D 平面,那就可以很簡單的加總,不用對於每個像素、每個深度無論有無物體積分。
投影時需要有一個 space,使得以相機為中心的射線會與平面的法向量正交,實際上會以第三維度作為平面的法向量,這就是 ray space。
積分會變成:
其中 是 的左上角 的部分。
過程是先把 world space 轉換成 camera space,再轉換為 ray space。
把 Gaussian 從 world space 轉換到 camera space:由於 camera space 到 world space 是以 camera-to-world matrix 轉換,因此可以用它的反矩陣來轉換。
若 C2W 是
可惜 camera space 轉換到 ray space 不是 affine mapping: 但其實可以用它的 Jacobian 來近似: :中心在 camera space 的座標。
因此 Gaussian 為:
把物體以很多 3D Gaussian 表示後,可以
動作額外加了很多資訊,通常會是互動時所必須的。
如何描述運動?簡單的作法是像小球一樣當成剛體運動,但背景的移動難以表達,可以切分得很細,比如用每個粒子、像素的移動來表示。這也是模擬流體的方式。
人則是 Articulated Body,也就是具有關節,每個肢體會彼此牽連。
如何從 2D 影像中找出動作?用 Optical Flow,就是要知道像素如何運動。
同一個點移動時通常顏色不太會變,假設有個點從 以 的速度移動:
多變數泰勒展開:
可以用右邊像素減去左邊像素,y 也一樣。
可以用下一個時間的像素減去現在的像素。
但有 u v 兩個未知數,需要其他限制。
改進 Brightness Constancy Constraint,使用 Spatial Consistency Constraint:假設鄰近的點有類似的運動。有 n 個點,則變成:
寫成 ,則可能會用 近似,但當 病態(Pathological)時(eigenvalue 是 0 或很小),解會數值不穩定。
與圖像連結,低紋理區域(如天空)的空間梯度很小,因此 的 eigenvalue 很小,讓解不穩定。
此方法其實基於三個假設:
在運動太大時會失敗,因此可以先把影像畫質變低(相當於附近的點取平均),這樣運動就變小,再縮放回原本的大小。
如果 Spatial consistency 抓的點實際上是不同物體或景深,則效果會很差。如果能做物體的 segmentation 會好很多。
用個神經網路,直接輸出 x y 軸的運動量。
給定單相機(monocular)的 2D 影片,希望能
第一個想法,在每個時刻做 3D Volume Rendering 以 fit 出好的模型,不太好,因為沒有考慮隨時間的變化
Model 空間中每個點的運動
NERF 是輸入 Position+Direction 輸出 Color+Density。只要在輸入加上時間的維度就行了。
問題
用某時間的每個點對應到其他時刻並 render。
問題:物體可能被遮蔽,比較難跟蹤點的移動。
解法:
還有一個 Constraint 能利用:Cycle consistency constraint,預測 i 到 j 的運動,加上預測 j 到 i 的運動,應該要接近 0。
還是不太夠,如果能把靜態與動態區域分開,動態以上面講的方法做,靜態用原本的 NeRF,會更好一點。
用 4D Gaussian,因為 Gaussian 是局部連續的,所以可能需要切成很多塊。可以用 2D 平面加上時間變成 3D Gaussian 來想像。
這樣原生就支援了 Optical Flow,因為如果一個 Gaussian 斜斜的,也就是在不同時間的位置不太一樣,就代表了它的運動。
用同一個集合的 3D Gaussian 表示整個動態場景。大小(縮放矩陣)、顏色、透明度、background logit(上面提到作為背景的機率)不能改變,每個 Gaussian 只能改中心位置(三維)、旋轉角度(以四元數表示角度,避免 Gimbal Lock,可參考 3b1b)。
但位置能隨意改變還是太自由,會為了 fit 而太不穩定。可以用基於物理的假設,因為鄰近的 Gaussian 通常會像是剛體一樣,相對位置與旋轉不太會變。
還可以加上 Local-orientation loss: 相鄰的 Gaussian 有類似的旋轉角度。Local-translation loss: 相鄰的 Gaussian 有類似的位移。雖然與剛體假設有點重複,但會讓學習變得更快。
聽不太懂
Arxiv: Generative Model 可以作為 Discriminative Model,把圖片加上噪音,讓模型針對某個分類,預測加入的噪音為何,與真實值比較。
Arxiv: 結合
Contraint 太多,那不如把它們都變成 Optimization 問題。