Метрика оценки для отключенных объектов в данных МРТ
Я пытаюсь оценить точность алгоритма, который сегментирует регионы в 3D-томах МРТ (мозг). Я использовал Dice, Jaccard, FPR, TNR, Precision... и т. Д., Но я делал это только по пикселям (IE FNs= количество ложных отрицательных пикселей). Есть ли пакет Python (или псевдокод) для этого на уровне поражения? Например, рассчитать TP как число повреждений (3d-объектов, отключенных в grd trth), обнаруженных моим алгоритмом? Таким образом, размер поражения не влияет на показатели точности.
2 ответа
Вы могли бы использовать Сципи label
чтобы найти связанные компоненты в изображении:
from scipy.ndimage.measurements import label
label_pred, numobj_pred = label(my_predictions)
label_true, numobj_true = label(my_groundtruth)
А затем сравните их, используя метрику по вашему выбору.
PS: или scikit-image, с демо здесь.
Вот код, который я написал для выполнения этой задачи. Пожалуйста, дайте мне знать, если кто-нибудь видит какие-либо ошибки.
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