| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> [多目标跟踪学习笔记]光流法 -> 正文阅读 |
|
[人工智能][多目标跟踪学习笔记]光流法 |
光流法是进行目标跟踪的传统方法, 参照视频B站进行学习, 做的笔记. 1. 运动场(Motion Field)与光流(Optical Flow)光流, 顾名思义就是光的流动. 对于图像来说, 什么是光的流动呢? 想象一下摄像头是运动的(目标是运动的也一样), 目标的运动变化其实就是"像素点"的"移动", 因此称为光流, 如下图所示:
问题1: 那么, 我们认为的所谓像素点亮度模式的变化和目标真实的运动之间有什么关系呢? 我们把目标真实物理运动在某个观测上的投影(Projection)称为运动场(Motion Field), 例如下图: 目标在往左上方移动, 它在sensor上的投影(也就是我们的观测)也有一个对应的移动方向, 也就是向下移动.
答案是否定的. 请看以下几种情况:
下图的左边, 假设球体是旋转的, 但是光源不动. 是有运动场, 无光流的情形.右边反之, 球体是不动的, 但光源是运动的.
2. 光流约束方程我们如何更好地通过光流来估计运动呢? 首先我们要做一些假设, 这样问题才可以进行下去. 我们考虑以下连续的两帧图片:
( u , v ) = ( δ x / δ t , δ y / δ t ) (u,v)=(\delta x/\delta t, \delta y/\delta t) (u,v)=(δx/δt,δy/δt) 假设1 两帧间的对应像素亮度不变我们认为
δ
t
\delta t
δt足够小, 以至于不会使我们关心的像素点在两帧之间产生亮度变化, 假设亮度用
I
(
?
)
I(·)
I(?)表示, 有: 我们对等号右边进行多元函数的Taylor展开, 并忽略二次项及以上的高阶项, 有: 联立上两式, 有: 令 δ t → 0 \delta t\rightarrow 0 δt→0. 两边同除 δ t \delta t δt, 有: ? I ? x δ x δ t + ? I ? y δ y δ t + ? I ? t = 0 \frac{\partial I}{\partial x} \frac{\delta x}{\delta t}+ \frac{\partial I}{\partial y} \frac{\delta y}{\delta t}+\frac{\partial I}{\partial t}=0 ?x?I?δtδx?+?y?I?δtδy?+?t?I?=0 式中的 δ x δ t , δ y δ t \frac{\delta x}{\delta t}, \frac{\delta y}{\delta t} δtδx?,δtδy?分别为光流真值(速度) u , v u,v u,v, 故将上式写为: I x u + I y v + I t = 0 I_xu+I_yv+I_t=0 Ix?u+Iy?v+It?=0 以上就是光流约束方程. 求解上式中 I x , I y , I t I_x, I_y, I_t Ix?,Iy?,It?的方式与图像处理中求梯度的方式类似, 固定一个变量求其余变量得到差, 例如 I x I_x Ix?按如下计算:
?
\space
? 具体地, 如上图, 假设光流真值为
u
=
(
u
,
v
)
\boldsymbol u=(u,v)
u=(u,v), 我们将其分解为垂直直线方向与平行直线方向 根据几何知识, 很快求得: u n = ∣ I t ∣ I x 2 + I y 2 ( I x , I y ) \boldsymbol{u_n}=\frac{|I_t|}{\sqrt{I_x^2+I_y^2}}(I_x, I_y) un?=Ix2?+Iy2??∣It?∣?(Ix?,Iy?) 然而, u p \boldsymbol{u_p} up?我们不知道, 因此需要更多的约束条件. 3. Lucas Kanade算法接上文, 我们需要更多的约束条件. Lucas Kanade算法所做的假设是: 假设2 假定对于每个像素, 运动场与光流和其邻域中的像素均相同假设某像素的某邻域为
W
W
W, 大小为
n
×
n
n \times n
n×n的矩形, 则对于
W
W
W中的每个像素
(
k
,
l
)
∈
W
(k,l)\in W
(k,l)∈W, 光流都相同, 因此有: 记为: n 2 n^2 n2这个数有点大, 为了计算方便, 我们将方程写为:
(
A
T
A
)
u
=
A
T
B
\boldsymbol{(A^TA)u=A^TB}
(ATA)u=ATB 因此就求解出光流了. 然而, LK算法以上的求解方式也有其局限性, 必须要求:
weil-conditioned的意义是, 如果特征值都太小, 则求解出的
u
u
u也很小, 结果不可靠. 4. 粗糙到精细的光流估计(光流金字塔, Coarse to fine estimation)LK算法有一个先验假设, 即 δ t \delta t δt足够小, 也就是小运动假设. 但如果运动范围很大的时候, 怎么做呢? 我们可以降低图片的分辨率, 例如通过池化的方式, 这样原来的大运动就会变成小运动. 如下图所示.
假定我们有四种分辨率, 从低到高是1, 2, 3, 4. 在1分辨率上, 我们利用小运动的估计来计算光流, 假设结果为 ( u , v ) 0 (u,v)^0 (u,v)0. 这样, 我们在2分辨率上利用1分辨率上计算出的光流, 产生一个新的图像(类似于插帧). 这个图像会更接近原始分辨率的运动, 但不精确. 这一步叫做"Wrap". 因此, 同样地我们对插帧后的2分辨率再计算光流, 得到插帧到最终图像的光流变化 Δ ( u , v ) 1 \Delta (u,v)^1 Δ(u,v)1. 因此此时我们可以得到更精确的光流估计 ( u , v ) 1 = ( u , v ) 0 + Δ ( u , v ) 1 (u,v)^1=(u,v)^0+\Delta (u,v)^1 (u,v)1=(u,v)0+Δ(u,v)1. 这一步叫做"Plus". 再对3分辨率上应用此光流插帧, 一直这样下去. 如图所示:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:48:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |