import torch import gradio as gr from pytube import YouTube from pdb import set_trace from colorizer import colorize_vid from dcgan import * # ================================ # EXAMPLE_FPS = "Same as original" examples = [ ["examples/1_falcon.mp4", "modelv2", "Same as original"], # 4:21 # ["examples/2_mughal.mp4", "modelv1", 12], # 4:30 ["examples/3_wizard.mp4", "modelv1", 6], # 7 min # ["examples/4_elgar.mp4", "modelv2", 6] # 22 min ] model_choices = [ "modelv2", "modelv1", ] loaded_models = {} for model_weights in model_choices: model = torch.load(f"{model_weights}.pth", map_location=torch.device('cpu')) model.eval() # also done in colorizer loaded_models[model_weights] = model def colorize_video(path_video, chosen_model, chosen_fps, start='', end=''): if not path_video: return return colorize_vid( path_video, loaded_models[chosen_model], chosen_fps, start, end ) def download_youtube(url): try: yt = YouTube(url) streams = yt.streams.filter( progressive=True, file_extension='mp4').order_by('resolution') return streams[0].download() except BaseException: raise Exception("Invalid URL or Video Unavailable") app = gr.Blocks() with app: gr.Markdown("#

Movie and Video Colorization

") gr.Markdown( """

Colorize black-and-white movies or videos with a DCGAN-based model!
Project by David Peng, Annie Lin, Adam Zapatka, and Maggy Lambo.

""" ) gr.Markdown("### Step 1: Choose a YouTube video (or upload locally below)") youtube_url = gr.Textbox(label="YouTube Video URL") youtube_url_btn = gr.Button(value="Extract YouTube Video") with gr.Row(): gr.Markdown("### Step 2: Adjust settings") gr.Markdown("### Step 3: Hit \"Colorize\"") with gr.Row(): bw_video = gr.Video(label="Black-and-White Video") colorized_video = gr.Video(label="Colorized Video") with gr.Row(): with gr.Column(): with gr.Row(): start_time = gr.Text( label="Start Time (hh:mm:ss or blank for original)", value='') end_time = gr.Text( label="End Time (hh:mm:ss or blank for original)", value='') with gr.Column(): bw_video_btn = gr.Button(value="Colorize", variant="primary") with gr.Row(): with gr.Column(): model_dropdown = gr.Dropdown( model_choices, value=model_choices[0], label="Model" ) fps_dropdown = gr.Dropdown( [3, 6, 12, 24, 30, "Same as original"], value=6, label="FPS of Colorized Video" ) gr.Markdown( """ #### Colorization Notes - Leave start, end times blank to colorize the entire video - To lower colorization time, you can decrease FPS, resolution, or duration - *modelv2* tends to color videos orange and sepia - *modelv1* tends to color videos with a variety of colors - *modelv2* and *modelv1* use the same modified DCGAN architecture but differ in results because of randomization in training #### More Reading - Colorizing black & white images with U-Net and conditional GAN - Image Colorization with Generative Adversarial Networks """ ) with gr.Column(): gr.Examples( examples=examples, inputs=[bw_video, model_dropdown, fps_dropdown], outputs=[colorized_video], fn=colorize_video, cache_examples=True, ) youtube_url_btn.click( download_youtube, inputs=youtube_url, outputs=bw_video ) bw_video_btn.click( colorize_video, inputs=[bw_video, model_dropdown, fps_dropdown, start_time, end_time], outputs=colorized_video ) app.launch()