Skip to content

Commit

Permalink
[API] Add multi-vibe and fix default v2/v3 uc preset
Browse files Browse the repository at this point in the history
  • Loading branch information
Aedial committed Apr 7, 2024
1 parent 6af0e5e commit e0bddc0
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 9 deletions.
64 changes: 64 additions & 0 deletions example/generate_image_with_vibe.py
Original file line number Diff line number Diff line change
@@ -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())
8 changes: 7 additions & 1 deletion novelai_api/ImagePreset.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion novelai_api/image_presets/presets_v2/default.preset
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
4 changes: 1 addition & 3 deletions novelai_api/image_presets/presets_v3/default.preset
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
5 changes: 1 addition & 4 deletions tests/api/test_imagegen_samplers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit e0bddc0

Please sign in to comment.