【问题标题】:Probability as input to Markov random field (MRF): how to refine the cmex code?概率作为马尔可夫随机场 (MRF) 的输入:如何细化 cmex 代码?
【发布时间】:2018-04-05 02:18:03
【问题描述】:

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

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

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

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

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

非常感谢您的帮助。谢谢

【问题讨论】:

  • 你有多少个 256x256x4 的概率图?似乎每个 2D 切片都有一张地图,但您正在做 3D 分割?你有几片?您是否有获得概率图的源图像/切片?
  • 嗨 Shai,感谢您的回复,我正在通过 Cnn 进行 2d 分割,输出是一张图像的 4 个概率图(每个概率图与一个类别相关),但是,我必须进行优化通过 MRF 使用 6 个邻居的网格(4 个在当前概率图中,另外 2 个在序列中同一类的相邻概率图中。目前我想分别为每个类(二进制)做,看看它是如何工作的以及所有类的扩展。我该怎么做?新数据和平滑项需要更改哪些函数?非常感谢。
  • 6-connect 用于 3D 网格。您的网格是二维的,您可以使用 4 连接或 8 连接。该图仅连接相邻像素,而不连接概率图中的相邻条目。
  • 它是某个类的概率网格中的6个邻居(例如i)。例如,如果当前体素为 (r,c,k),则该邻域包括该体素的 4 个邻居以及来自相邻切片的两个其他邻居(切片 k-1 和 k+1 中的类 i 的概率,即两个体素在 (r,c,k+1) 和 (r,c,k-1) 中。由于您的 GCmex 代码接受具有离散值的 rgb 图像,我如何改进它以采用连续概率 [0,1] 以及哪些函数是否应该更改以完善潜在条款?感谢您的帮助
  • 所以你有 4D 概率图:(r,c,k)x4。你有输入切片吗?你到底有什么?

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


【解决方案1】:

您有 60 片 256x256 像素(总共 ~4G 体素),即 slices 是一个 256-by-256-by-60 数组。一旦你将slices 输入你的网络(一个接一个或分批 - 任何最适合你的)你就有prob 大小的概率256-by-256-by-60-by-@ 987654333@.
我建议您使用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,
如果切片之间的空间距离大于同一切片中相邻体素之间的间隙,您可能需要为同一切片中的iijj 以及ii 和@987654344 使用不同的sig2 @ 位于不同的切片上。这需要一些努力。

【讨论】:

  • 谢谢,我通过 for 循环,prob(:,:,i,:)= cat(4, squeeze(pMap.a(1,:,:)), squeeze(pMap.a(2,:,:)), squeeze(pMap.a(3,:,:)), squeeze(pMap.a(4,:,:))) 将 4 个地图加载到 prob,但是,我收到错误:Error using GraphCut>OpenGraph (line 383) Wrong size of Dc or Sc。重塑后的 Dc 大小为 3932160×4。不知道为什么?!
  • 自从我上次使用这个包已经有一段时间了。可能是您需要转置 Dc
  • 非常感谢,它可以工作,但 Dc 已更改为 Dc',但对分割结果并没有太大改善。我设置sig=0.01;
  • 您可能希望增加平滑项的相对权重。您可以通过将 W 乘以 \lambda > 1 因子来做到这一点。
  • 非常感谢您的帮助,我也这样做了,但是没有太大的改进。边缘变得更平滑一点。 CNN 分割不足,我正在考虑通过使用 MRF 增加概率图的后验概率来改进它。
猜你喜欢
  • 2017-04-06
  • 2022-01-24
  • 2015-12-11
  • 2018-03-24
  • 2018-04-01
  • 2014-10-06
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多