读《"GrabCut" -- Interactive Foreground Extraction using Iterated Graph Cuts》

读《"GrabCut" -- Interactive Foreground Extraction using Iterated Graph Cuts》

C. Rother, V. Kolmogorov, and A. Blake, GrabCut: Interactive foreground extraction using iterated graph cuts, ACM Trans. Graph., vol. 23, pp. 309–314, 2004.

提起Image Segmentation,一般首先想到的就是Photoshop中的Magic Wand和Intelligent Scissors,但这些方法一来效果差、二来需要繁琐操作。相比之下,GrabCut是优秀得多的方法。

1. Graph Cut

GrabCut是基于前人将图割(graph cut)的最小割理论&算法套用在扣图上的。细节可参考此文:

YY Boykov, MP Jolly, Interactive graph cuts for optimal boundary and region segmentation of objects in N-D images. In Proc. IEEE Int. Conf. on Computer Vision, CD–ROM. 2001.

针对实际需求,有一种流行的思路是:把需求用精确、量化的方式重新描述出来,成为一个数学问题,那么,实现需求的过程就成了一个求解过程,很多时候,借用一些已有的理论,就可以得到一些效果还不错的求解方法。

对抠图这个问题,Boykov等人就开始这样定义:将原始灰度图(z = (z1, z2, ..., zn))理解为『前景图的每个像素以一定透明度(α = (α1, α2, ..., αn))覆盖在背景图上得到的图片』,求当结果最好时,对应的透明度值(α)。至于如何衡量结果好不好,首先,认为可以根据灰度分布(histogram)来衡量某个像素的值是否合理(θ = h(z|α));然后,仿照Gibbs energy定义了公式:


E(α,θ,z) = U(α,θ,z) + V(α,z)
即,分割的合理程度 = 分割结果的内部合理程度(从灰度分布来看,每个像素的值是否合理) + 分割边缘的合理程度(从边界相邻像素的角度来看,当前划分是否合理)
注:论文原文说是仿照Gibbs自由能的公式,但我觉得应该是想说焓的公式(焓=内能+压强*体积,H=U+pV),Gibbs函数是(Gibbs自由能=内能-温度*熵+压强*体积,G=U-TS+pV)

更详细的定义可参考论文原文。其实,如果仅考虑第一项(数据项),整个分割就变成了基于阈值的图像分割,会跟大津法等的结果类似。第二项(平滑项)的限制,会使分割倾向于使用尽可能少的分割,并尽量在高对比处分割。

在精确的定义了问题之后,就可以通过最小割算法得出(αi∈{0,1})限制下的硬分割结果。整个流程的限制是:1. 算法基于灰度图;2. 需要人工标注至少一个前景点和一个背景点;3. 结果为硬分割结果,未考虑边缘介于0~1之间的透明度。

2. GrabCut

按论文原文的说法,GrabCut在上述graph cut基础之上的改进包括:将基于灰度分布的模型替换为高斯混合模型(Gaussian Mixture Model,GMM)以支持彩色图片;将能一次性得到结果的算法改成了『强大的』迭代流程;将用户的交互简化到只需要框选前景物体即可。我觉得,核心的改变只有一点,就是支持彩色图片,其他的调整都是顺势而为,是被动的调整。

出发点是大量的彩色图片的分割需求,那么,就需要把判断像素属于前景/背景的公式从简单的使用灰度histogram扩展为一种能支持彩色的模型。彩色像素值的稀疏问题比灰度图要严重得多(256 vs 17M),所以,继续使用histogram是不现实的,需要信息压缩得更好一点的模型,作者在这里参考前人,对前景和背景各建了K=5的高斯混合模型。

但GMM模型也需要一定量的数据才能得出有意义的概率。原始方法中,用户会用有宽度的笔刷初步标记前景/背景区域,要是刷得长一点粗一点,一刷子也能有几百像素,在灰度模型中已经足够用了,但要换成彩色图,需要把前景/背景中的代表色都给刷上,难度就高了些,用户估计也理解不了。也就是说,GMM需要足够多的数据来得到靠谱的参数,画线是不够的,得标注成区域才能满足模型需要。

这也就是论文中『框住前景』处理的讨巧之处。『画框』看似在标记前景物体,但其实得到了大范围而且确定的背景区域。根据这些确定的背景区域,能够得到比较准确的背景GMM。相比之下,前景的GMM要低效得多,因为用来出前景GMM的数据里包含了很多背景GMM的数据。

如果这样能得到比较好的结果,事情就结束了,但估计结果好不到哪儿去。主要原因推测是:GMM模型本来就是压缩得比较厉害的模型,这样的模型还没有精确点的参数,以此推算出的概率实在不足为信。那按正常的思路,接下来就应该想方法得到更精确的GMM参数。论文中也是这样做的:既然前景GMM参数的主要问题是混杂了背景的信息,那就尽可能把背景去掉后再重算GMM参数,而区分前景背景本来就是我们的目的,这就成了论文中的『更新GMM—更新分割』的迭代流程,由于计算GMM参数也还是有些计算量的(跟k-means的迭代更新类似,),所以是每完整更新一次最小割、更新一次参数。这样做也是有理论支持的,因为仍旧满足每次更新,能量减少的约束,结果可以收敛。

因为GrabCut是按颜色分布和边缘对比度来分割图片的,对一些常见的与此原则相悖的图片,效果确实不好。比如前景人物的帽子、鞋、墨镜,通常颜色跟前景主体有较大区别;再如前景中的孔,有可能由于颜色区分和边缘的对比度不足,导致边缘的惩罚占上风,而没有扣出来背景。所以,GrabCut还是保留了人工修正的操作,定义了两种标记:绝对是背景和可能是前景。对分割错误人工修正后,分割还是可以比较准确的。

3. Soft Segmentation

上述流程得到的是hard segmentation的结果,即,所有的像素,要么是前景,要么是背景。为了得到更自然的边缘,需要在此之上考虑边缘像素的透明度。论文中做border matting的方法与之前类似,仍然是基于能量最小的思路,定义了基于颜色区别和边缘平滑的能量公式,然后求使能量最小的参数作为结果。与前人的区别是,为了达到更自然的结果,限制对于每段边缘,使用同样的透明度渐变。

具体为:先将边缘拟合成多边形,多边形边界向内外各扩6像素的范围是待分析区域(Tu)。对多边形的每条边(t),只需要确定两个参数:边缘渐变的中心∆、边缘渐变的宽度σ。这样,待分析区域的透明度(αn)就可以单纯地从与多边形边缘的距离(rn)以及对应边的∆、σ得到。因为边缘只有6个像素,其实对∆、σ参数并不是很敏感,所以论文把∆分了30份、σ分了10份,直接就用动态规划求解了。

对于边缘,分割出的前景边缘中混入背景颜色是非常显眼的(color bleeding)。为了使前景边缘有更自然的颜色,论文中再次取巧,从前景区域找一个最接近的像素,直接借用颜色。具体找的方式是借用了Bayes matte算法中估算前景颜色的部分,得到一个理想的颜色,然后,再从41x41范围内的前景像素中找一个最接近的颜色作为结果。


我理解,在处理透明度上的这些改进,主要目的是为了得到一个『看起来更自然』的结果。比如限制边缘透明度必须是平滑的渐变,用借色的方式消除边缘不自然的颜色。这些处理并没有很强的理论支持,但实际效果却相当不错。对自然场景图片的分割,比Bayes matte等方法得到的边缘明显看起来舒服得多。

备忘

论文中的一些细节,在这两篇blog中说的比较明白,供参考:图像分割之(二)Graph Cut(图割)图像分割之(三)从Graph Cut到Grab Cut

一些疑惑:记得最早看OpenCV的时候,很多概念都能在Photoshop里找到对应的工具/界面,但貌似没有什么工具可以使用GrabCut来分割,是因为微软有专利限制么?还是因为后续更好的方法淘汰了GrabCut?

编辑于 2019-10-07