2011/10/11

Art of Optical Flow 光流的藝術

Optical Flow是從觀察者的角度(2D), 物體上面的特徵點所產生的運動向量. 這些向量可以由每個frame推算出來. 得到這些向量的資訊, 用在影片格式方面, 可以用來壓縮影片. 在電影特效的領域裡:可以用來追蹤畫面, 自動去背, 自動ROTO, 重建3D場景, 製作慢動作特效, 計算景深資訊. 在機器科學裡面, 可以讓無人飛機偵測環境碰撞, 判斷速度, 物體的遠近. 基本上Optical Flow的技術可以視為一種機器的視覺. 以下文章主要由fxguide而來, 挑出重點略譯.


----以下為編譯後的內容----
作者:Mike Seymour
編譯:Hammer Chen

"Optic flow"這的詞, 其實是你我每天都會體驗到的視覺現象. 基本上, optic flow是當你在運動的時候, 體驗到的視覺上的移動. 假設你做在車子裡面, 看窗,外 你會看到樹木, 地面, 建築物, 似乎在往後移動---這樣的動作就是"optic flow". 這個動作也能告訴你物件跟你的距離有多遠, 距離比較遠的例如天空的雲, 山脈會移動的比較慢. 比較近的如樹木或是建築物會移動的比較快. 非常近的物體, 例如地面, 會以非常快的速度離開你. (節錄自Centeye)

我們可以用很清楚的數學來界定optic flow的強度與物件跟你的關係. 如果你用兩倍的速度移動, 那麼optic flow也會變成兩倍. 如果物件兩倍的接近你, optic flow也會變成兩倍. 而且optic flow也跟角度有關, 跟你移動的方向, 和觀看的方向有關. 如果你往前移動, 跟你呈90度角的會有最大optic flow. 如果朝你而來, 則optic flow會比較小.

Optical flow 是視覺特效科技發展最有趣的技術, 這裡會專訪發明這項技術的人.

電影駭客任務Matrix裡面的子彈時間( bullet time) 跟 optical flow技術大有關係!

Bill Collis是The Foundry公司寫出 Furnace optical flow外掛的人. 該外掛還包含了改變時間撥放快慢(retimers )的 Kronos功能, 而ILM公司的Kim Libreri 認為Kronos是當今做 retimers最棒的工具. Optical flow大概是在十年前開始被用在電影裡面, 而現在有業界裡面的天才們正在開發相關的外掛 ,有了這些外掛, 美術人員就有機會處理極端複雜的畫面, 把這項科技用在 After Effects Shake, Flame, Nuke, Fusion 與 toxik等合成軟體.

Optical flow或是追蹤每個像素所需要數學, 被用再當今標準的影片轉檔與壓縮裡面, 在視覺特效的領域裡面, Optical flow 被用在改變影片快慢(retime), 追蹤, 3D場景重建, 動態模糊, 自動roto, 移除缺陷 (dirt removal).

對於 Optical flow的計算, 我們必須要考慮每個像素的x y移動向量, 也要考慮每個像素的品質, 比較這個frame的某像素跟下個frame一不一樣, 還必須要設定一個評量標準, 怎樣的像素可以作為追蹤點. optical flow都是以浮點數在計算的, 有些會儲存在 OpenEXR檔案裡面.

"當我們在走路或是移動頭時, 眼裡的世界也跟著改變, 即便是我們靜止不動, 這個世界也不會一直維持不動. 東西會飄落, 樹木會擺動, 小孩嬉戲. 這一類的動作, 以及我們對動作的了解, 似乎很平常, 我們往往把它當作理所當然. 事實上, 能夠查覺這個世界的改變, 對於生存十分重要, 沒有這項能力, 我們感知就會失去連續性"---- M.Black 博士班論文, 1992年.

Black博士的論文呈現了---optical flow, 做為這個世界的動作投影到觀察者的平面最好的註解. Optical flow 是以二維的向量場所呈現的, Optical flow是由移動的物體, 或是攝影機移動所造成的 用最簡單的說法來談, optical flow 它就是追蹤一個frame的像素, 然後追蹤下一個frame...最後的輸出會得到一系列的向量, 從這些向量與分析, 你就可以找到原本場景中物件的形狀.

為什麼這樣的分析很重要, 因為基本上 optical flow可以視為"機器的視覺". 一旦我們給予電腦"看" 東西的能力, 那麼電腦就能由2D畫面判斷出的物件形狀, 物體位置甚至演員, 這樣開啟了很龐大的機會, 我們可以依此做出很多很酷的特效. 一旦電腦可以"看"到車子, 電腦就會自己對汽車做roto的工,作 自動取代背景隱藏的部分( background hidden)或是把汽車挖掉. 一旦電腦"看"的到, 電腦就會產生深度圖(depth map), 顯示哪些東西靠的比較近, 哪些比較遠, 甚至可以進行retime. 精確地對畫面進行補差 (missing frames between any two ), 產生非常平順的慢動作特效.

Optical flow 雖然是一項技術, 讓我們分析場景, 這不是3D的分析, 也不需要任何特殊的硬體. 它主要是比較每個frame 試著去比對每個像素, 由一個frame到下一個fram, 如果有一個完全平滑的球在自旋的話, 因為畫面上看不出動作, 所以就沒有Optical flow了!

Optical Flow的拍攝規範
前面談那麼多Optical Flow的理論有什麼意義呢? Optical Flow的程式寫法是根據某些假設或是規則, 如果你在拍攝的時候遵守這些規則, 就會產生比較好的結果. 這很容易理解, 我們都知道綠色或是藍色螢幕的去背, 我們在拍攝的去背畫面的時候都會有規則遵守: 例如不要穿著綠色上衣, 或是不要用 promist濾鏡, 避免綠色背景太過接近演員. 當然啦! 你還是可以違反這些規則, 但是為了要得到高品質的去背結果你可能要因此加倍努力才能得到好效果.

就 optical flow來說, 規則如下:
  1. 透明的東西, 會違反"單一的運動前提", 所以效果會不好
  2. 閃爍的燈光, 或是其他類似的狀況會違反"亮度恆定的假說". 效果也會不好
  3. 非常顆粒或是雜訊很多的影片效果也不好
  4. 後製通常會對Optical flow 的計算不好, 後製對Optical flow 的計算不會有幫助. 我們問過Black博士與 the Foundry的 Bill Collis, 兩個人都同意. 他們說: Optical flow 程式的演算法在寫的時候就有把雜訊與顆粒考慮進去了, 所以預先處理影片, 比方說顏色校正這類的東西, 雖然人肉眼看好像比較好看, 其實對你Optical flow的運算是有害的.
  5. Optical flow 會去考慮frame之間的圖案 所以快速移動可能不容易解算出來, 隨機的運動也不行. 如果物件過於激烈地改變, 連你用肉眼都很難看出來運動了, 我想電腦也很難判斷吧.
  6. 為了解決雞生蛋, 蛋生雞的問題, 就先給電腦雞吧. 很多程式都能輸入matte, 如果你能先提供物件的roto或是key或是有用的matte, 將會大大改善解算的問題. 目前的程式, 並沒有物件形狀的資料,庫 也沒有更高階的形狀資料, 所以預先把物件獨立出來會非常有效. the Foundry的 Kronos的 retimer功能就能輸入matte .
  7. 計算Optical flow 的時間或多或少跟影片的影像大小成正比, 兩倍的像素表示兩倍的計算時間 .
  8. 這跟邊界分離有關, 大部分的軟體對相對規則, 慢點的影片會比較好計算, 如果有交錯的運動要避免 例如兩個人交錯走過就是一個不好的例子.

發展的歷史

1993
1993年TRACK軟體發表, 這個東西的功能是計算攝影機的位置並且重建場景TRACK系統是Digital Domain公司整合的軟體. 用在電腦視覺(computer-vision)科技, 萃取影片中2D與3D的資訊 , 到了2006年. 推出第五版的TRACK, 可以餵資料給Digital Domain的NUKE合成系統. 但是這套系統在使用的時候需要相當的使用藝術... 通常不能只用一種方法來處理單一個場景, 可能需要三四種方法才能達成.

1995 – 1996
Optical flow技術首次用在電影裡面:
1995年Sergei Fogel研發出新的處理技術, 可以讓frame與frame之間產生內差, 這項科技很快地命名為Cinespeed. 而最先採用Cinespeed技術的電影是"不可能的任務". 其中有一幕湯姆克魯斯在圓桌上親吻Emmanuelle Beart, 這個鏡頭成功地結合傳統的2D與Cinespeed技術, 表現慢速鏡頭(retimed) 這基本上就是整個系統的元型.

在"美夢成真"這部電影裡面, 羅賓威廉斯在一個似乎用筆刷畫出來的世界裡面, 他是即時的表演, 但是當他接觸到植物的時候, 植物看起來好像是畫出來的. 背景一直有個巨大光線, 不論攝影機的位置在哪裡, 但是當風吹, 或是演員移動 ,植物都能夠很寫實地做出反應. 觀眾可能會假定這幕是完全在綠幕前拍攝的, 但是, 實際不是的. 導演(Vincent Ward)不想用傳統的方式拍攝, 他想用自由的, 自然的方式拍攝, 但是又能在後製加上驚人的特效.

美夢成真這部電影跨出的一大步

場景準備
最後想出的解決方法是, 在冰河國家公園拍攝所有場景, 演員就自然演出即可, 但是在現場擺上橘色標記點.

接著, 演員以Optical flow技術從場景中拿掉. 攝影機的功能是要重建攝影機在3D中運動, 然後再次利用Optical flow技術. Optical flow vector maps用來追蹤影片裡面的每個像素, 最後, 使用雷射雷達技術, 用來掃描拓譜, 產生點雲, 重建整個地形的3D資訊.

接著使用Photoshop做pre-viz, 團隊能夠依此決定要怎場景的哪邊繪製植物, 山脈, 天空, 水. 可以依照顏色, 亮度, 深度來繪製出alpha matte.

接著"動作繪製(Motion Paint )" 用來套用不同顏色與比刷, 根據動作/空間的分析資訊, 動作繪製拿實拍畫面Photoshop mattes 或是optical flow的處理, 來產生整個最終影片的效果

最後, 演員才又擺回原本的畫面裡頭.

1999
駭客任務中的子彈時間特,效 也是利用optical flow技術還讓慢動作畫面能平順地呈現. 而這次提昇的品質是過去業界無法想像的!

Kim Libreri是子彈時間的主管, 這幕最大的困難在於要慢慢的動. 然後拉攝(dolly)進畫面, 而每個靜態攝影機的最近距離是七吋, 而最近也會有12吋的間距, 所以要產生平順的運動根本就是不可能的.

最大的問題在於鏡頭的抖動, 每秒600個frame, 這些是跟optical flow無關的, 是穩定性與顏色等問題.

一開始時團隊有考慮到用cineon系統, 但是原廠Kodak有意把cineon抽出市場. 於是Kim Libreri詢問他在S&W的朋友, 請他試做效果相當不錯, 只是當時不是只有內差的問題, 還有攝影機拍攝600 fps的抖動問題.

根據Libreri所說, 在首次的駭客任務子彈時間測試的時候, John發明了新的詞---UCAP 他希望做出完全的捕捉, 他希望用10台攝影機, 能夠內差出所有角度的攝影機, 做出完整的3D場景重建, 裡面有演員 ,環境, 不管從任何角度都可以, 這就是團隊在下一步要做的(駭客任務第二集)

2000
在製作電影"大敵當前"的時候, RealViz Retimer這套軟體推出了. 那時我們用Cineon’s Cinespeed進行retime, 但是"大敵當前"有其他挑戰, 用這個工具無法克服. 這部電影拍攝了很多二戰時期史達林格勒的細節畫面, 電影中經常必須出現大量的火, 燃燒以及很厚實的煙, 燒向天際. 我們根本就不可能實際拍出這麼多煙霧, 而大部分拍攝地點製造這麼多煙霧也是不合法的. 所以我們的作法是拍攝微縮的煙霧, 用最高的FPS來拍攝, 就算是這樣還是不夠, 我們就利用當時最新的Retimer軟體來處理讓這些火焰, 煙霧的速度變慢. 有時候甚至讓速度整個慢十倍, 只有optical flow的技術有可能達到這種特效, 最終的效果讓我們感到十分驚奇.

駭客任務的續集
第一個把optical flow技術用在臉部表情動畫的不是"駭客任務"續集 ,其實是用在"不可能的任務2"與"靈異總動員". 裡面有一個角色要變臉的鏡頭, 我們決定要用optical flow的技術來做, 於是我們就拍攝一位演員的臉部表情背景是綠色螢幕, 而另外又做了這演員的模型. 我們把演員表情所產生的optical flow套用到模型上面, 模型就開始講話了. 雖然效果很粗糙, 但是這個測試說服了我們,這樣的流程可行. 雖然電影後來沒有用這個畫面, 可是這就是駭客任務續集UCAP的基礎, 我們可以說, 只要有好的3D模型, 我們就能重新建立某位角色的臉部表情.

當時Manex團隊想要找到合作夥伴, 因為這些特效相當複雜, 攝影機產生的資料量是每秒好幾G. 每天晚上團隊都要備份5terabytes的資料量, 到最後, 他們還必須要把工作帶回家處理這些高解析度的影片.

Borshukov回憶在拍攝"靈異總動員"的時候, 他發現景深效果不對, 但是他想到如果再加幾部攝影機的話就能產生正確的景深.

駭客任務續集, 把一些研究與成果都結合在一起. 結合了美夢成真的追蹤技術, 子彈時間的內差技術 還有虛擬攝影(virtual cinematography) 全部結合在一起---就變成了全景捕捉了(Universal Capture of the Matrix sequels) . 駭客任務續集, 延伸了optical flow技術, 使用多台攝影機並結合了,攝影量測學技術(photogrammetry)用在產生3D動作重建(包含了動態貼圖與擷取)

高解析度捕捉的設定
團隊小心翼翼地放置五台同步的攝影機, 在環境燈光下, 捕捉演員的表情. 為了要得到最佳圖像品質 ,精心佈置了Sony/Panavision HDW-F900攝影機與電腦工作, 捕捉出位壓縮的數位格式. 以每秒達到1G/sec 資料量寫到硬碟裡面.

Optical Flow的攝影量測學技術(Photogrammetry)
Optical flow用在追蹤每個畫面的像素, 最終結果會結合成一個虛擬的模型, 表現出自然的演員表情與重建的攝影機位置.

這演算法會投影模型的vertex到攝影機, 然後追蹤這些vertex的動作, 利用optical flow技術追蹤這2D畫面, 然後用三角測量法重新根據每個frame建立3D的位置, 最後會得到精確,的 每個vertex在3D空間的重建.

關鍵形狀, 適應, 移除整體運動(Keyshaping, Adapt, Removing Global Motion)
Optical flow的計算錯誤會隨著時間累積, 會造成3D重建不必要的飄移. 為了要減小飄移問題, 團隊用了反轉的Optical flow, 這個問題是經由手動的關鍵形狀(a manual keyshaping step)來減小的. 當問題大到某個程度的時候, 就手動修正錯誤, 然後用演算法的方式把這個修正套用到其他的frame. 重建的動作包含了整體的僵硬的頭部運動, 為了要添加臉部表情到CG身體, 我們會用最小平方法去吻合自然的臉部然後扣掉這個動作來取得不僵硬的臉部變形(non-rigid deformation)

貼圖的擷取
為了要產生逼真的臉部算圖效果, 就要擷取臉部表情隨時間的貼圖. 事實上團隊並沒有在演員臉部放置任何的標記點來幫助臉部追蹤. 因為他們可以根據多台攝影機, 隨著時間變化, 產生一個無縫的UV color map. 捕捉重要的貼圖變化, 例如皺紋, 或是擠壓產生的顏色改變, 臉部的每面都有很高解析度的細節.

算圖
雖然臉部動作擷取最細微的動作, 但是還是缺乏細節, 例如毛孔和皺紋. 團隊用的是高解析度的100-micron scan掃描臉部, 這個細節最終轉換成bump map. 動態的皺紋是根據影像處理所產生的, 然後把皺紋疊在bump map上面, 最後再結合image-based skin BRDF估算與次表面估算效果.

[相關文章]

3 comments:

Unknown said...

讚~辛苦了,又翻了一篇好文啊~

hsiang said...

辛苦了...獲益良多阿..

Anonymous said...

Thank you for the article. It is very impressive.