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

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 在这里我们主要完成卡尔曼滤波器进行跟踪的相关内容的实现。

815902569f6a467a99304f9ac1482386.png


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


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


1.初始化:


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


20200508002109615.png


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


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


20200508002118206.png

20200508002223246.png


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


20200508002128794.png

20200508002231194.png


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


2020050800214615.png


20200508002240839.png


# 内部使用KalmanFilter,7个状态变量和4个观测输入
    def __init__(self,bbox):
        """
         初始化边界框和跟踪器
         :param bbox:
        """
        #等速模型
        #卡尔曼滤波:状态转移矩阵:7,观测输入矩阵:4
        self.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*7
        self.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.01
        self.kd.Q[4:,4:] *= 0.01
        #X:观测结果、状态估计
        self.kf.x[:4] = convert_bbox_to_z(bbox)
        #参数的更新
        self.time_since_update = 0
        self.id = KalmanBoxTracker.count
        KalmanBoxTracker.count += 1
        self.history=[]
        self.hits = 0
        self.hit_streak = 0
        self.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 = []
        #hits
        self.hits += 1
        self.hit_streak += 1
        #根据观测结果修改内部状态x
        self.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置为0
        if self.time_since_update > 0:
            self.hit_streak=0
        self.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,观测输入矩阵:4
        self.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*7
        self.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.01
        self.kd.Q[4:,4:] *= 0.01
        #X:观测结果、状态估计
        self.kf.x[:4] = convert_bbox_to_z(bbox)
        #参数的更新
        self.time_since_update = 0
        self.id = KalmanBoxTracker.count
        KalmanBoxTracker.count += 1
        self.history=[]
        self.hits = 0
        self.hit_streak = 0
        self.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 = []
        #hits
        self.hits += 1
        self.hit_streak += 1
        #根据观测结果修改内部状态x
        self.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置为0
        if self.time_since_update > 0:
            self.hit_streak=0
        self.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()

目录
相关文章
|
1月前
|
传感器 算法 数据处理
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
117 0
|
9月前
|
机器学习/深度学习 传感器 算法
用于准确量化颅面对称性和面部生长的 3D 头影测量方案(Matlab代码实现)
用于准确量化颅面对称性和面部生长的 3D 头影测量方案(Matlab代码实现)
|
16天前
|
数据挖掘 数据库
检测未知成分一般用到那些仪器丨技术分析
未知成分检测是确定物质化学组成的过程,涉及样品收集、前处理、选择分析方法(如光谱法、色谱法、质谱法、能谱法等)、样品分析、数据分析解释、验证确认及报告编写。此过程需要专业知识,可寻求专业服务支持。
|
1月前
马尔可夫转换模型研究交通伤亡人数事故时间序列预测
马尔可夫转换模型研究交通伤亡人数事故时间序列预测
|
11月前
|
传感器 编解码 算法
【航空和卫星图像中检测建筑物】使用gabor特征和概率的城市区域和建筑物检测研究(Matlab代码实现)
【航空和卫星图像中检测建筑物】使用gabor特征和概率的城市区域和建筑物检测研究(Matlab代码实现)
|
机器学习/深度学习 算法 智慧交通
智慧交通day04-特定目标车辆追踪02:Siamese网络+单样本学习
Siamese network就是“连体的神经网络”,神经网络的“连体”是通过共享权值来实现的,如下图所示。共享权值意味着两边的网络权重矩阵一模一样,甚至可以是同一个网络。
118 0
智慧交通day04-特定目标车辆追踪02:Siamese网络+单样本学习
|
编解码 计算机视觉 智慧交通
智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-SiamRPN++(2019)
严格的平移不变性只存在于无填充网络中,如AlexNet。以前基于孪生的网络设计为浅层网络,以满足这一限制。然而,如果所使用的网络被ResNet或MobileNet等现代网络所取代,填充将不可避免地使网络变得更深,从而破坏了严格的平移不变性限制,不能保证物体最后的heatmap集中于中心。
125 0
智慧交通day04-特定目标车辆追踪03:siamese在目标跟踪中的应用-SiamRPN++(2019)
|
机器学习/深度学习 传感器 算法
【电池健康状态预测】基于灰狼算法优化BP神经网络实现电池健康状态预测附matlab代码
【电池健康状态预测】基于灰狼算法优化BP神经网络实现电池健康状态预测附matlab代码
|
智慧交通
智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波(汇总)
智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波(汇总)
72 0
|
机器学习/深度学习 传感器 监控
【航迹识别】基于改进的 Hausdorff 距离的DBSCAN船舶异常行为识别附matlab代码
【航迹识别】基于改进的 Hausdorff 距离的DBSCAN船舶异常行为识别附matlab代码