Spaces:
Runtime error
Runtime error
| 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 | |
| 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() | |