Skip to content

Commit

Permalink
[API] Add Furry v3 model
Browse files Browse the repository at this point in the history
  • Loading branch information
Aedial committed Apr 28, 2024
1 parent 794c4f3 commit b690a4e
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 17 deletions.
21 changes: 6 additions & 15 deletions example/generate_image_test_samplers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from pathlib import Path

from example.boilerplate import API
from novelai_api.ImagePreset import ImageModel, ImagePreset, ImageResolution, ImageSampler, UCPreset
from novelai_api.ImagePreset import ImageModel, ImagePreset, ImageSampler, UCPreset
from novelai_api.NovelAIError import NovelAIError


Expand All @@ -23,22 +23,13 @@ async def main():
async with API() as api_handler:
api = api_handler.api

model = ImageModel.Anime_v3
model = ImageModel.Furry_v3

preset = ImagePreset.from_default_config(model)
preset.resolution = ImageResolution.Normal_Portrait_v3
preset.seed = 1796796669
preset.scale = 5
preset.uc_preset = UCPreset.Preset_None
preset.uc = "{{{worst quality, low quality, bad fingers}}},"

preset.quality_toggle = False

prompt = (
"1girl, smile to viewer, sunny day, frilly white dress, lens flare, sunrays, "
"{{detailed fingers, bold outline}}, best quality, amazing quality, very aesthetic, absurdres"
)
samplers = [ImageSampler.ddim]
preset.uc_preset = UCPreset.Preset_Light

prompt = "1girl"
samplers = list(ImageSampler)

for sampler in samplers:
preset.sampler = sampler
Expand Down
22 changes: 22 additions & 0 deletions novelai_api/ImagePreset.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ class ImageModel(enum.Enum):

Anime_v3 = "nai-diffusion-3"
Inpainting_Anime_v3 = "nai-diffusion-3-inpainting"
Furry_v3 = "nai-diffusion-furry-3"
Inpainting_Furry_v3 = "nai-diffusion-furry-3-inpainting"


class ControlNetModel(enum.Enum):
Expand Down Expand Up @@ -186,6 +188,16 @@ class ImagePreset:
UCPreset.Preset_Light: "nsfw, lowres, jpeg artifacts, worst quality, watermark, blurry, very displeasing",
UCPreset.Preset_None: "lowres",
},
ImageModel.Furry_v3: {
UCPreset.Preset_Heavy: "nsfw, {{worst quality}}, [displeasing], {unusual pupils}, guide lines, "
"{{unfinished}}, {bad}, url, artist name, {{tall image}}, mosaic, {sketch page}, comic panel, "
"impact (font), [dated], {logo}, ych, {what}, {where is your god now}, {distorted text}, repeated text, "
"{floating head}, {1994}, {widescreen}, absolutely everyone, sequence, {compression artifacts}, "
"hard translated, {cropped}, {commissioner name}, unknown text, high contrast",
UCPreset.Preset_Light: "{worst quality}, guide lines, unfinished, bad, url, tall image, widescreen, "
"compression artifacts, unknown text",
UCPreset.Preset_None: "lowres",
},
}

# inpainting presets are the same as the normal ones
Expand Down Expand Up @@ -337,6 +349,14 @@ def from_v3_config(cls):

return cls.from_file(Path(__file__).parent / "image_presets" / "presets_v3" / "default.preset")

@classmethod
def from_v3_furry_config(cls):
"""
Create a new ImagePreset with the default settings from the v3 furry config
"""

return cls.from_file(Path(__file__).parent / "image_presets" / "presets_v3" / "default_furry.preset")

@classmethod
def from_default_config(cls, model: ImageModel) -> "ImagePreset":
"""
Expand All @@ -358,6 +378,8 @@ def from_default_config(cls, model: ImageModel) -> "ImagePreset":
return cls.from_v2_config()
elif model in (ImageModel.Anime_v3, ImageModel.Inpainting_Anime_v3):
return cls.from_v3_config()
elif model in (ImageModel.Furry_v3, ImageModel.Inpainting_Furry_v3):
return cls.from_v3_furry_config()

def __setitem__(self, key: str, value: Any):
if key not in self._TYPE_MAPPING:
Expand Down
7 changes: 6 additions & 1 deletion novelai_api/_high_level.py
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,12 @@ async def generate_image(
prompt = f"masterpiece, best quality, {prompt}"
elif model is ImageModel.Anime_v2:
prompt = f"very aesthetic, best quality, absurdres, {prompt}"
elif model in (ImageModel.Anime_v3, ImageModel.Inpainting_Anime_v3):
elif model in (
ImageModel.Anime_v3,
ImageModel.Inpainting_Anime_v3,
ImageModel.Furry_v3,
ImageModel.Inpainting_Furry_v3,
):
prompt = f"{prompt}, best quality, amazing quality, very aesthetic, absurdres"

async for e in self._parent.low_level.generate_image(prompt, model, action, settings):
Expand Down
26 changes: 26 additions & 0 deletions novelai_api/image_presets/presets_v3/default_furry.preset
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"resolution": "Normal_Portrait_v3",
"scale": 6.2,
"sampler": "k_euler_ancestral",
"steps": 28,
"n_samples": 1,
"strength": 0.7,
"noise": 0,
"uc_preset": "Preset_Heavy",
"quality_toggle": true,
"auto_smea": true,
"smea": false,
"smea_dyn": false,
"decrisper": false,
"controlnet_strength": 1,
"legacy": false,
"add_original_image": true,
"uncond_scale": 1,
"cfg_rescale": 0,
"noise_schedule": "native",
"legacy_v3_extend": false,
"params_version": 1,

"seed": 0,
"uc": ""
}
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jsonschema = "^4.21.1"
tokenizers = "^0.15.1"
ftfy = "^6.1.3"
regex = "^2023.12.25"
sentencepiece = "^0.1.98"
sentencepiece = "^0.2.0"
poetry = "^1.7.1"
# msgpack = "^1.0.5"

Expand Down
1 change: 1 addition & 0 deletions tests/api/test_imagegen_samplers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
models.remove(ImageModel.Inpainting_Anime_Curated)
models.remove(ImageModel.Inpainting_Furry)
models.remove(ImageModel.Inpainting_Anime_v3)
models.remove(ImageModel.Inpainting_Furry_v3)

samplers = list(ImageSampler)
model_samplers = list(itertools.product(models, samplers))
Expand Down

0 comments on commit b690a4e

Please sign in to comment.