bilegentile's picture
Upload folder using huggingface_hub
c19ca42 verified
import unittest
import pytest
from typing import NamedTuple, Optional
from .template import (
sd_version,
StableDiffusionVersion,
is_full_coverage,
APITestTemplate,
portrait_imgs,
realistic_girl_face_img,
general_negative_prompt,
)
class AdapterSetting(NamedTuple):
module: str
model: str
lora: Optional[str] = None
@property
def lora_prompt(self) -> str:
return f"<lora:{self.lora}:0.6>" if self.lora else ""
# Used to fix pose for better comparison between different settings.
openpose_unit = {
"module": "openpose",
"model": (
"control_v11p_sd15_openpose [cab727d4]"
if sd_version != StableDiffusionVersion.SDXL
else "kohya_controllllite_xl_openpose_anime [7e5349e5]"
),
"image": realistic_girl_face_img,
"weight": 0.8,
}
base_prompt = "1girl, simple background, (white_background: 1.2), portrait"
negative_prompts = {
"with_neg": general_negative_prompt,
"no_neg": "",
}
sd15_full_face = AdapterSetting(
"ip-adapter_clip_sd15",
"ip-adapter-full-face_sd15 [852b9843]",
)
sd15_plus_face = AdapterSetting(
"ip-adapter_clip_sd15",
"ip-adapter-plus-face_sd15 [71693645]",
)
sd15_normal = AdapterSetting(
"ip-adapter_clip_sd15",
"ip-adapter_sd15 [6a3f6166]",
)
sd15_light = AdapterSetting(
"ip-adapter_clip_sd15",
"ip-adapter_sd15_light [be1c9b97]",
)
sdxl_normal = AdapterSetting(
"ip-adapter_clip_sdxl",
"ip-adapter_sdxl [d5d53548]"
)
sdxl_vit = AdapterSetting(
"ip-adapter_clip_sdxl_plus_vith",
"ip-adapter_sdxl_vit-h [75a08f84]",
)
sdxl_plus_vit = AdapterSetting(
"ip-adapter_clip_sdxl_plus_vith",
"ip-adapter-plus_sdxl_vit-h [f1f19f7d]",
)
sdxl_plus_vit_face = AdapterSetting(
"ip-adapter_clip_sdxl_plus_vith",
"ip-adapter-plus-face_sdxl_vit-h [c60d7d48]",
)
class TestIPAdapterFullCoverage(unittest.TestCase):
def setUp(self):
if not is_full_coverage:
pytest.skip()
if sd_version == StableDiffusionVersion.SDXL:
self.settings = [
sdxl_normal,
sdxl_vit,
sdxl_plus_vit,
sdxl_plus_vit_face,
]
else:
self.settings = [
sd15_normal,
sd15_light,
sd15_plus_face,
sd15_full_face,
]
def test_adapter(self):
for s in self.settings:
for n, negative_prompt in negative_prompts.items():
name = f"{s}_{n}"
with self.subTest(name=name):
self.assertTrue(
APITestTemplate(
name,
"txt2img",
payload_overrides={
"prompt": f"{base_prompt},{s.lora_prompt}",
"negative_prompt": negative_prompt,
"steps": 20,
"width": 512,
"height": 512,
},
unit_overrides=[
{
"module": s.module,
"model": s.model,
"image": realistic_girl_face_img,
},
openpose_unit,
],
).exec()
)
def test_adapter_multi_inputs(self):
for s in self.settings:
for n, negative_prompt in negative_prompts.items():
name = f"multi_inputs_{s}_{n}"
with self.subTest(name=name):
self.assertTrue(
APITestTemplate(
name=name,
gen_type="txt2img",
payload_overrides={
"prompt": f"{base_prompt}, {s.lora_prompt}",
"negative_prompt": negative_prompt,
"steps": 20,
"width": 512,
"height": 512,
},
unit_overrides=[openpose_unit]
+ [
{
"image": img,
"module": s.module,
"model": s.model,
"weight": 1 / len(portrait_imgs),
}
for img in portrait_imgs
],
).exec()
)
def test_adapter_real_multi_inputs(self):
for s in self.settings:
for n, negative_prompt in negative_prompts.items():
name = f"real_multi_{s}_{n}"
with self.subTest(name=name):
self.assertTrue(
APITestTemplate(
name=name,
gen_type="txt2img",
payload_overrides={
"prompt": f"{base_prompt}, {s.lora_prompt}",
"negative_prompt": negative_prompt,
"steps": 20,
"width": 512,
"height": 512,
},
unit_overrides=[
openpose_unit,
{
"image": [{"image": img} for img in portrait_imgs],
"module": s.module,
"model": s.model,
},
],
).exec()
)
sd15_face_id = AdapterSetting(
"ip-adapter_face_id",
"ip-adapter-faceid_sd15 [0a1757e9]",
"ip-adapter-faceid_sd15_lora",
)
sd15_face_id_plus = AdapterSetting(
"ip-adapter_face_id_plus",
"ip-adapter-faceid-plus_sd15 [d86a490f]",
"ip-adapter-faceid-plus_sd15_lora",
)
sd15_face_id_plus_v2 = AdapterSetting(
"ip-adapter_face_id_plus",
"ip-adapter-faceid-plusv2_sd15 [6e14fc1a]",
"ip-adapter-faceid-plusv2_sd15_lora",
)
sd15_face_id_portrait = AdapterSetting(
"ip-adapter_face_id",
"ip-adapter-faceid-portrait_sd15 [b2609049]",
)
sdxl_face_id = AdapterSetting(
"ip-adapter_face_id",
"ip-adapter-faceid_sdxl [59ee31a3]",
"ip-adapter-faceid_sdxl_lora",
)
class TestIPAdapterFaceIdFullCoverage(unittest.TestCase):
def setUp(self):
if not is_full_coverage:
pytest.skip()
if sd_version == StableDiffusionVersion.SDXL:
self.settings = [sdxl_face_id]
else:
self.settings = [
sd15_face_id,
sd15_face_id_plus,
sd15_face_id_plus_v2,
sd15_face_id_portrait,
]
def test_face_id(self):
for s in self.settings:
for n, negative_prompt in negative_prompts.items():
name = f"{s}_{n}"
with self.subTest(name=name):
self.assertTrue(
APITestTemplate(
name,
"txt2img",
payload_overrides={
"prompt": f"{base_prompt},{s.lora_prompt}",
"negative_prompt": negative_prompt,
"steps": 20,
"width": 512,
"height": 512,
},
unit_overrides=[
{
"module": s.module,
"model": s.model,
"image": realistic_girl_face_img,
},
openpose_unit,
],
).exec()
)
def test_face_id_multi_inputs(self):
for s in self.settings:
for n, negative_prompt in negative_prompts.items():
name = f"multi_inputs_{s}_{n}"
with self.subTest(name=name):
self.assertTrue(
APITestTemplate(
name=name,
gen_type="txt2img",
payload_overrides={
"prompt": f"{base_prompt}, {s.lora_prompt}",
"negative_prompt": negative_prompt,
"steps": 20,
"width": 512,
"height": 512,
},
unit_overrides=[openpose_unit]
+ [
{
"image": img,
"module": s.module,
"model": s.model,
"weight": 1 / len(portrait_imgs),
}
for img in portrait_imgs
],
).exec()
)
def test_face_id_real_multi_inputs(self):
for s in self.settings:
for n, negative_prompt in negative_prompts.items():
name = f"real_multi_{s}_{n}"
with self.subTest(name=name):
self.assertTrue(
APITestTemplate(
name=name,
gen_type="txt2img",
payload_overrides={
"prompt": f"{base_prompt}, {s.lora_prompt}",
"negative_prompt": negative_prompt,
"steps": 20,
"width": 512,
"height": 512,
},
unit_overrides=[
openpose_unit,
{
"image": [{"image": img} for img in portrait_imgs],
"module": s.module,
"model": s.model,
},
],
).exec()
)
if __name__ == "__main__":
unittest.main()