GrabCut算法详解:从GMM模型说起
最近正在学习CG,争取有时间就看点论文写写代码。
GrabCut在OpenCv里面是有内置函数的,不过我还是用C++纯手工实现了一边原汁原味的论文,github链接GrabCut,里面有具体的实现代码和步骤,还有实现结果,欢迎来hack
简介
GrabCut是04年的一篇文章,是少数用传统方法~~(对,就是没用神经网络的意思)~~解决前景和背景分离的算法。
需要的前置知识有:
-
混合多高斯模型
-
最小割集合划分
下面先介绍这两个模型
备注:本文不含任何数学证明,仅仅介绍算法,如果想要严格证明请移步百度
GMM模型
多维单高斯模型和混合模型
平平无奇的一手公式:维数是 D D D,均值是 μ \mu μ,协方差 Σ \Sigma Σ,参数集合 θ = { μ , Σ } \theta=\{\mu, \Sigma\} θ={ μ,Σ}
X ∼ N ( μ , Σ ) : P ( x ∣ θ ) = ϕ ( x ∣ μ , Σ ) = 1 ( 2 π ) D / 2 s q r t ∣ Σ ∣ e x p { ( x − μ ) T Σ − 1 ( x − μ ) } X\sim N(\mu,\Sigma):P(x|\theta)=\phi(x|\mu,\Sigma)=\frac{1}{(2\pi)^{D/2} sqrt{|\Sigma}|}exp\{(x-\mu)^T\Sigma^{-1}(x-\mu)\} X∼N(μ,Σ):P(x∣θ)=ϕ(x∣μ,Σ)=(2π)D/2sqrt∣Σ∣1exp{(x−μ)TΣ−1(x−μ)}
其实混合模型就是字面意思,把很多个模型通过一定的概率混合起来,我们首先定义模型的个数 K K K,那么参数集合就变成了 θ = { μ k , Σ k , π k } \theta=\{\mu_k,\Sigma_k,\pi_k\} θ={ μk,Σk,πk},其中 π k \pi_k πk是第 k k k个模型的混合加权系数
P ( x ∣ θ ) = ∑ k K π k ϕ ( x ∣ μ k , Σ k ) P(x|\theta)=\sum_k^K\pi_k\phi(x|\mu_k,\Sigma_k) P(x∣θ)=k∑Kπkϕ(x∣μk,Σk)
混合高斯模型的应用和EM算法
应用很简单:聚类。也就是如果我们假设一堆数据恰好分成K堆并且可以看成每类都是正太分布,那么如果能用GMM模型去拟合这些数据,我们只需要算出每个数据属于某个高斯模型的概率,就可以把这些数据分类了。
拟合的算法有一个经典的EM算法。本质似乎是最大似然概率优化。不过本文通过Local/Global的视角去看待这个算法。
EM算法
输入:数据 z 1 ⋯ z n z_1\cdots z_n z1⋯zn和指定的参数 K K K
输出:拟合参数 θ = { μ k , Σ k , π k } \theta = \{\mu_k,\Sigma_k,\pi_k\} θ={ μk,Σk,πk}
-
初始化参数,包括正则化数据,随机化均值,单位化方差和混合比
-
Esitimate步骤,计算后验概率 γ j k \gamma_{jk} γjk
- γ j k = π k ϕ ( z j ∣ θ k ) ∑ k K π k ϕ