2

我在 DeeplabV3+ ( eval.py )的 Tensorflow 官方实现中找到了评估脚本,tf.metrics.mean_iou用于更新平均 IOU,并将其添加到 Tensorboard 进行记录。

tf.metrics.mean_iou实际上返回2个张量,一个是计算平均IOU,另一个是opdate_op,根据官方文档(doc),混淆矩阵。似乎每次如果你想计算 mean_iou,你必须先调用 update_op。

我正在尝试将此 update_op 作为张量添加到摘要中,但它不起作用。我的问题是如何将这个混淆矩阵添加到 Tensorboard 中?

我看到了一些关于如何计算混淆矩阵并将其添加到 Tensorboard 的其他线程,以及额外的操作。我只是想知道是否可以在没有这些额外操作的情况下做到这一点。

任何帮助,将不胜感激。

4

1 回答 1

4

我会在这里发布我的答案,因为有人赞成它。

假设您mean_iou以下列方式定义 op:

    miou, update_op = tf.metrics.mean_iou(
        predictions, labels, dataset.num_of_classes, weights=weights)
    tf.summary.scalar(predictions_tag, miou)

如果你在 Tensorboard 中看到你的图表,你会发现有一个名为 'mean_iou' 的节点,展开这个节点后,你会发现有一个名为 'total_confucion_matrix' 的操作。这是您计算每个类的召回率和精度所需要的。

在此处输入图像描述

获得节点名称后,您可以通过函数将其添加到您的 tensorboardtf.summary.text或在终端中打印tf.print。下面发布了一个示例:

    miou, update_op = tf.metrics.mean_iou(
        predictions, labels, dataset.num_of_classes, weights=weights)
    tf.summary.scalar(predictions_tag, miou)
    # Get the correct tensor name of confusion matrix, different graphs may vary
    confusion_matrix = tf.get_default_graph().get_tensor_by_name('mean_iou/total_confusion_matrix:0')

    # Calculate precision and recall matrix
    precision = confusion_matrix / tf.reshape(tf.reduce_sum(confusion_matrix, 1), [-1, 1])
    recall = confusion_matrix / tf.reshape(tf.reduce_sum(confusion_matrix, 0), [-1, 1])

    # Print precision, recall and miou in terminal
    precision_op = tf.print("Precision:\n", precision,
                         output_stream=sys.stdout)
    recall_op = tf.print("Recall:\n", recall,
                         output_stream=sys.stdout)
    miou_op = tf.print("Miou:\n", miou,
                         output_stream=sys.stdout)

    # Add precision and recall matrix in Tensorboard
    tf.summary.text('recall_matrix', tf.dtypes.as_string(recall, precision=4))
    tf.summary.text('precision_matrix', tf.dtypes.as_string(precision, precision=4))

    # Create summary hooks
    summary_op = tf.summary.merge_all()
    summary_hook = tf.contrib.training.SummaryAtEndHook(
        log_dir=FLAGS.eval_logdir, summary_op=summary_op)
    precision_op_hook = tf.train.FinalOpsHook(precision_op)
    recall_op_hook = tf.train.FinalOpsHook(recall_op)
    miou_op_hook = tf.train.FinalOpsHook(miou_op)
    hooks = [summary_hook, precision_op_hook, recall_op_hook, miou_op_hook]

    num_eval_iters = None
    if FLAGS.max_number_of_evaluations > 0:
      num_eval_iters = FLAGS.max_number_of_evaluations

    if FLAGS.quantize_delay_step >= 0:
      tf.contrib.quantize.create_eval_graph()

    tf.contrib.training.evaluate_repeatedly(
        master=FLAGS.master,
        checkpoint_dir=FLAGS.checkpoint_dir,
        eval_ops=[update_op],
        max_number_of_evaluations=num_eval_iters,
        hooks=hooks,
        eval_interval_secs=FLAGS.eval_interval_secs)

然后,您将在 Tensorboard 中汇总您的精度和召回矩阵: 在此处输入图像描述

于 2019-10-15T20:10:42.153 回答