2017-04-20 57 views
0

我有訓練的標籤爲具有像素值的圖像0或255從我的機器學習模型預測標籤也是具有象素值0或者255計算交叉口以上聯合用於面罩

255是像素的圖像與預測有關的價值。

現在我想計算IoU。 這裏是我的方法

for k in range(numImages): 
    for i in range(width){ 
     for j in range(height){ 
     if(label[i][j]==predicted[i][j]){ 
      if(label[i][j]==255){ 
      intersection++; 
      } 
     } 
     else if(label[i][j] ==255 || predicted[i][j]==255){ 
      union++; 
     } 
     } 
    } 
    IoU+=intersection/(union-intersection) 

IoU/=numImages 

最後借條借據是的價值。 這個計算是否正確?雖然嵌套的for循環/ if語句讓它有點凌亂

回答

1

這裏的邏輯似乎是正確的。 可能的替代方法可以是:

路口=總和((A. * B)> 0);

其中A. * B是圖像的逐點相乘(即,如果任一圖像具有0在這一點上,它們不相交併且各個像素的乘積爲0)。

工會=總和((A + B)> 0);

其中A + B是圖像的逐點添加。 (即,如果任一個非零,則它是聯合的一部分並且和大於0)。

IoU = intersection/union;

我不知道你在這樣的語法的工作是什麼語言,可能需要進行調整,但這種結構需要你的代碼從3環和2個條件語句,以1環和沒有條件語句。

編輯:

如果你也有興趣搞清楚如何計算其他常見的相似性指標(如Dice-Sorenson coefficientprecision, recall)使用類似的兩幅圖像之間的點算術的方法,看看示例代碼下面。語法是用於MATLAB的,但它應該說明邏輯。 (注:NNZ =非零元素的數目相當於「和(X> 0)」以上使用。)

%Generate complements of each image (0's to 1's, 1's to 0's) 
ref_complement=(ref-1).*-1; 
seg_complement=(seg-1).*-1; 

%True Positives 
TP=nnz(ref.*seg); 
%True Negatives 
TN=nnz(ref_complement.*seg_complement); 
%False Positive 
FP=nnz(ref_complement.*seg); 
%False Negative 
FN=nnz(ref.*seg_complement); 

%%Calculate metrics 
metrics.dice     = 2*TP/(FP + 2*TP + FN); 
metrics.recall    = TP/(TP + FN); 
metrics.precision   = TP/(TP + FP); 
metrics.AreaDifference  = ((TP + FP) - (TP + FN)) * pixelSize^2; 
+0

的最後一步,其中我平均它在圖像上,它是正確的嗎? – Sarthak

+0

我也想知道我們如何計算上述問題的精確度和召回率,並確保IoU能夠提供準確性?因爲IoU的分母不包含真正的否定。 – Sarthak

+0

編輯原始帖子以解決問題:精確度和召回率。 至於是否均在圖像上是正確的,我們必須要清楚什麼是正確的「的意思。如果你的意思是_matheously correct_,那麼是的。如果你的意思是這是一個正確的做法,那麼這是一個更爲細微的數據解釋問題,這個問題歸結於該領域的慣例,你正在分析的結果的性質以及算法的預期應用。出於這個原因,我在那裏幫不了你。 – JMikes