网站设计与网页制作,网站开发的过程步骤,做网站前台用什么,做后期的网站在这里我们主要完成卡尔曼滤波器进行跟踪的相关内容的实现。
初始化#xff1a;卡尔曼滤波器的状态变量和观测输入更新状态变量根据状态变量预测目标的边界框初始化#xff1a; 状态量x的设定是一个七维向量#xff1a; 分别表示目标中心位置的x,y坐标#xff0c;面积s和当…
在这里我们主要完成卡尔曼滤波器进行跟踪的相关内容的实现。
初始化卡尔曼滤波器的状态变量和观测输入更新状态变量根据状态变量预测目标的边界框初始化 状态量x的设定是一个七维向量 分别表示目标中心位置的x,y坐标面积s和当前目标框的纵横比最后三个则是横向纵向面积的变化速率其中速度部分初始化为0其他根据观测进行输入。
初始化卡尔曼滤波器参数7个状态变量和4个观测输入运动形式和转换矩阵的确定都是基于匀速运动模型状态转移矩阵F根据运动学公式确定 量测矩阵H是4*7的矩阵将观测值与状态变量相对应 以及相应的协方差参数的设定根据经验值进行设定。 # 内部使用KalmanFilter7个状态变量和4个观测输入def __init__(self,bbox):初始化边界框和跟踪器:param bbox:#等速模型#卡尔曼滤波状态转移矩阵7观测输入矩阵:4self.kf KalmanFilter(dim_x7,dim_z4) #初始化卡尔曼滤波器# 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_streak0self.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_x7,dim_z4) #初始化卡尔曼滤波器# 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_streak0self.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) 总结 了解初始化卡尔曼滤波器的状态变量和观测输入 更新状态变量update() 根据状态变量预测目标的边界框predict()