📘 第一部分:運動估計(Motion Estimation)
🧠 什么是運動估計?
簡單說:
👉 給你一段視頻,計算機要“看懂”里面什么東西動了、往哪動了、有多快。
比如:
-
一個人從左往右走
-
一輛車開向遠方
→ 這些動作,在圖像中就是像素位置和亮度的變化。
🧩 1. 基本方法:幀差法(Frame Differencing)
最簡單粗暴的辦法:
?做法:
把相鄰兩幀圖像像減法一樣相減:
-
如果像素差大 → 表示這個地方“變了” → 說明物體移動了。
-
如果差很小 → 說明這個區域沒動。
? 優點:
-
簡單、快速
-
不需要復雜模型
? 缺點:
-
相機抖動也會造成“運動誤判”
-
無法判斷方向
-
不適合運動緩慢或光照變化大的情況
🧩 2. 更高級方法:光流(Optical Flow)
💡 思想核心:
如果物體在移動,它的外觀(顏色、亮度)不會變,只是位置改變了。
于是我們提出一個“亮度恒定”假設(Brightness Constancy Assumption):
-
意思是:第 t 幀某個位置的像素亮度,等于下一幀這個點“移動后”新位置的亮度。
📐 公式推導(只理解邏輯,不用推導):
對這個式子求導后可以得到:
這是經典的光流約束方程(Optical Flow Constraint Equation)
符號 | 意義 |
---|---|
fx,fy | 空間梯度:圖像在 x、y 方向變化多快 |
ft | 時間梯度:這個像素亮度變化了多少 |
vx,vy | 這個像素在 x、y 方向移動速度(光流) |
?問題來了:這個方程只有一個式子,但有兩個未知數(vx 和 vy)!
這就叫做:方程不夠,解不出精確速度 → 所以我們要加“額外假設”來補救。
🧩 3. 光流估計的兩種主流方法
? 方法一:Lucas-Kanade 光流(局部解法)
假設某個小窗口(比如 3×3 區域)內的像素都是“差不多的速度”在移動。
于是我們就可以用 9 個像素點的方程聯立,做最小二乘求解:
-
解一組 (vx, vy)
-
每個窗口輸出一個運動向量
? 優點:
-
穩定、對噪聲不敏感
-
適合小區域物體移動緩慢的情況
? 缺點:
-
不適合大范圍運動或運動劇烈的情況
? 方法二:Horn-Schunck 光流(全局解法)
假設整個圖像的光流是連續、平滑變化的
核心思想:
-
既要滿足光流約束方程(f_x v_x + f_y v_y = -f_t)
-
又要讓 vx 和 vy 在空間上盡量平滑(不能跳躍太大)
數學目標變成一個能量最小化問題:
E=數據誤差+λ?平滑懲罰
其中 λ 控制“平滑重要性”:
-
λ 大:更平滑,但細節少
-
λ 小:細節保留好,但噪聲多
? 優點:
-
能全局考慮整幅圖,保留連續性
? 缺點:
-
數學復雜
-
計算慢
🧠 實際應用舉例:
應用場景 | 使用哪種方法 |
---|---|
小目標、攝像頭穩定 | Lucas-Kanade |
大范圍流動、水面波動 | Horn-Schunck |
車流分析、動作捕捉 | Optical Flow (變體) |
🚶 第二部分:單目標跟蹤 Object Tracking
🧠 什么是目標跟蹤(Object Tracking)?
在一段視頻中,持續地追蹤一個目標的位置和狀態。
比如:
-
你要一直追蹤視頻中的某一個人
-
他從左走到右,視頻有 30 幀
-
你要知道每一幀他在哪里(用框框框住他)
📌 跟蹤 vs 檢測的區別?
任務 | 檢測(Detection) | 跟蹤(Tracking) |
---|---|---|
每幀處理 | 是,重新識別 | 否,用上一幀預測當前位置 |
輸入 | 每幀獨立圖像 | 連續圖像序列 |
輸出 | 當前幀中所有目標的位置 | 特定目標在整個序列中的軌跡 |
開銷 | 大(重復識別) | 小(預測+更新) |
🎯 Tracking-by-Detection 框架
一種流行策略是:
先檢測(每一幀用目標檢測器找目標),再用跟蹤器“追蹤”這個目標。
📐 步驟如下:
-
檢測器在第 1 幀中找到目標(如一個人)
-
跟蹤器記錄這個人的位置(比如:中心點、速度)
-
到下一幀:根據之前的位置“預測”現在應該在哪
-
實際測量當前位置 → 校正
🧰 實現目標跟蹤的常用方法(兩個核心濾波器):
1?? Kalman Filter(卡爾曼濾波)——適合線性+高斯噪聲場景
🧠 卡爾曼濾波適合什么任務?
你跟蹤的物體是“平穩移動”的,比如:人走路、小車移動
🎯 它做兩件事:
步驟 | 說明 |
---|---|
預測 | 根據“運動模型”預測目標下一個位置 |
更新 | 根據“實際測量”修正位置(結合當前幀檢測框) |
📐 數學邏輯:
? 優點:
-
速度快
-
數學清晰,有閉式解
-
適合實際系統(攝像頭、雷達)
? 缺點:
-
假設線性 + 高斯
-
無法處理跳躍、不規則動作(如:人突然跑)
2?? Particle Filter(粒子濾波)——適合復雜運動、不規則情況
🧠 核心思想:
用很多“粒子”來表示目標的可能位置。每個粒子是一個猜測,誰更像目標,就給它更高的權重。
📷 類比理解:
-
你在叢林里追蹤一個逃跑的人
-
你不知道他在哪,但你有 100 個探員(粒子)去“猜”他可能的位置
-
每幀你會根據圖像反饋來更新這些探員的“猜測可信度”
-
下一幀你重新采樣+移動探員 → 持續追蹤
? 粒子濾波過程:
-
初始化:生成一堆粒子,代表各種可能位置
-
預測:每個粒子根據運動模型前進
-
賦權重:根據當前圖像(比如目標外觀)評估粒子
-
重采樣:根據權重選擇新的粒子集合
-
估計位置:權重最大的粒子 → 當前目標位置
? 優點:
-
可以處理非線性、非高斯問題
-
支持遮擋、多假設、目標跳躍
? 缺點:
-
計算量大(每幀計算多次)
-
粒子數太少 → 會偏移
-
粒子數太多 → 算得慢
📋 總結表:Kalman vs Particle
特性 | Kalman 濾波 | 粒子濾波 |
---|---|---|
運動建模 | 線性 | 可非線性 |
噪聲分布 | 高斯 | 任意分布 |
表達方式 | 高斯均值+協方差 | 一堆粒子(樣本) |
是否支持多峰估計 | ? | ?(可多個猜測) |
速度 | 快 | 較慢 |
📍 實際應用建議:
-
人體跟蹤(線性運動) → Kalman
-
跳躍/遮擋/視頻抖動大 → Particle Filter
-
跟蹤多個目標(MOT) → 結合檢測框匹配 + 濾波器預測(如 SORT)
🎯 什么是 Multi-Object Tracking?
目標不止一個的時候,我們要“同時追蹤多個目標”,而且要“知道誰是誰”。
🌟 比如你有這樣的視頻:
-
有 5 個人走來走去
-
有人進出畫面
-
有人遮擋別人
你要做的就是:
幀數 | 人的位置 |
---|---|
幀1 | Person1: (x1,y1), Person2: (x2,y2)... |
幀2 | Person1: (x1’,y1’), Person2: (x2’,y2’) |
... | ... |
你要持續追蹤每一個人,不能搞混他們的 ID!
🧩 MOT 中面臨的三大核心挑戰
1?? ID管理(Identity Switch)
ID Switch 是 MOT 中的最大問題之一。
模型錯誤地把 A 當作 B,把 B 當作 A(ID 互換)
📍 舉例:
-
幀1:Person A 是 ID=1,Person B 是 ID=2
-
幀2:模型把 A 當成了 2,B 當成了 1 → ? ID Switch
2?? 遮擋問題(Occlusion)
一個人被擋住了幾幀怎么辦?
-
不能直接刪掉他
-
要預測他還“在場”,等出現時再繼續跟蹤他
3?? 出入場問題(Entry / Exit)
-
新人進來時,應該分配一個新 ID(不能誤認為是別人)
-
某人出畫時,不能誤判為“消失”,更不能轉給別人
🏗? MOT 系統結構 = Detection + Association + Tracking
一般框架:
-
Detection(檢測)
用 Faster R-CNN、YOLO、SSD 等方法獲取當前幀中所有人的位置(bounding box) -
Association(關聯)
把當前幀的檢測框和上一幀的目標一一匹配-
匹配好了:更新目標軌跡
-
匹配不上:可能是新目標 or 消失了
-
-
Tracking(預測+更新)
每個目標用 Kalman Filter 預測下一幀的移動
再結合檢測框做更新
🔧 一種經典算法:SORT
Simple Online and Realtime Tracking
🔁 工作流程:
-
用 YOLO 之類檢測器獲取當前幀中的目標框
-
用 Kalman Filter 為每個目標預測位置
-
用匈牙利算法(Hungarian Algorithm)進行匹配
-
利用 IOU(交并比)作為匹配代價
-
-
分配 ID,更新軌跡狀態
? 優點:
-
實時運行(可以做到 30 FPS+)
-
效果不錯,適合多目標行人跟蹤
-
代碼結構簡單(所以叫 “Simple”)
? 缺點:
-
完全基于位置信息,沒考慮“外觀信息”
-
如果兩個人交叉靠得很近,容易 ID Switch
-
遮擋多時很容易斷開重連錯人
🧬 改進版本:Deep SORT
SORT + 加上一個深度學習的“外觀特征提取器”
💡 外觀 Re-ID 模塊:
-
給每個檢測框抽取一個外觀向量(如 128 維)
-
如果兩個人的外觀特征差別大 → 不匹配
-
如果特征很接近 → 可以認為是同一個人
?? Deep SORT 多了哪些內容?
-
檢測框 → 抽特征(用 CNN 網絡)
-
把外觀特征和位置信息結合起來
-
匹配時同時考慮 IOU 和 appearance similarity
? 優點:
-
減少 ID Switch
-
適合復雜遮擋、密集人群場景
-
更智能的目標識別與保持 ID 穩定性
🔢 MOT 評價指標(Multiple Object Tracking Metrics)
📊 常用指標:
指標 | 含義說明 |
---|---|
MOTA | Multi-object tracking accuracy,考慮了 ID switch、FP、FN 等綜合評分,越高越好 |
IDF1 | ID consistency,ID 保持一致的程度,越高越好 |
FP | False Positives(檢測了不存在的目標) |
FN | False Negatives(漏檢) |
ID switches | ID 被換錯的次數,越少越好 |
? 一句話記憶:
MOTA 越高越好,ID Switch 越低越好,IDF1 越接近 100 越好。
🛠? 實際部署中,還要考慮的因素:
場景 | 實際困難 |
---|---|
安防監控 | 攝像頭抖動、視角偏差、多目標靠近 |
自動駕駛 | 光照變化、目標進出頻繁、反射干擾 |
醫學場景 | 多細胞遮擋、目標形狀相似 |
體育分析 | 球員動態劇烈、視角切換快、相似球衣 |
? 三大算法對比總結表:
算法 | 用途 | 是否用外觀 | 速度 | 穩定性 |
---|---|---|---|---|
SORT | 實時場景 | ? | ? 非常快 | ? 容易ID錯 |
Deep SORT | 精確場景 | ?(Re-ID) | 🟢 中速 | ? 更穩定 |
ByteTrack | 無需外觀、用全部框 | ?(更魯棒) | 🟢 快 | ? 精度高 |
? 本節小結:
技術 | 關鍵詞 |
---|---|
MOT 核心流程 | 檢測 + 匹配 + 跟蹤更新 |
SORT | Kalman + IOU + 匈牙利算法 |
Deep SORT | SORT + 外觀特征提取 |
難點 | 遮擋、ID切換、出入場判斷 |
評估指標 | MOTA, IDF1, ID Switch |
例題?
? 正確答案:B ?
🔍 每個選項逐項解釋:
? A 是正確的:
圖像差分法(Image Subtraction)是基于幀之間像素變化檢測運動物體。
這在背景穩定(如靜止攝像頭)時最有效,因為背景不動,變化就代表“前景目標動了”。
? B 是錯誤的:
Template Matching(模板匹配)常用相似度度量如:
SAD(Sum of Absolute Differences)絕對差和 ?
SSD(Sum of Squared Differences)平方差和 ?
Cross-correlation 互相關 ?
而 Mutual Information(互信息)是圖像配準(medical imaging 等)常用,不是模板匹配中主流選擇,而且是要最大化不是最小化。
? C 是正確的:
Optical Flow(光流)假設圖像中每個小區域在時間上保持“局部一致性”——亮度不變、形狀小變化,這樣才便于追蹤。
? D 是正確的:
光流約束方程(Optical Flow Constraint Equation):
![]()
只有一個方程(每像素),但未知量有兩個(vx, vy) → 方程不夠 → 需要額外約束(如:鄰域平滑、Lucas-Kanade)
🧠 總結記憶點:
點 解釋 圖像差分 適合背景恒定 模板匹配 用的是 SSD / SAD / CC,不是 MI 光流 假設鄰域不變(小區域亮度恒定) 光流方程不夠 一個像素兩個未知,需加約束求解
? 正確答案:A ?
🔍 每個選項逐項解釋:
? A 是錯誤的:
Particle Filter(粒子濾波)不要求模型必須有顯式參數形式。
它的優勢在于可以處理 非線性、非高斯 的模型,通過采樣(粒子)進行近似。
它只需要能“采樣”模型的動態和觀測,不需要顯式參數表達。
? B 是正確的:
HMM(隱馬爾可夫模型)假設:
狀態只依賴前一個狀態
當前觀測值 只依賴于當前狀態
符合“馬爾可夫性質”
? C 是正確的:
貝葉斯跟蹤中的預測步驟通常基于 當前狀態只依賴上一個狀態。
即:
![]()
? D 是正確的:
卡爾曼濾波要求:
模型是線性的
噪聲是加性高斯分布(Additive Gaussian)
🧠 小技巧記憶:
方法 是否需要參數模型? Kalman ? 線性、高斯 Particle Filter ? 不要求參數表達