2

나는 MRF로 매우 새롭다. 프로그래밍에별로 좋지 않다. CNN을 사용하여 의미 론적 세분화에서 확률 맵을 얻었으므로 MRF (Markov Random Fields)를 사용하여 세분화를 최적화해야합니다. Shai Bagon이 제공 한 코드를이 링크 GCmex에서 다운로드 할 수 있습니다. 에너지 최소화는 알파 확장 또는 스왑을 기반으로 수행됩니다.Markov Random Field (MRF)의 입력으로 확률 : cmex 코드를 수정하는 방법은 무엇입니까?

코드를 mex로 컴파일 했으므로 단항 및 쌍방향 에너지 최소화 기능을 개선해야합니다. 나는 이미지의 스택을 가지고 있고 6 이웃 그리드를 추출해야하고 정교한 이웃을 페어 와이즈 함수에 포함시켜야한다. enter image description here

제 질문 은 : 누군가가 정의에 따라 코드를 다듬어

단항 함수에 대한 입력은 4 개 가지 클래스의 크기 (256,256,4)와 스택이 확률 맵 다른 에너지 함수 1) 나는 단항과 쌍의 공식을 바꾸고 싶다. 어떤 함수와 코드 부분을 다시 정제하고 다시 컴파일해야합니까?

2) w_i,j을 변경하는 방법은 무엇입니까? 그것은 강도 차이에 기초하여 계산됩니다, 여기에서는 우리는 확률 만 있습니다, 그것은 인접한 두 복셀의 확률의 차이입니까?

정말 고맙습니다. 감사합니다

+0

얼마나 많은 256x256x4 확률 맵이 있습니까? 각 2D 슬라이스에 대한 맵이있는 것처럼 보이지만 3D 분할을 수행하고 있습니까? 얼마나 많은 조각이 있니? 확률 맵을 얻은 소스 이미지/슬라이스가 있습니까? – Shai

+0

Hi Shai, 응답 주셔서 감사합니다, 나는 출력이 하나의 이미지 (각각의 확률 맵은 하나의 클래스와 관련 있음)에 대한 4 개의 확률 맵 인 Cnn에 의한 2d 분할을 수행하고 있습니다. 그러나 6의 그리드를 사용하여 MRF로 최적화를 수행해야합니다 - 네이버 (현재 확률 맵에서 4 개, 시퀀스에서 동일한 클래스의 인접 확률 맵에있는 다른 2 개).당분간 나는 각 클래스를 개별적으로 (바이너리) 어떻게 작동하는지보고 모든 클래스를 확장하려고한다. 내가 어떻게 해? 어떤 함수가 새로운 데이터와 평활화 조건을 위해 변경되어야합니까? 고마워요. –

+0

6- 연결은 3D 그리드 용입니다. 그리드가 2D이므로 4 연결 또는 8 연결 중 하나를 사용할 수 있습니다. 그래프는 인접한 픽셀 만 연결하고 확률 맵에서는 인접 항목을 연결하지 않습니다. – Shai

답변

3

당신은 256x256 PIX (TOT ~ 4G의 복셀)의 60 개 조각을 가지고, 즉 slices256 -by- 256 -by- 60 배열입니다. slices을 인터넷에 하나씩 (일괄 적으로 또는 일괄 적으로) 피드하면 확률이 256by-256by-60 -by- 4입니다.
최적화를 위해 그래프를 구성하는 데 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,
필요 슬라이스 사이의 공간 거리가 동일한 슬라이스에서 인접한 보셀 사이의 간격보다 큰 경우, 다른 슬라이스에있는 iijj에 대해서는 및 jj에 대해 sig2이 서로 다릅니다. 약간의 노력이 필요합니다.

+0

고마워, 나는 4 개의 맵을'prob'에로드했다. for 루프에 의해, prob (:, :, i :) = cat (4, squeeze (pMap.a (1, :, :)), squeeze (pMap.a (2, :, :)), squeeze 그러나, 오류가 발생합니다 :'GraphCut을 사용하여 오류 발생> OpenGraph (383 행) 크기가 잘못되었습니다. (예 : pMap.a (3, :, :)), squeeze Dc 또는 Sc'이다. Dc의 크기는 변형 후 3932160-by-4입니다. 나는 이유를 모른다. –

+0

이 패키지를 마지막으로 사용한 지 오래되었습니다. Dc – Shai

+0

을 고맙게 대치해야 할 수도 있습니다. 그러나 Dc가 Dc '로 변경되었지만 세그먼트 화 결과가 그다지 향상되지 않습니다. 나는'sig = 0.01'를 설정했다; –