|
import unittest |
|
import pytest |
|
from .template import ( |
|
is_full_coverage, |
|
APITestTemplate, |
|
girl_img, |
|
mask_img, |
|
mask_small_img, |
|
) |
|
|
|
|
|
class TestInpaintFullCoverage(unittest.TestCase): |
|
def setUp(self): |
|
if not is_full_coverage: |
|
pytest.skip() |
|
|
|
def test_inpaint(self): |
|
for gen_type in ("img2img", "txt2img"): |
|
if gen_type == "img2img": |
|
payload = { |
|
"init_images": [girl_img], |
|
"mask": mask_img, |
|
} |
|
unit = {} |
|
else: |
|
payload = {} |
|
unit = { |
|
"image": { |
|
"image": girl_img, |
|
"mask": mask_img, |
|
} |
|
} |
|
|
|
unit["model"] = "control_v11p_sd15_inpaint [ebff9138]" |
|
|
|
for i_resize, resize_mode in enumerate( |
|
("Just Resize", "Crop and Resize", "Resize and Fill") |
|
): |
|
|
|
if resize_mode == "Crop and Resize": |
|
payload["height"] = 768 |
|
payload["width"] = 512 |
|
|
|
|
|
if resize_mode == "Crop and Resize": |
|
payload["height"] = 512 |
|
payload["width"] = 512 |
|
|
|
|
|
if resize_mode == "Resize and Fill": |
|
payload["height"] = 768 |
|
payload["width"] = 768 |
|
|
|
if gen_type == "img2img": |
|
payload["resize_mode"] = i_resize |
|
else: |
|
unit["resize_mode"] = resize_mode |
|
|
|
for module in ("inpaint_only", "inpaint", "inpaint_only+lama"): |
|
unit["module"] = module |
|
|
|
with self.subTest( |
|
gen_type=gen_type, |
|
resize_mode=resize_mode, |
|
module=module, |
|
): |
|
self.assertTrue( |
|
APITestTemplate( |
|
f"{gen_type}_{resize_mode}_{module}", |
|
gen_type, |
|
payload_overrides=payload, |
|
unit_overrides=unit, |
|
).exec() |
|
) |
|
|
|
def test_inpaint_no_mask(self): |
|
"""Inpaint should fail if no mask is provided. Output should not contain |
|
ControlNet detected map.""" |
|
for gen_type in ("img2img", "txt2img"): |
|
if gen_type == "img2img": |
|
payload = { |
|
"init_images": [girl_img], |
|
} |
|
unit = {} |
|
else: |
|
payload = {} |
|
unit = { |
|
"image": { |
|
"image": girl_img, |
|
} |
|
} |
|
unit["model"] = "control_v11p_sd15_inpaint [ebff9138]" |
|
unit["module"] = "inpaint_only" |
|
with self.subTest(gen_type=gen_type): |
|
self.assertTrue( |
|
APITestTemplate( |
|
f"{gen_type}_no_mask_fail", |
|
gen_type, |
|
payload_overrides=payload, |
|
unit_overrides=unit, |
|
).exec() |
|
) |
|
|
|
def test_inpaint_double_mask(self): |
|
"""When mask is provided for both a1111 img2img input and ControlNet |
|
unit input, ControlNet input mask should be used.""" |
|
self.assertTrue( |
|
APITestTemplate( |
|
f"img2img_double_mask", |
|
"img2img", |
|
payload_overrides={ |
|
"init_images": [girl_img], |
|
"mask": mask_img, |
|
}, |
|
unit_overrides={ |
|
"image": { |
|
"image": girl_img, |
|
"mask": mask_small_img, |
|
}, |
|
"model": "control_v11p_sd15_inpaint [ebff9138]", |
|
"module": "inpaint", |
|
}, |
|
).exec() |
|
) |
|
|
|
def test_img2img_mask_on_unit(self): |
|
""" Usecase for inpaint_global_harmonious. """ |
|
self.assertTrue( |
|
APITestTemplate( |
|
f"img2img_mask_on_unit", |
|
"img2img", |
|
payload_overrides={ |
|
"init_images": [girl_img], |
|
}, |
|
unit_overrides={ |
|
"image": { |
|
"image": girl_img, |
|
"mask": mask_small_img, |
|
}, |
|
"model": "control_v11p_sd15_inpaint [ebff9138]", |
|
"module": "inpaint", |
|
}, |
|
).exec() |
|
) |
|
|
|
def test_outpaint_without_mask(self): |
|
self.assertTrue( |
|
APITestTemplate( |
|
f"img2img_outpaint_without_mask", |
|
"img2img", |
|
payload_overrides={ |
|
"init_images": [girl_img], |
|
"width": 768, |
|
"height": 768, |
|
"resize_mode": 2, |
|
}, |
|
unit_overrides={ |
|
"model": "control_v11p_sd15_inpaint [ebff9138]", |
|
"module": "inpaint_only+lama", |
|
}, |
|
).exec() |
|
) |
|
|
|
self.assertTrue( |
|
APITestTemplate( |
|
f"txt2img_outpaint_without_mask", |
|
"txt2img", |
|
payload_overrides={ |
|
"width": 768, |
|
"height": 768, |
|
}, |
|
unit_overrides={ |
|
"model": "control_v11p_sd15_inpaint [ebff9138]", |
|
"module": "inpaint_only+lama", |
|
"image": { |
|
"image": girl_img, |
|
}, |
|
"resize_mode": 2, |
|
}, |
|
).exec() |
|
) |
|
|
|
def test_inpaint_crop(self): |
|
self.assertTrue( |
|
APITestTemplate( |
|
"img2img_inpaint_crop", |
|
"img2img", |
|
payload_overrides={ |
|
"init_images": [girl_img], |
|
"inpaint_full_res": True, |
|
"mask": mask_small_img, |
|
}, |
|
unit_overrides={ |
|
"model": "control_v11p_sd15_canny [d14c016b]", |
|
"module": "canny", |
|
"inpaint_crop_input_image": True, |
|
}, |
|
).exec() |
|
) |
|
self.assertTrue( |
|
APITestTemplate( |
|
"img2img_inpaint_no_crop", |
|
"img2img", |
|
payload_overrides={ |
|
"init_images": [girl_img], |
|
"inpaint_full_res": True, |
|
"mask": mask_small_img, |
|
}, |
|
unit_overrides={ |
|
"model": "control_v11p_sd15_canny [d14c016b]", |
|
"module": "canny", |
|
"inpaint_crop_input_image": False, |
|
}, |
|
).exec() |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
unittest.main() |
|
|