【问题标题】:Convert TensorBoard Image Sequence to Video/GIF将 TensorBoard 图像序列转换为视频/GIF
【发布时间】:2020-05-10 01:54:49
【问题描述】:

我有一个脚本,它生成一系列 matplotlib 图形并使用 TensorBoard SummaryWriter() 将它们写入磁盘。 TensorBoard 提供了移动一个小滑块以在图像序列中前后移动的能力,但我想将图像序列转换为视频或动画。有没有办法做到这一点?

编辑 1:这是我的代码当前所做的简化示例。我想把.add_figure写入日志文件的图片转换成gif。

import matplotlib.pyplot as plt
import numpy as np
from torch.utils.tensorboard import SummaryWriter

n = 200
nframes = 25
x = np.linspace(-np.pi*4, np.pi*4, n)
tensorboard_writer = SummaryWriter()

for i, t in enumerate(np.linspace(0, np.pi, nframes)):
    plt.plot(x, np.cos(x + t))
    plt.plot(x, np.sin(2*x - t))
    plt.plot(x, np.cos(x + t) + np.sin(2*x - t))
    plt.ylim(-2.5,2.5)
    fig = plt.gcf()
    tensorboard_writer.add_figure(
        tag='temp',
        figure=fig,
        global_step=i,
        close=True)

【问题讨论】:

  • 你可以使用 imageio 或 matplotlib 的 FuncAnimation 虽然我建议你不要在创建它们并将它们传递给动画师之间将图形写入磁盘,除非你想保存单个帧
  • FuncAnimation 要求我同时将图像存储在内存中,对吧?
  • 从一组帧到单个视频文件的任何转换都需要在过程中的某个时间点将所有帧同时存储在内存中。在两者之间写入磁盘会产生冗余读取,除非您希望保留单个帧以及动画文件
  • 是的,我知道写和读回内存需要冗余的写和读,但这就是我要找的。​​span>
  • 好的,在这种情况下,您仍然可以使用 imageio 或 matplotlib 的 FuncAnimation。我将创建一个示例来演示

标签: image matplotlib animation video tensorboard


【解决方案1】:

您可以使用 imageio 或 matplotlib 的 FuncAnimation 从一组表示帧的文件中创建动画。例如,我根据

创建了一组文件
import matplotlib.pyplot as plt
import numpy as np

n = 200
nframes = 25
x = np.linspace(-np.pi*4, np.pi*4, n)

for i, t in enumerate(np.linspace(0, np.pi, nframes)):
    plt.plot(x, np.cos(x + t))
    plt.plot(x, np.sin(2*x - t))
    plt.plot(x, np.cos(x + t) + np.sin(2*x - t))
    plt.ylim(-2.5,2.5)
    plt.savefig('frame.'+str(i)+'.png', bbox_inches='tight', dpi=300)
    plt.clf()

这会创建一系列 nframes(例如 25 个)文件,命名约定为 'frame.n.png',其中 n 是帧号。两个传播的正弦波和创建的波在半个周期内绘制。

然后使用FuncAnimation 方法

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig = plt.figure(figsize=(10, 6), dpi=300)
nframes = 25

def animate(i):
    im = plt.imread('frame.'+str(i)+'.png')
    plt.imshow(im)
    plt.axis('off')

anim = FuncAnimation(fig, animate, frames=nframes, interval=(2000.0/nframes))
anim.save('output.gif', writer='imagemagick')

使用 imageio 方法,您可以轻松完成

import imageio

nframes = 25
files = ['frame.'+str(i)+'.png' for i in range(nframes)]

frames = [imageio.imread(f) for f in files]
imageio.mimsave('output.gif', frames, fps=(nframes / 2.0))

任何一种方法都会产生这个动画:

但是,与FuncAnimation 方法相比,imageio 方法要快得多

> $ time python3 imageio.py
real    0m9.483s
user    0m9.484s
sys     0m1.156s

> $ time python3 FuncAnimation.py
real    15m36.151s
user    3m28.375s
sys     12m3.578s

同样值得注意的是,FuncAnimation 方法生成的文件比 imageio 方法生成的文件小很多

2.5M Jan 23 18:36 FuncAnimation.gif
 13M Jan 23 18:08 imageio.gif

如果您喜欢程序化方法,当然也可以使用ffmpeg 来执行此操作。

【讨论】:

  • 哇!感谢这一切。不过,至关重要的是,我的问题涉及写入 TensorBoard 日志文件的图像。您能否修改您的答案以演示从此类文件中读取图像?
  • 明确地说,TensorBoard 日志文件是指SummaryWriter() 写入的文件类型
  • @RylanSchaeffer 能否通过SummaryWriter 添加用于将图像写入文件的代码?这将使我更容易回答您的后续问题
  • 完成!我使用您的代码使其尽可能简单。上述代码运行后,磁盘上会有一个runs/ 目录,里面有张量板日志文件。
  • @RylanSchaeffer 最简单的方法是制作动画并将文件同时写入磁盘 - 而不是制作 tensorboard 文件,然后再读回图形以制作动画。鉴于您编辑中的示例将是最好的方法 - 是否有任何理由无法使用您的实际代码?
猜你喜欢
  • 2014-12-16
  • 2023-03-04
  • 2020-03-17
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多