目录
- deepsort流程
- 一、匈牙利算法
- 二、卡尔曼滤波
- 车速预测例子
- 动态模型的概念
- 卡尔曼滤波在deepsort中的动态模型
- 三、预测值及测量值的含义
- deepsort在pytorch中的运行
deepsort流程
DeepSORT是一种常用的目标跟踪算法,它结合了深度学习和传统的目标跟踪方法。DeepSORT的核心思想是将深度学习的目标检测结果与传统的目标跟踪器相结合,实现在连续帧之间对目标的跟踪。
DeepSORT主要包括两个部分:目标检测和目标跟踪。对于目标检测,DeepSORT使用现有的目标检测算法,例如YOLO、Faster R-CNN等,来检测出图像中的目标。对于目标跟踪,DeepSORT使用卡尔曼滤波器来预测目标的位置,同时通过匈牙利算法来匹配跟踪目标和检测目标。
具体来说,DeepSORT的目标跟踪过程如下:
对于输入的当前帧,使用目标检测算法检测出所有的目标。
对于之前的每个跟踪目标,使用卡尔曼滤波器预测它在当前帧中的位置。
使用匈牙利算法将检测到的目标与之前的跟踪目标进行匹配,以便为每个跟踪目标分配检测目标。
对于未被分配的检测目标,将其视为新的跟踪目标,并使用卡尔曼滤波器进行位置预测。
对于长时间未被检测到的跟踪目标,将其删除。
重复上述步骤,以进行下一帧的目标跟踪。
总的来说,DeepSORT通过结合目标检测和目标跟踪,能够更加准确地跟踪目标,具有较高的实时性和鲁棒性。
一、匈牙利算法
在DeepSORT中,匈牙利算法用来将前一帧中的跟踪框tracks与当前帧中的检测框detections进行关联,通过外观信息(appearance information)和马氏距离(Mahalanobis distance),或者IOU来计算代价矩阵,通过代价矩阵完成新一帧检测框与原被跟踪对象的最优匹配。即匈牙利算法可以告诉我们当前帧的某个目标,是否与前一帧的某个目标相同。
二、卡尔曼滤波
卡尔曼滤波的核心思想是通过动态模型和测量模型来估计系统的状态。动态模型描述了系统的状态如何随时间变化,测量模型描述了如何将系统的状态转换为测量结果。卡尔曼滤波将这两个模型结合起来,通过状态预测和测量更新来估计系统的状态。
卡尔曼滤波的过程可以分为两个阶段:预测和更新。在预测阶段,卡尔曼滤波器根据动态模型预测系统的状态,并计算出预测误差。在更新阶段,卡尔曼滤波器将预测的状态与测量结果进行比较,计算出状态的估计值和估计误差。卡尔曼滤波器通过不断进行预测和更新,逐步提高对系统状态的估计精度。
卡尔曼滤波的优点在于可以根据系统的动态模型和测量模型来估计状态,可以适应不同的系统和环境。同时,卡尔曼滤波器可以对测量结果进行加权平均,有效抑制测量误差和干扰。不过,卡尔曼滤波的缺点在于需要对系统进行建模,并且对于非线性系统需要进行扩展卡尔曼滤波等变种方法的处理。
卡尔曼滤波被广泛应用于无人机、自动驾驶、卫星导航等领域,简单来说,其作用就是基于传感器的测量值来更新预测值,以达到更精确的估计。
DeepSORT算法使用卡尔曼滤波进行预测的原因是,通过对目标运动状态的建模,能够更加准确地预测目标的未来位置,从而提高目标跟踪的准确性和鲁棒性。
如果不使用卡尔曼滤波进行预测,直接跟踪目标的位置和大小,可能会受到多种因素的影响,例如目标运动的加速度、噪声干扰等等,从而导致目标跟踪的不稳定,容易出现跟踪丢失或误判的情况。而卡尔曼滤波则可以对这些因素进行建模,并对目标的位置、速度等状态进行估计和预测,从而在一定程度上保证目标跟踪的稳定性和准确性。
此外,卡尔曼滤波还能够根据目标的运动特性对跟踪结果进行优化,例如对于匀速直线运动的目标,卡尔曼滤波能够更加准确地预测目标的位置和速度,从而提高跟踪的效果。
车速预测例子
假设你有一个车速传感器,但是由于传感器的误差和外界干扰等原因,传感器测量的车速数据会存在一定程度的误差。现在你希望通过这个传感器测量的数据来估计车辆的真实速度,这时候就可以使用卡尔曼滤波。
卡尔曼滤波的基本思想是将观测数据和模型预测结果加权平均,得到更精确的状态估计结果。因此,在这个例子中,我们可以将车速传感器的测量结果作为观测值,将车速模型预测的结果作为模型预测值,然后使用卡尔曼滤波算法来对两者进行融合,得到更加准确的车速估计值。
具体来说,卡尔曼滤波算法可以分为两个步骤:预测和更新。在预测步骤中,我们使用车速模型来预测当前时刻车速的值和协方差矩阵;在更新步骤中,我们将车速传感器测量的值和预测值进行比较,计算卡尔曼增益,然后使用卡尔曼增益对预测值进行修正,得到当前时刻的最优估计值和协方差矩阵。
通过这种方式,我们可以将传感器测量的数据和模型预测的结果进行融合,得到更加精确的车速估计值,从而提高了行车安全。
动态模型的概念
动态模型指的是描述系统状态随时间变化的数学模型。在卡尔曼滤波中,动态模型通常用状态转移矩阵和控制向量来表示系统状态的演化规律。
状态转移矩阵描述了系统状态在没有控制输入情况下的演化规律,它将当前时刻的状态向量映射到下一时刻的状态向量,表示为:
X_k = F_k * X_{k-1}
其中,X_k和X_{k-1}分别表示第k和第k-1时刻的系统状态向量,F_k为状态转移矩阵。
控制向量描述了外部输入对系统状态的影响,它通常用来修正状态转移矩阵,表示为:
X_k = F_k * X_{k-1} + B_k * u_k
其中,B_k为控制矩阵,u_k为控制向量。
动态模型的建立需要根据具体的系统进行选择和设计,一般需要考虑系统的物理特性、运动规律等因素。在卡尔曼滤波中,动态模型的准确性对滤波器的估计精度有重要影响,因此需要根据实际情况进行适当的调整和优化。
卡尔曼滤波在deepsort中的动态模型
在DeepSORT中,卡尔曼滤波的动态模型是针对目标运动状态建立的。具体来说,DeepSORT使用了一个匀速模型,即假设目标在运动过程中保持匀速运动。在这个假设下,目标的状态向量可以表示为:
X_k = [u, v, s, r, a, b]^T
其中,u和v表示目标在图像平面上的位置,s和r表示目标的大小和纵横比,a和b表示目标的加速度。
状态转移矩阵F_k可以表示为:
F_k = [1, 0, Δt, 0, 0, 0;
0, 1, 0, Δt, 0, 0;
0, 0, 1, 0, 0, 0;
0, 0, 0, 1, 0, 0;
0, 0, 0, 0, 1, 0;
0, 0, 0, 0, 0, 1]
其中,Δt表示两帧之间的时间间隔。
控制向量u_k为0,即没有外部控制影响。
根据上述动态模型,可以使用卡尔曼滤波器预测目标在下一帧中的状态,并计算出预测误差。同时,在更新阶段,可以将预测的状态与测量结果进行比较,计算出状态的估计值和估计误差,从而对目标进行跟踪。
需要注意的是,在实际应用中,动态模型的建立需要根据实际情况进行调整,例如对于不同的目标,可以根据其运动特征和目标跟踪的要求进行相应的优化。
三、预测值及测量值的含义
注意,预测值和测量值都不是真值,卡尔曼滤波最终输出值是对于真值的最优估计值。
预测值:指根据目标的历史状态和运动模型(上一帧的跟踪结果),对目标在当前帧出现的位置进行预测。
测量值:指在当前帧中通过目标检测得到的目标位置和大小信息。‘
在DeepSORT算法中,对于每一帧输入的目标检测结果,首先需要对其进行匹配,将其与之前跟踪的目标进行匹配,得到目标的标识信息以及当前帧中目标的位置和大小信息。然后,需要对这些目标进行预测,得到它们在下一帧中的位置和大小信息。这里的预测值是指在当前帧中通过之前跟踪的目标状态以及卡尔曼滤波来预测下一帧中目标的位置和大小信息。
需要注意的是,预测值和测量值并不是同一帧中的数据。预测值是根据之前的跟踪结果和模型预测出来的目标位置和大小信息,而测量值是当前帧中通过目标检测获取的目标位置和大小信息。因此,预测值和测量值是不同的,它们来自于不同的帧,用于不同的目的。
至于时间概念和帧间关系,DeepSORT算法是一个序列化的算法,需要对每一帧的输入数据进行处理,同时需要考虑到不同帧之间的目标运动状态变化和相邻帧之间的目标位置和大小变化。在进行目标预测和匹配时,需要考虑到这些因素,从而保证目标跟踪的连续性和准确性。因此,时间概念和帧间关系是DeepSORT算法中非常重要的概念。
检测器得到bbox → 生成detections → 卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(级联匹配和IOU匹配) → 卡尔曼滤波更新
例子:
Frame 0:检测器检测到了3个detections,当前没有任何tracks,将这3个detections初始化为tracks
Frame 1:检测器又检测到了3个detections,对于Frame 0中的tracks,先进行预测得到新的tracks,然后使用匈牙利算法将新的tracks与detections进行匹配,得到(track, detection)匹配对,最后用每对中的detection更新对应的track
deepsort在pytorch中的运行
下载https://github.com/HowieMa/DeepSORT_YOLOv5_Pytorch.git相关代码。
在base内已经装有pytorch环境,配置详见:
pytorch的docker环境的安装
conda create -n deepsort --clone base
conda activate deepsort
将清华源替换后,安装一个requirements.txt:
pip install -r requirements.txt
安装依赖库:
sudo apt-get install libgl1-mesa-glx
解决报错:
(1)在upsampling.py中报错行改为:return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
(2)报错行self.update(yaml.load(fo.read()))改为self.update(yaml.load(fo, Loader=yaml.FullLoader))
工程main.py中的视频源文件改为:
parser.add_argument('--input_path', type=str, default='/home/DeepSORT_YOLOv5_Pytorch-master/001.avi', help='source')
即可运行demo:
python3 main.py