人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)

要想做好目标追踪,须做好目标检测,所以这里就是基于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换一下。

.

相关推荐
风象南3 小时前
普通人用AI加持赚到的第一个100块
人工智能·后端
牛奶4 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶4 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
哥布林学者6 小时前
高光谱成像(一)高光谱图像
机器学习·高光谱成像
地平线开发者6 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮6 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者7 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考7 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
冬奇Lab8 小时前
OpenClaw 源码精读(2):Channel & Routing——一条消息如何找到它的 Agent?
人工智能·开源·源码阅读
冬奇Lab8 小时前
一天一个开源项目(第38篇):Claude Code Telegram - 用 Telegram 远程用 Claude Code,随时随地聊项目
人工智能·开源·资讯