File size: 8,936 Bytes
f86ef0c
 
 
 
 
 
55f4105
 
f86ef0c
c2f0585
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3930c33
c2f0585
 
 
 
 
521a864
f86ef0c
 
 
e3e5e4b
3e0bf53
c25d024
55f4105
 
 
 
e5158fd
cd28a2d
8fb92bc
cd28a2d
f00b283
f7c0284
f00b283
990502e
f00b283
34ac09b
990502e
 
db91780
 
f00b283
260ef11
0a81284
 
f00b283
45ad881
ac0a6da
 
3341831
 
1ec9bd2
 
2f6b89f
 
3e0bf53
f86ef0c
f5b7834
f86ef0c
 
 
c25d024
f86ef0c
 
 
 
 
 
 
c2f0585
36374ad
c2f0585
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b0d98c
eb5cb7c
 
f86ef0c
6b98730
3eb21bd
e577eb4
 
ccf7d79
3e0bf53
7c7de36
e577eb4
 
ccf7d79
7c7de36
c2f0585
 
 
 
 
7c7de36
 
 
 
c2f0585
 
 
 
7c7de36
c25d024
36374ad
f86ef0c
 
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
179
180
181
182
183
184
185
import gradio as gr
import requests
import io
import random
import os
from PIL import Image
from deep_translator import GoogleTranslator
from langdetect import detect

import cv2
import torch
from basicsr.archs.srvgg_arch import SRVGGNetCompact
from gfpgan.utils import GFPGANer
from realesrgan.utils import RealESRGANer

os.system("pip freeze")
# download weights
if not os.path.exists('realesr-general-x4v3.pth'):
    os.system("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth -P .")
if not os.path.exists('GFPGANv1.2.pth'):
    os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.2.pth -P .")
if not os.path.exists('GFPGANv1.3.pth'):
    os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P .")
if not os.path.exists('GFPGANv1.4.pth'):
    os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -P .")
if not os.path.exists('RestoreFormer.pth'):
    os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/RestoreFormer.pth -P .")
if not os.path.exists('CodeFormer.pth'):
    os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/CodeFormer.pth -P .")


# background enhancer with RealESRGAN
model_us = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=32, upscale=4, act_type='prelu')
model_us_path = 'realesr-general-x4v3.pth'
half = True if torch.cuda.is_available() else False
upsampler = RealESRGANer(scale=4, model_path=model_us_path, model=model_us, tile=0, tile_pad=10, pre_pad=0, half=half)

os.makedirs('output', exist_ok=True)



API_URL = "https://api-inference.huggingface.co/models/openskyml/dalle-3-xl"
API_TOKEN = os.getenv("HF_READ_TOKEN") # it is free
headers = {"Authorization": f"Bearer {API_TOKEN}"}

models_list = ["AbsoluteReality 1.8.1", "DALL-E 3 XL", "Playground 2", "Openjourney 4", "Lyriel 1.6", "Animagine XL 2.0", "Counterfeit 2.5", "Realistic Vision 5.1", "Incursios 1.6", "Anime Detailer XL LoRA", "epiCRealism", "PixelArt XL", "NewReality XL"]

def query(prompt, model, is_negative=False, steps=20, cfg_scale=7, seed=None):
    language = detect(prompt)
    
    if language == 'ru':
        prompt = GoogleTranslator(source='ru', target='en').translate(prompt)
    print(f'\033[1mГенерация:\033[0m {prompt}')
    
    if model == 'DALL-E 3 XL':
        API_URL = "https://api-inference.huggingface.co/models/openskyml/dalle-3-xl"
    if model == 'Playground 2':
        API_URL = "https://api-inference.huggingface.co/models/playgroundai/playground-v2-1024px-aesthetic"
    if model == 'Openjourney 4':
        API_URL = "https://api-inference.huggingface.co/models/prompthero/openjourney-v4"
    if model == 'AbsoluteReality 1.8.1':
        API_URL = "https://api-inference.huggingface.co/models/digiplay/AbsoluteReality_v1.8.1"
    if model == 'Lyriel 1.6':
        API_URL = "https://api-inference.huggingface.co/models/stablediffusionapi/lyrielv16"
    if model == 'Animagine XL 2.0':
        API_URL = "https://api-inference.huggingface.co/models/Linaqruf/animagine-xl-2.0"
    if model == 'Counterfeit 2.5':
        API_URL = "https://api-inference.huggingface.co/models/gsdf/Counterfeit-V2.5"
    if model == 'Realistic Vision 5.1':
        API_URL = "https://api-inference.huggingface.co/models/stablediffusionapi/realistic-vision-v51"
    if model == 'Incursios 1.6':
        API_URL = "https://api-inference.huggingface.co/models/digiplay/incursiosMemeDiffusion_v1.6"
    if model == 'Anime Detailer XL LoRA':
        API_URL = "https://api-inference.huggingface.co/models/Linaqruf/anime-detailer-xl-lora"
    if model == 'epiCRealism':
        API_URL = "https://api-inference.huggingface.co/models/emilianJR/epiCRealism"
    if model == 'PixelArt XL':
        API_URL = "https://api-inference.huggingface.co/models/nerijs/pixel-art-xl"
    if model == 'NewReality XL':
        API_URL = "https://api-inference.huggingface.co/models/stablediffusionapi/newrealityxl-global-nsfw"
    
    payload = {
        "inputs": prompt,
        "is_negative": is_negative,
        "steps": steps,
        "cfg_scale": cfg_scale,
        "seed": seed if seed is not None else random.randint(-1, 2147483647)
        }

    image_bytes = requests.post(API_URL, headers=headers, json=payload).content
    image = Image.open(io.BytesIO(image_bytes))
    return image



def up(img, version, scale, weight):
    weight /= 100
    print(img, version, scale, weight)
    try:
        extension = os.path.splitext(os.path.basename(str(img)))[1]
        img = cv2.imread(img, cv2.IMREAD_UNCHANGED)
        if len(img.shape) == 3 and img.shape[2] == 4:
            img_mode = 'RGBA'
        elif len(img.shape) == 2:  # for gray inputs
            img_mode = None
            img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
        else:
            img_mode = None

        if version == 'v1.2':
            face_enhancer = GFPGANer(
            model_us_path='GFPGANv1.2.pth', upscale=2, arch='clean', channel_multiplier=2, bg_upsampler=upsampler)
        elif version == 'v1.3':
            face_enhancer = GFPGANer(
            model_us_path='GFPGANv1.3.pth', upscale=2, arch='clean', channel_multiplier=2, bg_upsampler=upsampler)
        elif version == 'v1.4':
            face_enhancer = GFPGANer(
            model_us_path='GFPGANv1.4.pth', upscale=2, arch='clean', channel_multiplier=2, bg_upsampler=upsampler)
        elif version == 'RestoreFormer':
            face_enhancer = GFPGANer(
            model_us_path='RestoreFormer.pth', upscale=2, arch='RestoreFormer', channel_multiplier=2, bg_upsampler=upsampler)
        elif version == 'CodeFormer':
            face_enhancer = GFPGANer(
            model_us_path='CodeFormer.pth', upscale=2, arch='CodeFormer', channel_multiplier=2, bg_upsampler=upsampler)

        try:
            _, _, output = face_enhancer.enhance(img, has_aligned=False, only_center_face=False, paste_back=True, weight=weight)
        except RuntimeError as error:
            print('Error', error)

        try:
            interpolation = cv2.INTER_AREA if scale < 2 else cv2.INTER_LANCZOS4
            h, w = img.shape[0:2]
            output = cv2.resize(output, (int(w * scale), int(h * scale)), interpolation=interpolation)
        except Exception as error:
            print('wrong scale input.', error)
        if img_mode == 'RGBA':  # RGBA images should be saved in png format
            extension = 'png'
        else:
            extension = 'jpg'
        save_path = f'output/out.{extension}'
        cv2.imwrite(save_path, output)

        output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
        return output
    except Exception as error:
        print('global exception', error)
        return None




css = """
footer {visibility: hidden !important;}
"""

with gr.Blocks(css=css) as dalle:
    with gr.Tab("Базовые настройки"):
        with gr.Row():
            with gr.Column(elem_id="prompt-container"):
                text_prompt = gr.Textbox(label="Prompt", placeholder="Описание изображения", lines=3, elem_id="prompt-text-input")
                model = gr.Radio(label="Модель", value="DALL-E 3 XL", choices=models_list)
                

    with gr.Tab("Расширенные настройки"):
        negative_prompt = gr.Textbox(label="Negative Prompt", placeholder="Чего не должно быть на изображении", value="[deformed | disfigured], poorly drawn, [bad : wrong] anatomy, [extra | missing | floating | disconnected] limb, (mutated hands and fingers), blurry, text, fuzziness", lines=3, elem_id="negative-prompt-text-input")

    with gr.Tab("Настройки апскейлинга"):
        up_1 = gr.Radio(choices=['v1.2', 'v1.3', 'v1.4', 'RestoreFormer', 'CodeFormer'], value='v1.4', label='Версия'),
        up_2 = gr.Slider(label="Коэффициент масштабирования", value=2, minimum=2, maximum=6),
        up_3 = gr.Slider(0, 100, label='Weight, только для CodeFormer. 0 для лучшего качества, 100 для лучшей идентичности', value=50)
    
    with gr.Row():
        text_button = gr.Button("Генерация", variant='primary', elem_id="gen-button")
    with gr.Row():
        image_output = gr.Image(type="pil", label="Изображение", elem_id="gallery")
    with gr.Row():
        up_button = gr.Button("Улучшить изображение", variant='primary', elem_id="gen-button")
    with gr.Row():
        up_output = gr.Image(type="pil", label="Улучшенное изображение", elem_id="gallery"),
        
    text_button.click(query, inputs=[text_prompt, model, negative_prompt], outputs=image_output)
    up_button.click(up, inputs=[image_output, up_1, up_2, up_3], outputs=up_output)

dalle.launch(show_api=False)