2

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

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

一元函数的输入是概率图,它是一个大小为 (256,256,4) 的堆栈,用于 4 个不同的类别: 在此处输入图像描述

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

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

我真的很感谢你的帮助。谢谢

4

1 回答 1

3

您有 60 片像素(总共256x256约 4G 体素),即slices一个256逐个数组。一旦你进入你的网络(一个接一个或分批- 任何最适合你的),你就有可能获得大小的概率。 我建议您使用第三个构造函数来构建您的图形以进行优化。 为此,您首先需要定义一个稀疏图。使用:25660slicesprob256256604
GCMex
sparse_adj_matrix

[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

output = reshape(L, size(slices));

PS,
如果切片之间的空间距离大于同一切片中相邻体素之间的间隙,则可能需要使用不同sig2的 foriijjthat 在同一切片中和 foriijj在不同的切片上。这需要一点努力。

于 2017-10-24T12:32:09.687 回答