学习笔记
在上一篇中,已经大致阐述了yolo的原理,现在在检测的基础上实现目标的追踪,我使用yolov5+deepsort进行追踪轨迹.
不进行训练,只是使用官方给定的权重文件以及实验视频.

一个浪费了一下午时间得到的感想

对于依赖环境的错误,不要一个个改包就按照官方从头开始重装所有的依赖包

该死的依赖w(゚Д゚)w

目标轨迹检测

  • 目标检测:这部分是检测到感兴趣的初始目标集,对目标分配ID,在随后的时间中进行追踪.这里是使用的yolov5进行目标的检测
  • 目标的跟踪;可分为单目标跟踪 (Single Object Tracking- SOT) 和多目标跟踪 (Multi Object Tracking- MOT).前者较为经典的算法有SiamFC,后者则有sort算法.下面主要说的是后一种

deepsort是基于sort算法的扩展,DeepSORT 将深度学习引入到 SORT 算法中,通过添加外观描述符来减少移动过程中相同目标的因为速度的原因引起的错误ID切换,从而提高跟踪效率.

关于sort算法

  • sort的思路:
  1. 首先通过检测器yolo,把每一帧的物体检测出来
  2. 通过卡尔曼滤波器预测物体在下一帧的位置
  3. 将预测的位置与下一帧实际检测到的位置做IOU的计算,得到相邻两帧物体的相似度
  4. 最后利用匈牙利匹配得到相邻帧的对应id
  • 由于这里只是计算框的重叠面积,因此如果两个物体发生遮挡,会出现id交换的情况,所以作者为了降低id交换,提出了deep sort算法。deep sort之所以可以把id交换降低45%,是因为它将面积匹配修改为了特征匹配,在匹配之前作者利用resnet50先将特征里取出来,由于一般情况下很少会遇到外观特征完全相同的两个物体,因此这种改进是有效的

其次是改进的deepsort算法

  • SORT算法使用简单的卡尔曼滤波处理逐帧数据的关联性以及使用匈牙利算法进行关联度量,这种简单的算法在高帧速率下获得了良好的性能,但由于SORT忽略了被检测物体的表面特征,因此只有在物体状态估计不确定性较低是才会准确,在Deep SORT中使用了更加可靠的度量来代替关联度量,并使用CNN网络在大规模行人数据集进行训练,并提取特征,已增加网络对遗失和障碍的鲁棒性
  1. 检测器得到检测目标
  2. 卡尔曼滤波预测下一帧目标(保证目标不会在识别中丢失)
  3. 使用匈牙利算法将预测后的和当前帧中的目标进行匹配(级联匹配和IOU匹配
  4. 卡尔曼滤波更新
关于原理
  • 匈牙利算法:匈牙利算法是最优规划分配问题的一种解法,同样的还有清华算法等等,基于此定理:如果代价矩阵的某一行或某一列同时加上或减去某个数,则这个新的代价矩阵的最优分配仍然是原代价矩阵的最优分配
  • 卡尔曼滤波:
    对于目标预测的方法,主要是均值(Mean),表示目标的位置信息,协方差(Covariance ),表示目标位置信息的不确定性两方面内容,
    因此卡尔曼滤波的也有两步:预测track在下一时刻的位置->基于detection来更新预测的位置