从图像“看出动作”

📘 第一部分:运动估计(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.mzph.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采用…