import os import warnings import logging # ---------------------------- # 1. Warning & logging setup # ---------------------------- # Suppress FutureWarning from timm internals warnings.filterwarnings( "ignore", category=FutureWarning, module="timm.models.layers" ) # Suppress UserWarning from modelscope (e.g. missing preprocessor config) warnings.filterwarnings( "ignore", category=UserWarning, module="modelscope" ) # Only show ERROR+ logs from modelscope logging.getLogger("modelscope").setLevel(logging.ERROR) # ---------------------------- # 2. Standard imports # ---------------------------- import cv2 import tempfile import gradio as gr import numpy as np from PIL import Image, ImageEnhance, ImageFilter from modelscope.outputs import OutputKeys from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks # ---------------------------- # 3. Load your colorization model # ---------------------------- img_colorization = pipeline( Tasks.image_colorization, model="iic/cv_ddcolor_image-colorization", model_revision="v1.02", # explicitly specify revision ) # ---------------------------- # 4. Image processing fns # ---------------------------- def colorize_image(img_path: str) -> str: image = cv2.imread(str(img_path)) output = img_colorization(image[..., ::-1]) result = output[OutputKeys.OUTPUT_IMG].astype(np.uint8) temp_dir = tempfile.mkdtemp() out_path = os.path.join(temp_dir, "colorized.png") cv2.imwrite(out_path, result) return out_path def enhance_image( img_path: str, brightness: float = 1.0, contrast: float = 1.0, edge_enhance: bool = False ) -> str: image = Image.open(img_path) image = ImageEnhance.Brightness(image).enhance(brightness) image = ImageEnhance.Contrast(image).enhance(contrast) if edge_enhance: image = image.filter(ImageFilter.EDGE_ENHANCE) temp_dir = tempfile.mkdtemp() enhanced_path = os.path.join(temp_dir, "enhanced.png") image.save(enhanced_path) return enhanced_path def process_image( img_path: str, brightness: float, contrast: float, edge_enhance: bool, output_format: str ): # Colorize → Enhance → Re‑save in chosen format colorized_path = colorize_image(img_path) enhanced_path = enhance_image(colorized_path, brightness, contrast, edge_enhance) img = Image.open(enhanced_path) temp_dir = tempfile.mkdtemp() filename = f"colorized_image.{output_format.lower()}" output_path = os.path.join(temp_dir, filename) img.save(output_path, format=output_format.upper()) # Return side-by-side gallery and downloadable file return ([img_path, enhanced_path], output_path) # ---------------------------- # 5. Gradio UI + custom CSS # ---------------------------- custom_css = """ body { background-color: #f0f2f5; } .gradio-container { max-width: 900px !important; margin: auto !important; } #header { background-color: #4CAF50; padding: 20px; border-radius: 8px; text-align: center; margin-bottom: 20px; } #header h2, #header p { color: white; margin: 0; } #header p { margin-top: 5px; font-size: 1rem; } #control-panel { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); margin-bottom: 20px; } #submit-btn { background-color: #4CAF50 !important; color: white !important; border-radius: 8px !important; font-weight: bold; padding: 10px 20px !important; margin-top: 10px !important; } #control-panel .gr-row { gap: 15px; } .gr-slider, .gr-checkbox, .gr-dropdown { margin-top: 10px; } #comparison_gallery { background: white; padding: 10px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } #download-btn { margin-top: 15px !important; } """ TITLE = "🌈 Color Restorization Model" DESCRIPTION = "Bring your old black & white photos back to life—upload, adjust, and download in vivid color." with gr.Blocks(title=TITLE, css=custom_css) as app: # Header gr.HTML( """
Bring your old black & white photos back to life—upload, adjust, and download in vivid color.