数据算法_组合优化_Hungarian algorithm

组合优化问题 (Combinatorial optimization problem,COP)

 是一类在离散状态下求极值的最优化问题
二分图(Bipartite graph)  匹配是由一组没有公共端点的边构成的集合。
   U与V之间的关联视为前一帧与当前帧的同一id目标的检测框的关联
数据关联是多目标跟踪任务中的关键步骤,
    运筹学方法,比较经典的即为匈牙利匹配算法和KM算法-传统方法被计算量限制,
	   数据关联的最大瓶颈是计算量爆炸的问题-只需要用一个方法找到最优解即可。从这个角度,问题变成了一个分配问题求最优解的过程
    随机有限集(RFS)理论-实现长时间追踪一百万数量以上的目标

匈牙利算法(Hungarian algorithm

匈牙利算法主要用来解决两个问题:求二分图的最大匹配数和最小点覆盖数
匈牙利算法计算
  1. 算法条件
     求目标函数的最小值
     人数和任务数相等
     效率非负
  2.算法本质:变换系数矩阵(效率),找到n个不同行不同列的0,使指派问题达到最优

jonker-volgenant算法

(也称lapjv算法)是一个比匈牙利解法更快的算法	

KM算法

KM算法(Kuhn-Munkres Algorithm)
   KM算法解决的是带权二分图的最优匹配问题,即引入了权值这
     引入了权值作为约束条件,可以使匹配成功率大大提高	   

场景

 场景是这样,检测中有9个ground truth,我预测了10个检测,他们和每个ground truth的IOU矩阵如下	
   需要把最合适的预测和标签绑定到一起,并且每个预测和标签只能使用一次	 
	 
  混淆矩阵 Confusion Matrix
  IOU(交并比)矩阵
  cost: 距离计算处理出来的,具体有余弦距离,欧氏距离和IOU距离
目标跟踪(Object-Tracking)
  利用检测+跟踪的模式
  利用将检测器和re-id模型两个结合成一个网络结构,这
    单目标跟踪典型算法有:Mean Shift、TLD(基于在线学习的跟踪)、KCF(基于相关滤波性)
	  DFT(Deteciton-Free Tracking) 需要人工标定视频的第一帧图像中的目标,之后边检测边跟踪,常用于单目标跟踪
    Multi-Object-Tracking 多目标跟踪算法典型有:SORT、DeepSORT
      TBD(Tracking-by-Detecton),又或者也可叫DBT(Detection-Based-Tracking)
     在线跟踪(Online Tracking)和离线跟踪(Offline Tracking)		  
  Deepsort的前身是sort算法,sort算法的核心是卡尔曼滤波算法和匈牙利算法
    而Deepsort算法在sort算法的基础上增加了级联匹配(Matching Cascade)和新轨迹的确认(confirmed)
    跟踪框与检测框: 
    卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,它将两个都不是那么可靠的方式做了融合,
	从而可以有效抵抗噪点等外部影响,得到相对准确的预测值。卡尔曼滤波算法就是根据你检测框的位置去预测目标在下一帧的位置
	检测框与跟踪框(卡尔曼滤波预测出来的跟踪框)他们匹配起来,找到最优(最佳)的匹配,从而实现跟踪 
 多目标跟踪算法benckmark	   数据集 算法评价指标

代码示例

import numpy as np
from scipy.optimize import linear_sum_assignment

if __name__ == '__main__':
    ## data
    base_row = ["a","b","c"]
    comp_col = ["x","z","y"]
    #square matrix 
    cost = np.array([[4, 1, 3], [2, 0, 5], [3, 2, 2]])
    base_row = ["a","b","c"]
    comp_col = ["x","z","y","i"]
    # rectangular  matrix
    cost = np.array([[4, 1, 3,3], [2, 0, 5,7], [3, 2, 2,0]])
    ## method
    row_ind, col_ind = linear_sum_assignment(cost)

    print(row_ind,"$")#开销矩阵对应的行索引
    print(col_ind,"#")#对应行索引的最优指派的列索引
    print(cost[row_ind,col_ind])#提取每个行索引的最优指派列索引所在的元素,形成数组
    print(cost[row_ind, col_ind].sum())
    for i in range(len(row_ind)):
        print(base_row[row_ind[i]],comp_col[col_ind[i]])	

源码

from ._lsap import linear_sum_assignment
  线性和分配问题
   linear_sum_assignment -- Solves the linear-sum assignment problem.
  二次指派问题(quadratic assignment problem) 
    quadratic_assignment -- Solves the quadratic assignment problem.
   scipy.sparse.csgraph.maximum_bipartite_matching 最大匹配问题:
   scipy.sparse.csgraph.min_weight_full_bipartite_matching
   scipy.optimize.linear_sum_assignment 求权值最小	

scipy是一个python开源的数学计算库,可以应用于数学、科学以及工程领域,它是基于numpy的科学计算库
    scipy.sparse 提供了 7 种稀疏矩阵数据结构,或者称之为稀疏格式
Scikit-learn(以前称为scikits.learn,也称为sklearn) sklearn 里的linear_assignment()	 

指派问题或分派问题 
 idx_main, idx_other = scipy.optimize.linear_sum_assignmen(cost_matrix)
  scipy.optimize.linear_sum_assignment 可以解指派问题(the linear sum assignment problem)
  scipy中有对应的接口scipy.optimize.linear_sum_assignment, 输入代价矩阵,即可得到分配问题的结果
  scipy.optimize.linear_sum_assignment
   输入和返回值
    maximum 
	 cost_matrix[row_ind, col_ind].sum() numpy.arange(cost_matrix.shape[0]).
  方矩阵 square matrix 
  矩阵矩形  a generalization of the classic assignment problem where the cost matrix is rectangular
     jonker-volgenant(lapjv:Linear Assignment Problem solver using Jonker-Volgenant algorithm)
     jonker-volgenant算法(也称lapjv算法)是一个比匈牙利解法更快的算法
interval=100	 
time_gap = abs(float(txt_timestamp) - float(get_ime_timestamp(img_file)))	
time_gap = time_gap	if time_gap <=  interval else 10000

”E“ 是 exponent(指数) 的缩写。
  3.14E3表示3140  科学计数法中E代表10的次幂 或者 3.14E+03表示3140 
  “E+”后面要精确到十分位位数不够末尾补0

参考

源码: https://github.com/scipy/scipy
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linear_sum_assignment.html	
 Assignment problem https://en.wikipedia.org/wiki/Assignment_problem	
https://blog.csdn.net/weixin_39548859/article/details/120276651 
IOU计算,邻接矩阵法 https://blog.csdn.net/zhuhuigege/article/details/127508137
DeepSORT目标跟踪里的匈牙利算法 最小代价分配问题 https://zhuanlan.zhihu.com/p/544534720
DETR中匈牙利Hungarian算法介绍  taken from # scikit-learn  https://blog.csdn.net/wsLJQian/article/details/118365084
posted @ 2023-03-23 09:11  辰令  阅读(331)  评论(0编辑  收藏  举报