diff --git a/tests/conftest.py b/tests/conftest.py index 7eb62a72..7ed56a3e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,7 @@ from typing import Generator import PIL.Image +from loguru import logger import pytest from hordelib.comfy_horde import Comfy_Horde @@ -20,6 +21,7 @@ def init_horde(): hordelib.initialise() from hordelib.settings import UserSettings + UserSettings.set_ram_to_leave_free_mb("100%") UserSettings.set_vram_to_leave_free_mb("90%") @@ -50,20 +52,26 @@ def shared_model_manager(hordelib_instance: HordeLib) -> Generator[type[SharedMo assert SharedModelManager.manager.blip is not None assert SharedModelManager.manager.clip is not None + for model_availible in SharedModelManager.manager.compvis.get_loaded_models(): + assert SharedModelManager.manager.unload_model(model_availible) + yield SharedModelManager SharedModelManager._instance = None # type: ignore SharedModelManager.manager = None # type: ignore +_testing_model_name = "Deliberate" + + @pytest.fixture(scope="class") -def stable_diffusion_modelname_for_testing(shared_model_manager: type[SharedModelManager]) -> str: +def stable_diffusion_model_name_for_testing(shared_model_manager: type[SharedModelManager]) -> str: """Loads the stable diffusion model for testing. This model is used by many tests. This fixture returns the model name as string.""" shared_model_manager.load_model_managers([CompVisModelManager]) - model_name = "Deliberate" - assert shared_model_manager.manager.load(model_name) - return model_name + + assert shared_model_manager.manager.load(_testing_model_name) + return _testing_model_name @pytest.fixture(scope="session") diff --git a/tests/test_horde_inference.py b/tests/test_horde_inference.py index 0645d694..8134bbfd 100644 --- a/tests/test_horde_inference.py +++ b/tests/test_horde_inference.py @@ -14,7 +14,7 @@ class TestHordeInference: def test_text_to_image( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -33,10 +33,11 @@ def test_text_to_image( "prompt": "an ancient llamia monster", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) assert pil_image is not None + assert isinstance(pil_image, Image.Image) img_filename = "text_to_image.png" pil_image.save(f"images/{img_filename}", quality=100) @@ -49,7 +50,7 @@ def test_text_to_image( def test_text_to_image_small( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -68,10 +69,11 @@ def test_text_to_image_small( "prompt": "a photo of cute dinosaur ### painting, drawing, artwork, red border", "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) assert pil_image is not None + assert isinstance(pil_image, Image.Image) img_filename = "text_to_image_small.png" pil_image.save(f"images/{img_filename}", quality=100) @@ -84,7 +86,7 @@ def test_text_to_image_small( def test_text_to_image_clip_skip_2( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -103,10 +105,11 @@ def test_text_to_image_clip_skip_2( "prompt": "an ancient llamia monster", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) assert pil_image is not None + assert isinstance(pil_image, Image.Image) img_filename = "text_to_image_clip_skip_2.png" pil_image.save(f"images/{img_filename}", quality=100) @@ -119,7 +122,7 @@ def test_text_to_image_clip_skip_2( def test_text_to_image_hires_fix( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -138,10 +141,11 @@ def test_text_to_image_hires_fix( "prompt": "an ancient llamia monster", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) assert pil_image is not None + assert isinstance(pil_image, Image.Image) img_filename = "text_to_image_hires_fix.png" pil_image.save(f"images/{img_filename}", quality=100) diff --git a/tests/test_horde_inference_controlnet.py b/tests/test_horde_inference_controlnet.py index 7bf31bf9..76ab7026 100644 --- a/tests/test_horde_inference_controlnet.py +++ b/tests/test_horde_inference_controlnet.py @@ -21,7 +21,7 @@ def test_controlnet_sd1( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -40,7 +40,7 @@ def test_controlnet_sd1( "prompt": "a man walking in the snow", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_db0.jpg"), "source_processing": "img2img", } @@ -80,7 +80,7 @@ def test_controlnet_sd1( def test_controlnet_fake_cn( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, db0_test_image: Image.Image, ): data = { @@ -100,7 +100,7 @@ def test_controlnet_fake_cn( "prompt": "a man walking in the snow", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": db0_test_image, "source_processing": "img2img", } @@ -111,7 +111,7 @@ def test_controlnet_fake_cn( def test_controlnet_strength( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -130,7 +130,7 @@ def test_controlnet_strength( "prompt": "a man walking on the moon", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_db0.jpg"), "source_processing": "img2img", } @@ -157,7 +157,7 @@ def test_controlnet_strength( def test_controlnet_hires_fix( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -177,7 +177,7 @@ def test_controlnet_hires_fix( "prompt": "a man walking in the jungle", "ddim_steps": 15, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_db0.jpg"), "source_processing": "img2img", } @@ -198,7 +198,7 @@ def test_controlnet_hires_fix( def test_controlnet_image_is_control( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -217,7 +217,7 @@ def test_controlnet_image_is_control( "prompt": "a woman standing in the snow", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_image_is_control.png"), "source_processing": "img2img", } diff --git a/tests/test_horde_inference_img2img.py b/tests/test_horde_inference_img2img.py index c4ff7f5e..838a4678 100644 --- a/tests/test_horde_inference_img2img.py +++ b/tests/test_horde_inference_img2img.py @@ -13,7 +13,7 @@ class TestHordeInference: def test_image_to_image( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -33,7 +33,7 @@ def test_image_to_image( "prompt": "a dinosaur", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_db0.jpg"), "source_processing": "img2img", } @@ -51,7 +51,7 @@ def test_image_to_image( def test_image_to_image_hires_fix_small( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -71,7 +71,7 @@ def test_image_to_image_hires_fix_small( "prompt": "a dinosaur", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_db0.jpg"), "source_processing": "img2img", } @@ -89,7 +89,7 @@ def test_image_to_image_hires_fix_small( def test_image_to_image_hires_fix_large( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -109,7 +109,7 @@ def test_image_to_image_hires_fix_large( "prompt": "a dinosaur", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_db0.jpg"), "source_processing": "img2img", } @@ -126,7 +126,7 @@ def test_image_to_image_hires_fix_large( def test_img2img_masked_denoise_1( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -141,7 +141,7 @@ def test_img2img_masked_denoise_1( "prompt": "a mecha robot sitting on a bench", "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_img2img_alpha.png"), "source_processing": "img2img", } @@ -159,7 +159,7 @@ def test_img2img_masked_denoise_1( def test_img2img_masked_denoise_high( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -174,7 +174,7 @@ def test_img2img_masked_denoise_high( "prompt": "a mecha robot sitting on a bench", "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_img2img_alpha.png"), "source_processing": "img2img", } @@ -192,7 +192,7 @@ def test_img2img_masked_denoise_high( def test_img2img_masked_denoise_mid( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -207,7 +207,7 @@ def test_img2img_masked_denoise_mid( "prompt": "a mecha robot sitting on a bench", "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_img2img_alpha.png"), "source_processing": "img2img", } @@ -225,7 +225,7 @@ def test_img2img_masked_denoise_mid( def test_img2img_masked_denoise_low( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -240,7 +240,7 @@ def test_img2img_masked_denoise_low( "prompt": "a mecha robot sitting on a bench", "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": Image.open("images/test_img2img_alpha.png"), "source_processing": "img2img", } @@ -258,7 +258,7 @@ def test_img2img_masked_denoise_low( def test_image_to_faulty_source_image( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -278,7 +278,7 @@ def test_image_to_faulty_source_image( "prompt": "an ancient llamia monster", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, "source_image": "THIS SHOULD FAILOVER TO TEXT2IMG", "source_processing": "img2img", } diff --git a/tests/test_horde_lora.py b/tests/test_horde_lora.py index 77d0c630..88067300 100644 --- a/tests/test_horde_lora.py +++ b/tests/test_horde_lora.py @@ -24,7 +24,7 @@ def test_text_to_image_lora_red( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): assert shared_model_manager.manager.lora @@ -50,7 +50,7 @@ def test_text_to_image_lora_red( "loras": [{"name": lora_name, "model": 1.0, "clip": 1.0}], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) assert pil_image is not None @@ -72,7 +72,7 @@ def test_text_to_image_lora_blue( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): assert shared_model_manager.manager.lora @@ -98,7 +98,7 @@ def test_text_to_image_lora_blue( "loras": [{"name": lora_name, "model": 1.0, "clip": 1.0}], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -117,7 +117,7 @@ def test_text_to_image_lora_chained( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): assert shared_model_manager.manager.lora @@ -150,7 +150,7 @@ def test_text_to_image_lora_chained( ], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -169,7 +169,7 @@ def test_text_to_image_lora_chained_bad( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): assert shared_model_manager.manager.lora @@ -200,7 +200,7 @@ def test_text_to_image_lora_chained_bad( ], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -211,7 +211,7 @@ def test_lora_trigger_inject_red( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): assert shared_model_manager.manager.lora @@ -235,7 +235,7 @@ def test_lora_trigger_inject_red( "loras": [{"name": lora_name, "model": 1.0, "clip": 1.0, "inject_trigger": "red"}], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -254,7 +254,7 @@ def test_lora_trigger_inject_any( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): assert shared_model_manager.manager.lora @@ -278,7 +278,7 @@ def test_lora_trigger_inject_any( "loras": [{"name": lora_name, "model": 1.0, "clip": 1.0, "inject_trigger": "any"}], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -297,7 +297,7 @@ def test_download_and_use_adhoc_lora( self, shared_model_manager: type[SharedModelManager], hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): assert shared_model_manager.manager.lora @@ -322,7 +322,7 @@ def test_download_and_use_adhoc_lora( "loras": [{"name": lora_name, "model": 0.75, "clip": 1.0, "inject_trigger": "any"}], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -339,7 +339,7 @@ def test_download_and_use_adhoc_lora( def test_for_probability_tensor_runtime_error( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_euler", @@ -364,7 +364,7 @@ def test_for_probability_tensor_runtime_error( ], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -373,7 +373,7 @@ def test_for_probability_tensor_runtime_error( def test_sd21_lora_against_sd15_model( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_euler", @@ -396,7 +396,7 @@ def test_sd21_lora_against_sd15_model( ], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) @@ -405,7 +405,7 @@ def test_sd21_lora_against_sd15_model( def test_stonepunk( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): # Blue, fuzzy search on version lora_name = "51539" @@ -427,7 +427,7 @@ def test_stonepunk( "loras": [{"name": lora_name, "model": 1.0, "clip": 1.0, "inject_trigger": "any"}], "ddim_steps": 20, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } pil_image = hordelib_instance.basic_inference(data) diff --git a/tests/test_horde_samplers.py b/tests/test_horde_samplers.py index bb17a56d..1ca14d50 100644 --- a/tests/test_horde_samplers.py +++ b/tests/test_horde_samplers.py @@ -14,7 +14,7 @@ class TestHordeSamplers: def test_samplers( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -38,7 +38,7 @@ def test_samplers( ), "ddim_steps": 30, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } images_to_compare: list[tuple[str, Image.Image]] = [] for sampler in HordeLib.SAMPLERS_MAP.keys(): @@ -59,7 +59,7 @@ def test_samplers( def test_slow_samplers( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, hordelib_instance: HordeLib, ): data = { @@ -83,7 +83,7 @@ def test_slow_samplers( ), "ddim_steps": 10, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } images_to_compare: list[tuple[str, Image.Image]] = [] diff --git a/tests/test_image_metadata.py b/tests/test_image_metadata.py index a7b91462..8ad8cd14 100644 --- a/tests/test_image_metadata.py +++ b/tests/test_image_metadata.py @@ -12,7 +12,7 @@ class TestHordeInference: def test_text_to_image( self, hordelib_instance: HordeLib, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, ): data = { "sampler_name": "k_dpmpp_2m", @@ -31,7 +31,7 @@ def test_text_to_image( "prompt": "a secret metadata store", "ddim_steps": 25, "n_iter": 1, - "model": stable_diffusion_modelname_for_testing, + "model": stable_diffusion_model_name_for_testing, } png_data = hordelib_instance.basic_inference(data, rawpng=True) assert png_data is not None diff --git a/tests/test_inference.py b/tests/test_inference.py index a519de56..4944d7a8 100644 --- a/tests/test_inference.py +++ b/tests/test_inference.py @@ -17,7 +17,7 @@ def test_unknown_pipeline(self, isolated_comfy_horde_instance: Comfy_Horde): def test_stable_diffusion_pipeline( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, shared_model_manager: type[SharedModelManager], isolated_comfy_horde_instance: Comfy_Horde, ): @@ -33,7 +33,7 @@ def test_stable_diffusion_pipeline( "sampler.steps": 25, "prompt.text": "a closeup photo of a confused dog", "negative_prompt.text": "cat, black and white, deformed", - "model_loader.model_name": stable_diffusion_modelname_for_testing, + "model_loader.model_name": stable_diffusion_model_name_for_testing, "clip_skip.stop_at_clip_layer": -1, "model_loader.model_manager": shared_model_manager, } @@ -50,7 +50,7 @@ def test_stable_diffusion_pipeline( def test_stable_diffusion_pipeline_clip_skip( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, shared_model_manager: type[SharedModelManager], isolated_comfy_horde_instance: Comfy_Horde, ): @@ -66,7 +66,7 @@ def test_stable_diffusion_pipeline_clip_skip( "sampler.steps": 25, "prompt.text": "a closeup photo of a confused dog", "negative_prompt.text": "cat, black and white, deformed", - "model_loader.model_name": stable_diffusion_modelname_for_testing, + "model_loader.model_name": stable_diffusion_model_name_for_testing, "clip_skip.stop_at_clip_layer": -2, "model_loader.model_manager": shared_model_manager, } @@ -83,7 +83,7 @@ def test_stable_diffusion_pipeline_clip_skip( def test_stable_diffusion_hires_fix_pipeline( self, - stable_diffusion_modelname_for_testing: str, + stable_diffusion_model_name_for_testing: str, shared_model_manager: type[SharedModelManager], isolated_comfy_horde_instance: Comfy_Horde, ): @@ -103,7 +103,7 @@ def test_stable_diffusion_hires_fix_pipeline( "negative_prompt.text": ( "render, cg, drawing, painting, artist, graphics, deformed, black and white, deformed eyes" ), - "model_loader.model_name": stable_diffusion_modelname_for_testing, + "model_loader.model_name": stable_diffusion_model_name_for_testing, "model_loader.model_manager": shared_model_manager, "empty_latent_image.width": 512, "empty_latent_image.height": 512,