当前位置: 首页 > news >正文

从图像“看出动作”

📘 第一部分:运动估计(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❌ 不要求参数表达

相关文章:

  • Redis集群部署三主三从(docker-compose方式)
  • 2025.04.15【Connection】| 生信数据可视化:连接图绘制指南
  • 跨域(CORS)的几种方式
  • 双重路由引入的环路,选路次优的产生以及解决方法
  • 2025最新版flink2.0.0安装教程(保姆级)
  • 层次式架构核心:中间层的功能、优势与技术选型全解析
  • Oracle中用户密码过期修改为不限制
  • Linux系统-scp命令--两台服务器之间传输文件
  • 利用纯JS开发浏览器小窗口移动广告小功能
  • 通过微信APPID获取小程序名称
  • Spring 框架知识整理
  • K8S_ResourceQuota与LimitRange的作用
  • Materials Studio学习笔记(一)——Materials Studio软件介绍
  • Flutter学习 滚动组件(1):ListView基本使用
  • 【差分隐私相关概念】瑞丽差分隐私(RDP)命题4
  • 宝塔面板中解锁Laravel日志查看的奥秘
  • pull.rebase 三种模式的应用场景
  • java的类加载器及其双亲委派机制
  • 解决docker安装OpenWebUI 报错 500
  • Node.js 数据库 CRUD 项目示例
  • 识味顺德︱顺德菜的醉系列与火滋味
  • “归雁经济”能带来什么?川大商学院调研团队深入乡村与返乡青年人才交流
  • 马上评丨马拉松“方便门”被处罚,是一针清醒剂
  • 见微知沪|最大力度消费补贴,最大程度满足人们对美好生活的向往
  • 著名哲学家、中山大学哲学系原系主任李锦全逝世
  • 复旦大学校长金力:将配套出台多项政策推动科技成果转化