二分图匹配及多目标追踪SORT

本文探讨了二分图的概念、匹配的概念,特别是最大匹配和完全匹配,通过教师课程安排为例,详细介绍了匈牙利算法在解决实际问题中的步骤。同时,讲解了如何用二分图模型来处理多目标追踪问题,如SORT算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

匹配

将需要配对的两种对象分别作为 X、Y,匹配常如资源匹配和工作安排等,求配对关系或者给顶点和边赋权,求某种条件下的最优分配问题。可以用而二分图来解决匹配的问题。

二分图

二分图又称作偶图,是图论中一个特殊的模型。设 G =(V,E)是一无向图,若顶点 V 可以分割为两个互不相交的子集 A 和 B 且图中每条边(i,j)所关联的两个顶点 i 和 j 分别属于这两个不同的顶点集,则称 G 是一个二分图。其充要条件是:图 G 中至少存在两个点,且图中所有回路的长度均为偶数。简单来说,就是顶点集 V 可分割为两个互不相交的子集,且图中每条边依附的两个顶点都分别属于这两个互不相交的子集,且两个子集内的顶点不相邻。当图中的顶点分为两个集合,使得第一个集合中的所有顶点都与第二个集合中的所有顶点相连时,此时是一特殊的二分图,称为完全二分图

二分图匹配

如果 E 的子集 M 中任意两条边都没有公共端点,则 M 称为一个匹配。边数最多的匹配称为最大匹配,如果 X 中顶点全都出现在 M 中,则称为 X-完全匹配。若个匹配 M 既是 X-完全匹配 又是 Y-完全匹配,则称 M 是完全匹配。对最大匹配和完全匹配的寻找和判定,有广泛的应用背景。

如工作安排问题:课程和教师的一一安排。可抽象为一个二分图 G = ,其中 U 是教师的集合,V是课程的集合,E 中的边 表示某位教师 U 可以上课程 V。求最大匹配,即使得每门课都有老师教,有学生上。最大匹配可用匈牙利算法

匈牙利算法

  1. 任取一个匹配 M(可以是空集或者只有一条边)。
  2. 令 S 是尚未匹配的点(非饱和点)的集合。
  3. 若 S 为空,则 M 已是最大匹配,算法结束。否则执行第四步。
  4. 从 S 中取出一个非饱和点 u 作为起点,从起点开始走交错路 P(即接下来走的路径一条在匹配 M 中一条不在匹配 M 中,交替走两种类型的路径)。
  5. 如果 P 的终点也是非饱和点(即 P 是一个增广路),则令 M 与 P 异或并赋值给 M,回到第三步。
  6. 如果此时 P 都不是增广路,则将点 u 从 S 中去掉,再执行第三步。 

上面的教师课程问题:u1 ~ u6 为教师,v1 ~ v6 为课程。

  • 当前的匹配 M1 为 {(u2,v6),(u3,v1)},未匹配的点集 S1 为{u1,u4,u5,u6}。选择 u1 作为起点。选出增广路 P1 为{(u1,v1),(v1,u3),(u3,v3)},如下图:

将 M1 与 P1 异或,得到 M2 为{(u1,v1),(u2,v6),(u3,v3)},此时未匹配的点集 S2 为{u4,u5,u6}。

  • 选择 u4 作为起点,选出增广路 P2 为{(u4,v2)}。再将 P2 与 M2 异或,得到 M3 为{(u1,v1),(u2,v6),(u3,v3),(u4,v2)},此时未匹配的点集 S3 为{u5,u6}。

  • 选择 u5 为起点,选出增广路 P3 为{(u5,v3),(v3,u3),(u3,v1),(v1,u1),(u1,v4)}。将 P3 与 M3 异或,得到 M4 为{(u5,v3),(u2,v6),(u3,v1),(u1,v4),(u4,v2)} ,此时未匹配的点集 S4 为{u6}。

  • 选 u6 为起点,选出增广路 P4 为{(u6,v1),(v1,u3),(u3,v3),(v3,u5),(u5,v5)}。将 P4 与 M4 异或,得到 M5 为{(u5,v5),(u2,v6),(u1,v4),(u4,v2),(u3,v3),(u6,v1)} 。即得到一个最大匹配,也是一个完全匹配。

多目标追踪算法SORT

### Bot-Sort算法概述 Bot-Sort是一种多目标跟踪(MOT)方法,在计算机视觉领域用于处理视频序列中的多个移动对象。该算法通过融合检测器输出和运动模型来估计场景内各个物体的位置、速度和其他属性[^1]。 ### 工作原理 核心理念在于利用卡尔曼滤波(Kalman Filter,KF)预测轨迹状态,并采用匈牙利匹配(Hungarian Algorithm)关联新出现的目标框与现有轨迹。具体而言: - **初始化阶段**:当首次发现新的未被追踪的对象实例时,会为其创建一条独立的轨迹记录。 - **更新过程**: - 对于每条现存轨迹,基于先前观测到的数据应用KF做一步向前预报; - 计算当前时刻候选边界盒同各已知路径间的相似度得分矩阵; - 使用二分图最大加权匹配技术解决分配问题; - **终止条件**:如果某条轨迹连续丢失超过设定阈值,则认为对应实体已经离开视野范围并停止维护这条链路。 ```python import numpy as np from filterpy.kalman import KalmanFilter from scipy.optimize import linear_sum_assignment as linear_assignment class BOT_SORT(): def __init__(self,max_age=1,min_hits=3,iou_threshold=0.3): self.max_age = max_age self.min_hits = min_hits self.iou_threshold = iou_threshold self.trackers = [] @staticmethod def convert_bbox_to_z(bbox): # bbox=[xmin,ymin,xmax,ymax] w = bbox[2]-bbox[0] h = bbox[3]-bbox[1] x = bbox[0]+w/2. y = bbox[1]+h/2. return np.array([x,y,w,h]).reshape((4, 1)) @staticmethod def convert_x_to_bbox(x,score=None): w = np.maximum(0., x[2]) h = np.maximum(0., x[3]) xmin = x[0]-(w/2.) ymin = x[1]-(h/2.) xmax=xmin+w ymax=ymin+h if(score==None): return np.array([xmin,ymin,xmax,ymax]).reshape((1,4)) else: return np.concatenate(([xmin],[ymin],[xmax],[ymax],[score])).reshape((1,5)) def update(self,dets=np.empty((0,5))): trks = np.zeros((len(self.trackers),5)) to_del = [] ret = [] for t,trk in enumerate(trks): pos = self.convert_x_to_bbox(self.trackers[t].kalman_filter.x) trk[:] = [pos[0], pos[1], pos[2], pos[3], 0] if(np.any(np.isnan(pos))): to_del.append(t) trks = np.ma.compress_rows(np.ma.masked_invalid(trks)) for t in reversed(to_del): self.trackers.pop(t) matched, unmatched_dets, unmatched_trks = associate(detections=dets,predictions=trks,iou_threshold=self.iou_threshold) for m in matched: self.trackers[m[1]].update(dets[m[0]]) for u_det in unmatched_dets: self.trackers.append(KalmanBoxTracker(dets[u_det])) i = len(self.trackers) for index_trk in unmatched_trks: i -= 1 track = self.trackers[index_trk] track.mark_missed() d = track.get_state()[0] if(track.time_since_update<1 and (track.hit_streak>=self.min_hits or self.frame_count<=self.min_hits)): ret.append(np.concatenate((d,[track.id+1])).reshape(1,-1)) # +1 as MOT benchmark requires positive if(i==0): break if(len(ret)>0): return np.concatenate(ret) return np.empty((0,5)) ``` 此实现展示了如何构建一个简单的BOT SORT框架,其中包含了基本组件如Kalman过滤器的状态转换以及IOU匹配逻辑。实际部署可能还需要考虑更多细节优化性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值