import streamlit as st
from PIL import Image
import numpy as np
import tensorflow as tf
import tensorflow_hub as hub
st.title("Fast Neural image style transfer")
st.write("Streamlit demo for Fast arbitrary image style transfer using a pretrained Image Stylization model from TensorFlow Hub. To use it, simply upload a content image and style image. To learn more about the project, please find the references listed below.")
# Load image stylization module.
@st.cache(allow_output_mutation=True)
def load_model():
return hub.load("https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2")
style_transfer_model = load_model()
def perform_style_transfer(content_image, style_image):
# Convert to float32 numpy array, add batch dimension, and normalize to range [0, 1]
content_image = tf.convert_to_tensor(content_image, np.float32)[tf.newaxis, ...] / 255.
style_image = tf.convert_to_tensor(style_image, np.float32)[tf.newaxis, ...] / 255.
output = style_transfer_model(content_image, style_image)
stylized_image = output[0]
return Image.fromarray(np.uint8(stylized_image[0] * 255))
# Upload content and style images.
content_image = st.file_uploader("Upload a content image")
style_image = st.file_uploader("Upload a style image")
# default images
st.write("Or you can choose from the following examples")
col1, col2, col3,col4 = st.columns(4)
if col1.button("Couple on bench"):
content_image = "examples/couple_on_bench.jpeg"
style_image = "examples/starry_night.jpeg"
if col2.button("Couple Walking"):
content_image = "examples/couple_walking.jpeg"
style_image = "examples/couple_watercolor.jpeg"
if col3.button("Golden Gate Bridge"):
content_image = "examples/golden_gate_bridge.jpeg"
style_image = "examples/couple_watercolor.jpeg"
if col4.button("Joshua Tree"):
content_image = "examples/joshua_tree.jpeg"
style_image = "examples/starry_night.jpeg"
if style_image and content_image is not None:
col1, col2 = st.columns(2)
content_image = Image.open(content_image)
# It is recommended that the style image is about 256 pixels (this size was used when training the style transfer network).
style_image = Image.open(style_image).resize((256, 256))
col1.header("Content Image")
col1.image(content_image, use_column_width=True)
col2.header("Style Image")
col2.image(style_image, use_column_width=True)
output_image=perform_style_transfer(content_image, style_image)
st.header("Output: Style transfer Image")
st.image(output_image, use_column_width=True)
# scroll down to see the references
st.markdown("**References**")
st.markdown("1. Exploring the structure of a real-time, arbitrary neural artistic stylization network", unsafe_allow_html=True)
st.markdown("2. Tutorial to implement Fast Neural Style Transfer using the pretrained model from TensorFlow Hub \n", unsafe_allow_html=True)
st.markdown("3. The idea to build a neural style transfer application was inspired from this Hugging Face Space ", unsafe_allow_html=True)