Graph Cut总结

来源:互联网 发布:精准数据营销 编辑:程序博客网 时间:2024/06/08 09:35

基本定理

入门理解

如果一条弧的两个顶点分别属于顶点集S和T那么这条弧称为割CUT(S,T)的一条割边
1. 定理一:如果f是网络中的一个流,CUT(S,T)是任意一个割,那么流量f的值等于正向割边的流量与负向割边的流量之差。
2. 推论1:如果f是网络中的一个流,CUT(S,T)是一个割,那么f的值不超过割CUT(S,T)的容量。
3. 推论2:网络中的最大流不超过任何割的容量
4. 定理2: 在任何网络中,如果f是一个流,CUT(S,T)是一个割,且f的值等于割CUT(S,T)的容量,那么f是一个最大流,CUT(S,T)是一个最小割(容量最小的割)。

  1. 定理3:最大流最小割定量: 在任何的网络中,最大流的值等于最小割的容量。

总结推论:

  1. 一条边的权值越大,成为割边的概率越小。
  2. 平滑项惩罚标签中差距大的项

α expansion

α expansion 算法在每一次循环某种(固定或者随机)顺序以标签α进行拓展移动找到最小的能量函数值。如果此次拓展节点比当前的标签的能量函数值小,那么将修改这个节点的标签为α。直到能量到达某个局部极小值不能继续拓展,算法终止。
这里写图片描述

由于该算法使用标签α进行拓展时需要添加一个辅助节点a,产生的三条边|ep,a|,|ea,q|tα¯a需满足切割其中任意一条边要比其他两天边一起花费要少。
这里写图片描述
对于任意的Pseudo-Boolean Functions,只有当它是Regular(sub-modular)时,才有可能是Graph-Representable。证明过程如下:
这里写图片描述
这里写图片描述

为使得交互函数(interaction function)是次模函数(sub-modular funciton),可参考以下两种方法。

  1. 学习得到能量参数,限制次模式的约束
  2. 在推断过程中截断非次模函数项。

交互函数的三种类型

1. 全局光滑先验

选择函数 Vp,q(f)对差距较大的fpfq有更大的惩罚,此类先验的问题是,在大多数视觉问题中,要估计量都具有不连续性,并且在最优化问题中标签间的巨大不同是可以允许的。使用全局光滑先验将在不连续局域趋向于过度平滑。
这里写图片描述

2. 分段常数先验

这类先验可以定义为:如果 fp=fqVp,q(f),否则Vp,q(f)等于某个正数.。局限在于对某些应用不能够准确表达。
这里写图片描述

3. 分段光滑先验

分段光滑先验分配低消耗给每个片内平滑变化的标签。此类平滑先验Vp,q(f)可定义为分配更大的惩罚给fp`和fq差距较大的标签,并设定惩罚的上界。
这里写图片描述

Olga veksler –Graph Cut 库

变量类型

  • typedef SiteID; // 像素点索引类型 index of a site (pixel); default is int32
  • typedef LabelID; // 标签索引类型 index of a label; default is int32
  • typedef EnergyType; // 总能量值类型 total energy value; default is int64
  • typedef EnergyTermType; // 个体能量项的类型 individual energy term; default is int32

标签中复杂的约束

  • Neighbouring pixels tend to take the same label
  • Low number of connected components
  • Classes present may be seen in one image
  • Geometric / Location consistency
  • Planarity in depth estimation
  • … many others (task dependent)

要求

Expansion算法需要满足三角不等式,对于任意标签 a,b,c

V(a,a) + V(b,c) <= V(a,c)+V(b,a).

1. 构造函数

(1) Constructor A 4邻域网格

GCoptimizationGridGraph(int width, int height,int num_labels);

(2) Constructor B 需指定领域系统

GCoptimizationGeneralGraph(int num_sites,int num_labels);
“`

(a) setNeighbors(SiteID s1, SiteID s2, EnergyTermType weight=1);

(b) void setAllNeighbors(SiteID *numNeighbors,SiteID **neighborsIndexes,EnergyTermType **neighborsWeights);
// (i) numNeighbors[i] 表示顶点i的邻居个数
// (ii)neighborIndexes[i] 存储指向定点i所有邻居的数组
// (iii) if neighborsIndexes[i][k] == j then neighborWeights[i][k] = w_ij

#### 3. Data Cost 一元项

(a)void setDataCost(EnergyTermType *dataArray)
//对于像素p的损失和标签l存储在dataArray[pixel * numlabels+l]

(b)void setDataCost(DataCostFn fn);
//DataCostFn 是函数的指针 f(Pixel p , Label l)

(c)void setDataCost(DataCostFnExtra fn,void *extraData);

(d)void setDataCost(SiteID s, LabelID l, EnergyTermType e);
//对于每个像素,每个标签设置能量项

(e)void setDataCostFunctor(DataCostFunctor* f);
//重写该方法

(f)struct SparseDataCost {
SiteID site;
EnergyTermType cost;
};
void setDataCost(LabelID l, SparseDataCost *costs, SiteID count);
对于某些应用程序,每个标签只有一小部分是可行的。这样做的一个方法是简单地将高成本分配给任何不可行位置。一个更有效的方法是精确地指定。哪些site对每个标签都是可行的。通过调用来实现setdatacost(标签,costs_for_label,num_costs_for_label)曾经每个标签。成本数组将在内部复制,因此您的成本数组可以被释放。

#### 4. Smooth Cost 平滑项

(a) void setSmoothCost(EnergyTermType *V)
//V是平滑项的数组V_pq(label1,label2) 存储在 V[label1+num_labels*label2]
(b) void setSmoothCost(SmoothCostFn fn);
//f(s1,s2,l1,l2) f是函数的指针

(c) void setSmoothCost(SmoothCostFnExtra fn,void *extraData);

(d) void setSmoothCost(LabelID l1, LabelID l2, EnergyTermType e)

(e) void setSmoothCostVH(EnergyTermType *V, EnergyTermType *vCosts, EnergyTermType *hCosts);

(f) void setSmoothCostFunctor(SmoothCostFunctor* f);

#### 5. Label Costs 标签损失函数

(a) void setLabelCost(EnergyTermType cost); //平等惩罚每个标签

(b) void setLabelCost(EnergyTermType* costArray); //分别惩罚每个标签的出现

(c) void setLabelSubsetCost(LabelID* labels, LabelID numLabels, EnergyTermType cost);//对于某个标签子集的出现进行惩罚

#### 6. Optimizing the energy 优化能量函数

a) EnergyType expansion(int max_num_iterations=-1);

b) bool alpha_expansion(LabelID alpha_label);

c) EnergyType swap(int max_num_iterations=-1);

d) void alpha_beta_swap(LabelID alpha_label, LabelID beta_label);

e) EnergyType compute_energy();
EnergyType giveDataEnergy();
EnergyType giveSmoothEnergy();
EnergyType giveLabelEnergy();
Returns respectively the total, data part, smooth part, and label part of the energy of the current labling.

f) LabelID whatLabel(SiteID site);

g) void setLabel(SiteID s, LabelID l);

h) void setLabelOrder(bool RANDOM_LABEL_ORDER);
“`

原创粉丝点击