1. 程式人生 > >圖割論文閱讀筆記:Min-cut/Max-flow

圖割論文閱讀筆記:Min-cut/Max-flow

An Experimental Comparison of Min-Cut/Max-Flow Algorithms for Energy Minimization in Vision

摘要
提出一個新的min-cut/Max-Floe演算法,並應用到計算機視覺鄰域。在實驗當中,比一般其他演算法快好幾倍,接近實時計算了。

1 Interduction
最早的基於圖的能量模型:
這裡寫圖片描述
如何通過圖割來最小化能量函式,min-cut/max-flow演算法有很重要的作用。
本文與兩種Min-cut/max-flow方面的方法:推進重標號和增廣路徑,做比較。文字的演算法是改進的增廣路徑的方法。

2 Background on graphs


這裡寫圖片描述
如圖2所示,一個有向帶權值的圖G=(V,E),V是節點集合,E是邊的集合,再加上兩個終端:只有流出邊的源點s和只有流入邊的匯點t,就組成了我們要的網路流圖。其中每個節點與s和t相連的邊叫t-links,對應(1)中的Dp;每個節點與相鄰節點相連的邊叫n-links,對應(1)中的Vp,q。

2.1 min-cut and max-flow problem
如上圖,一個割把圖分成兩部分,與s相連的畫素集合S和與t相連的畫素集合T。其中割C={S,T}是邊{p,q}的權重的和,p和q分別屬於S和T。而圖中的最小割就是權重和最小的C。
而一個網路流圖的最小割等於最大流(假設從s向t輸入流量,對於每個節點之間的邊有最大的流量限制:容量,那麼對一條路徑來說,其最大流量取決於它的最小容量,因此最大流就是最小割)。

2.2 standard algorithms in combinatorial optimization
最大流演算法主要分為兩種:增廣路徑和推進重標號。
增廣路徑法:通過不斷尋找增廣路徑,不斷增加流量來解決最大流問題,這是許多演算法的基礎。增廣路徑就是從源點到匯點的一條有向路徑。殘留網路Gf:對於每兩個節點之間的邊,一條和G同樣容量c的反向邊,還有一條容量為c-f的邊(表示殘留容量),其中c是邊的容量。當往一條路徑裡輸入可能的最大流量df時,第一條邊的容量為c-df,而第二條邊的流量為df。當路徑裡有一條邊飽和時,就找到了一條增廣路徑。從s到t的流f=f+df。當找不到增廣路徑時,流f就是一個最大流。
推進重標號法:生成預流,預流的節點的流入可以多於流出,多出的流量就是excess,而有正excess的節點就是active節點。將active節點的excess推入距匯點t最近的鄰節點。儘量使當前active節點的excess減少為0,網路中不存在active節點時,就得到了最大流。

3 new min-cut/max-flow algorithm
3.1 algorithm’s overview
這裡寫圖片描述
如圖,我們有兩個樹,S和T。在S中從父節點到子節點是不飽和的,在T中所有的子節點到父節點是不飽和的。每個樹的最外邊是active節點A,裡邊的是passive節點P,中間的是free節點。當一棵樹的active節點和另一棵樹的相遇時,這條連線的路徑就是增廣路徑。
演算法由一下3個階段重複迭代計算:
生長階段:擴充套件搜尋樹。Active節點在相鄰的free節點中獲得子節點,並使其成為新的active節點。若一個active的所有鄰節點都被找過了,這個節點就成了passive節點。
增廣階段:擴充套件上個階段找到的路徑。如果輸入的是最大流量,那這兩路上的一些邊就可能飽和了。如果一個邊是飽和的,那這個邊上的子節點就變成orphans節點。此時除了以s和t為根的樹外,還有以orphans節點為根的樹,圖就由兩棵樹變成了森林。
收養階段:回收orphans節點,使森林重新變成兩棵樹。為每個orphan找一個有效parent,這個parent應和orphan同屬一個s或t,且他們之間的邊是不飽和的。若沒有找到parent,則讓這個orphan成為free節點,且這個orphan的所有children都成為orphans。一直迴圈,最後就沒有orphans節點了,不過由於free節點的存在,重構的S和T也變小了。
三個階段不斷迴圈以後,T和S就沒有active節點了,且樹被飽和邊分開,就得到了最大流。

3.2 details of implementation
設G=(V,E),流f,殘留網圖Gf,active節點集合A,orphans節點集合O,路徑P。TREE(p)表示p節點屬於哪個樹,若p是free節點,則TREE為空。殘留容量為tree_cap(p->q)。

3.2.1 growth stage
這裡寫圖片描述

3.2.2 augmentation stage
輸入一個路徑P。開始時O為空,但由於P至少有一條飽和邊,所以結束時會產生orphan節點。
這裡寫圖片描述

3.2.3 adoption stage
為orphan節點p找一個有效parent,這個parent應和orphan同屬一個s或t,且他們之間的邊是不飽和的。若找到parent節點,將p保留在樹中,並連線到父節點。若沒有找到parent,則讓p成為free節點,且這個p所有children都成為orphans,並執行以下操作:
這裡寫圖片描述

3.3 algorithm tuning
一些細節上的優化。用FIFO原則來處理活動節點與孤立節點的順序,這是growth階段就是廣度優先搜尋了。這樣就保證至少從原點到匯點的第一條路是最短的。
帶adoption階段,orphan找的父節點必須來自於s或t。做以下優化:對於已經證實是來自源節點的節點做標記,並記錄其到源節點的距離,那之後的計算就不用重複找了,而且能通過比較直接得到最小距離的節點。

opencv實現了min-cut/max-flow程式碼,在opencv/sources/modules/imgproc/src檔案下邊的gcgraph.hpp中。
以及作者的程式碼:Max-flow/min-cut

這裡寫圖片描述