开福区互动网站建设,wordpress中如何添加面包屑,网站建设是什么?,咸宁市网站建设DeepSort详解 1、Sort回顾2、DeepSort的状态向量3、DeepSort的外观特征4、DeepSort的track状态5、DeepSort的代价矩阵以及门控矩阵6、DeepSort的级联匹配 1、Sort回顾
查看这篇博客
2、DeepSort的状态向量 Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量#xff0c… DeepSort详解 1、Sort回顾2、DeepSort的状态向量3、DeepSort的外观特征4、DeepSort的track状态5、DeepSort的代价矩阵以及门控矩阵6、DeepSort的级联匹配 1、Sort回顾
查看这篇博客
2、DeepSort的状态向量 Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量如下图所示 其中uv表示目标中心的水平和垂直像素的位置sr表示目标边界框的面积和纵横比。 DeepSort的状态量中加入了一个纵横比的变化率如下图所示 从理论上来讲加入了一个纵横比的变化率确实能够提高目标跟踪的准确性比较目标一直在移动会有遮挡显示的检测框的纵横比肯定也不是固定的。这是DeepSort的运动特征表示。下面我们看DeepSort的外观特征表示。
3、DeepSort的外观特征 为了解决Sort跟踪算法中对于目标遮挡或检测失效等问题带来的id消失之后再出现时的id不断变化的问题DeepSort加入了一个特征提取网络来进行对特征进行匹配可以关联上长时间被遮挡但又出现的目标、。DeepSort使用了一个简单的卷积神经网络来提取检测框中的目标特征向量这里的网络可以自己diy也可以使用目前主流的现有的CNN如ResNet18ResNet50等。在跟踪的过程中DeepSort会将目标在当前帧的特征向量进行提取并保存在track对象的属性中。在后面的每一帧中都会执行一次将当前帧的目标特征向量与gallery中的特征向量进行相似度的计算比如余弦相似度。这个相似度将会作为DeepSort匹配阶段的一个重要的判别依据。
4、DeepSort的track状态 DeepSort源码中的track类有三种状态Tentative暂定状态Confirmed确定状态Deleted删除态。在开始检测时检测的对象都会初始化一个track对象此时的track为Tentative暂定状态当这个track关联的检测对象连续三帧被检测到并且关联上这个track时那么在第四帧就会将这个track的状态升级为Confirmed状态如果track状态为Tentative并且当前帧失配了或者track的update次数已经超过了最大age则将track的状态降级为Deleted状态。
5、DeepSort的代价矩阵以及门控矩阵 将当前帧的检测框与先前存在的track进行关联的方式可以依靠匈牙利匹配算法来实现。但是在这之前我们需要解决代价矩阵的问题。Sort的代价矩阵是由当前帧的运动特征与前一帧的运动特征的卡尔曼预测值进行iou的比对来产生的这样做会导致较大的局限性。因此DeepSort寻找了两个适当的指标来结合运动特征和外观特征。 首先我们来看运动特征作者采用了马氏距离来衡量卡尔曼预测态和当前测量值之间的差异。关于马氏距离的解释可以查看这篇博客。下图则是DeepSort中外观特征的马氏距离计算公式 其中yisi表示第i个track分布到测量空间的投影dj表示第j个目标检测框在代码中的体现 我们计算出外观特征的距离之后我们还需要一个阈值来判断是否是我们想要的匹配其中四维空间的马氏阈值为9.4877这在代码中也有体现 有了阈值之后我们就可以来卡满足匹配要求的外观特征和不满足匹配要求的外观特征了 在计算出了feature的余弦相似度之后我们可以使用这个外观特征的门控特性来卡大于这个马氏阈值的我们将feature的余弦相似度设置成一个很大的固定值小于这个马氏阈值的我们则保留本来的余弦相似度代码中的体现 外观特征作者在每一个track中都创建了一个gallery来存储这个track在不同帧中的外观特征并且每个外观特征的模长为1特征层经过了归一化论文中用Rk表示Rk中最多存储100个外观特征。因此当我们获取当前帧的所有检测框时就得到了所有当前帧的外观特征我们拿这些外观特征与不同track对象中的Rk库进行余弦相似度的计算并得到其中的最小值 其中rj表示当前帧的第j个检测框rk(i)表示第i个track的gallery特征库余弦相似度值越大说明两个目标之间越相似因此这里的值取最小值表示最相似的。同样设定一个阈值来卡余弦相似度 在源码中这里的阈值设置为0.2即大于0.2的都置为一个固定值 运动特征与外观特征的融合运动特征与外观特征的作用是相辅相成的试想一下运动特征可以匹配上短期内的物体位移带来的目标位置变化但是遮挡之后目标的位置中断导致无法匹配上而外观特征可以搜寻过往的track的特征来进行匹配。但是当画面中出现两个目标的外观特征十分相似而空间上的分离能让我们确定他们时两个物体时这时使用外观特征则会导致将他们视为一个track的误判这时就需要运动特征来提供判断依据因此作者采用了加权的方式来综合两个代价矩阵得到最终的代价矩阵 最后我们联合运动门控矩阵马氏距离阈值得到与外观门控矩阵max_distance阈值得到得到了最终的关联性门控矩阵 然后结合最终的代价矩阵和门控矩阵来得到最终用于匈牙利匹配的矩阵并进行级联匹配。
6、DeepSort的级联匹配 对confirmed状态下的tracks和当前的检测框进行级联匹配这里的级联指的是不同update次数下的tracks我们都需要与当前的所有检测框进行匹配。先遍历当前的所有tracks并将其分成confirmed和unconfirmed的两种track记录下他们的索引在对应列表中。然后进入matching_cascade方法中从0开始遍历到cascade_depth源码中设置为70即我们遍历到最多在有70帧还未更新的track遍历当前level下的所有tracks挑出满足的tracks然后进入min_cost_matching函数中与当前帧的检测框进行匹配返回的是已经配对上的track索引和检测框索引以及还剩下的未匹配的检测框索引这个循环一直持续当未匹配的检测框列表为空时提前退出循环算法流程如下图所示 min_cost_matching函数中调用了gated_metric函数来进行代价矩阵的计算 def gated_metric(tracks, dets, track_indices, detection_indices):features np.array([dets[i].feature for i in detection_indices])targets np.array([tracks[i].track_id for i in track_indices])# 通过最近邻余弦距离计算出成本矩阵代价矩阵cost_matrix self.metric.distance(features, targets)# 计算门控后的成本矩阵代价矩阵cost_matrix linear_assignment.gate_cost_matrix(self.kf, cost_matrix, tracks, dets, track_indices,detection_indices)return cost_matrixgated_metric函数中得到了外观特征代价矩阵并且得到了运动特征的马氏距离门控矩阵对代价矩阵进行了第一次的门控。 这里的distance_metric就是我们刚才提到的gated_metric在这里的调用然后红框内的第二行就是使用最大余弦相似度进行第二次的门控这样一来关于卡尔曼状态的门控和外观特征的门控我们就都用上了。
最后说一下我对公式5的理解我一开始以为的是作者想每次都把这两者给算出来然后按照一定的权重进行相加得到代价矩阵结果在代码中找了很久并没有发现这一个操作。然后我才发现也许这里的lambda不是1就是0也就是说外观的代价矩阵还是外观的在这一阶段我们利用外观代价矩阵进行匹配在另一个阶段我们就会利用运动代价矩阵进行匹配。因此在级联匹配之后还有一个利用iou的运动代价矩阵来对级联匹配中还没有匹配成功的目标进行二次匹配。也就是上文中我说的相辅相成的功能。 如有理解不对的地方还请大家多多指出~~