如何从张量板事件摘要中提取和保存图像?
How to extract and save images from tensorboard event summary?
给定一个 tensorflow 事件文件,我如何提取与特定标签对应的图像,然后以通用格式将它们保存到磁盘,例如.png
?
您可以像这样提取图像。输出格式可能取决于图像在摘要中的编码方式,因此写入磁盘的结果可能需要使用除 .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
然后一个示例调用可能如下所示:
save_images_from_event('path/to/event/file', 'tag0')
请注意,这假设事件文件已完全写入——如果没有,则可能需要进行一些错误处理。
如果您使用的是 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
尽管 'v' 有图像字段,但它是空的。
我用过
tf.summary.image("topic", img)
将图像添加到事件文件。
对于那些不用代码也能做到的人,Tensorboard 中有一个优雅的方法UI。
- 在左上角,select复选框
Show data download links
- 在左下角,select 下载图标,可让您下载 svg 文件。
- 在右下角,select原始数据的数据下载链接,方便那些想做更复杂的数据分析或数据可视化的人
给定一个 tensorflow 事件文件,我如何提取与特定标签对应的图像,然后以通用格式将它们保存到磁盘,例如.png
?
您可以像这样提取图像。输出格式可能取决于图像在摘要中的编码方式,因此写入磁盘的结果可能需要使用除 .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
然后一个示例调用可能如下所示:
save_images_from_event('path/to/event/file', 'tag0')
请注意,这假设事件文件已完全写入——如果没有,则可能需要进行一些错误处理。
如果您使用的是 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
尽管 'v' 有图像字段,但它是空的。
我用过
tf.summary.image("topic", img)
将图像添加到事件文件。
对于那些不用代码也能做到的人,Tensorboard 中有一个优雅的方法UI。
- 在左上角,select复选框
Show data download links
- 在左下角,select 下载图标,可让您下载 svg 文件。
- 在右下角,select原始数据的数据下载链接,方便那些想做更复杂的数据分析或数据可视化的人