從圖像“看出動作”

📘 第一部分:運動估計(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 幀中找到目標(如一個人)

  2. 跟蹤器記錄這個人的位置(比如:中心點、速度)

  3. 到下一幀:根據之前的位置“預測”現在應該在哪

  4. 實際測量當前位置 → 校正


🧰 實現目標跟蹤的常用方法(兩個核心濾波器):


1?? Kalman Filter(卡爾曼濾波)——適合線性+高斯噪聲場景


🧠 卡爾曼濾波適合什么任務?

你跟蹤的物體是“平穩移動”的,比如:人走路、小車移動


🎯 它做兩件事:

步驟說明
預測根據“運動模型”預測目標下一個位置
更新根據“實際測量”修正位置(結合當前幀檢測框)

📐 數學邏輯:


? 優點:
  • 速度快

  • 數學清晰,有閉式解

  • 適合實際系統(攝像頭、雷達)

? 缺點:
  • 假設線性 + 高斯

  • 無法處理跳躍、不規則動作(如:人突然跑)



2?? Particle Filter(粒子濾波)——適合復雜運動、不規則情況


🧠 核心思想:

用很多“粒子”來表示目標的可能位置。每個粒子是一個猜測,誰更像目標,就給它更高的權重。


📷 類比理解:

  • 你在叢林里追蹤一個逃跑的人

  • 你不知道他在哪,但你有 100 個探員(粒子)去“猜”他可能的位置

  • 每幀你會根據圖像反饋來更新這些探員的“猜測可信度”

  • 下一幀你重新采樣+移動探員 → 持續追蹤


? 粒子濾波過程:

  1. 初始化:生成一堆粒子,代表各種可能位置

  2. 預測:每個粒子根據運動模型前進

  3. 賦權重:根據當前圖像(比如目標外觀)評估粒子

  4. 重采樣:根據權重選擇新的粒子集合

  5. 估計位置:權重最大的粒子 → 當前目標位置


? 優點:
  • 可以處理非線性、非高斯問題

  • 支持遮擋、多假設、目標跳躍

? 缺點:
  • 計算量大(每幀計算多次)

  • 粒子數太少 → 會偏移

  • 粒子數太多 → 算得慢


📋 總結表:Kalman vs Particle

特性Kalman 濾波粒子濾波
運動建模線性可非線性
噪聲分布高斯任意分布
表達方式高斯均值+協方差一堆粒子(樣本)
是否支持多峰估計??(可多個猜測)
速度較慢

📍 實際應用建議:

  • 人體跟蹤(線性運動) → Kalman

  • 跳躍/遮擋/視頻抖動大 → Particle Filter

  • 跟蹤多個目標(MOT) → 結合檢測框匹配 + 濾波器預測(如 SORT)


🎯 什么是 Multi-Object Tracking?

目標不止一個的時候,我們要“同時追蹤多個目標”,而且要“知道誰是誰”。


🌟 比如你有這樣的視頻:

  • 有 5 個人走來走去

  • 有人進出畫面

  • 有人遮擋別人
    你要做的就是:

幀數人的位置
幀1Person1: (x1,y1), Person2: (x2,y2)...
幀2Person1: (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


一般框架:

  1. Detection(檢測)
    用 Faster R-CNN、YOLO、SSD 等方法獲取當前幀中所有人的位置(bounding box)

  2. Association(關聯)
    把當前幀的檢測框和上一幀的目標一一匹配

    • 匹配好了:更新目標軌跡

    • 匹配不上:可能是新目標 or 消失了

  3. Tracking(預測+更新)
    每個目標用 Kalman Filter 預測下一幀的移動
    再結合檢測框做更新


🔧 一種經典算法:SORT

Simple Online and Realtime Tracking


🔁 工作流程:

  1. 用 YOLO 之類檢測器獲取當前幀中的目標框

  2. 用 Kalman Filter 為每個目標預測位置

  3. 用匈牙利算法(Hungarian Algorithm)進行匹配

    • 利用 IOU(交并比)作為匹配代價

  4. 分配 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)


📊 常用指標:

指標含義說明
MOTAMulti-object tracking accuracy,考慮了 ID switch、FP、FN 等綜合評分,越高越好
IDF1ID consistency,ID 保持一致的程度,越高越好
FPFalse Positives(檢測了不存在的目標)
FNFalse Negatives(漏檢)
ID switchesID 被換錯的次數,越少越好

? 一句話記憶:

MOTA 越高越好,ID Switch 越低越好,IDF1 越接近 100 越好。


🛠? 實際部署中,還要考慮的因素:

場景實際困難
安防監控攝像頭抖動、視角偏差、多目標靠近
自動駕駛光照變化、目標進出頻繁、反射干擾
醫學場景多細胞遮擋、目標形狀相似
體育分析球員動態劇烈、視角切換快、相似球衣

? 三大算法對比總結表:

算法用途是否用外觀速度穩定性
SORT實時場景?? 非常快? 容易ID錯
Deep SORT精確場景?(Re-ID)🟢 中速? 更穩定
ByteTrack無需外觀、用全部框?(更魯棒)🟢 快? 精度高

? 本節小結:

技術關鍵詞
MOT 核心流程檢測 + 匹配 + 跟蹤更新
SORTKalman + IOU + 匈牙利算法
Deep SORTSORT + 外觀特征提取
難點遮擋、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? 不要求參數表達

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76927.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76927.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76927.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 使用 SMB 協議

2025/4/14 向全棧工程師邁進! 一、詳述SMB協議 SMB(Server Message Block)協議是一個網絡文件共享協議,它使得計算機可以在網絡中共享文件、打印機以及其他資源。SMB 主要用于 Windows 操作系統,但也有其他平臺&#…

Spring編程式事務(本地事務)

使用 TransactionTemplate等類和 API 手動管理事務,控制事務的新建、提交、回滾等過程 方式一:使用 TransactionTemplate(推薦方式) Service public class OrderService {private final TransactionTemplate transactionTemplat…

itext7 html2pdf 將html文本轉為pdf

1、將html轉為pdf需求分析 經常會看到爬蟲有這樣的需求,將某一個網站上的數據,獲取到了以后,進行分析,然后將需要的數據進行存儲,也有將html轉為pdf進行存儲,作為原始存檔,當然這里看具體的需求…

企業級低代碼平臺的架構范式轉型研究

在快速迭代的數字時代,低代碼平臺如同一股清流,悄然成為開發者們的新寵。 它利用直觀易用的拖拽式界面和豐富的預制組件,將應用程序的開發過程簡化到了前所未有的程度。通過封裝復雜的編程邏輯和提供強大的集成能力,低代碼平臺讓…

C++ | STL之list詳解:雙向鏈表的靈活操作與高效實踐

引言 std::list 是C STL中基于雙向鏈表實現的順序容器,擅長高效插入和刪除操作,尤其適用于頻繁修改中間元素的場景。與std::vector不同,std::list的內存非連續,但提供了穩定的迭代器和靈活的元素管理。本文將全面解析std::list的…

AI運算服務器工控機特點與應用

AI運算服務器工控機是專門針對工業環境設計的計算設備,結合了傳統工控機(工業控制計算機)的可靠性與AI服務器的強大算力,廣泛應用于智能制造、邊緣計算、機器視覺、自動化控制等領域。以下是其核心特點、應用場景及選型建議&#…

25/4/9 算法筆記 DBGAN+強化學習+遷移學習實現青光眼圖像去模糊1

整體實驗介紹 實驗主要是結合DBGAN對抗網絡強化學習增強遷移學習增強實現青光眼圖像去模糊。今天則是先完成了DBGAN板塊模型的訓練。 實驗背景介紹 青光眼的主要特征有: 視盤形態與杯盤比CDR:青光眼患者主要表現為視杯擴大,盤沿變窄。 視…

智能復盤自動化系統搭建指南—基于DeepSeek API與Apple日歷的整合實踐

一、系統架構設計 本方案通過iOS快捷指令實現日歷數據與AI分析的自動化交互,核心流程包含: 日歷事件管理 創建每日循環的"AI復盤"日歷事項實現當日備注信息的動態更新 數據處理模塊時間日志標準化處理多維度數據特征提取 AI交互層對接DeepSeek…

01 位運算

12days 章節結構 00 算法前導課-編程基礎(自學的視頻) 01 位運算的奇巧淫技 02 查找與排序(上) 03 數組、查找與排序(下) 04 多維數組與矩陣 05 字符串專題 06 基本數學問題 06 遞歸、DFS、剪枝、回溯等問題 07 貪心策…

HDFS Full Block Report超限導致性能下降的原因分析

文章目錄 前言發現問題失敗的為什么是FBR塊匯報頻率的變化為什么FBR會反復失敗HDFS性能下降導致Yarn負載變高的形式化分析理解線程理解IO Wait理解HDFS性能下降導致Yarn負載和使用率增高 引用 前言 我們的Yarn Cluster主要用來運行一批由Airflow定時調度的Spark Job&#xff0…

【Kubernetes基礎--Pod深入理解】--查閱筆記2

深入理解Pod 為什么要有個Pod1. 容器協作與資源共享2. 簡化調度和資源管理3. 設計模式支持 Pod 基本用法Pod 容器共享 VolumePod 的配置管理ConfigMap 概述創建 ConfigMap 資源對象在 Pod 中使用 ConfigMap使用 ConfigMap 的限制條件 為什么要有個Pod Pod 的引入并非技術冗余&…

Margin和Padding在WPF和CSS中的不同

CSS和WPF中 margin 與 padding 在方向上的規定基本一致,但在使用場景和一些細節上有所不同。 CSS - 方向規定: margin 和 padding 屬性可以分別指定上、右、下、左四個方向的值。例如 margin:10px 20px 30px 40px; 表示上外邊距為10px、右外邊距為20…

gravity`(控制 View 內部內容的對齊方式)

文章目錄 **1. 常用取值****示例** **2. layout_gravity(控制 View 在父容器中的對齊方式)****常用取值****示例** **3. gravity vs layout_gravity 對比****4. 注意事項****5. 總結** 作用對象:當前 View 的內部內容(如 TextView…

Go:使用共享變量實現并發

競態 在串行程序中,步驟執行順序由程序邏輯決定;而在有多個 goroutine 的并發程序中,不同 goroutine 的事件先后順序不確定,若無法確定兩個事件先后,它們就是并發的。若一個函數在并發調用時能正確工作,稱…

Vue3 SSR Serverless架構革命:彈性計算與量子加速

一、全維度Serverless SSR架構 1.1 蜂巢式彈性調度系統 1.2 冷啟動時間優化表 優化策略Node.js冷啟(ms)Deno冷啟(ms)Bun冷啟(ms)裸啟動1800960420預編譯二進制650380210內存快照預熱22016090WASM實例池15011075量子狀態預載453832 二、邊緣渲染協議升級 2.1 流式SSR響應協議…

FPAG IP核調用小練習

一、調用步驟 1、打開Quartus 右上角搜索ROM,如圖所示 2、點擊后會彈出如圖所示 其中文件路徑需要選擇你自己的 3、點擊OK彈出如圖所示 圖中紅色改為12與1024 4、然后一直點NEXT,直到下圖 這里要選擇后綴為 .mif的文件 5、用C語言生成 .mif文件 //…

Spring Cloud 服務間調用深度解析

前言 在構建微服務架構時,服務間的高效通信是至關重要的。Spring Cloud 提供了一套完整的解決方案來實現服務間的調用、負載均衡、服務發現等功能。本文將深入探討 Spring Cloud 中服務之間的調用機制,并通過源碼片段和 Mermaid 圖表幫助讀者更好地理解…

AF3 generate_chain_data_cache腳本解讀

AlphaFold3 generate_chain_data_cache 腳本在源代碼的scripts文件夾下。該腳本從指定目錄中批量解析 mmCIF/PDB 文件的工具,并將每個鏈的基本信息(序列、分辨率、是否屬于聚類等)提取并寫入 JSON 文件,主要用于后續蛋白質建模、過濾或訓練數據準備。 源代碼: import ar…

vue項目打包部署到maven倉庫

需要的資源文件,都放在根目錄下: 1. versionInfo.js const fs require(fs) const path require(path) const mkdirp require(mkdirp) const spawn require(child_process).spawnconst packageObj require(./package.json) const versionNo packa…

MegaTTS3: 下一代高效語音合成技術,重塑AI語音的自然與個性化

在近期的發布中,浙江大學趙洲教授團隊與字節跳動聯合推出了革命性的第三代語音合成模型——MegaTTS3,該模型不僅在多個專業評測中展現了卓越的性能,還為AI語音的自然性和個性化開辟了新的篇章。 MegaTTS3技術亮點 零樣本語音合成 MegaTTS3采用…