第五篇 · 第13章
第13.2節 光流法(Optical Flow)與硬體運動向量計算#
從「眼睛的運動知覺」到演算法#
光流(optical flow)的概念源自心理學與神經科學:當你穿過樹林,視網膜上整個場景的亮度圖案以連續的速度場滑過,大腦由這個「流」推斷自身運動與物體的深度。1970 年代末,貝拉·朱爾茲(Bela Julesz)與隨後的黃煦濤(Thomas Huang)等人把這個想法數學化;1981 年是分水嶺——兩篇經典論文同年發表:柏蘭德·霍恩(Berthold Horn)與布萊恩·舒恩克(Brian Schunck)提出以全域平滑約束的變分法,布魯斯·盧卡斯(Bruce Lucas)與金出武雄(Takeo Kanade)提出區域最小平方法的 LK 演算法。兩者至今仍是所有運動估計教科書的起點。
光流約束方程:一個方程、兩個未知數#
設像素亮度 \(I(x,y,t)\),若同一物點在時間間隔 \(dt\) 內移動 \((dx,dy)\) 且亮度守恆(光流基本假設),則:
一階泰勒展開後得到光流約束方程:
其中 \(u = dx/dt\)、\(v = dy/dt\) 是該像素的速度(光流向量),\(I_x, I_y, I_t\) 是亮度的空間與時間偏導數。這一條方程有兩個未知數——孔徑問題(aperture problem):只看一個小窗孔裡的移動邊緣,你只能測得垂直於邊緣的法向速度,切向分量無法確定。
兩大經典解法正是兩種「補充假設」:
- Horn-Schunck:假設整幅圖的光流場是平滑的,求極小化
以變分法導出一組迭代式,結果平滑但邊緣模糊;
- Lucas-Kanade:假設局部小窗內光流為常數,用加權最小平方法解超定方程組 \(\mathbf{A}\mathbf{w} = \mathbf{b}\),其中 \(\mathbf{A}^{\top}\mathbf{A}\) 為結構張量,其特徵值決定解的可信度(兩個大特徵值=角點=可靠追蹤點)。LK 精確但不夠平滑,配合金字塔由粗到細(coarse-to-fine)迭代即可處理大位移。
從光流到區塊匹配:編碼器的硬體現實#
MPEG 編碼器其實不直接解光流方程,而是用區塊匹配(block matching):在搜尋窗內逐一試探位移 \((dx,dy)\),取絕對差和(SAD)最小者:
SAD 不用乘法(可用 adder tree 與進位節省加法器 CSA 實現),是 VLSI 最友善的度量。一個 MPEG-2 編碼器在 ±16 像素窗內每宏區塊需 \(33^2 \approx 1{,}089\) 次 SAD,每秒 30 幀、每幀 1,620 個宏區塊,總計約 5,300 萬次 256 像素 SAD——每秒超過百億次像素運算。1990 年代的全搜尋編碼晶片(如 C-Cube 的編碼卡、IBM MPEGSE)以二維 SAD 處理器陣列(systolic array,脈動陣列)解決:數百個處理單元排成網格,像素像心臟搏動般逐拍流過,每拍完成一次減法、絕對值與累加,讓資料重用率最大化。三步搜尋(TSS)、菱形搜尋(DS)等快速演算法則把計算量再降兩個數量級,是「演算法省矽面」的另一個典範。
標準、專利與產業經濟#
運動估計是 H.261(1990,ITU-T,視訊會議的起點,研發由 CCITT 第十五研究組主導)以來所有視訊標準的必備工具,也一直是專利密度最高的區塊:MPEG-2 的運動補償專利由飛利浦、Sony、東芝、松下等 DVD 專利聯盟持有,播放機每台抽取授權金;MPEG-4/AVC 時代則由 MPEG LA 專利池管理數千件專利的 FRAND 授權——「一個標準、數百專利、一個池子」的制度,使任何晶片廠都必須先算清授權金成本再決定投片。運動向量資料本身甚至成為新興用途:H.264 允許編碼器輸出 MV 供去交錯、幀率提升(motion-compensated frame rate conversion)使用,電視機的 MEMC 晶片(「補幀」)用運動向量合成中間幀,讓 24 fps 電影在 120 Hz 面板上平滑呈現——光流從「壓縮工具」變身「顯示增強」。
前因後果:光流的第二人生#
進入 2000 年代,光流法離開了編解碼器,進入電腦視覺的核心:2003 年 Lucas-Kanade 的影像對齊擴展(IK/IC 演算法,Baker 與 Matthews)成為人臉追蹤與影像穩定的基礎;2005 年 Farnebäck 的多項式展開光流、2015 年 CNN 學習式光流(FlowNet),一路到現代神經網路的光流估計。摩爾定律再次改寫了硬體版圖:1995 年需要整塊 systolic array 的運動估計,如今是 GPU 上一個 shader 迴圈或手機 ISP 的固定功能模組;而通用 GPU的出現,讓同一套「由粗到細+迭代求解」的光流架構同時服務視訊編碼、慢動作補幀、全景拼接與自駕車的視覺里程計——當年為了省電視頻寬而發明的數學,成為機器「看見運動」的語言。
延伸思考#
- 孔徑問題說明「單點測量必然欠定」;LK 演算法用角點(兩個大特徵值)避開它,這與自駕車為何偏愛追蹤特徵點而非整幅光流有何關聯?
- 區塊匹配的光流在遮蔽(occlusion)處必然失真,MEMC 補幀因此出現「圈狀偽影」;遮蔽感知的光流模型該如何嵌入硬體?
- Horn-Schunck 的變分法與今日的深度學習(能量最小化→損失函數)在數學結構上驚人相似;是神經網路「重新發現」了 1981 年的先驅,還是兩者解決的其實是不同問題?