机器视觉——目标跟踪

摘    要

 视觉跟踪技术是计算机视觉领域(人工智能分支)的一个重要课题,有着重要的研究意义;且在军事制导、视频监控、机器人视觉导航、人机交互、以及医疗诊断等许多方面有着广泛的应用前景。随着研究人员不断地深入研究,视觉目标跟踪在近十几年里有了突破性的进展,使得视觉跟踪算法不仅仅局限于传统的机器学习方法,更是结合了近些年人工智能热潮—深度学习(神经网络)和相关滤波器等方法,并取得了鲁棒(robust)、精确、稳定的结果。

视觉目标跟踪是指对图像序列中的运动目标进行检测、提取、识别和跟踪,获得运动目标的运动参数,如位置、速度、加速度和运动轨迹等,从而进行下一步的处理与分析,实现对运动目标的行为理解,以完成更高一级的检测任务。根据跟踪目标的数量可以将跟踪算法分为单目标跟踪与多目标跟踪。相比单目标跟踪而言,多目标跟踪问题更加复杂和困难。多目标跟踪问题需要考虑视频序列中多个独立目标的位置、大小等数据,多个目标各自外观的变化、不同的运动方式、动态光照的影响以及多个目标之间相互遮挡、合并与分离等情况均是多目标跟踪问题中的难点。

本次内容主要研究的内容基于目标跟踪下的:Opencv-python七种自带的跟踪算法以及:背景减除法、帧差法、混合高斯模型、卡尔曼滤波、粒子滤波、

光流估计发、sift。

绪论

目标跟踪划分为五项主要的研究内容:

运动模型(Motion Model):如何生成众多有效的候选框,生成候选样本的速度与质量直接决定了跟踪系统表现的优劣。常用的有两种方法:粒子滤波(Particle Filter)和滑动窗口(Sliding Window)。粒子滤波是一种序贯贝叶斯推断方法,通过递归的方式推断目标的隐含状态。而滑动窗口是一种穷举搜索方法,它列出目标附近的所有可能的样本作为候选样本。

特征提取(Feature Extractor): 利用何种特征表示目标,鉴别性的特征表示是目标跟踪的关键之一。根据目标的情况选择不同的特征表示,常用的特征被分为两种类型:手工设计的特征(Hand-crafted feature)和深度特征(Deep feature)。常用的手工设计的特征有灰度特征(Gray),方向梯度直方图(HOG),哈尔特征(Haar-like),尺度不变特征(SIFT)等。与人为设计的特征不同,深度特征是通过大量的训练样本学习出来的特征,它比手工设计的特征更具有鉴别性。因此,利用深度特征的跟踪方法通常很轻松就能获得一个不错的效果。

观测模型(Observation Model):为候选框打分(置信分数),大多数的跟踪方法主要集中在这一块的设计上。为候选框打分根据不同的思路,观测模型可分为两类:生成式模型(Generative Model)和判别式模型(Discriminative Model). 生成式模型通常寻找与目标模板最相似的候选作为跟踪结果,这一过程可以视为模板匹配。常用的理论方法包括:子空间,稀疏表示,字典学习等。而判别式模型通过训练一个分类器去区分目标与背景,选择置信度最高的候选样本作为预测结果。判别式方法已经成为目标跟踪中的主流方法,因为有大量的机器学习方法可以利用。常用的理论方法包括:逻辑回归,岭回归,支持向量机,多示例学习,相关滤波等。

模型更新(Model Update): 更新观测模型使其适应目标的变化,防止跟踪过程发生漂移。模型更新没有一个统一的标准,通常认为目标的表观连续变化,所以常常会每一帧都更新一次模型。但也有人认为目标过去的表观对跟踪很重要,连续更新可能会丢失过去的表观信息,引入过多的噪音,因此利用长短期更新相结合的方式来解决这一问题。

集成方法(Ensemble Method): 集成方法有利于提高模型的预测精度,也常常被视为一种提高跟踪准确率的有效手段。可以把集成方法笼统的划分为两类:在多个预测结果中选一个最好的,或是利用所有的预测加权平均。

在本次研究中使用环境如下:

扫描二维码关注公众号,回复: 14657709 查看本文章

pycharm64

nimpy-1.19.0rc1

opencv-contrib-python-4.3.0.36

matplotlib-3.1.3

硬件环境:

CPU:I7-7700HQ

GPU:GTX1050Ti

视频数据:

来源:网站下载

图像大小:768*576

时长:00:01:19

帧速率:10.00帧/秒

第2章 背景建模

2.1  帧差法

由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。

帧差法非常简单,但是会引入噪音和空洞问题。

2.2 混合高斯模型

2.2.1 混合高斯模型的建立

在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯的个数可以自适应。然后在测试阶段,对新来的像素进行GMM匹配,如果该像素值能够匹配其中一个高斯,则认为是背景,否则认为是前景。由于整个过程GMM模型在不断更新学习中,所以对动态背景有一定的鲁棒性。最后通过对一个有树枝摇摆的动态背景进行前景检测,取得了较好的效果。背景的实际分布应当是多个高斯分布混合在一起,每个高斯模型也可以带有权重。

混合高斯模型学习方法

1.首先初始化每个高斯模型矩阵参数。

2.取视频中T帧数据图像用来训练高斯混合模型。来了第一个像素之后用它来当做第一个高斯分布。

3.当后面来的像素值时,与前面已有的高斯的均值比较,如果该像素点的值与其模型均值差在3倍的方差内,则属于该分布,并对其进行参数更新。

4.如果下一次来的像素不满足当前高斯分布,用它来创建一个新的高斯分布。

混合高斯模型测试方法

在测试阶段,对新来像素点的值与混合高斯模型中的每一个均值进行比较,如果其差值在2倍的方差之间的话,则认为是背景,否则认为是前景。将前景赋值为255,背景赋值为0。这样就形成了一副前景二值图。

代码:

第一步:使用cv2.VideoCapture() 构造读取模型

第二步:使用cv2.getStructureElement(cv2.MORPH_ELLIPSE, (3, 3)) # 构造形态学使用的kernel,即np.ones((3, 3), np.uint8)

第三步:构造cv2.createBackgroundSubtractorMOG2() 实例化混合高斯模型

第四步:cap.read()从视频中读取文件,并使用model.apply(frame) 使用上混合高斯模型

第五步:使用cv2.morpholyEx(image, cv2.MORPH_OPEN, kernel) 使用开运算进行噪音的去除

第六步:cv2.findCountours找出图片中的轮廓,对其进行循环

第七步:对于周长大于188的轮廓,使用cv2.boundingRect计算外接矩阵,使用cv2.rectangle画出外接矩阵,作为人

第八步:使用cv2.imshow()展示图片,使用cv2.waitkey(150) & 0xff == 27来延长放映的时间

2.2.2 结果展示

2.3 背景减除法

2.3.1 基本原理

背景减除法是一种有效的运动对象检测算法,基本思想是利用背景的参数模型来近似背景图像的像素值,将当前帧与背景图像进行差分比较实现对运动区域的检测,其中区别较大的像素区域被认为是运动区域,而区别较小的像素区域被认为是背景区域。背景减除法必须要有背景图像,并且背景图像必须是随着光照或外部环境的变化而实时更新的,因此背景减除法的关键是背景建模及其更新。针对如何建立对于不同场景的动态变化均具有自适应性的背景模型,减少动态场景变化对运动分割的影响,研究人员已提出了许多背景建模算法,但总的来讲可以概括为非回归递推和回归递推两类。非回归背景建模算法是动态的利用从某一时刻开始到当前一段时间内存储的新近观测数据作为样本来进行背景建模。

2.3.2 结果展示

光流估计

3.1 基本原理

光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”,根据各个像素点的速度矢量特征,可以对图像进行动态分析,例如目标跟踪。

亮度恒定:同一点随着时间的变化,其亮度不会发生改变。

小运动:随着时间的变化不会引起位置的剧烈变化,只有小运动情况下才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数。

空间一致:一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。因为光流法基本方程约束只有一个,而要求x,y方向的速度,有两个未知变量。所以需要连立n多个方程求解。

cv2.calcOpticalFlowPyrLK():

参数:

prevImage 前一帧图像

nextImage 当前帧图像

prevPts 待跟踪的特征点向量

winSize 搜索窗口的大小

maxLevel 最大的金字塔层数

返回:

nextPts 输出跟踪特征点向量

status 特征点是否找到,找到的状态为1,未找到的状态为0

3.2 结果展示

光流法的主要任务就是计算光流场,即在适当的平滑性约束条件下,根据图像序列的时空梯度估算运动场,通过分析运动场的变化对运动目标和场景进行检测与分割。通常有基于全局光流场和特征点光流场两种方法。最经典的全局光流场计算方法是L-K(Lueas&Kanada)法和H-S(Hom&Schunck)法,得到全局光流场后通过比较运动目标与背景之间的运动差异对运动目标进行光流分割,缺点是计算量大。特征点光流法通过特征匹配求特征点处的流速,具有计算量小、快速灵活的特点,但稀疏的光流场很难精确地提取运动目标的形状。总的来说,光流法不需要预先知道场景的任何信息,就能够检测到运动对象,可处理背景运动的情况,但噪声、多光源、阴影和遮挡等因素会对光流场分布的计算结果造成严重影响;而且光流法计算复杂,很难实现实时处理。

卡尔曼滤波

4.1 基本原理

卡尔曼滤波的核心就是:预测+测量反馈。

卡尔曼滤波的前提:状态在定义域内具有正态高斯分布规律。

卡尔曼滤波——利用线性系统的状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计可看着是滤波的过程。

卡尔曼滤波主要分为两个过程:

1、时间更新,先验估计。2、测量更新,后验估计。而当前卡尔曼过程的后验估计不仅可以作为本次的最终结果,还能作为下一次的先验估计的初始值。

预测过程是利用系统模型(状态方程)预测状态的先验概率密度,也就是通过已有的先验知识对未来的状态进行猜测更新过程则利用最新的测量值对先验概率密度进行修正,得到后验概率密度,对之前猜测进行修正。

我们将这五个公式分成预测组和更新组。预测组总是根据前一个状态来估计当前状态。更新组则根据观测信息来对预测信息进行修正,以期达到最优估计之目的。

公式和opencv对应关系的讲解:

首先对于离散控制过程的系统,其系统状态和系统测量值可进行以下表示:

X(k): k时刻系统状态

A:   状态转移矩阵,对应opencv里kalman滤波器的transitionMatrix矩阵(关于opencv kalman滤波器详细定义会在2中给出)

B:   控制输入矩阵,对应opencv里kalman滤波器的controlMatrix矩阵

U(k):k时刻对系统的控制量

Z(k): k时刻的测量值

H:   系统测量矩阵,对应opencv里kalman滤波器的measurementMatrix矩阵

W(k):系统过程噪声,为高斯白噪声,协方差为Q,对应opencv里的kalman滤波器的processNoiseCov矩阵

V(k): 测量噪声,也为高斯白噪声,协方差为R,对应opencv里的kalman滤波器的measurementNoiseCov矩阵

 第一部分:预测值的计算

式(1):计算基于k-1时刻状态对k时刻系统状态的预测值

X(k|k-1):    基于k-1时刻状态对k时刻状态的预测值,对应opencv里kalman滤波器的predict()输出,即statePre矩阵

X(k-1|k-1):k-1时刻状态的最优结果,对应opencv里kalman滤波器的上一次状态的statePost矩阵

U(k):    k时刻的系统控制量,无则为0

A:  状态转移矩阵,对应opencv里kalman滤波器的transitionMatrix矩阵

B:  控制输入矩阵,对应opencv里kalman滤波器的controlMatrix矩阵

式(2):计算X(k|k-1)对应的协方差的预测值

P(k|k-1):  基于k-1时刻的协方差计算k时刻协方差的预测值,对应opencv里kalman滤波器的errorCovPre矩阵

P(k-1|k-1):k-1时刻协方差的最优结果,对应opencv里kalman滤波器的上一次状态的errorCovPost矩阵

Q: 系统过程噪声协方差,对应opencv里kalman滤波器的processNoiseCov矩阵

第二部分:

式(3):增益的计算

Kg(k):k时刻的kalman增益,为估计量的方差占总方差(估计量方差和测量方差)的比重,对应opencv里kalman滤波器的gain矩

H: 系统测量矩阵,对应opencv里kalman滤波器的measurementMatrix矩阵

R:测量噪声协方差,对应opencv里的kalman滤波器的measurementNoiseCov矩阵

第三部分:

式(4)--(5):k时刻的更新

式(4):计算k时刻系统状态最优值

X(k|k):k时刻系统状态的最优结果,对应opencv里kalman滤波器的k时刻状态的statePost矩阵

Z(k):k时刻系统测量值

式(5):计算k时刻系统最优结果对应的协方差

P(k|k):k时刻系统最优结果对应的协方差,对应opencv里kalman滤波器的errorCovPost矩阵

结果展示

SIFT算法

5.1 概述

SIFT算法实现物体识别主要有三大工序:

1.提取关键点

2.对关键点附加详细的信息(特征向量)

3.通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点

特征向量的生成算法总共包括四步:

1.检测尺度空间极值点,初步确定关键点位置和所在尺度。

2.精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点,以增强匹配稳定性、提高抗噪声能力。

3.为每个关键点指定方向参数,使算子具备旋转不变性。

4.关键点描述子的生成,即生成SIFT特征向量。

5.2 具体说明

1.构建高斯模板

2.高斯金字塔

设输入图像经过s次卷积后可以得到高斯卷积函数为G(x,y,2σ) 的输出图像,所有从σ到2σ的图像构成一个组octave,每个octave 固定有s个平面。每一层Ip= G(x,y,ksσ)*I , s=1,2,…,p. 而kp=2在同一阶中相邻两层的尺度因子比例系数是k,则第1阶第2层的尺度因子是kσ, 然后其它层以此类推;

第2阶的第1层由第一阶的中间层尺度图像进行降采样获得, 其尺度因子是k2σ,然后第2阶的第2层的尺度因子是第1层的k倍即k3σ;

第3阶的第1层由第2阶的中间层尺度图像进行降采样获得。其它阶的构成以此类推。

降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。

3.构建高斯差分金字塔(通过高斯金字塔中相邻尺度空间函数相减获得)

4.空间极值点检测

在DOG尺度空间金字塔中,为了检测到DOG空间的最大值和最小值, DOG尺度空间中中间层(最底层和最顶层除外)的每个像素点需要跟同一层的相邻8个像素点以及它上一层和下一层的9个相邻像素点总共26个相邻像素点进行比较,以确保在尺度空间和二维图像空间都检测到局部极值。标记为叉号的像素若比相邻26个像素的DOG值都大或都小,则该点将作为一个局部极值点,记下它的位置和对应尺度。

5.关键点定位

检测到的极值点是离散空间的极值点,

通过拟合三维二次函数来精确确定关键点的位置和尺度;

由于DOG算子会产生较强的边缘响应还需去除低对比度的关键点和不稳定的边缘响应点,以增强匹配稳定性、提高抗噪声能力。

关键点尺度: σ = σ0 * pow( 2.0, s/S)

式中: σ为关键点的尺度,

s 为关键点在高斯差分金字塔中所处于的层数

S 为每组的层数

6.关键点方向分配

为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。使用图像梯度的方法求取局部结构的稳定方向。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。

7.关键点特征描述

SIFT描述子是关键点邻域高斯图像梯度统计结果的表示。通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

128维关键点描述子生成步骤

① 确定计算描述子的图像区域,计算关键点主方向

描述子梯度方向直方图由关键点所在尺度的模糊图像计算产生。

Lowe实验结果表明:描述子采用4×4×8=128维向量表征,综合效果最优(不变性与独特性)。

 种子点由8×8单元组成。每一个小格都代表了特征点邻域所在的尺度空间的一个像素,箭头方向代表了像素梯度方向,箭头长度代表该像素的幅值

在4×4的窗口内计算8个方向的梯度方向直方图。绘制每个梯度方向的累加可形成一个种子点,一个关键点由4个种子点的信息组成。

计算关键点周围的16*16的窗口中每一个像素的梯度,描述子使用在关键点尺度空间内4*4的窗口中计算8个方向的梯度信息,共4*4*8=128维向量表征。

8.特征向量匹配

首先进行相似性度量。

所谓相似性度量是指用什么来确定待匹配特征之间的相似性,它通常是某种代价函数或者是距离函数的形式,一般采用各种距离函数作为特征的相似性度量,如欧氏距离、马氏距离等。

其次消除错配。

无论采用何种特征描述符和相似性判定度量,错配难以避免。这一步主要做的就是根据几何或光度的约束信息去除候选匹配点中的错配。一般利用RANSAC随机抽样一致性算法去除错误的匹配点对,得到最佳匹配点。通过对最佳匹配点的特征向量进行匹配,最后得到图像特征向量的匹配。

9.关键点匹配

分别对模板图(参考图,reference image)和实时图(观测图,observation image)建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。

5.3 结果展示

粒子滤波

6.1 基本理论

粒子滤波通过非参数化的蒙特卡洛 (Monte Carlo) 模拟方法来实现递推贝叶斯滤波,适用 于任何能用状态空间模型描述的非线性系统,精度可以逼近最优估计。粒子滤波器具有简单、易于实现等特点,它为分析非线性动态系统提供了一种有效的解决方法,从而引起 目标跟踪、信号处理以及自动控制等领域的广泛关注。首先概述用于求解目标状态后验概率的贝叶斯滤波理论 随后介绍具有普遍适用性的粒子滤波器,最后针对当前粒子滤波器存在的粒子 多样性丧失问题,提出了一种量子进化粒子滤波算法。

标准的粒子滤波算法流程为:

蒙特卡洛方法一般可以归纳为以下三个步骤:

构造概率模型。对于本身具有随机性质的问题,主要工作是正确地描述和模拟这个概 率过程。对于确定性问题,比如计算定积分、求解线性方程组、偏微分方程等问题,采 用蒙特卡洛方法求解需要事先构造一个人为的概率过程,将它的某些参量视为问题的解。

从指定概率分布中采样。产生服从己知概率分布的随机变量是实现蒙特卡洛方法模拟 试验的关键步骤。

建立各种估计量的估计。一般说来,构造出概率模型并能从中抽样后,便可进行现模 拟试验。随后,就要确定一个随机变量,将其作为待求解问题的解进行估计。

6.2 结果展示

opencv自带算法

7.1 算法

        tracker = cv2.TrackerBoosting_create()

        tracker = cv2.TrackerMIL_create()

        tracker = cv2.TrackerKCF_create()

        tracker = cv2.TrackerTLD_create()

        tracker = cv2.TrackerMedianFlow_create()

        tracker = cv2.TrackerCSRT_create()

        tracker = cv2.TrackerMOSSE_create()

Boosting是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。他可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于Boosting 框架中,通过Boosting框架对训练样本集的操作,得到不同的训练样本子集,用该样本子集去训练生成基分类器;每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n 后,就可产生 n 个基分类器,然后Boosting框架算法将这 n个基分类器进行加权融合,产生一个最后的结果分类器,在这 n个基分类器中,每个单个的分类器的识别率不一定很高,但他们联合后的结果有很高的识别率,这样便提高了该弱分类算法的识别率。

MIL算法基于boosting的思想,从M个特征对应的M个弱分类器中选择出K个弱分类器(对应K个特征,组成新的外观模型),然后组合成强分类器,并告诉我们在这个正样本袋里哪一个实例才是最正确的。

在KCF的算法中,训练样本的生成都是基于循环矩阵形式来构建的,其中基样本为正样本,其他都是虚构出的负样本,这样的样本集具有很好的特性,可以很方便的利用快速傅里叶变换和傅里叶对角化的性质来进行计算,而不需要得知负样本的具体形式,算法将有关负样本的计算都转换到了频域进行求解。这样,采用了循环矩阵的性质对输入图像的搜索区域进行密集采样之后,使得进行跟踪器训练时缺少样本的问题迎刃而解。因此,整个KCF算法对跟踪器进行训练的目的就是利用生成的这些样本,生成一个滤波器,使得其作用于这些样本时会生成我们期望的分布形式

TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间(long term tracking)跟踪算法。该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被跟踪过程中发生的形变、部分遮挡等问题。同时,通过一种改进的在线学习机制不断更新跟踪模块的“显著特征点”和检测模块的目标模型及相关参数,从而使得跟踪效果更加稳定、鲁棒、可靠。简单来说,TLD算法由三部分组成:跟踪模块、检测模块、学习模块

MedianFlow算法属于TLD跟踪算法中的Tracking部分。。它基于LK光流跟踪算法,并使用FB(正向/反向评估点追踪质量的一种方法)、NCC交叉验证进行反馈。

分类与回归树(classification and regression tree, CART)模型是应用广泛的决策树学习方法,同样由特征选择、树的生成和剪枝组成,既可以用于分类也可以用于回归。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支

MOSSE算法的创新的在于,它是第一篇将相关滤波引入到目标跟踪的领域的论文。其思想是构造一个滤波模板 h,使用该模板与图像序列帧 f(f指的是输入图像中框定的目标区域,也称为目标窗口,并非整个图像帧)做卷积运算,根据得到的响应输出g来确定目标在新的一帧图像中的位置。

7.2 结果展示

按照上述顺序

 

 

 

 

 

 

7.3 结果对比

BOOSTING:算法原理类似于Haar cascades (AdaBoost),是一种很老的算法。这个算法速度慢并且不是很准。

MIL:比BOOSTING准一点。

KCF:速度比BOOSTING和MIL更快,与BOOSTING和MIL一样不能很好地处理遮挡问题。

CSRT:比KCF更准一些,但是速度比KCF稍慢。

MedianFlow:对于快速移动的目标和外形变化迅速的目标效果不好。

TLD:会产生较多的false-positives。

MOSSE:算法速度非常快,但是准确率比不上KCF和CSRT。在一些追求算法速度的场合很适用。

猜你喜欢

转载自blog.csdn.net/weixin_49305883/article/details/123241088