def _image3_animated_gif(tag: str, image: Union[np.ndarray, torch.Tensor], scale_factor: float = 1.0) -> Summary: """Function to actually create the animated gif. Args: tag: Data identifier image: 3D image tensors expected to be in `HWD` format scale_factor: amount to multiply values by. if the image data is between 0 and 1, using 255 for this value will scale it to displayable range """ assert len( image.shape ) == 3, "3D image tensors expected to be in `HWD` format, len(image.shape) != 3" ims = [(np.asarray((image[:, :, i])) * scale_factor).astype(np.uint8) for i in range(image.shape[2])] ims = [GifImage.fromarray(im) for im in ims] img_str = b"" for b_data in PIL.GifImagePlugin.getheader(ims[0])[0]: img_str += b_data img_str += b"\x21\xFF\x0B\x4E\x45\x54\x53\x43\x41\x50" b"\x45\x32\x2E\x30\x03\x01\x00\x00\x00" for i in ims: for b_data in PIL.GifImagePlugin.getdata(i): img_str += b_data img_str += b"\x3B" summary_image_str = Summary.Image(height=10, width=10, colorspace=1, encoded_image_string=img_str) image_summary = Summary.Value(tag=tag, image=summary_image_str) return Summary(value=[image_summary])
def _ImageSummary(tag, height, width, colorspace, encoded_image): from tensorboard.compat.proto.summary_pb2 import Summary image = Summary.Image(height=height, width=width, colorspace=colorspace, encoded_image_string=encoded_image) return Summary(value=[Summary.Value(tag=tag, image=image)])
def make_image(tensor, rescale=1, rois=None): """Convert a numpy representation of an image to Image protobuf""" from PIL import Image height, width, channel = tensor.shape scaled_height = int(height * rescale) scaled_width = int(width * rescale) image = Image.fromarray(tensor) if rois is not None: image = draw_boxes(image, rois) image = image.resize((scaled_width, scaled_height), Image.ANTIALIAS) import io output = io.BytesIO() image.save(output, format='PNG') image_string = output.getvalue() output.close() return Summary.Image(height=height, width=width, colorspace=channel, encoded_image_string=image_string)
def make_video(tensor, fps): try: import moviepy # noqa: F401 except ImportError: print("add_video needs package moviepy") return try: from moviepy import editor as mpy except ImportError: print( "moviepy is installed, but can't import moviepy.editor.", "Some packages could be missing [imageio, requests]", ) return import tempfile t, h, w, c = tensor.shape # encode sequence of images into gif string clip = mpy.ImageSequenceClip(list(tensor), fps=fps) filename = tempfile.NamedTemporaryFile(suffix=".gif", delete=False).name try: # newer version of moviepy use logger instead of progress_bar argument. clip.write_gif(filename, verbose=False, logger=None) except TypeError: try: # older version of moviepy does not support progress_bar argument. clip.write_gif(filename, verbose=False, progress_bar=False) except TypeError: clip.write_gif(filename, verbose=False) with open(filename, "rb") as f: tensor_string = f.read() try: os.remove(filename) except OSError: logger.warning("The temporary file used by moviepy cannot be deleted.") return Summary.Image(height=h, width=w, colorspace=c, encoded_image_string=tensor_string)
def make_video(tensor, fps): try: import moviepy # noqa: F401 except ImportError: print('add_video needs package moviepy') return try: from moviepy import editor as mpy except ImportError: print("moviepy is installed, but can't import moviepy.editor.", "Some packages could be missing [imageio, requests]") return import tempfile t, h, w, c = tensor.shape # encode sequence of images into gif string clip = mpy.ImageSequenceClip(list(tensor), fps=fps) with tempfile.NamedTemporaryFile() as f: filename = f.name + '.gif' try: clip.write_gif(filename, verbose=False, progress_bar=False) except TypeError: clip.write_gif(filename, verbose=False) with open(filename, 'rb') as f: tensor_string = f.read() try: os.remove(filename) except OSError: pass return Summary.Image(height=h, width=w, colorspace=c, encoded_image_string=tensor_string)
def Image(**kw): from tensorboard.compat.proto.summary_pb2 import Summary return Summary.Image(**kw)