Graph Cuts on the GPU解析

来源:互联网 发布:萌鸽文化 淘宝 编辑:程序博客网 时间:2024/04/29 09:27

转自:http://bn-course.wikispaces.com/GPGPU+AccelerationGraph Cuts on the GPU

辅仁大学应用科学所博士班一年级黄才荏(2011.6)智慧型系统实验室islab_9902_b2.gif

1.简介

一二本份报告是以阅读CUDA cutsFast graph cuts on the GPU[1]这篇论文,理解graph cut的原理,并配合所提供之程式码,瞭解如何透过NVIDIA的CUDA[2](Compute Unified Device Architecture)技术实现平行运算,以达到加快运算速度的效果。在只使用CPU的情况下计算graph cuts,因计算复杂度高的状况下,无法达到即时的效果,但依靠CUDA的平行运算,可把运算效果提升数十倍,可达到即时的效果,对于需要即时的电脑视觉运算,是一种很好的方法。

一二Graph cut可在有向图(directed graph)或无向图(undirected graph)的把节点分割成两群。最常在解决有向图中,由源点(source)流向汇点(sink)的流量问题,例如:水管、网路或车流量。在近几年影像被建立成图学概念,使得影像可被建成无向图,于是graph cut被用来解决电脑视觉、图像处理以及机器学习(Machine Learning)的问题,其中的问题包括影像分割、影像分类以及影像合成。

一二

1.1 马可夫随机场


一二马可夫随机场(Markov random field)为一种具有马可夫性质(Markov property)图学模型,而马可夫性质为机率的一个概念,为在随机过程(stochastic process)中时间点的相关性,未来跟过去无关,只会跟当下的状态有关。如图1为例,在一随机过程中已知现在及过去的状态X=(xt,:t∈I)未来的时间点xn+1只跟当前时间点xn相关,跟过去时间点xn-1无关,具有此性质的随机过程便可称为马可夫过程(Markov process)。以机率表示为: 
CudaFunction-1.png
(1)

,其中最有名的马可夫过程为马可夫链(Markov chain)。


CudaImage-1.png
图1、马可夫过程

一二马可夫随机场为具有马可夫性质的无向图,其中节点(node)代表随机变数(random variable),节点之间的连线称为边(edge),用以代表两节点之相依关系,又称为马可夫网路(Markov network)及无向图模型(undirected graphical model),而有向图则称为贝式网路(Bayesian network)。以图2为例,一个无向图G=(V,E),节点V=(v1,v2,v3,v4),E=(e12,e13,e24,e34),节点v1,v2的相依关系为e12。因具有马可夫性质,所以节点v2跟最近节点有相依性,其机率为


CudaFunction-2.png
。 (2)
CudaImage-2.png
图2、马可夫随机场

一二近十几年来在影像上建立马可夫随机场,使得每一个像素点(pixel)的特徵当成是随机变数,如亮度或灰阶质。和邻近的像素点建立相依关系,如图3所示,黑色跟邻近的4个灰点为一集合,透过推论的方式,可用以解决影像处理或电脑视觉的问题,包括影像重建(image reconstruction)、分割(segmentation)或边缘侦测(edge detection)等等。


CudaImage-3.png
图3、影像上建立马可夫随机场

1.2 CUDA介绍



一二CUDA(Compute Unified Device Architecture)是由NVIDIA所推出的平行运算技术,能使用在NVIDIA的显示卡上的GPGPU(General-purpose computing on graphics processing units),使得运算效能大幅提升。特别在SIMD (Single instruction, multiple data),把一个问题可以拆解成多个计算方式相同、但结果彼此并互相不影响的小问题,在这种情况下,就可以把这些计算方式相同的小问题,给显示卡的GPU来进行大量平行化的处理。例如:1+2+3+4+5+6,可分成1+2、3+4、5+6三个小问题来进行平行运算,来得到加速的效果。尤其是在运算量远大于传输时,GPGPU的效能大大超越了CPU。
一二目前CPU的性能远大于GPU,在可平行化运算的状况下,还是会选择GPU运算。以图4所示,绿色的方块为算术逻辑单元(Arithmetic logic unit),在CPU中有4颗,而在GPU中有108颗。虽然CPU中只有4颗,但这4颗可以同时做不同的运算,例如分别做加、减、乘、除,而GPU无法同时进行不同的运算,也就是同一时间所有的单元只能运行一种运算,但有相同的运算时,便可进行平行运算,使得效能可比CPU快好几倍。

CPUGPU.png

图4、CPU与GPU的微架构

一二Nvida新一代核心架构"Fermi",是以物理学家Enrico Fermi(恩理科•费米)的姓来为其命名。CUDA架构的发展顺序为G80、G200、Fermi,目前新一代的产品都是Fermi架构,最早推出的核心晶片为GF100(GeForce of Fermi 100),如图所示,而其第一个使用Fermi的显示卡为GeForce GTX 480。目前最新推出的最新晶片为GF110系列,其架构跟GF100一样,只是在电路和制造过程的部分有重新设计,使得良品率要比GF100高得多,且功耗及温度方面比GF100更为出色。 
一二在Fermi架构中,在每个CUDA Core中,如图5所示,包含有分派埠(Dispatch Port),运算对象收集器(Operand Collector)、浮点运算单元(FP Unit)、整数逻辑单位(INT Unit)以及结果序列(Result Queue)几大部分。当任务分发至每个CUDA Core时,便由分派埠接收所指派的任务,再以运算对象收集器来决定是浮点运算或是整数运算,最后把运算结果藉由结果序列送至专属记忆体。 
CudaImage-5.png
图5、CUDA Core
一二每个CUDA Core均支援最新的 IEEE 754-2008浮点标准,而旧架构的Core支援为IEEE 754-1985浮点标准。比起以前的标准主要有两项改进,第一为能够支援单精度(float)及双精度(double)的乘法及加法指令。第二为支援FMA(fused multiply-add),而IEEE 754-1985所使用的为MAD(Multiply-add)。在电脑图形、线性代数和科学应用中常见的运算操作序列是把两个数相乘然后把获得的积与第三个数相加,例如D=A×B+C,如图6所示。MAD指令为两数相乘后,会对结果进行四舍五入,然后再继续进行加法之计算,最后再对结果四舍五入,导致计算的最终结果会造成较大的资料偏差。但FMA指令为计算指令全部完成后,才会进行四舍五入,因此计算结果的精度将会大幅提升,使得多种演算法获益。 

CudaImage-6.png

图6、MAD及FMA
一二CUDA可使用C、C++、Fortran的程式语言配合CUDA的软体开发工具(Toolkit)及套件(SDK),来对GPU资源进行调用,以达到平行程式之最佳效能。目前CUDA的开发工具及套件已发展到CUDA Toolkit v4.0 RC2,其中重要的更新为统一虚拟定址(Unified Virtual Addressing),可把系统及显示卡记忆体做透过虚拟的位址来做定址,使得在记忆体的操作上会更加容易。目前已有几个以影像处理及电脑视觉为主的GPGPU的函式库,包括OpenVIDIA、GpuCV、GPU4Vision、MinGPU以及Nvidia自行推出的NPP(NVIDIA Performance Primitives)。

2.原理说明

一二Graph cut的目的为了把图(graph)中的节点分成两群,同一群的节点彼此之间相 度高,不同群的节点则相 度低。本节主要在说明graph cut的原理,接著说明如何在CUDA上实现平行化程式,以提高效能。

一二

2.1 Graph cuts

一二Graph cut目的要把图中的节点分两群,在有向图中以流量(Flow)为概念,设定源点跟汇点,便可使用最大流量最小割定理(Max-Flow Min-Cut Theorem)。在无向图中则以能量的概念,把相 的节点分在同一群。以下先说明最大流量最小割定理,接著再说明graph cut的其中两种实作方法Ford-Fulkerson algorithm[2]和Push-relabel[3]。其中Push-relabel的方法为先以节点为单位来看流入及流出量,并统计来找到最大流量。Ford-Fulkerson则以源点流至汇点的每一条路径统计后找到最大流量。以CUDA的平行运算概念,Push-relabel的方法才可以使用GPGPU

一二

2.1.1 最大流量最小割定理

一二一张有向或无向图都为网路流(flow network),而网路流又可想成水流管线图,每个节点(node)之间都会有水管连接,水管会有水可流过的容量(capacity),当为有向图时,便会有流动方向性,无向图时,便表示两个方向皆可没有限制。如图7所示,此为有向网路流,水可以在各个节点之间流动,但需要遵守流量限制以及方向性。



CudaImage-8.png
图7、有向网路流
一二在网路流中的最大流量为设置两个点,源点和汇点,由源点灌入水,汇点流出水,,中途水会受限于节点间水管的容量,以及水流的方向或分流,造成流出汇点的量会有所不同,其中由汇点流出的最大 便为最大流量。如图8所示,从源点s流向至汇点t,其中红色的数字为水管的容量,蓝色的数字为实际水流过流量,可以看到流到汇点t的流量为4+7+12=23,此流量会为最大流量,因为可以看到流向汇点t的两个水管都到达极限,此时也可称为水管残留的容量最小。

CudaImage-10.png
图8、有向网路流的最大流量
一二Graph cut所使用的最大流量最小割定理为把图上的节点相关性高的分割在一起。相关性高的节点能够互相流通,也就是水管残留的容量高,反之,相关性低的节点互相流通的流量很低,也就是水管残留的容量低。最小割就是把残留的容量低的水管切割,以达到分割两群,此两群内的节点之间的相关性高。要找到残留的容量最低的水管不容易,但找到最大流量时的状况会为水管残留的容量最小的时候,于是最大流量最小割定理便先找到最大流量时,切割残留的容量最低的水管。如图9所示有三条水管的残留容量为0,水无法藉由这三条水管流通,便使用最大流量最小割定理,让上面的节点为一群,下面的节点为一群。

CudaImage-11.png
图9、最大流量最小割定理

2.1.2 Ford-Fulkerson 演算法

一二Ford-Fulkerson演算法为找出最大流量的方法,设定源点和汇点后,计算每一条可能的流动路径,使得最后无容量可由源点流向汇点的路径时便为最大流量,如图10所示,计算由S流向T的每一条路径的流量,每种颜色都代表一条路径。在网路流中以每一条由源点流向汇点的路径,便会改变网路流的剩余网路(Residual Network),剩余网路记录每个节点之间流动的剩余容量,而计算流动路径时可使用流动回流的方法,增加节点间的剩余容量,以找出扩充路径(Augmenting Path),扩充路径为在剩余网路由源点还可以流向汇点的路径,当无扩充路径时,此流量便为最大流量。找到最大流量后,便会拥有其水流图,于是对流量小的管线进行graph cut,达到分群的效果。

CudaImage-13.png

图10、Ford-Fulkerson 演算法

2.1.3 Push-relabel 演算法

一二Push-relabel演算法为另一种找出最大流量的方法。设置源点和汇点后,以每个节点具有含水量的概念下,从源点至汇点的方向,按顺序计算每个节点流入及流出量,如图11所示,每种颜色代表计算一个节点时的流入与流出。此方法具有慢慢往汇点推进的想法,避免绕回流的状况,但是要有推进的想法,便需要每个节点的设置高度 ,越往源点的高度越高,反之往汇点的高度越低,使得水由高处往低处流,而每个节点依序跟周围的其中一个节点计算流入及流出量。计算数次从源点到汇点的每个节点,最后在汇点得到的流入量最大时便为最大流量。
CudaImage-14.png

图11、Push-relabel 演算法

一二push-relabel演算法分为push和relabel两个步骤,push为任一节点与周围其中一个节点之间,找出此节点的存水量及与另一个节点之间的剩余流量,哪一个比较小,藉此可得知此节点是仍然有剩余流量,还是流不出去了。有三个条件限制,分别为存水量大于0,管线的容量大于流经此管线的流量,以及此节点高度要大于另一个节点的高度。Relabel为当某一节点的存水量大于0时,代表水流不出去,于是找出其他比此节点高度低的节点,把流不出去的流量流向低高度节点。每个节点重复以上两步骤,直到算到汇点后,便再从源点开始,直到找到最大流量,此时便亦得到水流图,就可以对流量小的管线进行graph cut,达到分群的效果。

2.2 在影像上的graph cut

一二在影像上使用graph cut来把像素点分为两群,便需要在影像中建立马可夫随机场,以像素点代表为节点,使得问题变为使用graph cut来解马可夫随机场的问题,以能量来表示两节点之间的关系,当节点被分成两群,此两群节点之间的能量为最小 时,此两群便为graph cut的结果。在影像中,两像素点之间的关系能量越强代表关系性越低,能量越弱代表关系性越高。换句话说,可看为由一个像素点移至另一个像素点所需的能量,能量越强代表越难移动,能量越弱代表越容易移动。以此观念使用到下式的能量关系式:

cudamath3.png
(3)
其中N⊂P×Pp为像素点,qp周围的邻居像素点。fpfq为标记的标签。Dp为资料能量,p点跟fp之间的能量。Vp为模糊能量,当p点和q点分别被标记为跟fpfq时之间的能量。使用像素点标记的方式,找到能量最小 时,便可使用graph cut的方法把影像的像素点分成两群。 如图12所示,蓝粗线代表像素点跟s之间能量比较小,反之蓝细线代表之间能量比较大,红粗线代表跟t之间能量比较小,反之红细线代表之间能量比较大,于是便依照两群能量为最小时,进行绿线的graph cut。
cudaimage10-3.png

图12、影像上使用最大流量最小割定理


一二但在影像上要使用Ford-Fulkerson和Push-relabel此两种流量方法的话,无法使用找出能量最小 的做法,于是便会把在影像上所建立无向图的马可夫随机场,从无向图建立成是双向的有向图,如图13所示,便可使用graph cut的最大流量最小割定理来把影像中的像素点分成两类。
cudaimage13.png
图13、无向图建立成双向有向图
一二

2.3 Graph cut使用于CUDA

一二GPGPU为使用平行化运算的方式来加快计算速度,在上一节介绍的两种使用流量方法的graphcut 的方法,其中push-relabel的方法为一个节点为单位,因此GPGPU便可以平行化运算的方式来计算每个节点的流入及流出量。而Ford-Fulkerson的方法却为每一次计算流动路径的便修改剩余网路,使得此方法并不是适合平行化运算。接下来就介绍在graph cut的push-relabel方法如何在GPGPU上实现。
一二使用GPGPU来加速push-relabel algorithm找到最大流量,首先把影像分成Bx*By区块(block),BxBy为x轴和y轴的区块数量。每个区块的维度为DxDy,在一个区块所要计算的节点数量,包括了四个方向的邻居点为(Dx+2)*(Dy+2)。每个节点会有存水量e(u)、节点高度h(u)、活跃程度flag(u)和对邻居点的残余容量。
一二在使用GPGPU时,因无法同时执行不同步骤,于是把push-relabel algorithm分成四个部分,分别为push、pull和local relabel。其中push为计算流出节点的流量。pull为计算流入节点的流量,并计算存水量,如图14所示,当所有节点计算push时会跟红色节点一样计算流出量,当所有节点计算pull时会跟蓝色节点一样计算流出量。local relabel为当节点存水量大于0时称为溢出,必须重新定义局部高度,也就是节点跟周围节点之间的高度,以解决溢出情形。按照push、pull和local relabel的顺序重复计算直到收敛为止,便可得到最大流量,最后再执行最小切,把节点分成两类。
一二
cudaimage17.png
图14、红色节点计算的为push,蓝色节点计算的为pull

3.程式执行

一二以CUDA cutsFast graph cuts on the GPU[1]所提供的程式码,在Nvidia显示卡的GPGPU来执行Graph cut的平行化程式,以MRF-benchmarks[4]里的档案来进行验证,其提供包括MRF的函式库以及验证的影像数据,在这里使用的为其所提供的binary档案 : "flower.txt" 、 "person.txt" 、 "sponge.txt",档案内容包括影像解析度、类别数、对类别的能量以及对x和y方向的高度权重,原始影像如图15所示。解析度分别为600*450、600*450和640*480。

4-1-1.png4-1-2.png4-1-3.png(a)一二一二一二一二一二一二一二一一二(b)一二一二一二一二一二一二一二(c)图15、MRF-benchmarks提供binary档案的原始影像。(a)flower (b) person (c) sponge。

3.1 执行结果

一二执行程式所使用的电脑配备:Nvidia的显示卡为GeFore G 105M,使用Visual Studio 2008配合NVIDIA GPU Computing Toolkit 3.2和NVIDIA GPU Computing SDK 3.2来编译程式,其中GeFore G 105M为的核心数为8,核心频率为640 MHz。执行后的结果影像为二元图,如图16所示,可以看到把影像中物件和背景分成两类。

4-2-1.jpg4-2-2.jpg4-2-3.jpg
(a)一二一二一二一二一二一二一二二一二一二(b)一二一二一二一二一二一二一二(c)
图16、执行结果。(a)flower (b) person (c) sponge。

3.2 执行时间

一二论文中使用GTX280的执行时间在flower、person和sponge分别为73、81和61ms。Tesla C1060执行时间如图17所示,在flower、person和sponge分别为61、89和74ms,因为Tesla C1060的核心数跟GTX280一样拥有240个核心,所以执行时间差不多。

flower-1.pngperson-1.pngsponge-1.png(a)一二一二一二一二一二一二一二(b)一二一二一二一二一二一二一二(c)
图17、Tesla C1060执行时间。(a)flower (b) person (c) sponge。
一二GTX480执行时间如图18所示,在flower、person和sponge分别为36、49和31ms,因为GTX480的核心数为GTX280的两倍,一共有480个核心,所以GTX480执行时间差不多为GTX280的两倍。

flower-3.pngperson-3.pngspone-3.png(a)一二一二一二一二一二一二一二(b)一二一二一二一二一二一二一二(c)
图18、GTX480执行时间。(a)flower (b) person (c) sponge。

4.结论与讨论

一二透过阅读CUDA cutsFast graph cuts on the GPU[1],知道此篇论文的目的为在CPU上执行影像的graph cut无法达到即时的效果,于是以GPGPU来加速以达到即时的效能。于是本篇报告便说明graph cut的原理以及在GPGPU上实现。透过提供的程式码在windows上执行,跟论文的执行时间上吻合,当使用更高阶的GPGPU时,可以达到更高的执行效率,故可以使用GPGPU来达到加速的效果。

参考文献

  1. V. Vineet and P. J. Narayanan, "CUDA cutsFast graph cuts on the GPU," in Proceedings of the International Conference on Computer Vision and Pattern Recognition Workshop, 2008.
    http://cvit.iiit.ac.in/papers/rtGCuts_2008.pdf
  2. L. R. Ford and D. R. Fulkerson, Flows in Networks, Princeton University Press, Princeton,N.J., 1962
    http://www.rand.org/pubs/reports/R375.html#src=mobile
  3. A. V. Goldberg and R. E. Tarjan, "A new approach to the maximum-flow problem," Journal of the ACM, Vol. 35, pp. 921-940, 1988.
    http://www.cs.princeton.edu/courses/archive/fall03/cs528/handouts/a%20new%20approach.pdf
  4. R. Szeliski, R. Zabih, D. Scharstein, O. Veksler, V. Kolmogorov, A. Agarwala, M. Tappen, and C. Rother, "A Comparative Study of Energy Minimization Methods for Markov Random Fields," in Ninth European Conference on Computer Vision, Vol. 2, pp. 19-26, Graz, Austria, May 2006.
    http://vision.middlebury.edu/MRF/eccv06/SZSVKATR-ECCV06.pdf
0 0