Вероятность как вход в Марковское случайное поле( MRF): как уточнить код cmex?
Я очень новичок в MRF
и не очень хорошо программирую.
Я получил карту вероятности от семантической сегментации с помощью CNN, я должен оптимизировать сегментацию с помощью случайных полей Маркова (MRF).
Я загружаю код, предоставленный Шай Багон по этой ссылке GCmex. Минимизация энергии осуществляется на основе альфа-расширения или подкачки.
Я скомпилировал код по mex, и мне нужно уточнить унарные и парные функции минимизации энергии. У меня есть стопка изображений и нужно извлечь 6-окрестностную сетку и включить уточненное соседство в парную функцию.
Входным сигналом для унарной функции является карта вероятностей, представляющая собой стек размером (256,256,4) для 4 различных классов.:Мои вопросы таковы:: Кто-то уточнил код в соответствии с определяющей различной энергетической функцией 1) я хочу изменить унарную и парную формулировку). Какие функции и какие части кода должны быть уточнены и снова перекомпилировали?
2) Как изменить w_i,j
? он вычисляется на основе разности интенсивностей, здесь у нас есть только вероятности, это разница вероятностей двух соседних вокселов?
Я очень ценю вашу помощь. СПАСИБО
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
, которые находятся на разных срезах. Это требует некоторых усилий.