概率作为马尔可夫随机场 (MRF) 的输入:如何改进 cmex 代码?
Probability as input to Markov random field (MRF): how to refine the cmex code?
我是 MRF
的新手,不太擅长编程。
我已经使用 CNN 从语义分割中获得了概率图,我必须使用马尔可夫随机场 (MRF) 来优化分割。
我在这个linkGCmex下载Shai Bagon提供的代码。基于 alpha 扩展或交换执行能量最小化。
我用 mex 编译了代码,我需要改进一元和成对能量最小化函数。我有一堆图像,需要提取 6-neighborhood 网格并在 pair-wise 函数中包含细化的邻域。
一元函数的输入是概率图,它是一个大小为 (256,256,4) 的堆栈,用于 4 个不同 类:
我的问题是:
有人根据定义的不同能量函数改进了代码 1) 我想更改一元和成对公式)。哪些功能和代码的哪些部分应该重新优化和重新编译?
2) 如何改变w_i,j
?是根据强度差计算的,这里只有概率,是相邻两个体素的概率之差吗?
非常感谢您的帮助。谢谢
你有 60 片 256x256
像素(总共 ~4G 体素),即 slices
是一个 256
-by-256
-by-60
数组。一旦你将 slices
喂入你的网络(一个接一个或分批——任何最适合你的)你就有 prob
大小的概率 256
-by-256
-by -60
-by-4
.
我建议您使用 third constructor of 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,
如果切片之间的空间距离大于同一切片中相邻体素之间的间隙,则可能需要对同一切片中的 ii
和 jj
使用不同的 sig2
,并且对于ii
和 jj
位于不同的切片上。这需要一点努力。
我是 MRF
的新手,不太擅长编程。
我已经使用 CNN 从语义分割中获得了概率图,我必须使用马尔可夫随机场 (MRF) 来优化分割。
我在这个linkGCmex下载Shai Bagon提供的代码。基于 alpha 扩展或交换执行能量最小化。
我用 mex 编译了代码,我需要改进一元和成对能量最小化函数。我有一堆图像,需要提取 6-neighborhood 网格并在 pair-wise 函数中包含细化的邻域。
一元函数的输入是概率图,它是一个大小为 (256,256,4) 的堆栈,用于 4 个不同 类:
我的问题是: 有人根据定义的不同能量函数改进了代码 1) 我想更改一元和成对公式)。哪些功能和代码的哪些部分应该重新优化和重新编译?
2) 如何改变w_i,j
?是根据强度差计算的,这里只有概率,是相邻两个体素的概率之差吗?
非常感谢您的帮助。谢谢
你有 60 片 256x256
像素(总共 ~4G 体素),即 slices
是一个 256
-by-256
-by-60
数组。一旦你将 slices
喂入你的网络(一个接一个或分批——任何最适合你的)你就有 prob
大小的概率 256
-by-256
-by -60
-by-4
.
我建议您使用 third constructor of 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,
如果切片之间的空间距离大于同一切片中相邻体素之间的间隙,则可能需要对同一切片中的 ii
和 jj
使用不同的 sig2
,并且对于ii
和 jj
位于不同的切片上。这需要一点努力。