File size: 7,298 Bytes
f6e4309
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dadad91
f6e4309
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
import gradio as gr
from PIL import Image
import cv2
import os, random, gc
import numpy as np
from transformers import pipeline
import PIL.Image
from diffusers.utils import load_image, export_to_video
from accelerate import Accelerator
from diffusers import StableDiffusionControlNetImg2ImgPipeline, ControlNetModel, UniPCMultistepScheduler
import torch
from moviepy.video.fx.all import crop
from diffusers.utils import export_to_gif
import mediapy
from image_tools.sizes import resize_and_crop
from moviepy.editor import *
from pathlib import Path
from typing import Optional, List
from tqdm import tqdm
import supervision as sv


accelerator = Accelerator(cpu=True)
models =[
    "runwayml/stable-diffusion-v1-5",
    "prompthero/openjourney-v4",
    "CompVis/stable-diffusion-v1-4",
    "stabilityai/stable-diffusion-2-1",
    "stablediffusionapi/edge-of-realism",
    "wavymulder/lomo-diffusion",
    "sd-dreambooth-library/fashion",
    "DucHaiten/DucHaitenDreamWorld",
    "kandinsky-community/kandinsky-2-1",
    "MirageML/lowpoly-cyberpunk",
    "plasmo/woolitize-768sd1-5",
    "plasmo/food-crit",
    "johnslegers/epic-diffusion-v1.1",
    "Fictiverse/ElRisitas",
    "robotjung/SemiRealMix",
    "herpritts/FFXIV-Style",
    "RayHell/popupBook-diffusion",
    "deadman44/SD_Photoreal_Merged_Models",
    "johnslegers/epic-diffusion",
    "tilake/China-Chic-illustration",
    "wavymulder/modelshoot",
    "prompthero/openjourney-lora",
    "Fictiverse/Stable_Diffusion_VoxelArt_Model",
    "darkstorm2150/Protogen_v2.2_Official_Release",
    "hassanblend/HassanBlend1.5.1.2",
    "hassanblend/hassanblend1.4",
    "nitrosocke/redshift-diffusion",
    "prompthero/openjourney-v2",
    "nitrosocke/Arcane-Diffusion",
    "Lykon/DreamShaper",
    "nitrosocke/mo-di-diffusion",
    "dreamlike-art/dreamlike-diffusion-1.0",
    "dreamlike-art/dreamlike-photoreal-2.0",
    "digiplay/RealismEngine_v1",
    "digiplay/AIGEN_v1.4_diffusers",
    "stablediffusionapi/dreamshaper-v6",
    "JackAnon/GorynichMix",
    "p1atdev/liminal-space-diffusion",
    "nadanainone/gigaschizonegs",
    "darkVOYAGE/dvMJv4",
    "digiplay/GhostMix",
    "ThePioneer/MISA",
    "TheLastBen/froggy-style-v21-768",
    "FloydianSound/Nixeu_Diffusion_v1-5",
    "kakaobrain/karlo-v1-alpha-image-variations",
    "digiplay/PotoPhotoRealism_v1",
    "ConsistentFactor/Aurora-By_Consistent_Factor",
    "rim0/quadruped_mechas",
    "Akumetsu971/SD_Samurai_Anime_Model",
    "sd-dreambooth-library/original-character-cyclps",
    "AIArtsChannel/steampunk-diffusion",
]

controlnet = accelerator.prepare(ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float32))
def plex(fpath, text, neg_prompt, modil, one, two, three, four, five):
    gc.collect()
    modal=""+modil+""
    pipe = accelerator.prepare(StableDiffusionControlNetImg2ImgPipeline.from_pretrained(modal, controlnet=controlnet, torch_dtype=torch.float32, use_safetensors=False, safety_checker=None))
    pipe.unet.to(memory_format=torch.channels_last)
    pipe.scheduler = accelerator.prepare(DPMSolverMultistepScheduler.from_config(pipe.scheduler.config))
    pipe = pipe.to("cpu")
    prompt = text
    video = './video.mp4'
    orvid = './orvid.mp4'
    canvid = './canvid.mp4'
    frames = []
    canframes = []
    orframes = []
    fin_frames = []
    max_frames=0
    cap = cv2.VideoCapture(fpath)
    clip = VideoFileClip(fpath)
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    fps = cap.get(cv2.CAP_PROP_FPS)
    aspect = width / height
    if aspect == 1 and height >= 512:
        nwidth = 512
        nheight = 512
        prep = clip.resize(height=nheight)
        left = 0
        top = 0
        right = 512
        bottom = 512
    if aspect > 1 and height >= 512:
        nheight = 512
        nwidth = int(nheight * aspect)
        prep = clip.resize(height=nheight)
        left = (nwidth - width) / 2
        top = 0
        right = (nwidth + width) / 2
        bottom = nheight
    if aspect < 1 and width >= 512:
        nwidth = 512
        nheight = int(nwidth / aspect)
        prep = clip.resize(height=nheight)
        left = 0
        top = (height - nheight) / 2
        right = nwidth
        bottom = (height + nheight) / 2
    if aspect < 1 and width < 512:
        return None
    if aspect > 1 and height < 512:
        return None
    closer = crop(clip, x1=left, y1=top, x2=right, y2=bottom)
    if fps > 33:
        closer.write_videofile('./video.mp4', fps=33)
        fps = 33
    else:
        closer.write_videofile('./video.mp4', fps=fps)
        fps = fps
    max_frames = int(fps * 4)
    for frame in tqdm(sv.get_video_frames_generator(source_path=video,)):
        frames.append(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    cap.release()
    cv2.destroyAllWindows()
    ncap = cv2.VideoCapture(video)
    total_frames = int(ncap.get(cv2.CAP_PROP_FRAME_COUNT))
    if total_frames <= 0:
        return None
    b = 0
    if total_frames > max_frames:
        max_frames = int(max_frames - 1)
    if total_frames < max_frames:
        max_frames = int(total_frames - 1)
    for b in range(int(max_frames)):
        frame = frames[b]
        original = load_image(Image.fromarray(frame))
        original.save('./image.png', 'PNG')
        original = original.resize((512, 512))
        original = original.convert("RGB")
        original.save('./image.png', 'PNG')
        orframes.append(original)
        cannyimage = np.array(original)
        cannyimage = cv2.Canny(cannyimage, 100, 200)
        cannyimage = cannyimage[:, :, None]
        cannyimage = np.concatenate([cannyimage, cannyimage, cannyimage], axis=2)
        cannyimage = Image.fromarray(cannyimage)
        canframes.append(cannyimage)
        generator = torch.Generator(device="cpu").manual_seed(five)
        imoge = pipe(prompt=prompt,image=[original],control_image=[cannyimage],guidance_scale=four,num_inference_steps=one,generator=generator,strength=two,negative_prompt=neg_prompt,controlnet_conditioning_scale=three,width=512,height=512)
        fin_frames.append(imoge.images[0])
        b += 1
    ncap.release()
    cv2.destroyAllWindows()
    export_to_video(fin_frames, video, fps=fps)
    export_to_video(orframes, orvid, fps=fps)
    export_to_video(canframes, canvid, fps=fps)
    return video, canvid, orvid

iface = gr.Interface(fn=plex, inputs=[gr.File(label="Your video",interactive=True),gr.Textbox(label="prompt"),gr.Textbox(label="neg prompt"),gr.Dropdown(choices=models, label="some sd models", value=models[0], type="value"), gr.Slider(label="num inference steps", minimum=1, step=1, maximum=10, value=5), gr.Slider(label="prompt strength", minimum=0.01, step=0.01, maximum=20.00, value=5.00), gr.Slider(label="controlnet scale", minimum=0.01, step=0.01, maximum=1.00, value=0.80), gr.Slider(label="Guidance scale", minimum=0.01, step=0.01, maximum=10.00, value=2.00), gr.Slider(label="Manual seed", minimum=1, step=32, maximum=4836928, value=1)], outputs=[gr.Video(label="final"), gr.Video(label="canny vid"), gr.Video(label="orig")],description="Running on cpu, very slow! by JoPmt.")
iface.queue(max_size=1,api_open=False)
iface.launch(max_threads=1)