Я очень новый с MRF
и не очень хорош в программировании.
Я получил карту вероятности из семантической сегментации с использованием CNN, я должен оптимизировать сегментацию с использованием случайных полей Маркова (MRF).
Я загружаю код, предоставленный Shai Bagon по этой ссылке GCmex. Минимизация энергии выполняется на основе альфа-расширения или обмена.
Я скомпилировал код через mex, и мне нужно уточнить унарные и попарные функции минимизации энергии. У меня есть стопка изображений, и мне нужно извлечь сетку из 6 соседей и включить уточненные соседние в парную функцию.
Входными данными в унарную функцию является карта вероятностей, представляющая собой стек размером 256 256,4 для 4 различных классов:
Мои вопросы:
Кто-то уточнил код в соответствии с определением различных энергетических функций 1) Я хочу изменить Унарную и парную формулировку). Какие функции и какие части кода должны быть уточнены и перекомпилированы снова?
2) Как поменять w_i,j
? он рассчитывается на основе разности интенсивности, здесь мы имеем только вероятности, это разность вероятностей двух соседних вокселей?
Я действительно ценю твою помощь. Спасибо
У вас есть 60 ломтиков 256x256
pix (tot ~ 4G voxels), то есть slices
это 256
-от-256
-от-60
массив. Как только вы кормите slices
в вашу сеть (по одному или в пакетном режиме — все, что работает лучше для вас) у вас есть prob
вероятность размера 256
-от-256
-от-60
-от-4
,
Я предлагаю вам использовать третий конструктор 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
за ii
а также jj
которые находятся в том же срезе и для ii
а также jj
которые на разных кусочках. Это требует немного усилий.
Других решений пока нет …