在这里我们主要完成卡尔曼滤波器进行跟踪的相关内容的实现。

  • 初始化:卡尔曼滤波器的状态变量和观测输入
  • 更新状态变量
  • 根据状态变量预测目标的边界框
  1. 初始化:

    状态量x的设定是一个七维向量:

分别表示目标中心位置的x,y坐标,面积s和当前目标框的纵横比,最后三个则是横向,纵向,面积的变化速率,其中速度部分初始化为0,其他根据观测进行输入。

初始化卡尔曼滤波器参数,7个状态变量和4个观测输入,运动形式和转换矩阵的确定都是基于匀速运动模型,状态转移矩阵F根据运动学公式确定:

量测矩阵H是4*7的矩阵,将观测值与状态变量相对应:

以及相应的协方差参数的设定,根据经验值进行设定。

# 内部使用KalmanFilter,7个状态变量和4个观测输入def __init__(self,bbox):"""初始化边界框和跟踪器:param bbox:"""#等速模型#卡尔曼滤波:状态转移矩阵:7,观测输入矩阵:4self.kf = KalmanFilter(dim_x=7,dim_z=4) #初始化卡尔曼滤波器# F:状态转移/状态变化矩阵 7*7 用当前的矩阵预测下一次的估计self.kf.F = np.array([[1, 0, 0, 0, 1, 0, 0],[0, 1, 0, 0, 0, 1, 0],[0, 0, 1, 0, 0, 0, 1],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 0, 1]])#H:量测矩阵/观测矩阵:4*7self.kf.H = np.array([[1, 0, 0, 0, 0, 0, 0],[0, 1, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0]])#R:测量噪声的协方差,即真实值与测量值差的协方差self.kf.R[2:,2:] *= 10#P:先验估计的协方差self.kf.P[4:,4:] *= 1000 #give high uncertainty to the unobservable initial velocities 对不可观测的初始速度给予高度不确定性self.kf.P *= 10#Q:过程激励噪声的的协方差self.kf.Q[-1,-1] *= 0.01self.kd.Q[4:,4:] *= 0.01#X:观测结果、状态估计self.kf.x[:4] = convert_bbox_to_z(bbox)#参数的更新self.time_since_update = 0self.id = KalmanBoxTracker.countKalmanBoxTracker.count += 1self.history=[]self.hits = 0self.hit_streak = 0self.age = 0
  1. 更新状态变量

    使用观测到的目标框更新状态变量

#使用观测到的目标框更新状态变量def update(self,bbox):"""使用观察到的目标框更新状态向量。filterpy.kalman.KalmanFilter.update 会根据观测修改内部状态估计self.kf.x。重置self.time_since_update,清空self.history。:param bbox:目标框:return:"""#重置部分参数self.time_since_update = 0#清空self.history = []#hitsself.hits += 1self.hit_streak += 1#根据观测结果修改内部状态xself.kf.update(convert_bbox_to_z(bbox))
  1. 进行目标框的预测

    推进状态变量并返回预测的边界框结果

#进行目标框的预测:推进状态变量并返回预测的边界框结果def predict(self):"""推进状态向量并返回预测的边界框估计。将预测结果追加到self.history。由于 get_state 直接访问 self.kf.x,所以self.history没有用到:return:"""#状态变量if(self.kf.x[6] + self.kf.x[2]) <= 0:self.kf.x[6] *= 0# 进行预测self.kf.predict()#卡尔曼滤波的预测次数self.age += 1#若过程中未进行更新,则将hit_streak置为0if self.time_since_update > 0:self.hit_streak=0self.time_since_update += 1#将预测结果追加到hietory中self.history.append(convert_x_to_bbox(self.kf.x))return self.history[-1]

整个代码如下所示:

class KalmanBoxTracker(object):count = 0"""初始化边界框和跟踪器:param bbox:"""#等速模型#卡尔曼滤波:状态转移矩阵:7,观测输入矩阵:4self.kf = KalmanFilter(dim_x=7,dim_z=4) #初始化卡尔曼滤波器# F:状态转移/状态变化矩阵 7*7 用当前的矩阵预测下一次的估计self.kf.F = np.array([[1, 0, 0, 0, 1, 0, 0],[0, 1, 0, 0, 0, 1, 0],[0, 0, 1, 0, 0, 0, 1],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 0, 1]])#H:量测矩阵/观测矩阵:4*7self.kf.H = np.array([[1, 0, 0, 0, 0, 0, 0],[0, 1, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0]])#R:测量噪声的协方差,即真实值与测量值差的协方差self.kf.R[2:,2:] *= 10#P:先验估计的协方差self.kf.P[4:,4:] *= 1000 #give high uncertainty to the unobservable initial velocities 对不可观测的初始速度给予高度不确定性self.kf.P *= 10#Q:过程激励噪声的的协方差self.kf.Q[-1,-1] *= 0.01self.kd.Q[4:,4:] *= 0.01#X:观测结果、状态估计self.kf.x[:4] = convert_bbox_to_z(bbox)#参数的更新self.time_since_update = 0self.id = KalmanBoxTracker.countKalmanBoxTracker.count += 1self.history=[]self.hits = 0self.hit_streak = 0self.age = 0#使用观测到的目标框更新状态变量def update(self,bbox):"""使用观察到的目标框更新状态向量。filterpy.kalman.KalmanFilter.update 会根据观测修改内部状态估计self.kf.x。重置self.time_since_update,清空self.history。:param bbox:目标框:return:"""#重置部分参数self.time_since_update = 0#清空self.history = []#hitsself.hits += 1self.hit_streak += 1#根据观测结果修改内部状态xself.kf.update(convert_bbox_to_z(bbox))
#进行目标框的预测:推进状态变量并返回预测的边界框结果def predict(self):"""推进状态向量并返回预测的边界框估计。将预测结果追加到self.history。由于 get_state 直接访问 self.kf.x,所以self.history没有用到:return:"""#状态变量if(self.kf.x[6] + self.kf.x[2]) <= 0:self.kf.x[6] *= 0# 进行预测self.kf.predict()#卡尔曼滤波的预测次数self.age += 1#若过程中未进行更新,则将hit_streak置为0if self.time_since_update > 0:self.hit_streak=0self.time_since_update += 1#将预测结果追加到hietory中self.history.append(convert_x_to_bbox(self.kf.x))return self.history[-1]#获取到当前的边界框的预测结果def get_state(self):"""返回当前边界框估计值:return:"""return convert_x_to_bbox(self.kf.x)

总结

  1. 了解初始化,卡尔曼滤波器的状态变量和观测输入

  2. 更新状态变量update()

  3. 根据状态变量预测目标的边界框predict()


智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波相关推荐

  1. 智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波(汇总)

    from __future__ import print_function from numba import jit import numpy as np from scipy.optimize i ...

  2. 智慧交通day02-车流量检测实现11:yoloV3模型

    yoloV3以V1,V2为基础进行的改进,主要有:利用多尺度特征进行目标检测:先验框更丰富:调整了网络结构:对象分类使用logistic代替了softmax,更适用于多标签分类任务. 1.算法简介 Y ...

  3. 智慧交通day02-车流量检测实现14:代码汇总+问题修正

    代码+权重文件+资源https://download.csdn.net/download/qq_39237205/43072746https://download.csdn.net/download/ ...

  4. 智慧交通day02-车流量检测实现12:基于yoloV3的目标检测

    在本章节代码编写中,发现之前的代码所处的环境是python3,因此导致了cv2.dnn.readNetFromDarknet()在代码运行中导致了i[0]的获值失败,故总结如下: cv2.dnn.re ...

  5. 智慧交通day02-车流量检测实现10:多目标追踪实现

    在这里我们主要实现了一个多目标跟踪器,管理多个卡尔曼滤波器对象,主要包括以下内容: 初始化:最大检测数,目标未被检测的最大帧数 目标跟踪结果的更新,即跟踪成功和失败的目标的更新 初始化 def __i ...

  6. 智慧交通day02-车流量检测实现01:总览

    随着城市交通量的迅猛增加,车流量统计已成为智能交通系统中一项关键技术和热门研究方向.高效而精确的车流量检测可以交通管理者和决策者,以及驾驶员提供数据支撑,从而为交通调度,降低拥堵情况的发生,提高道路利 ...

  7. 智慧交通day02-车流量检测实现07:匈牙利算法

    匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)是用来解决多目标跟踪中的数据关联问题,匈牙利算法与KM算法都是为了求解二分图的最大匹配问题 ...

  8. 智慧交通day02-车流量检测实现08:目标跟踪中的数据关联(将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配)

    # 将YOLO模型的检测框和卡尔曼滤波的跟踪框进行匹配 def associate_detection_to_tracker(detections,trackers,iou_threshold=0.3 ...

  9. 智慧交通day02-车流量检测实现02:多目标追踪

    1.多目标跟踪分类 多目标跟踪,即MOT(Multi-Object Tracking),也就是在一段视频中同时跟踪多个目标.MOT主要应用在安防监控和自动驾驶等领域中. 1.1 初始化方法 多目标跟踪 ...

最新文章

  1. web前端,我的新开始
  2. eclipse java jdk_设置Eclipse和Java JDK
  3. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑
  4. mysql语句中把string类型字段转datetime类型
  5. Inside IronPython: IronPython AST语法树(2/2)
  6. php rijndael,将PHP Rijndael算法重写为Java(Android)
  7. php js鼠标滚动刷新,利用php和js实现页面数据刷新
  8. .net开发MIS系统的难处.
  9. 企业该如何做好IT规划
  10. [译] The Cost Of JavaScript
  11. 必须知道的C语言知识细节:单引号和双引号正确用法
  12. 网易互娱 实习生招聘 内推
  13. db与放大倍数的转化
  14. [Android]天气App 1
  15. day25 Scala编cala编译器安装 3.1. 安装JDK 因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK 3.2. 安装Scala 3.2.1. Windows基础
  16. vue : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本
  17. atof函数(把字符串转换成浮点数)
  18. RK3399平台开发系列讲解(应用开发篇)1.12、RTC闹钟唤醒
  19. JS保留最多两位小数
  20. 【项目管理】如何成为合格的项目负责人

热门文章

  1. phpStorm重构快捷键(mac系统、持续更新)
  2. c语言中- gt he,C语言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分别是什么意思
  3. 镜像上传到linux失败,Docker push镜像失败解决方法
  4. 大数据开发初学者学习路线
  5. 深度相机(二)--结构光深度测距
  6. ecshop pages.lbi.php,关于Ecshop pages.lbi.php Xss漏洞的修复
  7. 应用层为何不能设置分辨率
  8. 大规模天线阵列(massive-mimo)的介绍
  9. php 字符串的比较大小,php怎么比较两个字符串的大小
  10. objectid.go源码阅读