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)是一个最小割(容量最小的割)。
- 定理3:最大流最小割定量: 在任何的网络中,最大流的值等于最小割的容量。
总结推论:
- 一条边的权值越大,成为割边的概率越小。
- 平滑项惩罚标签中差距大的项
α expansion
由于该算法使用标签
对于任意的Pseudo-Boolean Functions,只有当它是Regular(sub-modular)时,才有可能是Graph-Representable。证明过程如下:
为使得交互函数(interaction function)是次模函数(sub-modular funciton),可参考以下两种方法。
- 学习得到能量参数,限制次模式的约束
- 在推断过程中截断非次模函数项。
交互函数的三种类型
1. 全局光滑先验
选择函数
2. 分段常数先验
这类先验可以定义为:如果
3. 分段光滑先验
分段光滑先验分配低消耗给每个片内平滑变化的标签。此类平滑先验
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);
“`
- Graph Cut总结
- graph cut
- Graph cut
- Graph cut
- Graph cut
- graph cut
- Graph Cut
- graph-cut
- Graph Cut
- graph cut
- 关于graph cut
- Graph cut入门学习
- Graph cut入门学习
- Graph cut入门学习
- graph cut使用
- 从Graph Cut到Grab Cut
- Graph Cut(图割)
- 抠图算法Graph Cut
- RefineNet学习笔记
- CSS page-break-after 属性
- OpenWrt挂载USB,换源,在U盘上安装软件
- 动画
- str方法总结
- Graph Cut总结
- 第一次参加创业比赛有感——老人异常行为检测
- 基于TCP,UDP的网络编程总结
- Android xml布局预览错误java.lang.NoSuchFieldError: action_bar
- localtime时间获取
- LeetCode —— 70. Climbing Stairs
- MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法
- 使用Java 中Timer定时器设置订单提交后24小时未付款订单状态为已关闭。
- JavaScript的面向对象