anchorxia's picture
add musev
96d7ad8
raw
history blame
9.99 kB
from copy import deepcopy
import numpy as np
import random
import json
from .attributes import (
MultiAttr2Text,
AttriributeIsText,
AttributeIsTextAndName,
PresetMultiAttr2Text,
)
from .style import Style
from .render import Render
from . import AttrRegister
__all__ = [
"Age",
"Sex",
"Singing",
"Country",
"Lighting",
"Headwear",
"Eyes",
"Irises",
"Hair",
"Skin",
"Face",
"Smile",
"Expression",
"Clothes",
"Nose",
"Mouth",
"Beard",
"Necklace",
"KeyWords",
"InsightFace",
"Caption",
"Env",
"Decoration",
"Festival",
"SpringHeadwear",
"SpringClothes",
"Animal",
]
@AttrRegister.register
class Sex(AttriributeIsText):
name = "sex"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Headwear(AttriributeIsText):
name = "headwear"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Expression(AttriributeIsText):
name = "expression"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class KeyWords(AttriributeIsText):
name = "keywords"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Singing(AttriributeIsText):
def __init__(self, name: str = "singing") -> None:
super().__init__(name)
@AttrRegister.register
class Country(AttriributeIsText):
name = "country"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Clothes(AttriributeIsText):
name = "clothes"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Age(AttributeIsTextAndName):
name = "age"
def __init__(self, name: str = None) -> None:
super().__init__(name)
def __call__(self, attributes: str) -> str:
if not isinstance(attributes, str):
attributes = str(attributes)
attributes = attributes.split(",")
text = ", ".join(
["{}-year-old".format(attr) if attr != "" else "" for attr in attributes]
)
return text
@AttrRegister.register
class Eyes(AttributeIsTextAndName):
name = "eyes"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Hair(AttributeIsTextAndName):
name = "hair"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Background(AttributeIsTextAndName):
name = "background"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Skin(AttributeIsTextAndName):
name = "skin"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Face(AttributeIsTextAndName):
name = "face"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Smile(AttributeIsTextAndName):
name = "smile"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Nose(AttributeIsTextAndName):
name = "nose"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Mouth(AttributeIsTextAndName):
name = "mouth"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Beard(AttriributeIsText):
name = "beard"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Necklace(AttributeIsTextAndName):
name = "necklace"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Irises(AttributeIsTextAndName):
name = "irises"
def __init__(self, name: str = None) -> None:
super().__init__(name)
@AttrRegister.register
class Lighting(AttributeIsTextAndName):
name = "lighting"
def __init__(self, name: str = None) -> None:
super().__init__(name)
PresetPortraitAttributes = [
Age,
Sex,
Singing,
Country,
Lighting,
Headwear,
Eyes,
Irises,
Hair,
Skin,
Face,
Smile,
Expression,
Clothes,
Nose,
Mouth,
Beard,
Necklace,
Style,
KeyWords,
Render,
]
class PortraitMultiAttr2Text(PresetMultiAttr2Text):
preset_attributes = PresetPortraitAttributes
def __init__(self, funcs: list = None, use_preset=True, name="portrait") -> None:
super().__init__(funcs, use_preset, name)
@AttrRegister.register
class InsightFace(AttriributeIsText):
name = "insight_face"
face_render_dict = {
"boy": "handsome,elegant",
"girl": "gorgeous,kawaii,colorful",
}
key_words = "delicate face,beautiful eyes"
def __call__(self, attributes: str) -> str:
"""将insight faces 检测的结果转化成prompt
convert the results of insight faces detection to prompt
Args:
face_list (_type_): _description_
Returns:
_type_: _description_
"""
attributes = json.loads(attributes)
face_list = attributes["info"]
if len(face_list) == 0:
return ""
if attributes["image_type"] == "body":
for face in face_list:
if "black" in face and face["black"]:
return "african,dark skin"
return ""
gender_dict = {"girl": 0, "boy": 0}
face_render_list = []
black = False
for face in face_list:
if face["ratio"] < 0.02:
continue
if face["gender"] == 0:
gender_dict["girl"] += 1
face_render_list.append(self.face_render_dict["girl"])
else:
gender_dict["boy"] += 1
face_render_list.append(self.face_render_dict["boy"])
if "black" in face and face["black"]:
black = True
if len(face_render_list) == 0:
return ""
elif len(face_render_list) == 1:
solo = True
else:
solo = False
gender = ""
for g, num in gender_dict.items():
if num > 0:
if gender:
gender += ", "
gender += "{}{}".format(num, g)
if num > 1:
gender += "s"
face_render_list = ",".join(face_render_list)
face_render_list = face_render_list.split(",")
face_render = list(set(face_render_list))
face_render.sort(key=face_render_list.index)
face_render = ",".join(face_render)
if gender_dict["girl"] == 0:
face_render = "male focus," + face_render
insightface_prompt = "{},{},{}".format(gender, face_render, self.key_words)
if solo:
insightface_prompt += ",solo"
if black:
insightface_prompt = "african,dark skin," + insightface_prompt
return insightface_prompt
@AttrRegister.register
class Caption(AttriributeIsText):
name = "caption"
@AttrRegister.register
class Env(AttriributeIsText):
name = "env"
envs_list = [
"east asian architecture",
"fireworks",
"snow, snowflakes",
"snowing, snowflakes",
]
def __call__(self, attributes: str = None) -> str:
if attributes != "" and attributes != " " and attributes is not None:
return attributes
else:
return random.choice(self.envs_list)
@AttrRegister.register
class Decoration(AttriributeIsText):
name = "decoration"
def __init__(self, name: str = None) -> None:
self.decoration_list = [
"chinese knot",
"flowers",
"food",
"lanterns",
"red envelop",
]
super().__init__(name)
def __call__(self, attributes: str = None) -> str:
if attributes != "" and attributes != " " and attributes is not None:
return attributes
else:
return random.choice(self.decoration_list)
@AttrRegister.register
class Festival(AttriributeIsText):
name = "festival"
festival_list = ["new year"]
def __init__(self, name: str = None) -> None:
super().__init__(name)
def __call__(self, attributes: str = None) -> str:
if attributes != "" and attributes != " " and attributes is not None:
return attributes
else:
return random.choice(self.festival_list)
@AttrRegister.register
class SpringHeadwear(AttriributeIsText):
name = "spring_headwear"
headwear_list = ["rabbit ears", "rabbit ears, fur hat"]
def __call__(self, attributes: str = None) -> str:
if attributes != "" and attributes != " " and attributes is not None:
return attributes
else:
return random.choice(self.headwear_list)
@AttrRegister.register
class SpringClothes(AttriributeIsText):
name = "spring_clothes"
clothes_list = [
"mittens,chinese clothes",
"mittens,fur trim",
"mittens,red scarf",
"mittens,winter clothes",
]
def __call__(self, attributes: str = None) -> str:
if attributes != "" and attributes != " " and attributes is not None:
return attributes
else:
return random.choice(self.clothes_list)
@AttrRegister.register
class Animal(AttriributeIsText):
name = "animal"
animal_list = ["rabbit", "holding rabbits"]
def __call__(self, attributes: str = None) -> str:
if attributes != "" and attributes != " " and attributes is not None:
return attributes
else:
return random.choice(self.animal_list)