diff --git a/example/generate_image_with_vibe.py b/example/generate_image_with_vibe.py new file mode 100644 index 0000000..8c9ed6e --- /dev/null +++ b/example/generate_image_with_vibe.py @@ -0,0 +1,64 @@ +""" +{filename} +============================================================================== + +| Example of how to generate an image with inpainting +| +| The resulting image will be placed in a folder named "results" +""" + +import asyncio +import base64 +from pathlib import Path + +from example.boilerplate import API +from novelai_api.ImagePreset import ImageGenerationType, ImageModel, ImagePreset + + +async def single_vibe(): + d = Path("results") + d.mkdir(exist_ok=True) + + async with API() as api_handler: + api = api_handler.api + + image = base64.b64encode((d / "image.png").read_bytes()).decode() + + model = ImageModel.Anime_v3 + + preset = ImagePreset.from_default_config(model) + preset.reference_image = image + preset.reference_strength = 0.6 + preset.reference_information_extracted = 1.0 + preset.seed = 42 + + async for _, img in api.high_level.generate_image("1girl", model, preset, ImageGenerationType.NORMAL): + (d / "image_with_vibe.png").write_bytes(img) + + +async def multi_vibe(): + d = Path("results") + d.mkdir(exist_ok=True) + + async with API() as api_handler: + api = api_handler.api + + image1 = base64.b64encode((d / "image1.png").read_bytes()).decode() + image2 = base64.b64encode((d / "image2.png").read_bytes()).decode() + image3 = base64.b64encode((d / "image3.png").read_bytes()).decode() + + model = ImageModel.Anime_v3 + + preset = ImagePreset.from_default_config(model) + preset.reference_image_multiple = [image1, image2, image3] + preset.reference_strength_multiple = [0.6, 0.6, 0.6] + preset.reference_information_extracted_multiple = [1.0, 1.0, 1.0] + preset.seed = 42 + + async for _, img in api.high_level.generate_image("1girl", model, preset, ImageGenerationType.NORMAL): + (d / "image_with_multivibe.png").write_bytes(img) + + +if __name__ == "__main__": + asyncio.run(single_vibe()) + asyncio.run(multi_vibe()) diff --git a/novelai_api/ImagePreset.py b/novelai_api/ImagePreset.py index 8a31a34..04864e5 100644 --- a/novelai_api/ImagePreset.py +++ b/novelai_api/ImagePreset.py @@ -7,7 +7,7 @@ import sys import typing from pathlib import Path -from typing import Any, Dict, Optional, Tuple, Union +from typing import Any, Dict, List, Optional, Tuple, Union from novelai_api.ImagePreset_CostTables import DDIM_COSTS, NAI_COSTS, SMEA_COSTS, SMEA_DYN_COSTS from novelai_api.python_utils import NoneType, expand_kwargs @@ -262,6 +262,12 @@ class ImagePreset: reference_information_extracted: float #: https://docs.novelai.net/.image/vibetransfer.html#reference-strength reference_strength: float + #: reference_image for multi-vibe transfer + reference_image_multiple: List[str] + #: reference_information_extracted for multi-vibe transfer + reference_information_extracted_multiple: List[float] + #: reference_strength for multi-vibe transfer + reference_strength_multiple: List[float] #: Use the old behavior of prompt separation at the 75 tokens mark (can cut words in half) legacy_v3_extend: bool diff --git a/novelai_api/image_presets/presets_v2/default.preset b/novelai_api/image_presets/presets_v2/default.preset index 4e03798..f948f21 100644 --- a/novelai_api/image_presets/presets_v2/default.preset +++ b/novelai_api/image_presets/presets_v2/default.preset @@ -6,7 +6,7 @@ "n_samples": 1, "strength": 0.7, "noise": 0, - "uc_preset": "Preset_Low_Quality_Bad_Anatomy", + "uc_preset": "Preset_Heavy", "quality_toggle": true, "auto_smea": true, "smea": false, diff --git a/novelai_api/image_presets/presets_v3/default.preset b/novelai_api/image_presets/presets_v3/default.preset index bc8ea92..7f059a9 100644 --- a/novelai_api/image_presets/presets_v3/default.preset +++ b/novelai_api/image_presets/presets_v3/default.preset @@ -6,7 +6,7 @@ "n_samples": 1, "strength": 0.7, "noise": 0, - "uc_preset": "Preset_Low_Quality_Bad_Anatomy", + "uc_preset": "Preset_Heavy", "quality_toggle": true, "auto_smea": true, "smea": false, @@ -19,8 +19,6 @@ "cfg_rescale": 0, "noise_schedule": "native", "legacy_v3_extend": false, - "reference_information_extracted": 1, - "reference_strength": 0.6, "params_version": 1, "seed": 0, diff --git a/tests/api/test_imagegen_samplers.py b/tests/api/test_imagegen_samplers.py index 8798f38..e1ebc44 100644 --- a/tests/api/test_imagegen_samplers.py +++ b/tests/api/test_imagegen_samplers.py @@ -39,7 +39,7 @@ async def test_samplers( model, sampler = model_sampler # ddim_v3 only work with Anime v3 - if model not in (ImageModel.Anime_v3,) and sampler is ImageSampler.ddim_v3: + if sampler is ImageSampler.ddim_v3 and model not in (ImageModel.Anime_v3,): return logger = api_handle.logger @@ -52,9 +52,6 @@ async def test_samplers( # Furry doesn't have UCPreset.Preset_Low_Quality_Bad_Anatomy if model is ImageModel.Furry: preset.uc_preset = UCPreset.Preset_Low_Quality - # Anime v2 uses different presets than v1 - elif model in (ImageModel.Anime_v2, ImageModel.Anime_v3): - preset.uc_preset = UCPreset.Preset_Heavy async for _, _ in api.high_level.generate_image("1girl", model, preset): pass