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


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

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

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

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

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

Я очень ценю вашу помощь. СПАСИБО

1 2

1 ответ:

У вас есть 60 срезов 256x256 pix (tot ~4G вокселов), то есть slices является массивом 256-by-256-by-60. Как только вы вводите slices в свою сеть (один за другим или партиями - все, что работает лучше всего для вас), у вас есть prob вероятность размера 256-by-256-by-60-by-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, которые находятся на разных срезах. Это требует некоторых усилий.