上图中E[X]与E[Y]分别是X、Y的均值。
多变量间可以组合成一个协方差矩阵,如下图所示:↓↓↓
对角线上的协方差,就是方差。
因为计算马氏距离时,涉及到协方差矩阵的求逆运算,影响运算速度,所以一般采用“Cholesky分解”的方式进行求解
import math
def m_dist(data,new_data):
data = np.array(data)# 总体
data_mean = np.array(data.mean(axis=0))# 求总体均值向量
cov = np.cov(data.T) # 转置一下, 满足行标签为特征
cov_rev = np.linalg.inv(cov)# ∑求逆矩阵
diff = new_data-data_mean# 求差
res = math.sqrt(np.dot(diff,cov_rev).dot(diff.T))# 最后根据公式组合在一起
return res
匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法
匈牙利算法求解示例:看了就明白的那种
问题描述:↓↓↓
算法实现步骤:
1、每行减去该行的最小值↑↑↑↑↑
2、每列减去该列的最小值↑↑↑↑↑
3、找到水平或者垂直的线来覆盖表格中的0(需要把所有的0全部覆盖才行),且需要满足显得条数=表格的行列数↑↑↑
4、寻找未覆盖数据的最小值,并未覆盖的数减去最小值,但线的交叉点处的数字要加上该最小值↑↑↑
5、划线,未覆盖的数字继续重复步骤↑↑↑
6、根据限制条件分配任务↑↑↑
1、视频帧经过目标检测算法得到检测的目标(Detections)
2、将Detections与当前的Track进行IOU匹配(Detections与Track数目不一定相等),匹配的算法采用的是匈牙利算法进行求解;
3、匹配完毕的结果有Unmatched Tracks、Unmatched Detections、Matched Tacks;
对于Unmatched Tracks进行Deleted删除掉;
对于Unmatched Detections则产生新暂定为New Tracks(状态先设置为Tentative),需要经过一个试用期,当出现三帧连续命中时,则确定为Confirmed状态的Track;
4、对于Matched Tracks则进行卡尔曼滤波器的状态更新;
5、将Tracks进行卡尔曼滤波器的预测,在于新检测出的Detections进行IOU的匹配,反复循环;
算法缺陷:ID switch发生的频率较高
算法流程:
DeepSORT算法改进思路:
1、改进的跟踪算法加入了外观信息(即外观描述子:使用预训练的卷积神经网络提取外观特征)来提高SORT的性能,用余弦距离(做最近邻运算)来度量tracks和detection的相似度以减少SORT算法中ID switch的次数;
2、另外使用了卡尔曼滤波器的预测与实际的detection之间的平方马氏距离滤除可能性比较小的匹配。↓↓↓↓↓
将Track设定为一个状态空间(8维度),SORT算法中为七维的
分别是边界框中心点的位置的横纵坐标u、v;宽高比γ;高度h;后四位是其对应的速度;
1、对每一个track,计算该帧距上次匹配的帧数,设置一个计数器:在卡尔曼滤波器预测期间,计数器会增加1,当track与测量相关联时,此计数器会重置为0;
2、当Track超出了预先设置的最大生命期时,则认为已经离开了该场景,则该track将从track集合中删除掉;
3、当有新的detection与已存在的所有track关联不上时,则认为有新的检测目标进入,对应的初始化一个新的track,并设置状态为Tentative,当连续三帧都有成功关联时,则状态设置为conformed,否则删除掉;
4、Track状态的转换图:
5、深度外观描述子:
使用卷积神经网络,利用行人重识别数据集上进行训练
将展平后的数据特征进行BN与L2范数归一化处理,将特征投影到单位超球面上,同余弦外观度量相兼容。↓↓↓↓
D:/deep_sort
├─deep_sort
│ ├─configs
│ │ └─deepsort.yaml #deepsort配置文件
│ ├─deep_sort
│ │ ├─deep
│ │ │ ├─checkpoint #deepsort的ReID网络权重
│ │ │ ├─evaluate.py #ReID网络评估脚本
│ │ │ ├─feature_extractor.py #特征提取器代码
│ │ │ ├─model.py #ReID网络定义代码
│ │ │ ├─prepare_car.py #整理车辆数据集脚本
│ │ │ ├─prepare_person.py #整理行人数据集脚本
│ │ │ ├─test.py #ReID网络测试脚本
│ │ │ ├─train.py #ReID网络训练脚本
│ │ ├─sort
│ │ │ ├─detection.py #Detection类定义代码
│ │ │ ├─iou_matching.py #IoU计算代码
│ │ │ ├─kalman_filter.py #卡尔曼滤波器代码
│ │ │ ├─linear_assignment.py #分配算法代码
│ │ │ ├─nn_matching.py #最近邻距离计算代码
│ │ │ ├─preprocessing.py #非极大抑制代码
│ │ │ ├─track.py #Track类定义代码
│ │ │ └─tracker.py #Tracker类定义代码
│ │ └─deepsort.py #DeepSORT类定义代码
│ └─utils #deepsort辅助工具代码
├─easydict #easydict包
├─models #yolov5 v5.0的models代码
├─utils #yolov5 v5.0的utils代码
├─video #测试的视频文件
├─weights #yolov5预训练权重
├─count_car.py #车辆计数演示脚本
├─count_person.py #行人计数演示脚本
├─demo.py #多目标跟踪演示脚本
├─LICENSE #版权文件
├─objdetector.py #封装的yolov5检测器脚本
├─objtracker.py #封装的deepsort跟踪器脚本
└─requirements.txt #yolov5的依赖包列表文件