将 TensorBoard 图像序列转换为视频/GIF

Ryl*_*fer 5 video animation image matplotlib tensorboard

我有一个脚本,可以生成一系列 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)

Run Code Online (Sandbox Code Playgroud)

Wil*_*ler 2

您可以使用 imageio 或 matplotlibFuncAnimation从一组表示帧的文件创建动画。作为示例,我根据以下内容创建了一组文件

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()
Run Code Online (Sandbox Code Playgroud)

它创建一系列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')
Run Code Online (Sandbox Code Playgroud)

使用 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))
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

然而,imageio 方法比以下方法要快得多FuncAnimation

> $ 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
Run Code Online (Sandbox Code Playgroud)

然而,还值得注意的是,该FuncAnimation方法生成的文件非常生成的文件比 imageio 方法创建的文件小得多

2.5M Jan 23 18:36 FuncAnimation.gif
 13M Jan 23 18:08 imageio.gif
Run Code Online (Sandbox Code Playgroud)

ffmpeg如果您更喜欢编程方法,您当然也可以这样做。