Вероятность как вход в марковское случайное поле (MRF): как уточнить код cmex?

Я очень новый с MRF и не очень хорош в программировании.
Я получил карту вероятности из семантической сегментации с использованием CNN, я должен оптимизировать сегментацию с использованием случайных полей Маркова (MRF).
Я загружаю код, предоставленный Shai Bagon по этой ссылке GCmex. Минимизация энергии выполняется на основе альфа-расширения или обмена.

Я скомпилировал код через mex, и мне нужно уточнить унарные и попарные функции минимизации энергии. У меня есть стопка изображений, и мне нужно извлечь сетку из 6 соседей и включить уточненные соседние в парную функцию.

Входными данными в унарную функцию является карта вероятностей, представляющая собой стек размером 256 256,4 для 4 различных классов:
введите описание изображения здесь

Мои вопросы:
Кто-то уточнил код в соответствии с определением различных энергетических функций 1) Я хочу изменить Унарную и парную формулировку). Какие функции и какие части кода должны быть уточнены и перекомпилированы снова?

2) Как поменять w_i,j? он рассчитывается на основе разности интенсивности, здесь мы имеем только вероятности, это разность вероятностей двух соседних вокселей?

Я действительно ценю твою помощь. Спасибо

2

Решение

У вас есть 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 которые на разных кусочках. Это требует немного усилий.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]