2、多目标追踪基础:目标检测概念、IOU(交并比)计算、卡尔曼滤波原理简介、匈牙利匹配算法简介
各位同学,咱们今天聊聊多目标追踪的底层逻辑。说实话,很多人一上来就调库、跑模型,结果遇到实际问题就抓瞎。我当年刚入行时也踩过这个坑——模型跑得飞起,但追踪效果一塌糊涂。后来才明白,底层概念不扎实,上层应用就是空中楼阁。
多目标追踪,说白了就是两件事:先找到目标,再给目标编号。找到目标靠目标检测,编号靠匹配算法。今天咱们就把这两块掰开揉碎了讲清楚。
2.1 目标检测概念
目标检测是什么?就是让计算机在图像里找到我们关心的物体,并框出它的位置。嗯,这里要注意,检测和分类是两码事——分类只告诉你「图里有猫」,检测还要告诉你「猫在左上角那个框里」。
我在项目中常用的检测思路有两种:
- 两阶段检测(如Faster R-CNN):先找候选区域,再对每个区域做分类。精度高,但慢。
- 单阶段检测(如YOLO、SSD):一步到位,直接输出位置和类别。速度快,适合实时系统。
咱们测温系统用的是YOLOv5,为什么?因为测温场景要求实时性,你想想看,一个人走过去,你花半秒才检测到,那温度早变了。YOLO系列在速度和精度之间取得了不错的平衡。
核心输出:目标检测的输出通常是一个列表,每个元素包含:
- 边界框坐标(x, y, w, h 或 x1, y1, x2, y2)
- 类别标签(如person、car)
- 置信度分数(0~1之间)
2.2 IOU(交并比)计算
IOU,全称Intersection over Union,中文叫交并比。这玩意儿是目标检测里最基础、最常用的指标。我习惯把它理解成「两个框的重合程度」。
计算公式很简单:
IOU = 两个框的交集面积 / 两个框的并集面积
举个例子:
框A: [50, 50, 150, 150] # [x1, y1, x2, y2]
框B: [100, 100, 200, 200]
交集区域: [100, 100, 150, 150] → 面积 = 50 * 50 = 2500
并集面积: 框A面积(100*100=10000) + 框B面积(100*100=10000) - 交集面积(2500) = 17500
IOU = 2500 / 17500 ≈ 0.143
IOU的取值范围是0到1。0表示完全不重合,1表示完全重合。在实际项目中,我们通常设定一个阈值,比如0.5——IOU大于0.5就算匹配成功。
我的经验:在测温系统中,IOU阈值设得太高(比如0.8)会导致漏检,设得太低(比如0.3)会导致误匹配。我一般从0.5开始调,根据实际效果微调。曾经有个项目,因为IOU阈值设错了,导致一个人被识别成两个人,温度数据全乱了。
2.3 卡尔曼滤波原理简介
卡尔曼滤波,听起来很高大上,其实核心思想就一句话:用上一帧的状态预测当前帧的位置,再用当前帧的观测值修正预测。
我刚开始学的时候也被公式吓到了,后来发现它就是个「预测+修正」的循环。你想想看,一个人从画面左边走到右边,他的运动是有规律的——不会瞬移。卡尔曼滤波就是利用这个规律,在检测失败时也能给出合理的位置估计。
卡尔曼滤波的两个核心步骤:
- 预测:根据上一帧的位置和速度,预测当前帧的位置。
- 更新:用当前帧的检测结果(观测值)修正预测值。
在测温系统中,卡尔曼滤波的作用特别明显。比如一个人被短暂遮挡了,检测器可能漏掉他,但卡尔曼滤波能根据之前的运动轨迹「猜」出他应该在哪。等遮挡过去,检测器重新找到他时,追踪ID还能续上。
注意:卡尔曼滤波假设运动是线性的、噪声是高斯的。如果目标突然急转弯或加速,预测就会不准。我在做行人追踪时遇到过这种情况——人突然转身,卡尔曼滤波预测的位置和实际位置差了好几个像素。解决办法是适当增大过程噪声协方差矩阵,让滤波器更「相信」观测值。
2.4 匈牙利匹配算法简介
匈牙利算法,名字听着像数学竞赛题,其实是个解决「指派问题」的经典算法。在多目标追踪里,它的任务就是:把当前帧的检测框和已有的追踪轨迹一一配对。
为什么需要这个算法?因为检测结果和追踪轨迹的数量往往不一样——可能检测到5个人,但只有3个追踪轨迹。匈牙利算法能找出「代价最小」的匹配方案。
代价怎么算?通常用IOU的补数(1 - IOU)作为代价。IOU越大,代价越小,越可能匹配成功。
算法流程大致如下:
- 构建代价矩阵(检测框 vs 追踪轨迹的IOU补数)
- 用匈牙利算法找出最小代价匹配
- 对未匹配的检测框创建新轨迹
- 对未匹配的追踪轨迹标记为丢失或删除
避坑指南:我曾经在项目中直接用匈牙利算法匹配所有检测框和轨迹,结果发现当目标数量很多时(比如超过20个),计算量暴增,帧率直接掉到10fps以下。后来我加了一个「距离阈值」——如果检测框和轨迹的IOU小于0.3,直接认为不可能匹配,不参与匈牙利算法计算。这样既保证了匹配质量,又提升了速度。
2.5 知识体系总览
为了让大家更直观地理解这些概念之间的关系,我画了一张流程图:
从这张图可以看出,多目标追踪不是单一算法能搞定的,而是多个模块协同工作的结果。目标检测提供原始观测,卡尔曼滤波做运动预测,IOU计算匹配代价,匈牙利算法做最优匹配——缺一不可。
我的建议:初学者不要一上来就调参,先把这四个概念吃透。我见过太多人把匈牙利算法当黑盒用,结果匹配逻辑出了问题都不知道从哪查。你想想看,如果连IOU都不会手算,怎么调试匹配阈值?
好了,这一章的内容就到这里。下一章咱们会深入代码层面,看看这些算法在Python里怎么实现。记住,理论是基础,动手才是关键。
公众号:蓝海资料掘金营,微信deep3321