# Based on: https://github.com/jantic/DeOldify import os, re, time os.environ["TORCH_HOME"] = os.path.join(os.getcwd(), ".cache") os.environ["XDG_CACHE_HOME"] = os.path.join(os.getcwd(), ".cache") import streamlit as st import PIL import cv2 import numpy as np import uuid from zipfile import ZipFile, ZIP_DEFLATED from io import BytesIO from random import randint from datetime import datetime from src.deoldify import device from src.deoldify.device_id import DeviceId from src.deoldify.visualize import * from src.app_utils import get_model_bin device.set(device=DeviceId.CPU) @st.cache(allow_output_mutation=True, show_spinner=False) def load_model(model_dir, option): if option.lower() == 'artistic': model_url = 'https://data.deepai.org/deoldify/ColorizeArtistic_gen.pth' get_model_bin(model_url, os.path.join(model_dir, "ColorizeArtistic_gen.pth")) colorizer = get_image_colorizer(artistic=True) elif option.lower() == 'stable': model_url = "https://www.dropbox.com/s/usf7uifrctqw9rl/ColorizeStable_gen.pth?dl=0" get_model_bin(model_url, os.path.join(model_dir, "ColorizeStable_gen.pth")) colorizer = get_image_colorizer(artistic=False) return colorizer def resize_img(input_img, max_size): img = input_img.copy() img_height, img_width = img.shape[0],img.shape[1] if max(img_height, img_width) > max_size: if img_height > img_width: new_width = img_width*(max_size/img_height) new_height = max_size resized_img = cv2.resize(img,(int(new_width), int(new_height))) return resized_img elif img_height <= img_width: new_width = img_height*(max_size/img_width) new_height = max_size resized_img = cv2.resize(img,(int(new_width), int(new_height))) return resized_img return img def colorize_image(pil_image, img_size=800) -> "PIL.Image": # Open the image pil_img = pil_image.convert("RGB") img_rgb = np.array(pil_img) resized_img_rgb = resize_img(img_rgb, img_size) resized_pil_img = PIL.Image.fromarray(resized_img_rgb) # Send the image to the model output_pil_img = colorizer.plot_transformed_pil_image(resized_pil_img, render_factor=35, compare=False) return output_pil_img def image_download_button(pil_image, filename: str, fmt: str, label="Download"): if fmt not in ["jpg", "png"]: raise Exception(f"Unknown image format (Available: {fmt} - case sensitive)") pil_format = "JPEG" if fmt == "jpg" else "PNG" file_format = "jpg" if fmt == "jpg" else "png" mime = "image/jpeg" if fmt == "jpg" else "image/png" buf = BytesIO() pil_image.save(buf, format=pil_format) return st.download_button( label=label, data=buf.getvalue(), file_name=f'{filename}.{file_format}', mime=mime, ) ########################### ###### STREAMLIT CODE ##### ########################### st_color_option = "Artistic" # Load models try: with st.spinner("Loading..."): print('before loading the model') colorizer = load_model('models/', st_color_option) print('after loading the model') except Exception as e: colorizer = None print('Error while loading the model. Please refresh the page') print(e) st.write("**App loading error. Please try again later.**") if colorizer is not None: st.title("AI Photo Colorization") st.image(open("assets/demo.jpg", "rb").read()) st.markdown( """ Colorizing black & white photo can be expensive and time consuming. We introduce AI that can colorize grayscale photo in seconds. **Just upload your grayscale image, then click colorize.** """ ) uploaded_file = st.file_uploader("Upload photo", accept_multiple_files=False, type=["png", "jpg", "jpeg"]) if uploaded_file is not None: bytes_data = uploaded_file.getvalue() img_input = PIL.Image.open(BytesIO(bytes_data)).convert("RGB") with st.expander("Original photo", True): st.image(img_input) if st.button("Colorize!") and uploaded_file is not None: with st.spinner("AI is doing the magic!"): img_output = colorize_image(img_input) img_output = img_output.resize(img_input.size) # NOTE: Calm! I'm not logging the input and outputs. # It is impossible to access the filesystem in spaces environment. now = datetime.now().strftime("%Y%m%d-%H%M%S-%f") img_input.convert("RGB").save(f"./output/{now}-input.jpg") img_output.convert("RGB").save(f"./output/{now}-output.jpg") st.write("AI has finished the job!") st.image(img_output) # reuse = st.button('Edit again (Re-use this image)', on_click=set_image, args=(inpainted_img, )) uploaded_name = os.path.splitext(uploaded_file.name)[0] image_download_button( pil_image=img_output, filename=uploaded_name, fmt="jpg", label="Download Image" )