2

私はMRFで非常に新しく、それほどプログラミングにはあまり適していません。 CNNを使用したセマンティックセグメンテーションから確率マップを取得しました。マルコフランダムフィールド(MRF)を使用してセグメンテーションを最適化する必要があります。 Shai Bagonが提供するコードをこのリンクGCmexにダウンロードします。エネルギーの最小化は、アルファ拡大またはスワップに基づいて実行されます。マルコフ確率場(MRF)への入力としての確率:cmexコードを改良する方法は?

コードをmexでコンパイルしました。私は、単項式とペアワイズのエネルギー最小化関数を改良する必要があります。私は画像のスタックを持っており、6近傍グリッドを抽出し、ペアワイズ関数で洗練された近傍を含める必要があります。

単項関数への入力は、サイズのスタック(256,256,4)である確率マップである4つの異なるクラスのため: enter image description here

私の質問は以下のとおりです。 誰かが定義に従ってコードを洗練されています異なるエネルギー関数1)私は単項式と対方程式を変えたいと思う)。どの関数とどの部分を再コンパイルして再コンパイルするべきですか?

2)w_i,jの変更方法ここでは強度差に基づいて計算されます。ここでは、2つの隣接ボクセルの確率の差ですか?

本当にありがとうございます。おかげ

+0

256x256x4確率マップはいくつありますか? 2Dスライスごとにマップがあるようですが、3Dセグメンテーションを行っていますか?いくつのスライスがありますか?あなたは確率地図を持っているソース画像/スライスを持っていますか? – Shai

+0

こんにちはシャイ、応答のおかげで、私は出力が1つの画像(各確率マップは1つのクラスに関連しています)4つの確率マップですが、私は6のグリッドを使用してMRFで最適化を行う必要があります - 近隣(現在の確率マップでは4つ、シーケンスと同じクラスの隣接確率マップでは2つ)。当分の間、私は各クラスを別々に(バイナリ)実行して、どのように動作し、すべてのクラスを拡張するかを確認したい。どうしたらいいですか?どの関数を新しいデータとスムージングのために変更する必要がありますか?ありがとうございます。 –

+0

6-connectは3Dグリッド用です。あなたのグリッドは2Dです。あなたは4接続または8接続のいずれかを持つことができます。グラフは、隣接するピクセルのみを接続し、確率マップ内の隣接するエントリは接続しません。 – Shai

答えて

3

あなたは256x256 PIX(TOT〜4Gボクセル)の60枚のスライスを持っている、つまりslices256行列256行列60配列です。あなたがあなたのネットに(prob256 -by-256 -by- 60 -by- 4の確率を持っているあなたのネットに(prob)あなたのネットに1つ1つまたはバッチをslicesをフィードしたら
最適化のためにグラフを作成するのに、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、
に必要 スライス間の空間距離が同じスライス内の隣接するボクセル間のギャップよりも大きい場合は、異なるスライスにあるiiおよびjjについては、異なるスライス内にある異なるsig2iiおよびjjがあります。これには少しの努力が必要です。

+0

ありがとう、私は4つのマップを 'prob'にロードしました。 forループ、prob(:、:、i:)= cat(4、squeeze(pMap.a(1、:、:))、squeeze(pMap.a(2、:、:))、squeezeしかし、私はエラーが発生しています: 'GraphCutを使ったエラー> OpenGraph(383行目) 間違ったサイズDcまたはScである。 Dcのサイズは、再成形後に3932160×4です。何故かはわからない?! –

+0

最後にこのパッケージを使用して以来、しばらく経っています。あなたはDc – Shai

+0

を移調する必要があるかもしれませんが、DcはDcに変更されましたが、セグメンテーションの結果はそれほど改善されません。私は 'sig = 0.01'を設定しました。 –