目标跟踪算法

news/2024/12/2 6:44:54/

目标跟踪算法

一.互相关运算

给你一张我的正脸照(没有经过美颜处理的),你该如何在人群中找到我呢?一种最直观的方案就是:“谁长得最像就是谁”。但是对于计算机来说,如何衡量“长得像”,并不是个简单的问题。这就涉及一种基本的运算——互相关(cross-correlation)。互相关运算可以用来度量两个信号之间的相似性。在离散的图像空间中,它的数学定义是这样的:

在这里插入图片描述

h和 f分别为核和图像,代表着要搜索的目标模版和存在要搜索的目标的图像。如果这个公式对你来说有点难以理解,那你又能否记起离散图像空间卷积运算的定义:

在这里插入图片描述

从公式看,它俩不就是把 h水平、垂直分别翻转一下的关系嘛!实际上,在很多机器学习库的实现中,所谓的“卷积”就是通过互相关运算来实现的——反正卷积核中的所有参数都是通过优化得到的、物理意义不明的值,它要做的仅仅是“在卷积核合适的位置学习合适的值”。严格使用卷积运算学习得到的核,等价于使用互相关运算学习到的核的180度翻转。

互相关运算让得以衡量 h与 f的相似度,互相关得到的响应图中每个像素的响应高低代表着每个位置相似度的高低。假设目标存在于新一帧图像
f中的话,那么在 h和 f对得最齐的地方就应该是目标中心的位置了!

一些难点:目标的形状、大小甚至身处的环境都是在不断发生变化的。在考虑这些变数的同时,如何学习目标不变的那些特性,从而准确地进行定位呢?或者说,如何让核
h能够通过与 f的互相关运算来最有效地得到响应呢?这也就是单目标跟踪主流方法所尝试的思路。

定义则是响应图的ground truth。因为处理的是一个连续的图像序列,所以还存在下标
i通过对上式中的 h对整个图像序列进行优化,可以让目标跟踪算法学习一个最优的相关滤波器。为了提升优化的速度,还可以把
h和f 投射到傅里叶频域。空域中的互相关运算在频域中变成了逐项相乘,优化目标也就变了。

它等价于:

那么对于整个序列而言,可以解出最优的:

但这并不一定对于每一帧图像都是最优的。为了让随着序列的进行而适应性地进行更新,可以递归式地定义不断更新中的:

在这里插入图片描述

二.在线跟踪(Online Tracking)和离线跟踪(Offline Tracking)

通过调整更新学习率参数
η,可以让算法学得具有高鲁棒性并且能够快速适应目标外观变化的。上述的过程就是首次在单目标跟踪问题上使用相关滤波的工作——MOSSE[1])(Minimum Output Sum of Squared Error, CVPR10, F. Henriques et al.)的基本思路。

多目标跟踪算法又可分为在线跟踪(Online Tracking)和离线跟踪(Offline Tracking)。在线跟踪要求处理每一帧时,决定当前帧的跟踪结果时只能利用当前帧和之前的帧中的信息,也不能根据当前帧的信息来修改之前帧的跟踪结果。离线跟踪则允许利用之后的帧的信息从而获得全局最优解。离线追踪的设定也不太适合实际应用场景,但是以一种“batch”的形式进行的离线跟踪(每次得到若干帧,在这些帧中求全局最优)也是可行的,只是会导致一点延迟。

在这里插入图片描述

按照处理方式分类。上:在线跟踪;下:离线跟踪

三.匈牙利与Kalman filter

主流的目标跟踪算法都是基于Tracking-by-Detecton策略,即基于目标检测的结果来进行目标跟踪。DeepSORT运用的就是这个策略,DeepSORT对人群进行跟踪,每个bbox左上角的数字是用来标识某个人的唯一ID号。

这里就有个问题,如果视频中不同时刻的同一个人,位置发生了变化,那么是如何关联上的呢?答案就是匈牙利算法和卡尔曼滤波。

· 匈牙利算法可以告诉当前帧的某个目标,是否与前一帧的某个目标相同。

· 卡尔曼滤波可以基于目标前一时刻的位置,来预测当前时刻的位置,并且可以比传感器(在目标跟踪中即目标检测器,比如Yolo等)更准确的估计目标的位置。

匈牙利算法(Hungarian Algorithm)

首先,先介绍一下什么是分配问题(Assignment Problem):假设有N个人和N个任务,每个任务可以任意分配给不同的人,已知每个人完成每个任务要花费的代价不尽相同,那么如何分配可以使得总的代价最小。

举个例子,假设现在有3个任务,要分别分配给3个人,每个人完成各个任务所需代价矩阵(cost matrix)如下所示(这个代价可以是金钱、时间等等):

怎样才能找到一个最优分配,使得完成所有任务花费的代价最小呢?

匈牙利算法(又叫KM算法)就是用来解决分配问题的一种方法,它基于定理:

如果代价矩阵的某一行或某一列同时加上或减去某个数,则这个新的代价矩阵的最优分配仍然是原代价矩阵的最优分配。

算法步骤(假设矩阵为NxN方阵):

  1. 对于矩阵的每一行,减去其中最小的元素

  2. 对于矩阵的每一列,减去其中最小的元素

  3. 用最少的水平线或垂直线覆盖矩阵中所有的0

  4. 如果线的数量等于N,则找到了最优分配,算法结束,否则进入步骤5

  5. 找到没有被任何线覆盖的最小元素,每个没被线覆盖的行减去这个元素,每个被线覆盖的列加上这个元素,返回步骤3

卡尔曼滤波(Kalman Filter)

卡尔曼滤波被广泛应用于无人机、自动驾驶、卫星导航等领域,简单来说,其作用就是基于传感器的测量值来更新预测值,以达到更精确的估计。

假设要跟踪小车的位置变化,如下图所示,蓝色的分布是卡尔曼滤波预测值,棕色的分布是传感器的测量值,灰色的分布就是预测值基于测量值更新后的最优估计。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

协方差(Covariance ):表示目标位置信息的不确定性,由8x8的对角矩阵表示,矩阵中数字越大则表明不确定性越大,可以以任意值初始化。

·
卡尔曼滤波分为两个阶段:(1) 预测track在下一时刻的位置,(2) 基于detection来更新预测的位置。

下面将介绍这两个阶段用到的计算公式。(这里不涉及公式的原理推导,因为我也不清楚原理(ಥ_ಥ) ,只是说明一下各个公式的作用)


http://www.ppmy.cn/news/614456.html

相关文章

Spring Boot中的@RequestMapping注解,如何使用

Spring Boot中的RequestMapping注解 介绍 Spring Boot是一个流行的Java框架,它提供了许多方便的注解和工具,使得Web应用程序的开发变得更加容易。其中,RequestMapping注解是Spring Boot中最常用的注解之一,它可以帮助开发者定义…

JS继承的实现方式

原型链继承://原型链继承:把父类的私有公有的属性和方法,都作为子类公有的属性;//核心:不是把父类私有公有的属性克隆一份一模一样的给子类的公有吧;他是通过__proto__建立和子类之间的原型链,当…

单目测距算法

单目测距算法 相似三角形 用相似三角形计算物体或者目标到相机的距离,将使用相似三角形来计算相机到一个已知的物体或者目标的距离。 假设有一个宽度为 W 的目标或者物体。然后将这个目标放在距离的相机为 D 的位置。用相机对物体进行拍照并且测量物体的像素宽度…

LeetCode-198. 打家劫舍

题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存…

php 解决方案,php优化解决方案

php优化本帖最后由 xuzuning 于 2013-09-30 13:05:14 编辑//define server info begin$servername "192.168.1.182";$serverusername "whh";$serverpassword "whh";$database"whh";$usertable"user";$userfield"use…

FCN与U-Net语义分割算法

FCN与U-Net语义分割算法 图像语义分割(Semantic Segmentation)是图像处理和是机器视觉技术中关于图像理解的重要一环,也是 AI 领域中一个重要的分支。语义分割即是对图像中每一个像素点进行分类,确定每个点的类别(如属于背景、人或车等&…

oracleHelper 操作帮助类

1 using System;2 using System.Configuration;3 using System.Data;4 using System.Collections;5 using Oracle.DataAccess.Client;6 7 namespace Cont.DAL.Leave8 {9 /// <summary>10 ///Oracle数据库操作帮助类11 /// </summary>12 public cla…

php smarty关闭缓存,php+Smarty的缓存操作

一、使用缓存 要开启smarty的缓存,只需将caching设为true,并指定cache_dir即可. 使用cache_lefetime指定缓存生存时间,单位为秒 要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id,如$smarty->display(/index.tpl/,$my_cache_id);此特性可用于对不同的…