def average_precision(precision, recall, name=None): """Compute a average precision from precision and recall Tensors. Implementation following Pascal 2012 and ILSVRC guidelines. """ with tf.name_scope(name, 'average_precision', [precision, recall]): # Convert to float64 to decrease error on Riemann sums. precision = tf.cast(precision, dtype=tf.float64) recall = tf.cast(recall, dtype=tf.float64) # Add bounds values to precision and recall. precision = tf.concat([[0.], precision, [0.]], axis=0) recall = tf.concat([[0.], recall, [1.]], axis=0) # Ensures precision is increasing in reverse order. precision = tfe_math.cummax(precision, reverse=True) # Riemann sums for estimating the integral. # mean_pre = (precision[1:] + precision[:-1]) / 2. mean_pre = precision[1:] diff_rec = recall[1:] - recall[:-1] ap = tf.reduce_sum(mean_pre * diff_rec) return ap
def precision_recall_values(xvals, precision, recall, name=None): """Compute values on the precision/recall curve. Args: x: Python list of floats; precision: 1D Tensor decreasing. recall: 1D Tensor increasing. Return: list of precision values. """ with ops.name_scope(name, "precision_recall_values", [precision, recall]) as name: # Add bounds values to precision and recall. precision = tf.concat([[0.], precision, [0.]], axis=0) recall = tf.concat([[0.], recall, [1.]], axis=0) precision = tfe_math.cummax(precision, reverse=True) prec_values = [] for x in xvals: mask = tf.less_equal(recall, x) val = tf.reduce_min(tf.boolean_mask(precision, mask)) prec_values.append(val) return tf.tuple(prec_values)
def precision_recall_values(xvals, precision, recall, name=None): """Compute values on the precision/recall curve. Args: x: Python list of floats; precision: 1D Tensor decreasing. recall: 1D Tensor increasing. Return: list of precision values. """ with ops.name_scope(name, "precision_recall_values", [precision, recall]) as name: # Add bounds values to precision and recall. precision = tf.concat([[0.], precision, [0.]], axis=0) recall = tf.concat([[0.], recall, [1.]], axis=0) precision = tfe_math.cummax(precision, reverse=True) prec_values = [] for x in xvals: mask = tf.less_equal(recall, x) val = tf.reduce_min(tf.boolean_mask(precision, mask)) prec_values.append(val) return tf.tuple(prec_values)
def average_precision_voc12(precision, recall, name=None): """Compute (interpolated) average precision from precision and recall Tensors. The implementation follows Pascal 2012 and ILSVRC guidelines. See also: https://sanchom.wordpress.com/tag/average-precision/ """ with tf.name_scope(name, 'average_precision_voc12', [precision, recall]): # Convert to float64 to decrease error on Riemann sums. precision = tf.cast(precision, dtype=tf.float64) recall = tf.cast(recall, dtype=tf.float64) # Add bounds values to precision and recall. precision = tf.concat([[0.], precision, [0.]], axis=0) recall = tf.concat([[0.], recall, [1.]], axis=0) # Ensures precision is increasing in reverse order. precision = tfe_math.cummax(precision, reverse=True) # Riemann sums for estimating the integral. # mean_pre = (precision[1:] + precision[:-1]) / 2. mean_pre = precision[1:] diff_rec = recall[1:] - recall[:-1] ap = tf.reduce_sum(mean_pre * diff_rec) return ap
def average_precision_voc12(precision, recall, name=None): """Compute (interpolated) average precision from precision and recall Tensors. The implementation follows Pascal 2012 and ILSVRC guidelines. See also: https://sanchom.wordpress.com/tag/average-precision/ """ with tf.compat.v1.name_scope(name, 'average_precision_voc12', [precision, recall]): # Convert to float64 to decrease error on Riemann sums. precision = tf.cast(precision, dtype=tf.float64) recall = tf.cast(recall, dtype=tf.float64) # Add bounds values to precision and recall. precision = tf.concat([[0.], precision, [0.]], axis=0) recall = tf.concat([[0.], recall, [1.]], axis=0) # Ensures precision is increasing in reverse order. precision = tfe_math.cummax(precision, reverse=True) # Riemann sums for estimating the integral. # mean_pre = (precision[1:] + precision[:-1]) / 2. mean_pre = precision[1:] diff_rec = recall[1:] - recall[:-1] ap = tf.reduce_sum(input_tensor=mean_pre * diff_rec) return ap