Morphy / app2.py
K00B404's picture
Rename app.py to app2.py
7b8ed58 verified
Raw History Blame Contribute Delete
4.37 kB
import gradio as gr
import numpy as np
import cv2
import torch
import random
import os
import spaces
'''
class ImageMorpher:
def __init__(self, num_frames=30, fps=10):
self.num_frames = num_frames
self.fps = fps
def morph_images(self, image_A, image_B):
"""Morphs two images."""
image_A = np.array(image_A)
image_B = np.array(image_B)
if image_A.shape != image_B.shape:
raise ValueError("Images must have the same dimensions.")
if image_A.dtype != image_B.dtype:
raise ValueError("Images must have the same data type.")
height, width, _ = image_A.shape
morphed_images = []
for i in range(self.num_frames + 1):
alpha = i / self.num_frames
beta = 1 - alpha
morphed_image = cv2.addWeighted(image_A, alpha, image_B, beta, 0)
morphed_images.append(morphed_image)
return morphed_images
def create_mp4(self, images, output_path="output.mp4"):
"""Creates an MP4 video from a list of images."""
height, width, _ = images[0].shape
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter(output_path, fourcc, self.fps, (width, height))
for image in images:
video_writer.write(image)
video_writer.release()
def morph_image_chain(self, images):
"""Morphs a chain of images and returns the video path."""
morphed_images = []
for i in range(len(images) - 1):
morphed_images.extend(self.morph_images(images[i], images[i + 1]))
self.create_mp4(morphed_images)
return "output.mp4"
def swap_to_gallery(images):
return gr.update(value=images, visible=True), gr.update(visible=True), gr.update(visible=False)
def upload_example_to_gallery(images, prompt, style, negative_prompt):
return gr.update(value=images, visible=True), gr.update(visible=True), gr.update(visible=False)
def remove_back_to_files():
return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
# Create an instance of the ImageMorpher class
morpher = ImageMorpher()
"""
# Define the Gradio interface
### Description and style
logo = r"""
<center><img src='https://photo-maker.github.io/assets/logo.png' alt='PhotoMaker logo' style="width:80px; margin-bottom:10px"></center>
"""
title = r"""
<h1 align="center">🤗 Morphy the morpher 🤗</h1>
"""
description = r"""
<b></b>
<br>
Morph image chain into mp4
<br>
How to use:<br>
-Select two or more images using the "select" tool in the "Images" input field.<br>
-Click "Submit".<br>
The "Output Video" block will display the morphed video, which you can watch and download.<br>
"""
css = '''
.gradio-container {width: 85% !important}
'''
"""
with gr.Blocks(css=css) as demo:
gr.Markdown(logo)
gr.Markdown(title)
gr.Markdown(description)
with gr.Row():
with gr.Column():
fn=morpher.morph_image_chain,
files = gr.File(
label="Drag (Select) 1 or more photos of your face",
file_types=["image"],
file_count="multiple"
)
inputs = gr.Gallery(label="Your images",type="numpy", visible=False, columns=5, rows=1, height=200)
with gr.Column(visible=False) as clear_button:
remove_and_reupload = gr.ClearButton(value="Remove and upload new ones", components=files, size="sm")
with gr.Column():
outputs=gr.Video(label="Output Video",interactive=False),
title="Image Chain Morphing App",
with gr.Column():
gallery = gr.Gallery(label="Generated Images")
files.upload(fn=swap_to_gallery, inputs=files, outputs=[files, clear_button, files])
remove_and_reupload.click(fn=remove_back_to_files, outputs=[files, clear_button, files])
demo.launch()
"""
import app1
'''
Explanation:
ImageMorpher class:
Encapsulates the morphing logic and video creation.
Has num_frames and fps attributes for customization.
morph_images method handles morphing two images.
create_mp4 method creates the MP4 video.
morph_image_chain method:
Iterates through the input image list and morphs each pair.
Creates the final MP4 video using create_mp4.
Returns the path to the video file.
'''