引言
RandomWalk是基於圖論分割方法的一個重要分支。在根據圖像建立的圖模型上,RandomWalk根據隨機遊走模型,來求解未標記的像素(unseeded pixels)到達已標記的種子點(seeded pixels)的概率,根據未標記的像素到達不同目標區域的概率大小,來判斷未標記像素的歸屬。
RandomWalk圖像分割算法分爲三個步驟:(1)圖模型的建立;(2)根據隨機遊走模型計算unseeded pixels到達目標區域的線性方程組;(3)利用迭代法求解線性方程組,這裏通常採用共軛梯度法進行求解(conjugate gradient)。其求解過程可以用下圖來描述:
1 圖模型的建立
2 隨機遊走模型的建立
3 模型的求解
方案一:直接使用CUDA
需要注意的是這裏的矩陣運算是稀疏矩陣的運算,需要對稀疏矩陣進行壓縮處理。
第三方提供的稀疏矩陣運算程序:http://www.mverschoor.nl/wp/projects/cuda-spmv/
CUDA官方提供的稀疏矩陣運算程序[需要CUDA7.0版本]:https://developer.nvidia.com/cuSPARSE
方案二:OPENCL的加速方法來實現
可以使用ViennaCL進行運算。ViennaCL是使用OPENCL,OPENMP,CUDA等編寫的,主要用於進行高級的矩陣運算。http://viennacl.sourceforge.net/viennacl-about.html
方案三:使用已有的加速方法來實現,例如voreen:
使用voreenBlas中的共軛梯度程序求解,其中也包括對稀疏矩陣的處理。https://github.com/bilgili/Voreen/tree/master/modules/randomwalker
方案四:其他的庫,包括MKL中的DCG相關函數;GMM庫等等
4 與圖割方法的比較
參考文獻:
- <Random Walk For Image Segmentation> Leo Grady.