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)
您可以使用 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如果您更喜欢编程方法,您当然也可以这样做。