Guest User

Untitled

a guest
Mar 19th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.25 KB | None | 0 0
  1. # score.py
  2. import os
  3. import settings
  4. from tqdm import tqdm
  5. from skimage.io import imread
  6. import numpy as np
  7. import metrics
  8. from keras.models import Model, load_model
  9. from skimage.morphology import label
  10. from skimage.transform import resize
  11.  
  12. # Settings
  13. max_number_of_samples = 50 # this sets how many samples of the full training set to look at, this is not random, just the first N samples
  14. model_file = "model-dsbowl2018-3.h5"
  15. X_train_file = "X_train_256_256.npy"
  16.  
  17. # Define the object by object mean IOU calculation for a given image
  18. def object_mean_iou(y_labeled_true, y_labeled_pred):
  19. num_y_labeled_true = y_labeled_true.max()
  20. num_y_labeled_pred = y_labeled_pred.max()
  21. threshold_ious = []
  22. for threshold in [0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95]:
  23. true_positives = 0
  24. false_negative = 0
  25. pred_obj_preload = []
  26. pred_obj_size = []
  27. for predicted_object_id in range(1, num_y_labeled_pred + 1):
  28. pred_obj = y_labeled_pred == predicted_object_id
  29. pred_obj_preload.append(pred_obj)
  30. pred_obj_size.append(np.count_nonzero(pred_obj))
  31. # a true positive for given threshold is when a _single_ object in the prediction corresponds to a given true object
  32. for true_object_id in range(1, num_y_labeled_true + 1):
  33. true_obj = y_labeled_true == true_object_id
  34. true_obj_size = np.count_nonzero(true_obj)
  35. matches = 0
  36. for predicted_object_id in range(1, num_y_labeled_pred + 1):
  37. # calculate the iou for this object and the true object
  38. this_pred_obj = pred_obj_preload[predicted_object_id-1]
  39. this_pred_obj_size = pred_obj_size[predicted_object_id-1]
  40. intersection = np.count_nonzero(true_obj & this_pred_obj)
  41. union = true_obj_size + this_pred_obj_size - intersection
  42. iou = intersection / union
  43. if iou > threshold:
  44. matches += 1
  45. if matches == 1:
  46. true_positives += 1
  47. if matches == 0:
  48. false_negative += 1
  49. false_positive = num_y_labeled_pred - true_positives
  50. threshold_ious.append(true_positives / (true_positives + false_positive + false_negative))
  51. return sum(threshold_ious) / len(threshold_ious)
  52.  
  53. train_ids = next(os.walk(settings.TRAIN_PATH))[1][:max_number_of_samples]
  54. # this is the 256x256 training data already loaded into a numpy array and resized
  55. X_train = np.load(X_train_file)[:max_number_of_samples]
  56. # this is the true sizes of the training images for upsampling the masks after prediction
  57. sizes_train = np.load("sizes_train.npy")
  58.  
  59. # Get and resize train images and masks
  60. Y_labeled_true = []
  61. IMG_CHANNELS = settings.IMG_CHANNELS
  62. print('Loading true masks ...')
  63. for n, id_ in tqdm(enumerate(train_ids), total=len(train_ids)):
  64. path = settings.TRAIN_PATH + id_
  65. img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]
  66. mask = np.zeros((img.shape[0], img.shape[1], 1), dtype=np.bool)
  67. next_object_number = 1
  68. for mask_file in next(os.walk(path + '/masks/'))[2]:
  69. mask_ = imread(path + '/masks/' + mask_file)
  70. mask_ = next_object_number * (np.expand_dims(mask_, axis=-1) // 255)
  71. mask = np.maximum(mask, mask_)
  72. next_object_number += 1
  73. Y_labeled_true.append(np.squeeze(mask, -1))
  74.  
  75. # Use the same labeling methodology here that you use before submitting
  76. model = load_model(model_file, custom_objects={"mean_iou": metrics.mean_iou, "mean_iou2": metrics.mean_iou2})
  77. preds_train = model.predict(X_train, verbose=1)
  78. preds_train_t = (preds_train > 0.5).astype(np.uint8)
  79.  
  80. # Create list of upsampled test masks
  81. preds_test_upsampled = []
  82. for i in range(len(preds_train_t)):
  83. preds_test_upsampled.append(resize(np.squeeze(preds_train_t[i]),
  84. (sizes_train[i][0], sizes_train[i][1]),
  85. mode='constant', preserve_range=True))
  86. Y_labeled_pred = [label(pred) for pred in preds_test_upsampled]
  87.  
  88. images_iou = []
  89. for n in range(len(Y_labeled_true)):
  90. image_iou = object_mean_iou(Y_labeled_true[n], Y_labeled_pred[n])
  91. print("Image " + str(n) + " IOU: " + str(image_iou))
  92. images_iou.append(image_iou)
  93. print("mIOU (LB) Score: " + str(sum(images_iou) / len(images_iou)))
Add Comment
Please, Sign In to add comment