UniPortrait / src /process.py
Junjie96's picture
Upload 38 files
dbac7c5 verified
import time
import uuid
import gradio as gr
import numpy as np
from PIL import Image
from .generation import call_generation
from .util import upload_np_2_oss
def get_image_url(request_id, pil_image, suffix):
np_image = np.array(pil_image.convert("RGB"))
image_url = upload_np_2_oss(np_image, request_id + suffix)
return image_url
def is_no_image_placeholder(pil_image):
from PIL import Image, ImageChops
no_image_placeholder = Image.open("assets/No-Image-Placeholder.png").convert("RGB")
diff = ImageChops.difference(pil_image, no_image_placeholder)
if diff.getbbox() is None:
return True
else:
return False
def text_to_single_id_generation_process(
pil_faceid=None, pil_supp_faceids=None,
pil_mix_faceid_1=None, mix_scale_1=0.0,
pil_mix_faceid_2=None, mix_scale_2=0.0,
faceid_scale=0.0, face_structure_scale=0.0,
prompt="", negative_prompt="",
pil_style=None, style_scale=0.0,
seed=-1, image_resolution="512x512", use_sr=True,
):
request_id = time.strftime('%Y%m%d-', time.localtime(time.time())) + str(uuid.uuid4())
if prompt == "":
raise gr.Error("Please enter the prompt")
if pil_style and is_no_image_placeholder(pil_style):
pil_style = None
faceid_url = []
if pil_faceid:
faceid_url.append(get_image_url(request_id, pil_faceid, suffix="_faceid.png"))
if pil_supp_faceids and len(pil_supp_faceids) > 0:
for idx, pil_supp_faceid in enumerate(pil_supp_faceids):
pil_supp_faceid = Image.open(pil_supp_faceid)
faceid_url.append(get_image_url(request_id, pil_supp_faceid, suffix=f"_supp_faceid_{idx}.png"))
mix_face_url = []
mix_scale = []
if pil_mix_faceid_1 is not None:
mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_1, suffix=f"_mix_faceid_1_{mix_scale_1:.2f}.png")
)
mix_scale.append(mix_scale_1)
if pil_mix_faceid_2 is not None:
mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_2, suffix=f"_mix_faceid_2_{mix_scale_2:.2f}.png")
)
mix_scale.append(mix_scale_2)
# The outer parenthesis represent the ID, and the inner parenthesis represent the mix face image for each ID.
faceid_image_url, mix_faceid_image_url, mix_faceid_scale = [], [], []
if len(faceid_url) > 0:
faceid_image_url.append(faceid_url)
mix_faceid_image_url.append(mix_face_url)
mix_faceid_scale.append(mix_scale)
if pil_style is None:
style_image_url = ""
else:
style_image_url = get_image_url(request_id, pil_style, suffix="_style.png")
data = dict(
input=dict(
faceid_image_url=faceid_image_url,
mix_faceid_image_url=mix_faceid_image_url,
mix_faceid_scale=mix_faceid_scale,
style_image_url=style_image_url,
prompt=prompt,
negative_prompt=negative_prompt
),
parameters=dict(
image_resolution=image_resolution,
faceid_scale=faceid_scale * 10.,
face_structure_scale=face_structure_scale * 10.,
style_scale=style_scale * 10.,
use_sr=int(use_sr),
seed=seed,
mode="text-to-image",
)
)
res = call_generation(data)
return res
def text_to_multi_id_generation_process(
pil_faceid_1st=None, pil_supp_faceids_1st=None,
pil_mix_faceid_1_1st=None, mix_scale_1_1st=0.0,
pil_mix_faceid_2_1st=None, mix_scale_2_1st=0.0,
pil_faceid_2nd=None, pil_supp_faceids_2nd=None,
pil_mix_faceid_1_2nd=None, mix_scale_1_2nd=0.0,
pil_mix_faceid_2_2nd=None, mix_scale_2_2nd=0.0,
faceid_scale=0.0, face_structure_scale=0.0,
prompt="", negative_prompt="",
pil_style=None, style_scale=0.0,
seed=-1, image_resolution="512x512", use_sr=True,
):
request_id = time.strftime('%Y%m%d-', time.localtime(time.time())) + str(uuid.uuid4())
if prompt == "":
raise gr.Error("Please enter the prompt")
if pil_style and is_no_image_placeholder(pil_style):
pil_style = None
first_faceid_url = []
if pil_faceid_1st:
first_faceid_url.append(get_image_url(request_id, pil_faceid_1st, suffix="_faceid_1st.png"))
if pil_supp_faceids_1st and len(pil_supp_faceids_1st) > 0:
for idx, pil_supp_faceid_1st in enumerate(pil_supp_faceids_1st):
pil_supp_faceid_1st = Image.open(pil_supp_faceid_1st)
first_faceid_url.append(get_image_url(request_id, pil_supp_faceid_1st, suffix=f"_faceid_1st_{idx}.png"))
second_faceid_url = []
if pil_faceid_2nd:
second_faceid_url.append(get_image_url(request_id, pil_faceid_2nd, suffix="_faceid_2nd.png"))
if pil_supp_faceids_2nd and len(pil_supp_faceids_2nd) > 0:
for idx, pil_supp_faceid_2nd in enumerate(pil_supp_faceids_2nd):
pil_supp_faceid_2nd = Image.open(pil_supp_faceid_2nd)
second_faceid_url.append(get_image_url(request_id, pil_supp_faceid_2nd, suffix=f"_faceid_2nd_{idx}.png"))
first_mix_face_url, first_mix_scale = [], []
if pil_mix_faceid_1_1st:
first_mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_1_1st, suffix=f"_mix_faceid_1_1st_{mix_scale_1_1st:.2f}.png")
)
first_mix_scale.append(mix_scale_1_1st)
if pil_mix_faceid_2_1st is not None:
first_mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_2_1st, suffix=f"_mix_faceid_2_1st_{mix_scale_2_1st:.2f}.png")
)
first_mix_scale.append(mix_scale_2_1st)
second_mix_face_url, second_mix_scale = [], []
if pil_mix_faceid_1_2nd:
second_mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_1_2nd, suffix=f"_mix_faceid_1_2nd_{mix_scale_1_2nd:.2f}.png")
)
second_mix_scale.append(mix_scale_1_2nd)
if pil_mix_faceid_2_2nd is not None:
second_mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_2_2nd, suffix=f"_mix_faceid_2_2nd_{mix_scale_2_2nd:.2f}.png")
)
second_mix_scale.append(mix_scale_2_2nd)
# The outer parenthesis represent the ID, and the inner parenthesis represent the mix face image for each ID.
faceid_image_url, mix_faceid_image_url, mix_faceid_scale = [], [], []
if len(first_faceid_url) > 0:
faceid_image_url.append(first_faceid_url)
mix_faceid_image_url.append(first_mix_face_url)
mix_faceid_scale.append(first_mix_scale)
if len(second_faceid_url) > 0:
faceid_image_url.append(second_faceid_url)
mix_faceid_image_url.append(second_mix_face_url)
mix_faceid_scale.append(second_mix_scale)
if pil_style is None:
style_image_url = ""
else:
style_image_url = get_image_url(request_id, pil_style, suffix="_style.png")
data = dict(
input=dict(
faceid_image_url=faceid_image_url,
mix_faceid_image_url=mix_faceid_image_url,
mix_faceid_scale=mix_faceid_scale,
style_image_url=style_image_url,
prompt=prompt,
negative_prompt=negative_prompt
),
parameters=dict(
image_resolution=image_resolution,
faceid_scale=faceid_scale * 10.,
face_structure_scale=face_structure_scale * 10.,
style_scale=style_scale * 10.,
use_sr=int(use_sr),
seed=seed,
mode="text-to-image",
)
)
res = call_generation(data)
return res
def image_to_single_id_generation_process(
pil_faceid=None, pil_supp_faceids=None,
pil_mix_faceid_1=None, mix_scale_1=0.0,
pil_mix_faceid_2=None, mix_scale_2=0.0,
faceid_scale=0.0, face_structure_scale=0.0,
pil_style=None, style_scale=1.0,
seed=-1, image_resolution="768x512", use_sr=True,
):
request_id = time.strftime('%Y%m%d-', time.localtime(time.time())) + str(uuid.uuid4())
if pil_faceid is None:
raise gr.Error("Please upload an ID image")
if pil_style is None:
raise gr.Error("Please upload a reference image")
faceid_url = []
if pil_faceid:
faceid_url.append(get_image_url(request_id, pil_faceid, suffix="_faceid.png"))
if pil_supp_faceids and len(pil_supp_faceids) > 0:
for idx, pil_supp_faceid in enumerate(pil_supp_faceids):
pil_supp_faceid = Image.open(pil_supp_faceid)
faceid_url.append(get_image_url(request_id, pil_supp_faceid, suffix=f"_supp_faceid_{idx}.png"))
mix_face_url = []
mix_scale = []
if pil_mix_faceid_1 is not None:
mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_1, suffix=f"_mix_faceid_1_{mix_scale_1:.2f}.png")
)
mix_scale.append(mix_scale_1)
if pil_mix_faceid_2 is not None:
mix_face_url.append(
get_image_url(request_id, pil_mix_faceid_2, suffix=f"_mix_faceid_2_{mix_scale_2:.2f}.png")
)
mix_scale.append(mix_scale_2)
# The outer parenthesis represent the ID, and the inner parenthesis represent the mix face image for each ID.
faceid_image_url, mix_faceid_image_url, mix_faceid_scale = [], [], []
if len(faceid_url) > 0:
faceid_image_url.append(faceid_url)
mix_faceid_image_url.append(mix_face_url)
mix_faceid_scale.append(mix_scale)
if pil_style is None:
style_image_url = ""
else:
style_image_url = get_image_url(request_id, pil_style, suffix="_style.png")
data = dict(
input=dict(
faceid_image_url=faceid_image_url,
mix_faceid_image_url=mix_faceid_image_url,
mix_faceid_scale=mix_faceid_scale,
style_image_url=style_image_url,
),
parameters=dict(
image_resolution=image_resolution,
faceid_scale=faceid_scale * 10.,
face_structure_scale=face_structure_scale * 10.,
style_scale=style_scale * 10.,
use_sr=int(use_sr),
seed=seed,
mode="image-to-image",
)
)
res = call_generation(data)
return res