要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。
一.参数与演示

这里用到的是coco预训练人的数据集:


二.针对检测结果初始化track


对每一帧数据都输出yolo5的检测结果(主要是四个坐标值)




上图是说在第一帧时检测到8个框,它们每个框的4个坐标值如上图。

置信度是指每个框是人的可能性是多少。





下面就看它取特征的网络结构:

最终输出的特征结果是每个框(一共8个框)对应的128维的向量。




上图是按置信度过滤掉分值低的,然后再从detections对象出取出过滤后的boxes与置信度值(得分)。
三.对track执行预测操作




对上二个张图中写的卡曼滤波更正为卡尔曼滤波。按上图所示下面就实例化Track了,如下图:



一个track只会保存100个特征,也就保存100帧结果。到此第一帧的追踪就完成(其实第一帧也只是初始化track,没做核心内容,从第二帧开始才执行核心内容),

上面二个方法也是卡尔曼滤波的预测与更新两个核心操作。
下面开始第二帧追踪了,这里track已经有值了:


四.状态量预测结果


上图中mean[3]就是指h的值,因为对人进行跟踪时,随着运动,距离越远h值变得越小,越近h值就会变得越大,其它的x,y值是固定的,a这个长宽比也是固定的,所以说h变化比较大,那么就用基于h来做噪声矩阵。


按h初始化得到一个噪声矩阵P:

得到状态转移矩阵A:


上图中写的FX中的F改成A,表示状态转移矩阵。

其实上图中写的F实际上是A来的,表示状态转移矩阵。

做8次后tracker.predict()就结束了,下面将进行tracker.update(detections)方法了。tracker.update(detections)不但完成更新还要完成匹配,是最核心的方法。
五.IOU代价矩阵计算
tracker.update(detections)流程是先匹配再更新操作的。匹配包括级联匹配,当未匹配上就做IOU。

因为3次确认上才会做级联匹配,那现在第2帧进来时不会做级联匹配,就会做IOU匹配:

IOU核心就是把代价矩阵做出来,使它的损失最小(距离最小),其实就是计算track与detection之间的IOU距离值出来。

初始化出一个全是0的8*8的代价矩阵cost_matrix出来。



六.参数更新操作
匈牙利匹配只需要一个代价矩阵cost_matrix参数,输入代价矩阵返回回来最合适的匹配。上面已经得到这个参数了,所以下面就直接调用这方法:

linear_assignment是scipy中已经实现好的,直接调用返回对应的ID值:

调用的结果如下图:

有返回ID后就对detection与track中的值进行匹配过滤,如下图:

返回后得到匹配后的结果,完成IOU代价矩阵计算:

由上图可见到匹配到8个对,那接下来就要做更新操作:




取前4个值:

将协方差矩阵映射到检测空间:

上图最后把均值向量映射到检测空间的4个值(mean),协方差映射到检测空间+初始化的噪声矩阵都返回回去。映射完后就计算卡尔曼增益了,如下图:




至此卡尔曼增益已算出,预测值与协方差距阵都做了更新。
七.级联匹配模块

上图中假设8个人都连续命中3次那也就是要进行级联匹配,

为什么先做级联匹配呢?因为级联匹配是对确定状态(连续3帧都匹配上,即比较有把握的匹配了)的匹配。IOU匹配主要是对新的detection的匹配。

八.ReID特征代价矩阵计算
进入级联匹配方法中,它主要做外观信息与运动信息的匹配:




它也一样要构建代价矩阵出来


求上面所说的代价矩阵用到的是余弦相似度计算

这里运用到二个特征向量之间做余弦相似度,取出距离最近的(相似度最大的)出来,值得其它地方运用。




九.匹配结果与总结
返回级联的代价矩阵后,也要做过滤:



IOU匹配都是每一帧都会去匹配的。追踪的核心思想是当前帧track是否与检测值bbox匹配上,其中核心是代价矩阵的求解。

总结:目标检测得到bbox,第一帧得到track(iou匹配),连续3帧确定的就进行级联匹配(包括iou匹配)。
本例是对人的目标做追踪,而如果换成其它物体追踪就要把ckpt.t7换一下。
.
