2017-09-01 76 views
-1

我正試圖評估在3D MRI卷(大腦)中分割區域的算法的準確性。我一直在使用Dice,Jaccard,FPR,TNR,Precision ...等,但我只是按像素進行的(I.E. FNs =假負像素數)。是否有一個python軟件包(或僞代碼)在病變級別執行此操作?例如,計算TP作爲我的算法檢測到的病變數(grd trth中的3d斷開連接的對象)?通過這種方式,病變的大小對準確度指標的影響不大。MRI數據中斷開連接的對象的評估指標

回答

1

你可以使用SciPy的的label找到連接的部件圖像中:

from scipy.ndimage.measurements import label 
label_pred, numobj_pred = label(my_predictions) 
label_true, numobj_true = label(my_groundtruth) 

,然後使用您所選擇的指標進行比較。

PS:或者scikit-image的演示here

0

這裏是我最終寫的代碼來完成這項任務。請讓我知道是否有人看到任何錯誤。

def distance(p1, p2,dim): 
    if dim==2: return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) 
    elif dim==3: return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2+ (p2[2] - p1[2])**2) 
    else: print 'error' 

def closest(true_cntrd,pred_pts,dim): 
    dist_list=[] 
    for pred_pt in pred_pts: 
     dist_list.append(distance(true_cntrd, pred_pt,dim)) 
    min_idx = np.argmin(dist_list) 
    return pred_pts[min_idx],min_idx 

def eval_disconnected(y_true,y_pred,dim): 
    y_pred=y_pred>0.5 
    label_pred, numobj_pred = label(y_pred) 
    label_true, numobj_true = label(y_true) 

    true_labels,pred_labels=np.arange(numobj_true+1)[1:],np.arange(numobj_pred+1)[1:] 
    true_centroids=center_of_mass(y_true,label_true,true_labels) 
    pred_centroids=center_of_mass(y_pred,label_pred,pred_labels) 

    if len(pred_labels)==0: 
     TP,FN,FP=0,len(true_centroids),0 
     return TP,FN,FP 

    true_lbl_hit_list=[] 
    pred_lbl_hit_list=[] 
    for (cntr_true,lbl_t) in zip(true_centroids,np.arange(numobj_true+1)[1:]): 
     closest_pred_cntr,idx = closest(cntr_true,pred_centroids,dim) 
     closest_pred_cntr=tuple(int(coor) for coor in closest_pred_cntr) 
     if label_true[closest_pred_cntr]==lbl_t: 
      true_lbl_hit_list.append(lbl_t) 
      pred_lbl_hit_list.append(pred_labels[idx] ) 
    pred_lbl_miss_list = [pred_lbl for pred_lbl in pred_labels if not(pred_lbl in pred_lbl_hit_list)] 
    true_lbl_miss_list = [true_lbl for true_lbl in true_labels if not(true_lbl in true_lbl_hit_list)] 
    TP=len(true_lbl_hit_list) # all the grd truth labels that were predicted 
    FN=len(true_lbl_miss_list) # all the grd trth labels that were missed 
    FP=len(pred_lbl_miss_list) # all of the predicted labels that didn't hit 
    return TP,FN,FP