如何从tensorboard事件摘要中提取和保存图像?

eqz*_*qzx 12 python tensorflow tensorboard

给定张量流事件文件,如何提取与特定标记对应的图像,然后以通用格式将它们保存到磁盘,例如.png

eqz*_*qzx 15

你可以像这样提取图像.输出格式可能取决于图像在摘要中的编码方式,因此生成的写入磁盘可能需要使用其他格式.png

import os
import scipy.misc
import tensorflow as tf

def save_images_from_event(fn, tag, output_dir='./'):
    assert(os.path.isdir(output_dir))

    image_str = tf.placeholder(tf.string)
    im_tf = tf.image.decode_image(image_str)

    sess = tf.InteractiveSession()
    with sess.as_default():
        count = 0
        for e in tf.train.summary_iterator(fn):
            for v in e.summary.value:
                if v.tag == tag:
                    im = im_tf.eval({image_str: v.image.encoded_image_string})
                    output_fn = os.path.realpath('{}/image_{:05d}.png'.format(output_dir, count))
                    print("Saving '{}'".format(output_fn))
                    scipy.misc.imsave(output_fn, im)
                    count += 1  
Run Code Online (Sandbox Code Playgroud)

然后示例调用可能如下所示:

save_images_from_event('path/to/event/file', 'tag0')

请注意,这假设事件文件已完全写入 - 如果不是,则可能需要进行一些错误处理.

  • 什么是标签?什么是事件文件?请举个具体例子 (2认同)

Fab*_*ter 6

如果您使用 TensorFlow 2,这会很好用

from collections import defaultdict, namedtuple
from typing import List
import tensorflow as tf


TensorBoardImage = namedtuple("TensorBoardImage", ["topic", "image", "cnt"])


def extract_images_from_event(event_filename: str, image_tags: List[str]):
    topic_counter = defaultdict(lambda: 0)

    serialized_examples = tf.data.TFRecordDataset(event_filename)
    for serialized_example in serialized_examples:
        event = event_pb2.Event.FromString(serialized_example.numpy())
        for v in event.summary.value:
            if v.tag in image_tags:

                if v.HasField('tensor'):  # event for images using tensor field
                    s = v.tensor.string_val[2]  # first elements are W and H

                    tf_img = tf.image.decode_image(s)  # [H, W, C]
                    np_img = tf_img.numpy()

                    topic_counter[v.tag] += 1

                    cnt = topic_counter[v.tag]
                    tbi = TensorBoardImage(topic=v.tag, image=np_img, cnt=cnt)

                    yield tbi
Run Code Online (Sandbox Code Playgroud)

虽然“v”有一个图像字段,但它是空的。

我用了

    tf.summary.image("topic", img)
Run Code Online (Sandbox Code Playgroud)

将图像添加到事件文件中。


Agi*_*ean 6

对于那些也可以不用代码的人来说,Tensorboard UI 中有一种优雅的方式。

  1. 在左上角,选中复选框 Show data download links
  2. 在左下角,选择可让您下载 svg 文件的下载图标。
  3. 在右下角,选择原始数据的数据下载链接,方便那些想做更复杂的数据分析或数据可视化的人

在此处输入图片说明

  • 这个答案并不是作者想要的。问题是如何下载图像部分中的图像,而不是标量部分中的绘图。 (2认同)
  • @koha 该下载按钮现在可以“将当前图表下载为 SVG”。tf/tfboard 2.5 (2认同)