我有一个脚本,该脚本生成一系列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
从代表帧的一组文件中创建动画。例如,我根据
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')
使用图像处理方法,您只需完成
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
执行此操作。