3

I hope someone can help to troubleshoot this problem. I'm trying to save the loss plots out of Keras in the form of the following animation.

img

but I have been facing the following error, and ultimately I can't save the animation:

MovieWriter stderr:
[h264_v4l2m2m @ 0x55a67176f430] Could not find a valid device
[h264_v4l2m2m @ 0x55a67176f430] can't configure encoder
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

---------------------------------------------------------------------------
BrokenPipeError                           Traceback (most recent call last)
~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in saving(self, fig, outfile, dpi, *args, **kwargs)
    229         try:
--> 230             yield self
    231         finally:

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs, progress_callback)
   1155                             frame_number += 1
-> 1156                     writer.grab_frame(**savefig_kwargs)
   1157 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in grab_frame(self, **savefig_kwargs)
    383         self.fig.savefig(self._frame_sink(), format=self.frame_format,
--> 384                          dpi=self.dpi, **savefig_kwargs)
    385 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/figure.py in savefig(self, fname, transparent, **kwargs)
   2179 
-> 2180         self.canvas.print_figure(fname, **kwargs)
   2181 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, **kwargs)
   2081                     bbox_inches_restore=_bbox_inches_restore,
-> 2082                     **kwargs)
   2083             finally:

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py in print_raw(self, filename_or_obj, *args, **kwargs)
    445                 cbook.open_file_cm(filename_or_obj, "wb") as fh:
--> 446             fh.write(renderer._renderer.buffer_rgba())
    447 

BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

CalledProcessError                        Traceback (most recent call last)
<ipython-input-23-13442cbf583d> in <module>
     17 print(f'{model_type.upper()} Train Time: {Timer} sec')
     18 
---> 19 create_loss_animation(model_type, hist.history['loss'], hist.history['val_loss'], epoch)
     20 
     21 evaluate(model, trainX, trainY, testX, testY, scores_train, scores_test)

<ipython-input-22-199228cd4989> in create_loss_animation(model_type, loss_hist, val_loss_hist, epoch)
     34 
     35     ani = matplotlib.animation.FuncAnimation(fig, animate, fargs=(l1, l2, loss, val_loss, title), repeat=True, interval=1000, repeat_delay=1000)
---> 36     ani.save(f'loss_animation_{model_type}_oneDataset.mp4', writer=writer)

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs, progress_callback)
   1154                             progress_callback(frame_number, total_frames)
   1155                             frame_number += 1
-> 1156                     writer.grab_frame(**savefig_kwargs)
   1157 
   1158         # Reconnect signal for first draw if necessary

~/anaconda3/envs/CR7/lib/python3.6/contextlib.py in __exit__(self, type, value, traceback)
     97                 value = type()
     98             try:
---> 99                 self.gen.throw(type, value, traceback)
    100             except StopIteration as exc:
    101                 # Suppress StopIteration *unless* it's the same exception that

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in saving(self, fig, outfile, dpi, *args, **kwargs)
    230             yield self
    231         finally:
--> 232             self.finish()
    233 
    234 

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in finish(self)
    365     def finish(self):
    366         '''Finish any processing for writing the movie.'''
--> 367         self.cleanup()
    368 
    369     def grab_frame(self, **savefig_kwargs):

~/anaconda3/envs/CR7/lib/python3.6/site-packages/matplotlib/animation.py in cleanup(self)
    409         if self._proc.returncode:
    410             raise subprocess.CalledProcessError(
--> 411                 self._proc.returncode, self._proc.args, out, err)
    412 
    413     @classmethod

CalledProcessError: Command '['/usr/bin/ffmpeg', '-f', 'rawvideo', '-vcodec', 'rawvideo', '-s', '720x720', '-pix_fmt', 
'rgba', '-r', '5', '-loglevel', 'error', '-i', 'pipe:', '-vcodec', 'h264', '-pix_fmt', 'yuv420p', '-b', '800k', '-y', 
'loss_animation_CNN_oneDataset.mp4']' returned non-zero exit status 1.

I tried to ignore the error by this answer but it seems it's not the case. I also checked similar case but its answer for getting a static git binary is not my cas as well since not especial converting PNG to MP4!

My code is as follows:

plt.rcParams['animation.ffmpeg_path'] = '/usr/bin/ffmpeg'

def animate(i, data1, data2, line1, line2):
    temp1 = data1.iloc[:int(i+1)]
    temp2 = data2.iloc[:int(i+1)]

    line1.set_data(temp1.index, temp1.value)
    line2.set_data(temp2.index, temp2.value)

    return (line1, line2)


def create_loss_animation(model_type, data1, data2):
    fig = plt.figure()
    plt.title(f'Loss on Train & Test', fontsize=25)
    plt.xlabel('Epoch', fontsize=20)
    plt.ylabel('Loss MSE for Sx-Sy & Sxy', fontsize=20)
    plt.xlim(min(data1.index.min(), data2.index.min()), max(data1.index.max(), data2.index.max()))
    plt.ylim(min(data1.value.min(), data2.value.min()), max(data1.value.max(), data2.value.max()))

    l1, = plt.plot([], [], 'o-', label='Train Loss', color='b', markevery=[-1])
    l2, = plt.plot([], [], 'o-', label='Test Loss', color='r', markevery=[-1])
    plt.legend(loc='center right', fontsize='xx-large')

    Writer = animation.writers['ffmpeg']
    writer = Writer(fps=5, bitrate=1800)

    ani = matplotlib.animation.FuncAnimation(fig, animate, fargs=(data1, data2, l1, l2), repeat=True, interval=1000, repeat_delay=1000)
    ani.save(f'{model_type}.mp4', writer=writer)

# create datasets
x = np.linspace(0,150,50)
y1 = 41*np.exp(-x/20)
y2 = 35*np.exp(-x/50)

my_data_number_1 = pd.DataFrame({'x':x, 'value':y1}).set_index('x')
my_data_number_2 = pd.DataFrame({'x':x, 'value':y2}).set_index('x')

create_loss_animation('test', my_data_number_1, my_data_number_2)
9
  • How would you fix Could not find a valid device [h264_v4l2m2m @ 0x55a67176f430] can't configure encoder if you weren't using Python at all, but were calling ffmpeg from bash? Do that. Commented Aug 9, 2019 at 0:42
  • @CharlesDuffy Sir sound's promising but I'm not familiar really with bash, may I ask you to explain more so that I can fix this problem. I'm into python only. Commented Aug 9, 2019 at 0:44
  • ...so, the point I'm making is that it isn't a Python-specific error, but is purely an ffmpeg error; a CalledProcessError just tells you that the program failed -- it's not specific to the language/tools you used to start the program, except insofar as it's a library in that language that's generating the set of command-line arguments, feeding input, etc. Commented Aug 9, 2019 at 0:46
  • Conveniently enough, the tools here give you a command line to work with; the array ['/usr/bin/ffmpeg', '-f', 'rawvideo', '-vcodec', 'rawvideo', '-s', '720x720', '-pix_fmt', 'rgba', '-r', '5', '-loglevel', 'error', '-i', 'pipe:', '-vcodec', 'h264', '-pix_fmt', 'yuv420p', '-b', '800k', '-y', 'loss_animation_CNN_oneDataset.mp4'] means you can run the same command (outside Python) as /usr/bin/ffmpeg -f rawvideo -vcodec rawvideo -s 720x720 -pix_fmt rgba -r 5 -loglevel error -i pipe: -vcodec h264 -pix_fmt yuv420p -b 800k -y loss_animation_CNN_oneDataset.mp4 Commented Aug 9, 2019 at 0:48
  • I can try it in jupyter notebook what you mentioned! Commented Aug 9, 2019 at 0:50

2 Answers 2

1

I got the same error, somehow I locked the video and ffmpeg couldn't overwrite it I guess. Make sure this locked is unchecked.

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Where is this located? How does one get this view?
1

It may be because the installed version is wrong, you can try and use the following installation package instead: https://www.pcsoft.com.cn/down/36231?module=soft.

Then add the decompressed path by: plt.rcParams["animation.ffmpeg_path"] = r"decompressed_path\ffmpeg.exe"

1 Comment

Hi and welcome to Stack Overflow! Please take the tour. Thanks for answering but can you also add an explanation on how your code solves the issue? Check the help center for info on how to format code.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.