作为马尔可夫随机场(MRF)输入的概率:如何优化cmex代码?

时间:2017-10-24 10:16:32

标签: c++ computer-vision caffe image-segmentation markov-random-fields

我对MRF非常陌生,而且对编程并不擅长。 我已经使用CNN从语义分割中获得概率图,我必须使用马尔可夫随机场(MRF)来优化分割。 我在这个链接GCmex下载了Shai Bagon提供的代码。能量最小化基于α扩展或交换执行。

我用mex编译代码,我需要改进一元和成对的能量最小化函数。我有一堆图像,需要提取6邻域网格,并在成对函数中包含精炼的邻域。

一元函数的输入是概率图,它是4个不同类的大小(256,256,4)的堆栈: enter image description here

我的问题是: 是否有人根据定义的不同能量函数改进了代码1)我想改变一元和成对配方)。哪些功能和代码的哪些部分应该再次改进和重新编译?

2)如何更改w_i,j?它是根据强度差来计算的,这里我们只有概率,它是两个相邻体素概率的差异吗?

我非常感谢你的帮助。感谢

1 个答案:

答案 0 :(得分:3)

你有60片256x256像素(总计~4G体素),slices256 - by - 256 - by - {{1}数组。一旦您将60送入您的网络(逐个或分批 - 任何最适合您的方式),您的slices概率大小为prob - by - 256 - by - 256 - 通过 - 60
我建议您使用third constructor of GCMex构建图表以进行优化 为此,首先需要定义稀疏图。使用sparse_adj_matrix

4

一旦你有了图表,它就会从这里下山:

[ii jj] = sparse_adj_matrix([256 256 60], 1, 1);  % 6-connect 3D grid
n = prod([256 256 60]);  % num voxels
wij = exp(-((slices(ii)-slices(jj)).^2)/(2*sig2));  % -|Ii-Ij|^2/2\sig^2
W = sparse(ii, jj, wij, n, n);  % sparse grid graph

要查看输出标签,您需要Dc = -reallog(reshape(prob, n, 4)).'; %' unary/data term lambda = 2; % relative weight of the smoothness term gch = GraphCut('open', Dc, lambda*(ones(4)-eye(4)), W); % construct the graph [gch L] = GraphCut('expand', gch); % minimize using "expand" method gch = GraphCut('close', gch); % do not forget to de-allocate

reshape

PS,
如果切片之间的空间距离大于同一切片中相邻体素之间的间隙,则可能需要对同一切片中的output = reshape(L, size(slices)); sig2使用不同的ii位于不同切片上的jjii。这需要一点努力。