从图像“看出动作”

news2025/7/6 19:09:45

📘 第一部分:运动估计(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.coloradmin.cn/o/2336107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙案例---生肖抽卡

案例源码: Zodiac_cards: 鸿蒙生肖抽奖卡片 效果演示 初始布局 1. Badge 角标组件 此处为语雀内容卡片,点击链接查看:https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定义接口 interface ImageCount {url:…

宿舍管理系统(servlet+jsp)

宿舍管理系统(servletjsp) 宿舍管理系统是一个用于管理学生宿舍信息的平台,支持超级管理员、教师端和学生端三种用户角色登录。系统功能包括宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录、添加宿舍房间、心理咨询留言板、修改密码和退出系统等模块。宿舍管理员…

驱动-兼容不同设备-container_of

驱动兼容不同类型设备 在 Linux 驱动开发中,container_of 宏常被用来实现一个驱动兼容多种不同设备的架构。这种设计模式在 Linux 内核中非常常见,特别 是在设备驱动模型中。linux内核的主要开发语言是C,但是现在内核的框架使用了非常多的面向…

MySQLQ_数据库约束

目录 什么是数据库约束约束类型NOT NULL 非空约束UNIQUE 唯一约束PRIMARY KEY主键约束FOREIGN KEY外键约束CHECK约束DEFAULT 默认值(缺省)约束 什么是数据库约束 数据库约束就是对数据库添加一些规则,使数据更准确,关联性更强 比如加了唯一值约束&#…

责任链设计模式(单例+多例)

目录 1. 单例责任链 2. 多例责任链 核心区别对比 实际应用场景 单例实现 多例实现 初始化 初始化责任链 执行测试方法 欢迎关注我的博客!26届java选手,一起加油💘💦👨‍🎓😄😂 最近在…

林纳斯·托瓦兹:Linux系统之父 Git创始人

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 林纳斯托瓦兹:Linux之父、Git创始人 一、传奇人物的诞生 1. 早年生活与家…

8. RabbitMQ 消息队列 + 结合配合 Spring Boot 框架实现 “发布确认” 的功能

8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能 文章目录 8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1.1 回退消息 2.备用交换机3. API说…

维港首秀!沃飞长空AE200亮相香港特别行政区

4月13日-16日,第三届香港国际创科展在香港会议展览中心盛大举办。 作为国内领先、国际一流的eVTOL主机厂,沃飞长空携旗下AE200批产构型登陆国际舞台,以前瞻性的创新技术与商业化应用潜力,吸引了来自全球17个国家及地区的行业领袖…

redis6.2.6-prometheus监控

一、软件及系统信息 redis:redis-6.2.6 redis_exporter:redis_exporter-v1.50.0.linux-amd64.tar.gz # cat /etc/anolis-release Anolis OS release 8.9 granfa; 7.5.3 二、下载地址 https://github.com/oliver006/redis_exporter/releases?page…

如何在idea中快速搭建一个Spring Boot项目?

文章目录 前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热启动(热部署)结语 前言 Spring Boot 凭借其便捷的开发特性,极大提升了开发效率,为 Java 开发工作带来诸多便利。许多大伙伴希望快速…

itext7 html2pdf 将html文本转为pdf

1、将html转为pdf需求分析 经常会看到爬虫有这样的需求,将某一个网站上的数据,获取到了以后,进行分析,然后将需要的数据进行存储,也有将html转为pdf进行存储,作为原始存档,当然这里看具体的需求…

docker compose搭建博客wordpress

一、前言 docker安装等入门知识见我之前的这篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…

代码随想录算法训练营Day30

力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接:力扣452.用最少数量的箭引爆气球 视频链接:代码随想录 题…

无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测

作者:牧思 背景 随着云原生的普及,Golang 编程语言变得越来越热门。相比 Java,Golang 凭借其轻量,易学习的特点得到了越来越多工程师的青睐,然而由于 Golang 应用需要被编译成二进制文件再进行运行,Golan…

006.Gitlab CICD流水线触发

文章目录 触发方式介绍触发方式类型 触发方式实践分支名触发MR触发tag触发手动人为触发定时任务触发指定文件变更触发结合分支及文件变更触发正则语法触发 触发方式介绍 触发方式类型 Gitlab CICD流水线的触发方式非常灵活,常见的有如下几类触发方式: …

512天,倔强生长:一位技术创作者的独白

亲爱的读者与同行者: 我是倔强的石头_,今天是我在CSDN成为创作者的第512天。当系统提示我写下这篇纪念日文章时,我恍惚间想起了2023年11月19日的那个夜晚——指尖敲下《开端——》的标题,忐忑又坚定地按下了“发布”键。那时的我…

【目标检测】【YOLO综述】YOLOv1到YOLOv10:最快速、最精准的实时目标检测系统

YOLOv1 to YOLOv10: The fastest and most accurate real-time object detection systems YOLOv1到YOLOv10:最快速、最精准的实时目标检测系统 论文链接 0.论文摘要 摘要——本文是对YOLO系列系统的全面综述。与以往文献调查不同,本综述文…

日常学习开发记录-slider组件

日常学习开发记录-slider组件 从零开始实现一个优雅的Slider滑块组件前言一、基础实现1. 组件结构设计2. 基础样式实现3. 基础交互实现 二、功能增强1. 添加拖动功能2. 支持范围选择3. 添加垂直模式 三、高级特性1. 键盘操作支持2. 禁用状态 五、使用示例六、总结 从零开始实现…

Windows 系统如何使用Redis 服务

前言 在学习过程中,我们长期接触到的是Mysql 关系型数据库,也是够我们平时练习项目用的,但是后面肯定会有大型数据的访问就要借助新的新的工具。 一、什么是Redis Redis(Remote Dictionary Server)是一个基于内存的 键…

【unity游戏开发入门到精通——UGUI】CanvasScaler画布缩放器组件

注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——UGUI】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、CanvasScaler画布缩放器组件是什么二、CanvasScaler的三种适配模式1、Cons…