File size: 2,476 Bytes
49256a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from cProfile import label
import glob
import gradio as gr
import tensorflow as tf
from huggingface_hub import from_pretrained_keras
import numpy as np

pixel_cnn = from_pretrained_keras("keras-io/pixel-cnn-mnist")


def infer(batch):
    pixels = np.zeros(shape=(batch,) + (pixel_cnn.input_shape)[1:])
    batch, rows, cols, channels = pixels.shape

    # Iterate over the pixels because generation has to be done sequentially pixel by pixel.
    for row in range(rows):
        for col in range(cols):
            for channel in range(channels):
                # Feed the whole array and retrieving the pixel value probabilities for the next
                # pixel.
                probs = pixel_cnn.predict(pixels)[:, row, col, channel]
                # Use the probabilities to pick pixel values and append the values to the image
                # frame.
                pixels[:, row, col, channel] = tf.math.ceil(
                    probs - tf.random.uniform(probs.shape)
                )

    for i, pic in enumerate(pixels):
        tf.keras.preprocessing.image.save_img(
            "/tmp/generated_image_{}.png".format(i), deprocess_image(np.squeeze(pic, -1))
        )
    return glob.glob("/tmp/generated*")


def deprocess_image(x):
    # Stack the single channeled black and white image to RGB values.
    x = np.stack((x, x, x), 2)
    # Undo preprocessing
    x *= 255.0
    # Convert to uint8 and clip to the valid range [0, 255]
    x = np.clip(x, 0, 255).astype("uint8")
    return x


article = """<center>
Authors: Space by <a href='https://twitter.com/johko990' target='_blank'><b>Johannes Kolbe</b></a>, model by İhsan Soydemir after an example by ADMoreau at 
<a href='https://keras.io/examples/generative/pixelcnn/' target='_blank'><b>keras.io</b></a> <br>
<a href='https://arxiv.org/abs/1606.05328' target='_blank'><b>Original paper</b></a> by van den Oord et al."""


description = """Image generation using a CNN. The model is trained on MNIST data, so the generation capabilities are limited to MNIST like images. <br>
Just use the slider to set how many images should be created.<br>
The execution might take some time."""


Iface = gr.Interface(
    fn=infer,
    inputs=gr.inputs.Slider(minimum=1, maximum=20, default=4, step=1, label="Number of images to generate"),
    outputs=gr.outputs.Carousel(["image"]),
    title="PixelCNN - MNIST Image Generation",
    article=article,
    description=description,
).launch(enable_queue=True)