Search code examples
tensorflowkerasdeep-learningtensorboard

How to display custom images in TensorBoard using Keras?


I'm working on a segmentation problem in Keras and I want to display segmentation results at the end of every training epoch.

I want something similar to Tensorflow: How to Display Custom Images in Tensorboard (e.g. Matplotlib Plots), but using Keras. I know that Keras has the TensorBoard callback but it seems limited for this purpose.

I know this would break the Keras backend abstraction, but I'm interested in using TensorFlow backend anyway.

Is it possible to achieve that with Keras + TensorFlow?


Solution

  • So, the following solution works well for me:

    import tensorflow as tf
    
    def make_image(tensor):
        """
        Convert an numpy representation image to Image protobuf.
        Copied from https://github.com/lanpa/tensorboard-pytorch/
        """
        from PIL import Image
        height, width, channel = tensor.shape
        image = Image.fromarray(tensor)
        import io
        output = io.BytesIO()
        image.save(output, format='PNG')
        image_string = output.getvalue()
        output.close()
        return tf.Summary.Image(height=height,
                             width=width,
                             colorspace=channel,
                             encoded_image_string=image_string)
    
    class TensorBoardImage(keras.callbacks.Callback):
        def __init__(self, tag):
            super().__init__() 
            self.tag = tag
    
        def on_epoch_end(self, epoch, logs={}):
            # Load image
            img = data.astronaut()
            # Do something to the image
            img = (255 * skimage.util.random_noise(img)).astype('uint8')
    
            image = make_image(img)
            summary = tf.Summary(value=[tf.Summary.Value(tag=self.tag, image=image)])
            writer = tf.summary.FileWriter('./logs')
            writer.add_summary(summary, epoch)
            writer.close()
    
            return
    
    tbi_callback = TensorBoardImage('Image Example')
    

    Just pass the callback to fit or fit_generator.

    Note that you can also run some operations using the model inside the callback. For example, you may run the model on some images to check its performance.

    screen