日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

智慧交通day02-车流量检测实现07:匈牙利算法

發布時間:2024/7/5 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智慧交通day02-车流量检测实现07:匈牙利算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匈牙利算法(Hungarian Algorithm)與KM算法(Kuhn-Munkres Algorithm)是用來解決多目標跟蹤中的數據關聯問題,匈牙利算法與KM算法都是為了求解二分圖的最大匹配問題

有一種很特別的圖,就做二分圖,那什么是二分圖呢?就是能分成兩組,U,V。其中,U上的點不能相互連通,只能連去V中的點,同理,V中的點不能相互連通,只能連去U中的點。這樣,就叫做二分圖。

可以把二分圖理解為視頻中連續兩幀中的所有檢測框,第一幀所有檢測框的集合稱為U,第二幀所有檢測框的集合稱為V。同一幀的不同檢測框不會為同一個目標,所以不需要互相關聯,相鄰兩幀的檢測框需要相互聯通,最終將相鄰兩幀的檢測框盡量完美地兩兩匹配起來。而求解這個問題的最優解就要用到匈牙利算法或者KM算法。

1.匈牙利算法

匈牙利算法是一種在多項式時間內求解任務分配問題的組合優化算法。美國數學家哈羅德·庫恩于1955年提出該算法。此算法之所以被稱作匈牙利算法,是因為算法很大一部分是基于以前匈牙利數學家Dénes K?nig和Jen? Egerváry的工作之上創建起來的。

我們以目標跟蹤的方法介紹匈牙利算法,以下圖為例,假設左邊的四張圖是我們在第N幀檢測到的目標(U),右邊四張圖是我們在第N+1幀檢測到的目標(V)。紅線連起來的圖,是我們的算法認為是同一行人可能性較大的目標。由于算法并不是絕對理想的,因此并不一定會保證每張圖都有一對一的匹配,一對二甚至一對多,再甚至多對多的情況都時有發生。這時我們怎么獲得最終的一對一跟蹤結果呢?我們來看匈牙利算法是怎么做的。

  • 第一步

首先給左1進行匹配,發現第一個與其相連的右1還未匹配,將其配對,連上一條藍線。

  • 第二步

接著匹配左2,發現與其相連的第一個目標右2還未匹配,將其配對

  • 第三步

接下來是左3,發現最優先的目標右1已經匹配完成了,怎么辦呢?

我們給之前右1的匹配對象左1分配另一個對象。

(黃色表示這條邊被臨時拆掉)

可以與左1匹配的第二個目標是右2,但右2也已經有了匹配對象,怎么辦呢?

我們再給之前右2的匹配對象左2分配另一個對象(注意這個步驟和上面是一樣的,這是一個遞歸的過程)。

此時發現左2還能匹配右3,那么之前的問題迎刃而解了,回溯回去。

左2對右3,左1對右2,左3對右1。

所以第三步最后的結果就是:

  • 第四步

最后是左4,很遺憾,按照第三步的節奏我們沒法給左4騰出來一個匹配對象,只能放棄對左4的匹配,匈牙利算法流程至此結束。藍線就是我們最后的匹配結果。至此我們找到了這個二分圖的一個最大匹配。最終的結果是我們匹配出了三對目標,由于候選的匹配目標中包含了許多錯誤的匹配紅線(邊),所以匹配準確率并不高。可見匈牙利算法對紅線連接的準確率要求很高,也就是要求我們運動模型、外觀模型等部件必須進行較為精準的預測,或者預設較高的閾值,只將置信度較高的邊才送入匈牙利算法進行匹配,這樣才能得到較好的結果。

可以使用:

scipy.optimize.linear_sum_assignment(cost_matrix)

實現匈牙利算法,其中const_matrix表示代價矩陣。比如第一幀有a,b,c,d四個目標,第二幀圖像有p,q,r,s四個目標,其相似度矩陣如下所示:

from scipy.optimize import linear_sum_assignment import numpy as np # 代價矩陣 cost =np.array([[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]]) # 匹配結果 row_ind,col_ind=linear_sum_assignment(cost) #對應的行索引 print("行索引:\n{}".format(row_ind)) #對應行索引的最優指派的列索引 print("列索引:\n{}".format(col_ind)) #提取每個行索引的最優指派列索引所在的元素,形成數組 print("匹配度:\n{}".format(cost[row_ind,col_ind]))

輸出結果為:

匈牙利算法的流程大家看到了,有一個很明顯的問題相信大家也發現了,按這個思路找到的最大匹配往往不是我們心中的最優。匈牙利算法將每個匹配對象的地位視為相同,在這個前提下求解最大匹配。這個和我們研究的多目標跟蹤問題有些不合,因為每個匹配對象不可能是同等地位的,總有一個真實目標是我們要找的最佳匹配,而這個真實目標應該擁有更高的權重,在此基礎上匹配的結果才能更貼近真實情況。

KM算法就能比較好地解決這個問題,我們下面來看看KM算法。

2.KM算法

KM算法解決的是帶權二分圖的最優匹配問題。

還是用上面的圖來舉例子,這次給每條連接關系加入了權重,也就是我們算法中其他模塊給出的置信度分值。

KM算法解決問題的步驟是這樣的。

  • 第一步

首先對每個頂點賦值,稱為頂標,將左邊的頂點賦值為與其相連的邊的最大權重,右邊的頂點賦值為0

  • 第二步:

匹配的原則是只和權重與左邊分數(頂標)相同的邊進行匹配,若找不到邊匹配,對此條路徑的所有左邊頂點的頂標減d,所有右邊頂點的頂標加d。參數d我們在這里取值為0.1。

對于左1,與頂標分值相同的邊先標藍。

然后是左2,與頂標分值相同的邊標

然后是左3,發現與右1已經與左1配對。首先想到讓左3更換匹配對象,然而根據匹配原則,只有權值大于等于0.9+0=0.9(左頂標加右頂標)的邊能滿足要求。于是左3無法換邊。那左1能不能換邊呢?對于左1來說,只有權值大于等于0.8+0=0.8的邊能滿足要求,無法換邊。此時根據KM算法,應對所有沖突的邊的頂點做加減操作,令左邊頂點值減0.1,右邊頂點值加0.1。結果如下圖所示。

再進行匹配操作,發現左3多了一條可匹配的邊,因為此時左3對右2的匹配要求只需權重大于等于0.8+0即可,所以左3與右2匹配

最后進行左4的匹配,由于左4唯一的匹配對象右3已被左2匹配,發生沖突。進行一輪加減d操作,再匹配,左四還是匹配失敗。兩輪以后左4期望值降為0,放棄匹配左4。

至此KM算法流程結束,三對目標成功匹配,甚至在左三目標預測不夠準確的情況下也進行了正確匹配。可見在引入了權重之后,匹配成功率大大提高。

最后還有一點值得注意,匈牙利算法得到的最大匹配并不是唯一的,預設匹配邊、或者匹配順序不同等,都可能會導致有多種最大匹配情況,所以有一種替代KM算法的想法是,我們只需要用匈牙利算法找到所有的最大匹配,比較每個最大匹配的權重,再選出最大權重的最優匹配即可得到更貼近真實情況的匹配結果。但這種方法時間復雜度較高,會隨著目標數越來越多,消耗的時間大大增加,實際使用中并不推薦。


總結:

  • 匈牙利算法和KM算法是進行二分圖最大匹配的算法,在目標追蹤用于進行目標關聯
from scipy.optimize import linear_sum_assignment import numpy as np # 代價矩陣 cost =np.array([[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]]) # 匹配結果 row_ind,col_ind=linear_sum_assignment(cost) #對應的行索引 print("行索引:\n{}".format(row_ind)) #對應行索引的最優指派的列索引 print("列索引:\n{}".format(col_ind)) #提取每個行索引的最優指派列索引所在的元素,形成數組 print("匹配度:\n{}".format(cost[row_ind,col_ind])) # 行索引: # [0 1 2 3] # 列索引: # [3 2 1 0] # 匹配度: # [4 6 6 4]result=linear_sum_assignment(cost) print(np.array(list(zip(*result)))) # [[0 3] # [1 2] # [2 1] # [3 0]]""" 匈牙利算法(Hungarian Algorithm)與KM算法(Kuhn-Munkres Algorithm)1.匈牙利算法與KM算法:都是用來解決多目標跟蹤中的數據關聯問題2.匈牙利算法與KM算法:都是為了求解二分圖的最大匹配問題二分圖1.有一種很特別的圖,就做二分圖,那什么是二分圖呢?就是能分成兩組,U,V。其中,U上的點不能相互連通,只能連V中的點,同理,V中的點不能相互連通,只能連U中的點。這樣,就叫做二分圖。2.可以把二分圖理解為視頻中連續兩幀中的所有檢測框,第一幀所有檢測框的集合稱為U,第二幀所有檢測框的集合稱為V。同一幀的不同檢測框不會為同一個目標,所以不需要互相關聯,相鄰兩幀的檢測框需要相互聯通,最終將相鄰兩幀的檢測框盡量完美地兩兩匹配起來。而求解這個問題的最優解就要用到匈牙利算法或者KM算法。匈牙利算法1.匈牙利算法是一種在多項式時間內求解任務分配問題的組合優化算法。2.我們以目標跟蹤的方法介紹匈牙利算法,以下圖為例,假設左邊的四張圖是我們在第N幀檢測到的目標(U),右邊四張圖是我們在第N+1幀檢測到的目標(V)。紅線連起來的圖,是我們的算法認為是同一人的可能性較大的目標。由于算法并不是絕對理想的,因此并不一定要保證每張圖都有一對一的匹配,出現一對二甚至一對多的情況,再甚至多對多的情況都時有發生。這時我們怎么獲得最終的一對一跟蹤結果呢?我們來看匈牙利算法是怎么做的。 3.匈牙利算法1.第一步:首先給左1進行匹配,發現左1與其相連的第一個目標右1還未匹配,將其配對,連上一條藍線。 2.第二步:接著匹配左2,發現左2與其相連的第一個目標右2還未匹配,將其配對,連上一條藍線。3.第三步:1.接下來匹配左3,發現左3與其相連的第一個目標(最優先的目標)右1已經匹配給左1了,怎么辦呢?那么我們給之前右1匹配的對象左1分配給另外一個對象,即把左1和右1的匹配關系取消掉,黃色線表示這左1和右1的匹配關系被臨時拆掉。2.可以與左1匹配的第二個目標是右2,但右2此時也已經有了其匹配對象左2,怎么辦呢?我們再給之前右2的匹配對象左2分配給另一個對象(注意這個步驟和上面是一樣的,這是一個遞歸的過程),即把左2和右2的匹配關系取消掉,黃色線表示這左2和右2的匹配關系被臨時拆掉。3.此時發現左2還能匹配與其相連的第二個目標右3,發現左1還能匹配與其相連的第二個目標右2,最終左2匹配右3,左1匹配右2,左3匹配右1。4.第四步:最后是左4,很遺憾,按照第三步的節奏我們沒法給左4騰出來一個匹配對象,只能放棄對左4的匹配,匈牙利算法流程至此結束。藍線就是我們最后的匹配結果。至此我們找到了這個二分圖的一個最大匹配。最終的結果是我們匹配出了三對目標,由于候選的匹配目標中包含了許多錯誤的匹配紅線(邊),所以匹配準確率并不高。可見匈牙利算法對紅線連接的準確率要求很高,也就是要求我們運動模型、外觀模型等部件必須進行較為精準的預測,或者預設較高的閾值,只將置信度較高的線(邊)才送入匈牙利算法進行匹配,這樣才能得到較好的結果。 實現匈牙利算法1.API:scipy.optimize.linear_sum_assignment(cost_matrix)其中 const_matrix 表示代價矩陣。比如第一幀有a,b,c,d四個目標,第二幀圖像有p,q,r,s四個目標,其相似度矩陣如下所示.2.例子: from scipy.optimize import linear_sum_assignmentimport numpy as np# 代價矩陣cost =np.array([[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]])# 匹配結果row_ind, =linear_sum_assignment(cost)#對應的行索引print("行索引:\n{}".format(row_ind))#對應行索引的最優指派的列索引print("列索引:\n{}".format(col_ind))#提取每個行索引的最優指派列索引所在的元素,形成數組print("匹配度:\n{}".format(cost[row_ind,col_ind])) 打印結果:行索引:[0 1 2 3]列索引:[3 2 1 0]匹配度:[4 6 6 4] 3.結論:匈牙利算法的流程,有一個很明顯的問題,按這個思路找到的最大匹配往往不是我們心中的最優。匈牙利算法將每個匹配對象的地位視為相同,在這個前提下求解最大匹配。這個和所研究的多目標跟蹤問題有些不合,因為每個匹配對象不可能是同等地位的,總有一個真實目標是我們要找的最佳匹配,而這個真實目標應該擁有更高的權重,在此基礎上匹配的結果才能更貼近真實情況。KM算法就能比較好地解決這個問題。 KM算法KM算法解決的是帶權二分圖的最優匹配問題。還是用上面的圖來舉例子,這次給每條連接關系加入了權重,權重也就是我們算法中其他模塊給出的置信度分值。 KM算法解決帶權二分圖的最優匹配問題的步驟:1.左右兩邊的圖匹配的原則是:左右兩邊的圖只和"權重與左邊圖的分數(頂標)相同的"邊進行匹配,若左邊圖根據與其分數(頂標)相同的最大權重的線(邊)所連接到的右圖已經被分配了某個左圖的話,那么產生沖突,解決的方式是對產生沖突的左邊的兩個圖的頂標減d,然后令產生沖突的右邊的一個圖的頂點值加d。參數d我們在這里取值為0.1。2.實現具體步驟:1.第一步首先對左右兩邊的每個圖(頂點)進行賦值,該值分數稱為頂標。將左邊的每個圖(頂點)賦值為與其相連的線(邊)的最大權重,右邊的每個圖(頂點)賦值為0。2.第二步:1.對于左1,與左1的頂標分值相同的最大權重的邊先標藍,左1連接右1。2.對于左2,與左2的頂標分值相同的最大權重的邊先標藍,左2連接右3。3.對于左3,與左3的頂標分值相同的最大權重的邊所連接的右1已經與左1配對,左3無法直接連接右1,此時產生沖突。1.首先想到的是讓左3更換匹配對象,然而根據匹配原則,只有權值大于等于(左圖頂標加右圖頂標)0.9+0=0.9的邊能滿足左3連接右1的要求,否則無法換邊。那么于是左3無法換邊。那左1能不能換邊(更換匹配對象)呢?對于左1來說,只有權值大于等于(左圖頂標加右圖頂標)0.8+0=0.8的邊能滿足左1連接右1的要求,否則無法換邊。2.此時根據KM算法,應對產生沖突的左右兩邊的圖的頂點做加減操作,首先令產生沖突的左邊的兩個圖的頂點值減0.1,然后令產生沖突的右邊的一個圖的頂點值加0.1。3.此時發現左3多了一條可匹配的邊,因為此時左3連接右2的匹配要求能滿足權重大于等于(左圖頂標加右圖頂標)0.8+0=0.8,所以左3與右2匹配。4.最后進行左4的匹配,由于左4唯一的可匹配對象右3已被左2匹配,此時發生沖突。左右兩邊發生沖突的圖進行一輪加減d的操作,再進行匹配,此時左四還是匹配右3失敗。當經過一共兩輪的加減d的操作后發現左4的頂標降為0,左4放棄繼續匹配。3.至此KM算法流程結束,三對目標成功匹配,甚至在左三目標預測不夠準確的情況下也進行了正確匹配。可見在引入了權重之后,匹配成功率大大提高。最后還有一點值得注意,匈牙利算法得到的最大匹配并不是唯一的,預設匹配邊、或者匹配順序不同等,都可能會導致有多種最大匹配情況,所以有一種替代KM算法的想法是,我們只需要用匈牙利算法找到所有的最大匹配,比較每個最大匹配的權重,再選出最大權重的最優匹配即可得到更貼近真實情況的匹配結果。但這種方法時間復雜度較高,會隨著目標數越來越多,消耗的時間大大增加,實際使用中并不推薦。 """

總結

以上是生活随笔為你收集整理的智慧交通day02-车流量检测实现07:匈牙利算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。