2017-09-01 9 views
-1

3D MRIボリューム(脳)の領域を分割するアルゴリズムの精度を評価しようとしています。私はダイス、Jaccard、FPR、TNR、Precisionなどを使っていますが、私はこのピクセル単位でしか行っていません(I.E.FNs = false negピクセル数)。病変レベルでこれを行うためのPythonパッケージ(または疑似コード)がありますか?たとえば、私のアルゴリズムで検出された病変の数(grd trthの3d切断オブジェクト)としてTPを計算しますか?この方法では、病変の大きさは精度メトリクスに大きな影響を与えません。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 
関連する問題