From 625da190b21648be9b38618dd3b1c40fdfa57f9e Mon Sep 17 00:00:00 2001 From: jakechai Date: Thu, 30 Oct 2025 22:09:31 +0800 Subject: [PATCH] v2.2.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Fix Make Image Grid `from torchvision import transforms as TF` -> `import torchvision.transforms.functional as TF` issue. 2. Upgrade Split Image Grid node: ① Reasonable default values: Ensure at least 1 row/column to avoid division by zero errors. ② Better error messages: Provide specific resolution suggestions. ③ Boundary checks: Ensure cropping does not exceed the image area. ④ Empty list protection: Ensure a valid image tensor is always returned. ⑤ Exception handling: Gracefully handle errors in crop mode. 3. Separated the `install.py` file for ComfyUI and the `install_manual.py` file for the `install.bat` file. It should work fine now. 4. Zip IPAdapterPlus.py to IPAdapterPlus.zip to avoid node-conflict attention in ComfyUI Manager. 5. Random Prompter supports both string dictionaries, lists or txt format for YAML files. 6. Add more choices to Random Prompter. --- README.md | 20 +- install.bat | 4 +- install.py | 285 +-- install_manual.py | 296 +++ nodes/jake_node_image.py | 34 +- nodes/jake_node_prompt.py | 9 +- nodes/jake_utils.py | 167 +- nodes/prompt_data/camera/1-camera.json | 93 - nodes/prompt_data/camera/1-shot.json | 41 + nodes/prompt_data/camera/2-shot.json | 39 - nodes/prompt_data/camera/2-view.json | 73 + nodes/prompt_data/camera/3-view.json | 55 - nodes/prompt_data/camera/4-lens.json | 33 - nodes/prompt_data/camera/6-shutter.json | 35 - nodes/prompt_data/camera/7-aperture.json | 22 - nodes/prompt_data/camera/8-iso.json | 18 - nodes/prompt_data/camera/9-exposure.json | 7 - nodes/prompt_data/camera/900-camera.json | 296 +++ nodes/prompt_data/camera/901-lens.json | 93 + nodes/prompt_data/camera/902-shutter.json | 36 + nodes/prompt_data/camera/903-aperture.json | 22 + nodes/prompt_data/camera/904-film.json | 113 + .../camera/{5-dof.json => 905-dof.json} | 5 +- nodes/prompt_data/camera/906-iso.json | 19 + nodes/prompt_data/camera/907-exposure.json | 8 + nodes/prompt_data/camera/999-movement.json | 124 +- nodes/prompt_data/expression/1-happy.txt | 24 +- .../expression/10-negative_mood.json | 164 ++ .../expression/11-complex_mood.json | 104 + nodes/prompt_data/expression/12-other.json | 5 + nodes/prompt_data/expression/2-sad.json | 32 +- nodes/prompt_data/expression/3-angry.yaml | 37 +- nodes/prompt_data/expression/4-shock.toml | 10 - nodes/prompt_data/expression/4-surprised.toml | 18 + nodes/prompt_data/expression/5-confused.csv | 14 +- nodes/prompt_data/expression/6-disgusted.json | 8 + nodes/prompt_data/expression/6-other.json | 33 - nodes/prompt_data/expression/7-fearful.json | 35 + .../expression/8-contemptuous.json | 9 + .../expression/9-positive_mood.json | 108 + .../facial_action/1-combination.json | 482 +++- .../prompt_data/facial_action/2-eyebrows.json | 28 +- nodes/prompt_data/facial_action/3-eyes.json | 71 +- nodes/prompt_data/facial_action/4-nose.json | 18 +- nodes/prompt_data/facial_action/5-mouth.json | 59 +- nodes/prompt_data/facial_action/6-cheeks.json | 24 +- nodes/prompt_data/facial_action/7-chin.json | 12 +- nodes/prompt_data/facial_action/8-head.json | 7 + .../facial_action/999-injured.json | 127 +- nodes/prompt_data/lighting/1-time.json | 41 +- nodes/prompt_data/lighting/2-nature.json | 24 +- nodes/prompt_data/lighting/3-artificial.json | 72 +- nodes/prompt_data/lighting/4-diriection.json | 7 + nodes/prompt_data/lighting/5-mood.json | 36 +- nodes/prompt_data/motion/1-performance.json | 191 +- nodes/prompt_data/motion/2-pose.json | 223 +- nodes/prompt_data/scene/1-background.json | 2171 ++++++++++++----- nodes/prompt_data/scene/2-atmasphere.json | 2 + nodes/prompt_data/scene/3-color.json | 145 -- nodes/prompt_data/scene/3-weather.json | 111 + .../scene/900-color_description.yml | 36 + nodes/prompt_data/scene/901-color.json | 285 +++ pyproject.toml | 2 +- .../ComfyUI_IPAdapter_plus/IPAdapterPlus.py | 2059 ---------------- .../ComfyUI_IPAdapter_plus/IPAdapterPlus.zip | Bin 0 -> 14629 bytes 65 files changed, 5080 insertions(+), 3701 deletions(-) create mode 100644 install_manual.py delete mode 100644 nodes/prompt_data/camera/1-camera.json create mode 100644 nodes/prompt_data/camera/1-shot.json delete mode 100644 nodes/prompt_data/camera/2-shot.json create mode 100644 nodes/prompt_data/camera/2-view.json delete mode 100644 nodes/prompt_data/camera/3-view.json delete mode 100644 nodes/prompt_data/camera/4-lens.json delete mode 100644 nodes/prompt_data/camera/6-shutter.json delete mode 100644 nodes/prompt_data/camera/7-aperture.json delete mode 100644 nodes/prompt_data/camera/8-iso.json delete mode 100644 nodes/prompt_data/camera/9-exposure.json create mode 100644 nodes/prompt_data/camera/900-camera.json create mode 100644 nodes/prompt_data/camera/901-lens.json create mode 100644 nodes/prompt_data/camera/902-shutter.json create mode 100644 nodes/prompt_data/camera/903-aperture.json create mode 100644 nodes/prompt_data/camera/904-film.json rename nodes/prompt_data/camera/{5-dof.json => 905-dof.json} (89%) create mode 100644 nodes/prompt_data/camera/906-iso.json create mode 100644 nodes/prompt_data/camera/907-exposure.json create mode 100644 nodes/prompt_data/expression/10-negative_mood.json create mode 100644 nodes/prompt_data/expression/11-complex_mood.json create mode 100644 nodes/prompt_data/expression/12-other.json delete mode 100644 nodes/prompt_data/expression/4-shock.toml create mode 100644 nodes/prompt_data/expression/4-surprised.toml create mode 100644 nodes/prompt_data/expression/6-disgusted.json delete mode 100644 nodes/prompt_data/expression/6-other.json create mode 100644 nodes/prompt_data/expression/7-fearful.json create mode 100644 nodes/prompt_data/expression/8-contemptuous.json create mode 100644 nodes/prompt_data/expression/9-positive_mood.json create mode 100644 nodes/prompt_data/facial_action/8-head.json delete mode 100644 nodes/prompt_data/scene/3-color.json create mode 100644 nodes/prompt_data/scene/3-weather.json create mode 100644 nodes/prompt_data/scene/900-color_description.yml create mode 100644 nodes/prompt_data/scene/901-color.json delete mode 100644 replacement/ComfyUI_IPAdapter_plus/IPAdapterPlus.py create mode 100644 replacement/ComfyUI_IPAdapter_plus/IPAdapterPlus.zip diff --git a/README.md b/README.md index 9b4feca..f571890 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,11 @@ A [ComfyUI](https://github.com/comfyanonymous/ComfyUI) workflow customization by Feel free to join my [Discord server](https://discord.gg/2XC3w9as2f). If you like what I share, please support me with [PayPal](https://paypal.me/jakechaikefu). +> [!NOTE] +> - You might need ComfyUI v0.3.64 for JakeUpgrade v2.1.5up, for the `comfy_extras.nodes_compositing.SplitImageWithAlpha.split_image_with_alpha()` renaming issue. + ## Video Introduction -- (new)imgen QWen Model Sheet workflow: wip +- (new)imgen QWen Eidt Model Sheet workflow: [Youtube](https://youtu.be/SGEo8vlppG0) | [Bilibili](https://www.bilibili.com/video/BV1J3yUBLEPH/) - Wan Video | Wan Vace workflows: [Youtube](https://youtu.be/4KNOufzVsUs) | [Bilibili](https://www.bilibili.com/video/BV1kCJGzgEL4/) - Wan Video update 1 (multi-GPU | Dilated CN | ATI | Uni3C preview): [Youtube](https://youtu.be/gvgX82470i0) | [Bilibili](https://www.bilibili.com/video/BV1TS7hzwE99/) - Wan Video update 2 (Wan Eco | Long Video | Lip Sync | ref2v | MiniMax Remover and more): [Youtube](https://youtu.be/iZbT0Zi7ksg) | [Bilibili](https://www.bilibili.com/video/BV1DbaszHENZ/) @@ -306,6 +309,19 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake 1. Random Prompter bug fixed. 2. Fix bad connections in portrait master + random prompter workflow. +- 2025-10-30 - v2.2.3 +1. Fix Make Image Grid `from torchvision import transforms as TF` -> `import torchvision.transforms.functional as TF` issue. +2. Upgrade Split Image Grid node: +① Reasonable default values: Ensure at least 1 row/column to avoid division by zero errors. +② Better error messages: Provide specific resolution suggestions. +③ Boundary checks: Ensure cropping does not exceed the image area. +④ Empty list protection: Ensure a valid image tensor is always returned. +⑤ Exception handling: Gracefully handle errors in crop mode. +3. Separated the `install.py` file for ComfyUI and the `install_manual.py` file for the `install.bat` file. It should work fine now. +4. Zip IPAdapterPlus.py to IPAdapterPlus.zip to avoid node-conflict attention in ComfyUI Manager. +5. Random Prompter supports both string dictionaries, lists or txt format for YAML files. +6. Add more choices to Random Prompter. + ## Installation 1. `git clone https://github.com/jakechai/ComfyUI-JakeUpgrade` into the `custom_nodes` folder - e.g. `custom_nodes\ComfyUI-JakeUpgrade` @@ -421,6 +437,8 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake | MTV Crafter [2.1](https://github.com/DINGYANB/MTVCrafter) | main & module model | t2v ff2v | | Flash VSR [2.1](https://github.com/OpenImagingLab/FlashVSR) | main model | v2v | | MoCha [2.1](https://orange-3dv-team.github.io/MoCha/) | main model | v2v | +| Kaleido [2.1](https://arxiv.org/html/2510.18573v1) | main model | s2v | +| HoloCine [2.2](https://holo-cine.github.io/) | main model | t2v multi-scenes | | *control* | | | | Unianimate [2.1](https://github.com/ali-vilab/UniAnimate) | control lora | ff2v | | Depth lora [2.1](https://huggingface.co/spacepxl/Wan2.1-control-loras/tree/main/1.3b/depth) | control lora | t2v | diff --git a/install.bat b/install.bat index 2b64cca..b54fe67 100644 --- a/install.bat +++ b/install.bat @@ -52,8 +52,8 @@ echo. echo 📦 Starting smart dependency check... echo. -:: 运行 Python 安装脚本 -%PYTHON_EXEC% install.py +:: 运行 Python 安装脚本 - 使用手动安装版本 +%PYTHON_EXEC% install_manual.py if %errorlevel% neq 0 ( echo. diff --git a/install.py b/install.py index aa8ca9f..daedc6f 100644 --- a/install.py +++ b/install.py @@ -1,199 +1,30 @@ #!/usr/bin/env python3 """ -JakeUpgrade Nodes Auto-Install Script -JakeUpgrade 节点自动安装脚本 -用于安装 ComfyUI 自定义节点所需的依赖包 -For installing dependencies required by ComfyUI custom nodes +JakeUpgrade Nodes Auto-Install Script for ComfyUI +ComfyUI 自动安装脚本 - 简化版,无用户交互 """ import sys import subprocess import os -import platform -import re from pathlib import Path -def get_comfyui_path(): - """获取 ComfyUI 根目录路径 / Get ComfyUI root path""" - current_dir = Path(__file__).parent - - # 尝试多种可能的目录结构 - possible_paths = [ - current_dir.parent.parent, # root\ComfyUI\custom_nodes\ - current_dir.parent.parent.parent, # root\ComfyUI\custom_nodes\node_name - current_dir.parent.parent.parent.parent, # root\ComfyUI\custom_nodes\node_name\subfolder - ] - - for comfy_path in possible_paths: - # 检查是否是 ComfyUI 目录 - if (comfy_path / "ComfyUI").exists(): - return comfy_path - - # 如果找不到,返回当前目录的父目录的父目录 - return current_dir.parent.parent - -def get_python_executable(): - """获取 Python 可执行文件路径 / Get Python executable path""" - comfy_path = get_comfyui_path() - - # 优先使用嵌入式 Python / Prefer embedded Python - embedded_python = comfy_path / "python_embeded" / "python.exe" - if embedded_python.exists(): - print(f"✅ Using embedded Python: {embedded_python}") - return str(embedded_python) - - # 检查 ComfyUI 目录下的嵌入式 Python - embedded_python2 = comfy_path / "ComfyUI" / "python_embeded" / "python.exe" - if embedded_python2.exists(): - print(f"✅ Using embedded Python: {embedded_python2}") - return str(embedded_python2) - - # 使用系统 Python / Use system Python - system_python = sys.executable - print(f"✅ Using system Python: {system_python}") - return system_python - -def check_python_version(python_exec): - """检查 Python 版本 / Check Python version""" - print("🔍 Checking Python version...") +def run_installation(): + """执行安装流程""" try: - result = subprocess.run( - [python_exec, "--version"], - capture_output=True, - text=True, - timeout=10 - ) - if result.returncode == 0: - version_output = result.stdout.strip() - print(f"✅ Python version: {version_output}") - - # 解析版本号 / Parse version number - version_match = re.search(r"Python (\d+)\.(\d+)", version_output) - if version_match: - major, minor = int(version_match.group(1)), int(version_match.group(2)) - if major < 3 or (major == 3 and minor < 8): - print(f"❌ Unsupported Python version: {version_output}") - print("✅ Requires Python 3.8 or higher") - return False - return True - except Exception as e: - print(f"❌ Failed to check Python version: {e}") - return False - - return True - -def check_existing_dependencies(python_exec): - """检查已安装的依赖 / Check existing dependencies""" - print("\n🔍 Checking existing dependencies...") - - try: - # 获取已安装的包列表 - result = subprocess.run( - [python_exec, "-s", "-m", "pip", "list", "--format=freeze"], - capture_output=True, - text=True, - timeout=30 - ) + # 使用当前 Python 解释器 + python_exec = sys.executable - if result.returncode == 0: - installed_packages = set() - for line in result.stdout.strip().split('\n'): - if line and '==' in line: - pkg = line.split('==', 1)[0].strip().lower() - installed_packages.add(pkg) - - # 读取 requirements.txt - current_dir = Path(__file__).parent - requirements_file = current_dir / "requirements.txt" - - with open(requirements_file, 'r', encoding='utf-8') as f: - requirements = f.readlines() - - missing_packages = [] - for req in requirements: - req = req.strip() - if not req or req.startswith('#'): - continue - - # 只检查包名,不考虑版本 - pkg_name = req.strip().lower() - - if pkg_name not in installed_packages: - missing_packages.append(req) - print(f"❌ {req} - Not installed") - else: - print(f"✅ {req} - Already installed") - - return missing_packages - else: - print(f"❌ Cannot get installed packages: {result.stderr}") - return None - - except Exception as e: - print(f"❌ Error checking dependencies: {e}") - return None - -def install_missing_only(python_exec, missing_packages): - """只安装缺失的包 / Install only missing packages""" - if not missing_packages: - print("✅ All dependencies already installed") - return True - - print(f"\n📦 Packages to install: {', '.join(missing_packages)}") - - try: - # 为所有缺失的包一次性安装 - print("⏳ Installing missing dependencies...") - result = subprocess.run( - [python_exec, "-s", "-m", "pip", "install"] + missing_packages, - capture_output=True, - text=True, - timeout=300 - ) + # requirements.txt 路径 + current_dir = Path(__file__).parent + requirements_file = current_dir / "requirements.txt" - if result.returncode == 0: - print("✅ Missing dependencies installed") - return True - else: - print(f"❌ Installation failed: {result.stderr}") + if not requirements_file.exists(): + print(f"Requirements file not found: {requirements_file}") return False - - except Exception as e: - print(f"❌ Exception during installation: {e}") - return False - -def install_requirements(python_exec): - """安装 requirements.txt 中的依赖 / Install dependencies from requirements.txt""" - print("\n📦 Starting dependency check...") - - current_dir = Path(__file__).parent - requirements_file = current_dir / "requirements.txt" - - if not requirements_file.exists(): - print(f"❌ requirements.txt not found: {requirements_file}") - return False - - try: - # 首先检查已安装的依赖 - missing_packages = check_existing_dependencies(python_exec) - if missing_packages is None: - # 如果检查失败,回退到传统安装方式 - print("⚠️ Dependency check failed, using traditional installation") - return install_traditional(python_exec, requirements_file) - - # 只安装缺失的包 - return install_missing_only(python_exec, missing_packages) - - except Exception as e: - print(f"❌ Exception during installation: {e}") - return install_traditional(python_exec, requirements_file) - -def install_traditional(python_exec, requirements_file): - """传统安装方式(备用) / Traditional installation (fallback)""" - print("🔄 Using traditional installation method") - - try: + # 直接安装依赖 + print("Installing dependencies...") result = subprocess.run( [python_exec, "-s", "-m", "pip", "install", "-r", str(requirements_file)], capture_output=True, @@ -202,95 +33,29 @@ def install_traditional(python_exec, requirements_file): ) if result.returncode == 0: - print("✅ Dependencies installation completed!") + print("Dependencies installed successfully") return True else: - print(f"❌ Error during installation:") - if result.stdout: - print(f"Stdout: {result.stdout}") - if result.stderr: - print(f"Stderr: {result.stderr}") + print(f"Installation failed: {result.stderr}") return False - except subprocess.TimeoutExpired: - print("❌ Installation timeout, check network connection or install manually") + except Exception as e: + print(f"Installation error: {e}") return False -def check_installation(python_exec): - """检查安装结果 / Check installation results""" - print("\n🔍 Checking installation results...") - - packages_to_check = [ - ("cv2", "opencv-python"), - ("piexif", "piexif"), - ("torch", "torch"), - ("torchvision", "torchvision"), - ("numpy", "numpy"), - ("PIL", "pillow"), - ("simpleeval", "simpleeval"), - ("functools", "functools"), - ("yaml", "PyYAML"), - ("toml", "toml"), - - ] - - all_installed = True - for import_name, package_name in packages_to_check: - try: - # 使用指定的 Python 执行器检查 - check_script = f"import {import_name}" if import_name != "PIL" else "import PIL" - result = subprocess.run( - [python_exec, "-c", check_script], - capture_output=True, - text=True, - timeout=10 - ) - if result.returncode == 0: - print(f"✅ {package_name} installed correctly") - else: - print(f"❌ {package_name} installation failed: {result.stderr}") - all_installed = False - except Exception as e: - print(f"❌ Error checking {package_name}: {e}") - all_installed = False - - return all_installed - def main(): - """主函数 / Main function""" - print("=" * 60) - print("🛠️ JakeUpgrade Nodes Installer") - print("=" * 60) + """主函数 - 简化版,无用户交互""" + print("JakeUpgrade Nodes Installer - ComfyUI Mode") - # 检查系统信息 - print(f"💻 OS: {platform.system()} {platform.release()}") - print(f"📁 Working directory: {Path(__file__).parent}") + success = run_installation() - # 获取 Python 执行器 - python_exec = get_python_executable() - - # 执行安装步骤 - if not check_python_version(python_exec): - sys.exit(1) - - if not install_requirements(python_exec): - print("\n❌ Dependency installation failed, try manual installation:") - print(" 1. Open command prompt or terminal") - print(" 2. Change to current directory") - print(f" 3. Run: {python_exec} -m pip install -r requirements.txt") - sys.exit(1) - - # 验证安装 - if check_installation(python_exec): - print("\n🎉 Installation complete! JakeUpgrade Nodes ready!") - print("🔧 You can now start ComfyUI and use JakeUpgrade nodes") + if success: + print("Installation completed successfully") else: - print("\n⚠️ Some dependencies may not be installed correctly") - print("💡 Recommended to restart ComfyUI and check if nodes work properly") + print("Installation failed") - print("\nPress Enter to exit...") - input() + # 不等待用户输入,直接退出 + sys.exit(0 if success else 1) if __name__ == "__main__": - import re main() \ No newline at end of file diff --git a/install_manual.py b/install_manual.py new file mode 100644 index 0000000..aa8ca9f --- /dev/null +++ b/install_manual.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +""" +JakeUpgrade Nodes Auto-Install Script +JakeUpgrade 节点自动安装脚本 +用于安装 ComfyUI 自定义节点所需的依赖包 +For installing dependencies required by ComfyUI custom nodes +""" + +import sys +import subprocess +import os +import platform +import re +from pathlib import Path + +def get_comfyui_path(): + """获取 ComfyUI 根目录路径 / Get ComfyUI root path""" + current_dir = Path(__file__).parent + + # 尝试多种可能的目录结构 + possible_paths = [ + current_dir.parent.parent, # root\ComfyUI\custom_nodes\ + current_dir.parent.parent.parent, # root\ComfyUI\custom_nodes\node_name + current_dir.parent.parent.parent.parent, # root\ComfyUI\custom_nodes\node_name\subfolder + ] + + for comfy_path in possible_paths: + # 检查是否是 ComfyUI 目录 + if (comfy_path / "ComfyUI").exists(): + return comfy_path + + # 如果找不到,返回当前目录的父目录的父目录 + return current_dir.parent.parent + +def get_python_executable(): + """获取 Python 可执行文件路径 / Get Python executable path""" + comfy_path = get_comfyui_path() + + # 优先使用嵌入式 Python / Prefer embedded Python + embedded_python = comfy_path / "python_embeded" / "python.exe" + if embedded_python.exists(): + print(f"✅ Using embedded Python: {embedded_python}") + return str(embedded_python) + + # 检查 ComfyUI 目录下的嵌入式 Python + embedded_python2 = comfy_path / "ComfyUI" / "python_embeded" / "python.exe" + if embedded_python2.exists(): + print(f"✅ Using embedded Python: {embedded_python2}") + return str(embedded_python2) + + # 使用系统 Python / Use system Python + system_python = sys.executable + print(f"✅ Using system Python: {system_python}") + return system_python + +def check_python_version(python_exec): + """检查 Python 版本 / Check Python version""" + print("🔍 Checking Python version...") + try: + result = subprocess.run( + [python_exec, "--version"], + capture_output=True, + text=True, + timeout=10 + ) + if result.returncode == 0: + version_output = result.stdout.strip() + print(f"✅ Python version: {version_output}") + + # 解析版本号 / Parse version number + version_match = re.search(r"Python (\d+)\.(\d+)", version_output) + if version_match: + major, minor = int(version_match.group(1)), int(version_match.group(2)) + if major < 3 or (major == 3 and minor < 8): + print(f"❌ Unsupported Python version: {version_output}") + print("✅ Requires Python 3.8 or higher") + return False + return True + except Exception as e: + print(f"❌ Failed to check Python version: {e}") + return False + + return True + +def check_existing_dependencies(python_exec): + """检查已安装的依赖 / Check existing dependencies""" + print("\n🔍 Checking existing dependencies...") + + try: + # 获取已安装的包列表 + result = subprocess.run( + [python_exec, "-s", "-m", "pip", "list", "--format=freeze"], + capture_output=True, + text=True, + timeout=30 + ) + + if result.returncode == 0: + installed_packages = set() + for line in result.stdout.strip().split('\n'): + if line and '==' in line: + pkg = line.split('==', 1)[0].strip().lower() + installed_packages.add(pkg) + + # 读取 requirements.txt + current_dir = Path(__file__).parent + requirements_file = current_dir / "requirements.txt" + + with open(requirements_file, 'r', encoding='utf-8') as f: + requirements = f.readlines() + + missing_packages = [] + for req in requirements: + req = req.strip() + if not req or req.startswith('#'): + continue + + # 只检查包名,不考虑版本 + pkg_name = req.strip().lower() + + if pkg_name not in installed_packages: + missing_packages.append(req) + print(f"❌ {req} - Not installed") + else: + print(f"✅ {req} - Already installed") + + return missing_packages + else: + print(f"❌ Cannot get installed packages: {result.stderr}") + return None + + except Exception as e: + print(f"❌ Error checking dependencies: {e}") + return None + +def install_missing_only(python_exec, missing_packages): + """只安装缺失的包 / Install only missing packages""" + if not missing_packages: + print("✅ All dependencies already installed") + return True + + print(f"\n📦 Packages to install: {', '.join(missing_packages)}") + + try: + # 为所有缺失的包一次性安装 + print("⏳ Installing missing dependencies...") + result = subprocess.run( + [python_exec, "-s", "-m", "pip", "install"] + missing_packages, + capture_output=True, + text=True, + timeout=300 + ) + + if result.returncode == 0: + print("✅ Missing dependencies installed") + return True + else: + print(f"❌ Installation failed: {result.stderr}") + return False + + except Exception as e: + print(f"❌ Exception during installation: {e}") + return False + +def install_requirements(python_exec): + """安装 requirements.txt 中的依赖 / Install dependencies from requirements.txt""" + print("\n📦 Starting dependency check...") + + current_dir = Path(__file__).parent + requirements_file = current_dir / "requirements.txt" + + if not requirements_file.exists(): + print(f"❌ requirements.txt not found: {requirements_file}") + return False + + try: + # 首先检查已安装的依赖 + missing_packages = check_existing_dependencies(python_exec) + + if missing_packages is None: + # 如果检查失败,回退到传统安装方式 + print("⚠️ Dependency check failed, using traditional installation") + return install_traditional(python_exec, requirements_file) + + # 只安装缺失的包 + return install_missing_only(python_exec, missing_packages) + + except Exception as e: + print(f"❌ Exception during installation: {e}") + return install_traditional(python_exec, requirements_file) + +def install_traditional(python_exec, requirements_file): + """传统安装方式(备用) / Traditional installation (fallback)""" + print("🔄 Using traditional installation method") + + try: + result = subprocess.run( + [python_exec, "-s", "-m", "pip", "install", "-r", str(requirements_file)], + capture_output=True, + text=True, + timeout=300 + ) + + if result.returncode == 0: + print("✅ Dependencies installation completed!") + return True + else: + print(f"❌ Error during installation:") + if result.stdout: + print(f"Stdout: {result.stdout}") + if result.stderr: + print(f"Stderr: {result.stderr}") + return False + + except subprocess.TimeoutExpired: + print("❌ Installation timeout, check network connection or install manually") + return False + +def check_installation(python_exec): + """检查安装结果 / Check installation results""" + print("\n🔍 Checking installation results...") + + packages_to_check = [ + ("cv2", "opencv-python"), + ("piexif", "piexif"), + ("torch", "torch"), + ("torchvision", "torchvision"), + ("numpy", "numpy"), + ("PIL", "pillow"), + ("simpleeval", "simpleeval"), + ("functools", "functools"), + ("yaml", "PyYAML"), + ("toml", "toml"), + + ] + + all_installed = True + for import_name, package_name in packages_to_check: + try: + # 使用指定的 Python 执行器检查 + check_script = f"import {import_name}" if import_name != "PIL" else "import PIL" + result = subprocess.run( + [python_exec, "-c", check_script], + capture_output=True, + text=True, + timeout=10 + ) + if result.returncode == 0: + print(f"✅ {package_name} installed correctly") + else: + print(f"❌ {package_name} installation failed: {result.stderr}") + all_installed = False + except Exception as e: + print(f"❌ Error checking {package_name}: {e}") + all_installed = False + + return all_installed + +def main(): + """主函数 / Main function""" + print("=" * 60) + print("🛠️ JakeUpgrade Nodes Installer") + print("=" * 60) + + # 检查系统信息 + print(f"💻 OS: {platform.system()} {platform.release()}") + print(f"📁 Working directory: {Path(__file__).parent}") + + # 获取 Python 执行器 + python_exec = get_python_executable() + + # 执行安装步骤 + if not check_python_version(python_exec): + sys.exit(1) + + if not install_requirements(python_exec): + print("\n❌ Dependency installation failed, try manual installation:") + print(" 1. Open command prompt or terminal") + print(" 2. Change to current directory") + print(f" 3. Run: {python_exec} -m pip install -r requirements.txt") + sys.exit(1) + + # 验证安装 + if check_installation(python_exec): + print("\n🎉 Installation complete! JakeUpgrade Nodes ready!") + print("🔧 You can now start ComfyUI and use JakeUpgrade nodes") + else: + print("\n⚠️ Some dependencies may not be installed correctly") + print("💡 Recommended to restart ComfyUI and check if nodes work properly") + + print("\nPress Enter to exit...") + input() + +if __name__ == "__main__": + import re + main() \ No newline at end of file diff --git a/nodes/jake_node_image.py b/nodes/jake_node_image.py index 7cb7938..fa9ef80 100644 --- a/nodes/jake_node_image.py +++ b/nodes/jake_node_image.py @@ -151,7 +151,6 @@ class RoughOutline_JK: # Concatenate after unifying shapes return numpy.concatenate(new_contour, axis=0) - class OpenDWPose_JK: """Combine DWPose and OpenPose images by removing and reserving specific colors""" @@ -247,7 +246,6 @@ class OpenDWPose_JK: result_image = numpy.add(DWPose, OpenPose) return (result_image,) - class MakeImageGrid_JK: """Create image grid from multiple images""" @@ -270,7 +268,7 @@ class MakeImageGrid_JK: def make_image_grid(self, images, grid_side_num, grid_side): """Create image grid from batch of images""" try: - from torchvision import transforms as TF + import torchvision.transforms.functional as TF except ImportError: raise ImportError("torchvision is required for MakeImageGrid_JK") @@ -289,7 +287,6 @@ class MakeImageGrid_JK: return (image_grid,) - class SplitImageGrid_JK: """Split image grid into individual images""" @@ -298,8 +295,9 @@ class SplitImageGrid_JK: return { "required": { "image": ("IMAGE",), - "grid_side": ("BOOLEAN", {"default": True, "label_on": "rows", "label_off": "columns"},), + "grid_side": ("BOOLEAN", {"default": True, "label_on": "rows", "label_off": "columns"}), "grid_side_num": ("INT", {"default": 1, "min": 1, "max": 8192}), + "crop_excess": ("BOOLEAN", {"default": True, "label_on": "crop", "label_off": "error"}), }, } @@ -309,7 +307,7 @@ class SplitImageGrid_JK: CATEGORY = icons.get("JK/Image") DESCRIPTION = "Split image grid into individual images based on rows or columns" - def split_image_grid(self, image, grid_side_num, grid_side): + def split_image_grid(self, image, grid_side_num, grid_side, crop_excess=True): """Split image grid into multiple images""" images = [] for image_pil in torch_imgs_to_pils(image): @@ -320,13 +318,26 @@ class SplitImageGrid_JK: cols = grid_side_num rows = None - image_pils = pil_split_image(image_pil, rows, cols) - images.append(pils_to_torch_imgs(image_pils, image.dtype, image.device)) + try: + image_pils = pil_split_image(image_pil, rows, cols, crop_excess) + if image_pils: # Only process if we have images + torch_imgs = pils_to_torch_imgs(image_pils, image.dtype, image.device) + images.append(torch_imgs) + except Exception as e: + if not crop_excess: + raise e + # In crop mode, try to handle the error more gracefully + print(f"Warning: {e}. Using fallback splitting.") + # Fallback: use single image + images.append(image) + + if not images: + # If no images were created, return the original + return (image,) images = torch.cat(images, dim=0) return (images,) - class ImageRemoveAlpha_JK: """Remove alpha channel from RGBA images""" @@ -354,7 +365,6 @@ class ImageRemoveAlpha_JK: return (torch.cat(ret_images, dim=0),) - class ColorGrading_JK: """Apply color grading with brightness, contrast, saturation and RGB adjustments""" @@ -421,7 +431,6 @@ class ColorGrading_JK: return (torch.cat(ret_images, dim=0),) - class GetSize_JK: """Get dimensions from image, latent, or mask""" @@ -458,7 +467,6 @@ class GetSize_JK: return (image_width, image_height) - # Helper functions for image cropping operations def get_bounding_box(mask): """Calculate bounding box from mask""" @@ -507,7 +515,6 @@ def calculate_scale_factor(target_mega_pixel, width, height): target_pixels = target_mega_pixel * 1000000 # Convert to pixels return math.sqrt(target_pixels / current_pixels) - class ImageCropByMaskResolutionGrp_JK: """Calculate crop parameters based on mask for image processing""" @@ -582,7 +589,6 @@ class ImageCropByMaskResolutionGrp_JK: return (crop_width, crop_height, offset_x, offset_y, target_width, target_height) - class ImageCropByMaskParams_JK: """Provide crop parameters for mask-based image cropping""" diff --git a/nodes/jake_node_prompt.py b/nodes/jake_node_prompt.py index 62aeb2b..2d1cfb6 100644 --- a/nodes/jake_node_prompt.py +++ b/nodes/jake_node_prompt.py @@ -233,7 +233,8 @@ class FileLoader: data = yaml.safe_load(f) if isinstance(data, list): - return DataCleaner.clean_and_deduplicate(data) + all_values = [str(item).strip() for item in data if str(item).strip()] + return DataCleaner.clean_and_deduplicate(all_values) elif isinstance(data, dict): # 处理YAML字典格式 all_values = [] @@ -244,8 +245,10 @@ class FileLoader: all_values.append(value) return DataCleaner.clean_and_deduplicate(all_values) else: - print(f"Warning: YAML file {file_path} has unsupported structure: {type(data)}") - return [] + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read().strip() + # 如果不是标准的YAML结构,按文本文件处理 + return [line.strip() for line in content.split('\n') if line.strip()] except Exception as e: print(f"Error reading YAML file {file_path}: {e}") return [] diff --git a/nodes/jake_utils.py b/nodes/jake_utils.py index 790b486..69c840c 100644 --- a/nodes/jake_utils.py +++ b/nodes/jake_utils.py @@ -269,7 +269,7 @@ def calculate_loop_frame_count( return int(loop_frame_count) #---------------------------------------------------------------------------------------------------------------------# -# Image Utilities from 3D Pack +# Image Utilities copied and modified from 3D Pack #---------------------------------------------------------------------------------------------------------------------# def torch_imgs_to_pils(images, masks=None, alpha_min=0.1): """ @@ -313,33 +313,156 @@ def pils_to_torch_imgs(pils: Union[Image.Image, List[Image.Image]], dtype=torch. return images -def pil_split_image(image, rows=None, cols=None): +def pil_split_image(image, rows=None, cols=None, crop_excess=True): """ - inverse function of make_image_grid + Split image into grid with proper error handling and validation + + Args: + image: PIL Image to split + rows: Number of rows (None for auto) + cols: Number of columns (None for auto) + crop_excess: Whether to crop excess pixels or raise error """ - # image is in square - if rows is None and cols is None: - # image.size [W, H] - rows = 1 - cols = image.size[0] // image.size[1] - assert cols * image.size[1] == image.size[0] - subimg_size = image.size[1] - elif rows is None: - subimg_size = image.size[0] // cols - rows = image.size[1] // subimg_size - assert rows * subimg_size == image.size[1] - elif cols is None: - subimg_size = image.size[1] // rows - cols = image.size[0] // subimg_size - assert cols * subimg_size == image.size[0] + original_width, original_height = image.size + + # Validate input parameters + if rows is not None and rows <= 0: + raise ValueError(f"Rows must be positive, got {rows}") + if cols is not None and cols <= 0: + raise ValueError(f"Columns must be positive, got {cols}") + + # Case 1: Both rows and cols specified + if rows is not None and cols is not None: + subimg_width = original_width // cols + subimg_height = original_height // rows + + # Validate if splitting is possible + if subimg_width <= 0 or subimg_height <= 0: + raise ValueError(f"Cannot split image {original_width}x{original_height} into {cols}x{rows} grid - subimage size would be {subimg_width}x{subimg_height}") + + if crop_excess: + # Crop to make divisible + new_width = subimg_width * cols + new_height = subimg_height * rows + if new_width != original_width or new_height != original_height: + image = image.crop((0, 0, new_width, new_height)) + else: + # Check if divisible + if subimg_width * cols != original_width or subimg_height * rows != original_height: + raise ValueError( + f"Image size {original_width}x{original_height} cannot be evenly divided into {cols}x{rows} grid. " + f"Subimage size would be {subimg_width}x{subimg_height} with excess pixels. " + f"Use crop_excess=True or resize the image to {subimg_width * cols}x{subimg_height * rows}" + ) + + # Case 2: Only columns specified + elif cols is not None: + subimg_width = original_width // cols + if subimg_width <= 0: + raise ValueError(f"Cannot split image width {original_width} into {cols} columns") + + # Calculate rows based on maintaining aspect ratio or using available height + rows = max(1, original_height // subimg_width) # Ensure at least 1 row + + subimg_height = original_height // rows + + if crop_excess: + new_width = subimg_width * cols + new_height = subimg_height * rows + if new_width != original_width or new_height != original_height: + image = image.crop((0, 0, new_width, new_height)) + else: + if subimg_width * cols != original_width or subimg_height * rows != original_height: + raise ValueError( + f"Image size {original_width}x{original_height} cannot be evenly divided into {cols} columns. " + f"Subimage size would be {subimg_width}x{subimg_height} with {original_width - subimg_width * cols}x{original_height - subimg_height * rows} excess. " + f"Suggested grid: {cols}x{rows}" + ) + + # Case 3: Only rows specified + elif rows is not None: + subimg_height = original_height // rows + if subimg_height <= 0: + raise ValueError(f"Cannot split image height {original_height} into {rows} rows") + + # Calculate columns based on maintaining aspect ratio or using available width + cols = max(1, original_width // subimg_height) # Ensure at least 1 column + + subimg_width = original_width // cols + + if crop_excess: + new_width = subimg_width * cols + new_height = subimg_height * rows + if new_width != original_width or new_height != original_height: + image = image.crop((0, 0, new_width, new_height)) + else: + if subimg_width * cols != original_width or subimg_height * rows != original_height: + raise ValueError( + f"Image size {original_width}x{original_height} cannot be evenly divided into {rows} rows. " + f"Subimage size would be {subimg_width}x{subimg_height} with {original_width - subimg_width * cols}x{original_height - subimg_height * rows} excess. " + f"Suggested grid: {cols}x{rows}" + ) + + # Case 4: Auto-detect (assume square grid) else: - subimg_size = image.size[1] // rows - assert cols * subimg_size == image.size[0] + # Try to make square subimages + if original_width >= original_height: + cols = original_width // original_height + rows = 1 + subimg_size = original_height + else: + rows = original_height // original_width + cols = 1 + subimg_size = original_width + + if cols <= 0 or rows <= 0: + raise ValueError(f"Cannot auto-split image {original_width}x{original_height} - too small") + + if crop_excess: + new_width = subimg_size * cols + new_height = subimg_size * rows + if new_width != original_width or new_height != original_height: + image = image.crop((0, 0, new_width, new_height)) + else: + if subimg_size * cols != original_width or subimg_size * rows != original_height: + raise ValueError( + f"Image size {original_width}x{original_height} cannot be auto-split into square subimages. " + f"Suggested grid: {cols}x{rows} with subimage size {subimg_size}" + ) + subimg_width = subimg_height = subimg_size + + # Final validation + if 'subimg_width' not in locals() or 'subimg_height' not in locals(): + subimg_width = original_width // cols + subimg_height = original_height // rows + + if subimg_width <= 0 or subimg_height <= 0: + raise ValueError(f"Calculated invalid subimage size: {subimg_width}x{subimg_height}") + + # Perform the actual splitting subimgs = [] for i in range(rows): for j in range(cols): - subimg = image.crop((j*subimg_size, i*subimg_size, (j+1)*subimg_size, (i+1)*subimg_size)) - subimgs.append(subimg) + left = j * subimg_width + upper = i * subimg_height + right = left + subimg_width + lower = upper + subimg_height + + # Safety check - ensure we don't go beyond image bounds + if right > image.width: + right = image.width + if lower > image.height: + lower = image.height + + # Only add if we have a valid region + if left < right and upper < lower: + subimg = image.crop((left, upper, right, lower)) + subimgs.append(subimg) + + # Final safety check - ensure we have at least one image + if not subimgs: + raise ValueError("No valid subimages could be created from the grid") + return subimgs def pil_make_image_grid(images, rows=None, cols=None): diff --git a/nodes/prompt_data/camera/1-camera.json b/nodes/prompt_data/camera/1-camera.json deleted file mode 100644 index a737a6f..0000000 --- a/nodes/prompt_data/camera/1-camera.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - "Canon EOS 90D", - "Canon EOS M50", - "Canon EOS M50 Mark II", - "Canon EOS M6 Mark II", - "Canon EOS R5", - "Canon EOS RP", - "Canon EOS Rebel T8i", - "Canon EOS-1D X Mark III", - "Canon PowerShot G7 X Mark III", - "Fujifilm FinePix XP140", - "Fujifilm GFX 100", - "Fujifilm GFX 50S", - "Fujifilm Instax Mini 11", - "Fujifilm X-E4", - "Fujifilm X-Pro3", - "Fujifilm X-T200", - "Fujifilm X-T4", - "Fujifilm X100V", - "GoPro HERO9 Black", - "Hasselblad 907X 50C", - "Hasselblad H5D-50c", - "Hasselblad H6D-100c", - "Hasselblad X1D II 50C", - "Hasselblad XCD 4|45P", - "Leica CL", - "Leica M-D", - "Leica M10 Monochrom", - "Leica M10-R", - "Leica M11", - "Leica Q-P", - "Leica Q2", - "Leica Q2 Monochrom", - "Leica S3", - "Leica SL2", - "Leica SL2-S", - "Nikon Coolpix P950", - "Nikon Coolpix W300", - "Nikon D3500", - "Nikon D6", - "Nikon D780", - "Nikon D850", - "Nikon Z5", - "Nikon Z50", - "Nikon Z6", - "Nikon Z6 II", - "Nikon Z7 II", - "Olympus E-M1X", - "Olympus OM-D E-M1 Mark II", - "Olympus OM-D E-M10 Mark IV", - "Olympus OM-D E-M1X", - "Olympus OM-D E-M5 Mark III", - "Olympus PEN E-PL10", - "Olympus PEN-F", - "Olympus Tough TG-6", - "Panasonic Lumix DC-G100", - "Panasonic Lumix DC-G9", - "Panasonic Lumix DC-GH5", - "Panasonic Lumix DC-S1R", - "Panasonic Lumix DC-S5", - "Panasonic Lumix DMC-FZ300", - "Panasonic Lumix DMC-LX100 II", - "Panasonic Lumix FZ1000 II", - "Panasonic Lumix G100", - "Panasonic Lumix GH5 II", - "Panasonic Lumix S1", - "Panasonic Lumix S1R", - "Panasonic Lumix S5", - "Pentax 645Z", - "Pentax K-1 Mark II", - "Pentax KP", - "Phase One XF IQ4 150MP", - "Phase One XT", - "Ricoh GR III", - "Ricoh Theta Z1", - "Sigma SD Quattro H", - "Sigma fp", - "Sigma fp L", - "Sony A6000", - "Sony A6400", - "Sony A7R IV", - "Sony A7S III", - "Sony A9 II", - "Sony Alpha 1", - "Sony Alpha A7 III", - "Sony Alpha A9 II", - "Sony Cyber-shot DSC-RX10 IV", - "Sony Cyber-shot DSC-W800", - "Sony Cyber-shot RX100 VII", - "Sony RX10 IV", - "Sony RX100 VII", - "Sony ZV-1" -] \ No newline at end of file diff --git a/nodes/prompt_data/camera/1-shot.json b/nodes/prompt_data/camera/1-shot.json new file mode 100644 index 0000000..f77dd05 --- /dev/null +++ b/nodes/prompt_data/camera/1-shot.json @@ -0,0 +1,41 @@ +[ + "a specific shot size", + "bust shot", + "chest shot", + "close-up shot", + "detail shot", + "distance shot", + "dutch angle shot", + "extreme close-up shot", + "extreme long shot", + "extreme tight shot", + "extreme wide shot", + "eye-level shot", + "face shot", + "full body shot", + "full length portrait shot", + "full shot", + "half length portrait shot", + "head and shoulders portrait shot", + "head close-up shot", + "head portrait shot", + "high-angle shot", + "knee shot", + "long shot", + "low-angle shot", + "medium close-up shot", + "medium full shot", + "medium long shot", + "medium shot", + "medium tight shot", + "medium wide shot", + "mug shot", + "near shot", + "over-the-shoulder shot", + "overhead shot", + "portrait shot", + "selfie shot", + "tight shot", + "waist shot", + "wide shot" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/2-shot.json b/nodes/prompt_data/camera/2-shot.json deleted file mode 100644 index f1a358e..0000000 --- a/nodes/prompt_data/camera/2-shot.json +++ /dev/null @@ -1,39 +0,0 @@ -[ - "full body shot", - "face shot", - "head close-up shot", - "portrait shot", - "full length portrait shot", - "half length portrait shot", - "head and shoulders portrait shot", - "head portrait shot", - "chest shot", - "bust shot", - "waist shot", - "knee shot", - "mug shot", - "detail shot", - "eye-level shot", - "high-angle shot", - "low-angle shot", - "overhead shot", - "over-the-shoulder shot", - "dutch angle shot", - "selfie shot", - "near shot", - "medium shot", - "medium full shot", - "distance shot", - "close-up shot", - "extreme close-up shot", - "medium close-up shot", - "tight shot", - "medium tight shot", - "extreme tight shot", - "long shot", - "medium long shot", - "extreme long shot", - "wide shot", - "medium wide shot", - "extreme wide shot" -] diff --git a/nodes/prompt_data/camera/2-view.json b/nodes/prompt_data/camera/2-view.json new file mode 100644 index 0000000..6e1dff9 --- /dev/null +++ b/nodes/prompt_data/camera/2-view.json @@ -0,0 +1,73 @@ +[ + "a specific view angle", + "aerial view", + "back view", + "bird's-eye view shot", + "bottom view", + "cowboy shot view", + "dutch angle shot view", + "dynamic view angle", + "extreme high view angle", + "extreme low view angle", + "eye-level shot", + "focus on back", + "focus on chest", + "focus on feet", + "focus on hands", + "focus on head", + "focus on heels", + "focus on knees", + "focus on left elbow", + "focus on left foot", + "focus on left hand", + "focus on left heel", + "focus on left knee", + "focus on left popliteal fossa", + "focus on left posterior elbow", + "focus on popliteal fossas", + "focus on right elbow", + "focus on right foot", + "focus on right hand", + "focus on right heel", + "focus on right knee", + "focus on right popliteal fossa", + "focus on right posterior elbow", + "focus on shoulder", + "focus on upper body", + "focus on upper body and head", + "focus on waist", + "from a specific extreme view angle", + "from a specific medium view angle", + "from a specific view angle", + "front view", + "ground level shot", + "high view angle", + "hip level shot", + "knee level shot", + "left profile view", + "left side view", + "left three-quarter angle view", + "low view angle", + "medium high view angle", + "medium low view angle", + "profile view", + "rear angle", + "right profile view", + "right side view", + "right three-quarter angle view", + "rotated view angle", + "seen from above", + "seen from behind", + "seen from below", + "seen from outside", + "seen from side", + "shoulder-level shot", + "side view", + "side-profile", + "straight on view", + "three-quarter angle view", + "top down view", + "top view", + "upside-down view angle", + "worm's-eye view shot" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/3-view.json b/nodes/prompt_data/camera/3-view.json deleted file mode 100644 index 076618a..0000000 --- a/nodes/prompt_data/camera/3-view.json +++ /dev/null @@ -1,55 +0,0 @@ -[ - "from a specific view angle", - "from a specific medium view angle", - "from a specific extreme view angle", - "dynamic view angle", - "front view", - "side view", - "left side view", - "right side view", - "back view", - "top view", - "top down view", - "bottom view", - "cowboy shot view", - "dutch angle shot view", - "rotated view angle", - "upside-down view angle", - "profile view", - "left profile view", - "right profile view", - "three-quarter angle view", - "left three-quarter angle view", - "right three-quarter angle view", - "focus on head", - "focus on shoulder", - "focus on chest", - "focus on upper body", - "focus on upper body and head", - "focus on back", - "focus on waist", - "focus on left elbow", - "focus on right elbow", - "focus on left posterior elbow", - "focus on right posterior elbow", - "focus on hands", - "focus on left hand", - "focus on right hand", - "focus on knees", - "focus on left knee", - "focus on right knee", - "focus on popliteal fossas", - "focus on left popliteal fossa", - "focus on right popliteal fossa", - "focus on feet", - "focus on left foot", - "focus on right foot", - "focus on heels", - "focus on left heel", - "focus on right heel", - "from above view angle", - "from behind view angle", - "from below view angle", - "from outside view angle", - "from side view angle" -] diff --git a/nodes/prompt_data/camera/4-lens.json b/nodes/prompt_data/camera/4-lens.json deleted file mode 100644 index 26307d9..0000000 --- a/nodes/prompt_data/camera/4-lens.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - "telescope lens", - "extreme long lens", - "long lens", - "super telephoto lens", - "telephoto lens", - "standard lens", - "wide-angle lens", - "ultra wide-angle lens", - "fisheye lens", - "panorama lens", - "macro lens", - "microscopic lens", - "tilt-shift lens", - "pinhole lens", - "lens flare effect", - "1200mm lens", - "1000mm lens", - "800mm lens", - "600mm lens", - "500mm lens", - "400mm lens", - "300mm lens", - "200mm lens", - "105mm lens", - "85mm lens", - "50mm lens", - "35mm lens", - "24mm lens", - "14mm lens", - "9mm lens", - "4mm lens" -] diff --git a/nodes/prompt_data/camera/6-shutter.json b/nodes/prompt_data/camera/6-shutter.json deleted file mode 100644 index 2452848..0000000 --- a/nodes/prompt_data/camera/6-shutter.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - "extremely slow shutter", - "slow shutter", - "moderately slow shutter", - "standard shutter", - "fast shutter", - "rapid shutter", - "ultra-high-speed shutter", - "electronically fast shutter", - "60s shutter speed", - "30s shutter speed", - "20s shutter speed", - "10s shutter speed", - "5s shutter speed", - "1s shutter speed", - "1/2s shutter speed", - "1/4s shutter speed", - "1/8s shutter speed", - "1/15s shutter speed", - "1/30s shutter speed", - "1/60s shutter speed", - "1/125s shutter speed", - "1/250s shutter speed", - "1/500s shutter speed", - "1/1000s shutter speed", - "1/2000s shutter speed", - "1/4000s shutter speed", - "1/8000s shutter speed", - "1/16000s shutter speed", - "banding effect", - "jello effect", - "orton effect", - "rolling shutter effect", - "shutter effect" -] \ No newline at end of file diff --git a/nodes/prompt_data/camera/7-aperture.json b/nodes/prompt_data/camera/7-aperture.json deleted file mode 100644 index 631875b..0000000 --- a/nodes/prompt_data/camera/7-aperture.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - "Extremely Large aperture", - "Large aperture", - "Small aperture", - "Standard aperture", - "Small aperture", - "Extremely Small aperture", - "Pinhole aperture", - "f/1.2 aperture", - "f/1.4 aperture", - "f/1.8 aperture", - "f/2.0 aperture", - "f/2.8 aperture", - "f/4.0 aperture", - "f/5.6 aperture", - "f/8.0 aperture", - "f/11 aperture", - "f/13 aperture", - "f/16 aperture", - "f/22 aperture", - "f/32 aperture" -] \ No newline at end of file diff --git a/nodes/prompt_data/camera/8-iso.json b/nodes/prompt_data/camera/8-iso.json deleted file mode 100644 index 2b014ff..0000000 --- a/nodes/prompt_data/camera/8-iso.json +++ /dev/null @@ -1,18 +0,0 @@ -[ - "very high ISO", - "high ISO", - "medium ISO", - "low-medium ISO", - "base ISO", - "low ISO", - "ISO 12800", - "ISO 6400", - "ISO 3200", - "ISO 1600", - "ISO 800", - "ISO 400", - "ISO 200", - "ISO 100", - "ISO 64", - "ISO 50" -] \ No newline at end of file diff --git a/nodes/prompt_data/camera/9-exposure.json b/nodes/prompt_data/camera/9-exposure.json deleted file mode 100644 index 56416ec..0000000 --- a/nodes/prompt_data/camera/9-exposure.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "severely overexposure", - "overexposure", - "normal exposure", - "underexposure", - "severely underexposure" -] \ No newline at end of file diff --git a/nodes/prompt_data/camera/900-camera.json b/nodes/prompt_data/camera/900-camera.json new file mode 100644 index 0000000..303fd6d --- /dev/null +++ b/nodes/prompt_data/camera/900-camera.json @@ -0,0 +1,296 @@ +[ + "aaton ltr", + "aaton ltr cinema", + "aaton xtr prod", + "agfa apx 400", + "agfa vista", + "agfacolor pro 200", + "arri alexa", + "arri alexa 65 cinema", + "arri alexa mini", + "arriflex 35", + "arriflex 435es", + "arriflex 535b", + "blackmagic cinema camera 2.5k", + "blackmagic design pocket cinema camera 4k", + "bolex h16", + "bolex h16 cinema", + "canon", + "canon 5d", + "canon 5d mark iii", + "canon 6d", + "canon 7", + "canon c500", + "canon eos 1d c", + "canon eos 1d x digital slr camera", + "canon eos 5d digital", + "canon eos 90d", + "canon eos m50", + "canon eos m50 mark ii", + "canon eos m6 mark ii", + "canon eos r", + "canon eos r5", + "canon eos rebel t3i", + "canon eos rebel t7i", + "canon eos rebel t8i", + "canon eos rp", + "canon eos-1d x mark iii", + "canon g16", + "canon powershot a2300", + "canon powershot g7 x mark ii", + "canon powershot g7 x mark iii", + "canon powershot g9 x", + "canon powershot g9 x mark ii", + "canon powershot sx260 hs", + "canon powershot sx620 hs", + "casio ex-10", + "casio exilim ex-fr100", + "casio exilim ex-zr100", + "cinestill 800t", + "diana f+ analog", + "dji mavic 2 pro", + "eclair npr", + "ektar 100", + "fine grain", + "fujicolor pro", + "fujifilm finepix f550exr", + "fujifilm finepix xp140", + "fujifilm gfx 100", + "fujifilm gfx 50s", + "fujifilm instax mini 11", + "fujifilm x-e4", + "fujifilm x-pro3", + "fujifilm x-t1", + "fujifilm x-t2", + "fujifilm x-t200", + "fujifilm x-t4", + "fujifilm x-t4 digital", + "fujifilm x100t", + "fujifilm x100v", + "fujifilm x70", + "fujifilm xt3", + "gopro hero digital", + "gopro hero4 black", + "gopro hero7 black", + "gopro hero9 black", + "hasselbad", + "hasselblad 500cm analog", + "hasselblad 907x 50c", + "hasselblad h5d-50c", + "hasselblad h6d", + "hasselblad h6d-100c", + "hasselblad x1d ii 50c", + "hasselblad x1d ii digital", + "hasselblad xcd 4|45p", + "holga 120n analog", + "ilford hp5 plus b&w", + "imax hd camera", + "insta360 one x", + "jvc", + "kodak brownie analog", + "kodak easyshare m532", + "kodak funsaver analog", + "kodak ultra max 800", + "kodak vision3", + "kodak vision3 imax", + "leica", + "leica cl", + "leica i", + "leica m-d", + "leica m10 monochrom", + "leica m10-r", + "leica m11", + "leica m3 analog", + "leica m6 analog", + "leica q", + "leica q-p", + "leica q2", + "leica q2 monochrom", + "leica s3", + "leica sl", + "leica sl2", + "leica sl2-s", + "leica t digital", + "lomochrome color film", + "lomography diana f+", + "lomography lomo'instant automat glass magellan edition", + "lumix gh5 digital", + "lytro illum", + "mamiya 7 ii analog", + "minolta", + "mitchell bncr", + "moviecam compact", + "muted low grain", + "nikon", + "nikon 1 j1 digital camera system", + "nikon 1 j5", + "nikon 1 v3", + "nikon coolpix l810", + "nikon coolpix p1000", + "nikon coolpix p340", + "nikon coolpix p950", + "nikon coolpix s6200", + "nikon coolpix w300", + "nikon d3", + "nikon d3500", + "nikon d4 digital slr camera", + "nikon d4s", + "nikon d500", + "nikon d6", + "nikon d7000", + "nikon d750", + "nikon d780", + "nikon d810", + "nikon d850", + "nikon f", + "nikon z5", + "nikon z50", + "nikon z6", + "nikon z6 ii", + "nikon z6 ii mirrorless", + "nikon z7", + "nikon z7 ii", + "nikon z7 ii mirrorless", + "nizo s48", + "olympus", + "olympus e-m1", + "olympus e-m1x", + "olympus e-pl1", + "olympus om-1 digital", + "olympus om-d e-m1", + "olympus om-d e-m1 mark ii", + "olympus om-d e-m10 mark iii", + "olympus om-d e-m10 mark iv", + "olympus om-d e-m1x", + "olympus om-d e-m5", + "olympus om-d e-m5 digital camera", + "olympus om-d e-m5 mark iii", + "olympus pen e-pl10", + "olympus pen e-pl7", + "olympus pen epl3 compact system camera", + "olympus pen-f", + "olympus sp-820uz ihs", + "olympus stylus 1s", + "olympus tough tg-6", + "olympus tough tg-820 ihs", + "olympus xa2 digital", + "panaflex gold ii", + "panasonic", + "panasonic gh4", + "panasonic lumix dc-fz1000 ii", + "panasonic lumix dc-g100", + "panasonic lumix dc-g9", + "panasonic lumix dc-gh5", + "panasonic lumix dc-s1r", + "panasonic lumix dc-s5", + "panasonic lumix dmc gf5 compact system camera", + "panasonic lumix dmc-fh5", + "panasonic lumix dmc-fz300", + "panasonic lumix dmc-g1", + "panasonic lumix dmc-g3", + "panasonic lumix dmc-gh2 body only digital camera", + "panasonic lumix dmc-gh3", + "panasonic lumix dmc-gx85", + "panasonic lumix dmc-lx100", + "panasonic lumix dmc-lx100 ii", + "panasonic lumix dmc-ts4", + "panasonic lumix dmc-tz100", + "panasonic lumix fz1000 ii", + "panasonic lumix g100", + "panasonic lumix gh5 ii", + "panasonic lumix s1", + "panasonic lumix s1r", + "panasonic lumix s5", + "panasonic varicam 35", + "panavision panaflex millennium xl2", + "pentax", + "pentax 645z", + "pentax 645z digital", + "pentax k-01", + "pentax k-1 mark ii", + "pentax k-3", + "pentax k-5", + "pentax k-5 ii digital slr camera body only", + "pentax k-70", + "pentax k1000 analog", + "pentax kp", + "pentax optio rs1500", + "pentax optio wg-1 gps", + "pentax q compact system camera", + "phase one iq250", + "phase one xf iq4 150mp", + "phase one xt", + "plaubel makina w67 analog", + "polaroid sx-70 analog", + "porta 160", + "prominent grain", + "red digital cinema camera", + "red epic dragon", + "red one mx", + "red weapon helium", + "ricoh cx6", + "ricoh gr digital iii", + "ricoh gr digital iv", + "ricoh gr digital iv compact digital camera", + "ricoh gr ii", + "ricoh gr iii", + "ricoh theta v", + "ricoh theta z1", + "rolleiflex", + "rolleiflex analogshot", + "samsung ex2f smart camera", + "samsung galaxy nx", + "samsung nx1", + "samsung nx100", + "samsung nx11 compact system camera", + "samsung nx20 smart camera body only", + "samsung nx200 smart camera", + "samsung nx300m", + "samsung wb850f smart camera", + "sigma fp", + "sigma fp l", + "sigma sd quattro h", + "sony", + "sony a6000", + "sony a6400", + "sony a7iii digital", + "sony a7r ii", + "sony a7r iv", + "sony a7s", + "sony a7s iii", + "sony a9 ii", + "sony alpha 1", + "sony alpha 7r ii", + "sony alpha a6000", + "sony alpha a6400", + "sony alpha a7 iii", + "sony alpha a77 dslr camera", + "sony alpha a7r ii", + "sony alpha a9 ii", + "sony alpha nex-5n", + "sony alpha nex-7 body only compact system camera", + "sony cyber-shot dsc rx10 iii", + "sony cyber-shot dsc rx100 iii", + "sony cyber-shot dsc rx100 iv", + "sony cyber-shot dsc rx1r ii", + "sony cyber-shot dsc-hx20v", + "sony cyber-shot dsc-rx10 ii", + "sony cyber-shot dsc-rx10 iv", + "sony cyber-shot dsc-rx100", + "sony cyber-shot dsc-rx100 vi", + "sony cyber-shot dsc-w800", + "sony cyber-shot dsc-wx150", + "sony cyber-shot rx100 vii", + "sony f55", + "sony f65", + "sony fdr-ax100", + "sony nex c3 compact system camera", + "sony pdw-f800 xdcam", + "sony rx10 iv", + "sony rx100 vii", + "sony zv-1", + "tri-x 400 b&w", + "velvia 100", + "with a specific camera", + "xiaomi mi sphere 360 camera" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/901-lens.json b/nodes/prompt_data/camera/901-lens.json new file mode 100644 index 0000000..fedbfb7 --- /dev/null +++ b/nodes/prompt_data/camera/901-lens.json @@ -0,0 +1,93 @@ +[ + "4mm lens", + "9mm lens", + "14mm lens", + "18mm lens", + "24mm lens", + "35mm lens", + "50mm lens", + "85mm lens", + "105mm lens", + "200mm lens", + "300mm lens", + "400mm lens", + "500mm lens", + "600mm lens", + "800mm lens", + "1000mm lens", + "1200mm lens", + "extreme long lens", + "fisheye lens", + "lens flare effect", + "long lens", + "macro lens", + "microscopic lens", + "panorama lens", + "pinhole lens", + "standard lens", + "super telephoto lens", + "telephoto lens", + "telescope lens", + "tilt-shift lens", + "ultra wide-angle lens", + "wide-angle lens", + "canon ef 100mm", + "canon ef 11-24mm", + "canon ef 14mm", + "canon ef 16-35mm", + "canon ef 17-40mm", + "canon ef 35mm", + "canon ef 50mm", + "canon ef 70-200mm", + "canon ef 85mm", + "fujifilm xf 10-24mm", + "fujifilm xf 16-55mm", + "fujifilm xf 16mm", + "fujifilm xf 23mm", + "fujifilm xf 50-140mm", + "fujifilm xf 56mm", + "fujifilm xf 8-16mm", + "fujifilm xf 80mm", + "fujifilm xf 90mm", + "nikon af-s 105mm", + "nikon af-s 14-24mm", + "nikon af-s 16-35mm", + "nikon af-s 17-35mm", + "nikon af-s 35mm", + "nikon af-s 50mm", + "nikon af-s 70-200mm", + "nikon af-s 85mm", + "olympus m.zuiko digital ed 25mm", + "olympus m.zuiko digital ed 45mm", + "olympus m.zuiko digital ed 75mm", + "panasonic lumix s pro 35mm", + "panasonic lumix s pro 50mm", + "panasonic lumix s pro 70mm", + "rokinon 24mm", + "rokinon 50mm", + "rokinon 85mm", + "sigma 10-20mm", + "sigma 105mm", + "sigma 12-24mm", + "sigma 135mm", + "sigma 14mm", + "sigma 35mm", + "sigma 50mm", + "sigma 70-200mm", + "sigma 8-16mm", + "sigma 85mm", + "sony fe 100mm", + "sony fe 12-24mm", + "sony fe 16-35mm", + "sony fe 35mm", + "sony fe 50mm", + "sony fe 70-200mm", + "sony fe 85mm", + "tamron sp 45mm", + "tamron sp 70mm", + "tamron sp 85mm", + "with a specific lens", + "zeiss batis 85mm", + "zeiss milvus 50mm", + "zeiss otus 55mm" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/902-shutter.json b/nodes/prompt_data/camera/902-shutter.json new file mode 100644 index 0000000..dabc7ba --- /dev/null +++ b/nodes/prompt_data/camera/902-shutter.json @@ -0,0 +1,36 @@ +[ + "1/16000s shutter speed", + "1/8000s shutter speed", + "1/4000s shutter speed", + "1/2000s shutter speed", + "1/1000s shutter speed", + "1/500s shutter speed", + "1/250s shutter speed", + "1/125s shutter speed", + "1/60s shutter speed", + "1/30s shutter speed", + "1/15s shutter speed", + "1/8s shutter speed", + "1/4s shutter speed", + "1/2s shutter speed", + "1s shutter speed", + "10s shutter speed", + "20s shutter speed", + "30s shutter speed", + "5s shutter speed", + "60s shutter speed", + "banding effect", + "electronically fast shutter", + "extremely slow shutter", + "fast shutter", + "jello effect", + "moderately slow shutter", + "orton effect", + "rapid shutter", + "rolling shutter effect", + "shutter effect", + "slow shutter", + "standard shutter", + "ultra-high-speed shutter", + "with a specific shutter" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/903-aperture.json b/nodes/prompt_data/camera/903-aperture.json new file mode 100644 index 0000000..b093310 --- /dev/null +++ b/nodes/prompt_data/camera/903-aperture.json @@ -0,0 +1,22 @@ +[ + "f/1.2 aperture", + "f/1.4 aperture", + "f/1.8 aperture", + "f/2.0 aperture", + "f/2.8 aperture", + "f/4.0 aperture", + "f/5.6 aperture", + "f/8.0 aperture", + "f/11 aperture", + "f/13 aperture", + "f/16 aperture", + "f/22 aperture", + "f/32 aperture", + "large aperture", + "extremely large aperture", + "extremely small aperture", + "pinhole aperture", + "small aperture", + "standard aperture", + "with a specific aperture" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/904-film.json b/nodes/prompt_data/camera/904-film.json new file mode 100644 index 0000000..5b210b1 --- /dev/null +++ b/nodes/prompt_data/camera/904-film.json @@ -0,0 +1,113 @@ +[ + "adox pan 100 film", + "adox silvermax 100 film", + "agfa apx 400", + "agfa vista", + "agfa vista plus 200 film", + "agfacolor pro 200", + "agfaphoto ct100 film", + "agfaphoto vista plus 200", + "black and white negative film", + "cinestill 50d", + "cinestill 800t", + "color negative film", + "ektar 100", + "fine grain", + "fuji astia 100f film", + "fuji natura 1600 film", + "fuji neopan 400 film", + "fuji neopan acros 100 film", + "fuji provia 100f film", + "fuji provia 1600f rdpiii film", + "fuji provia 3200f rdpiii film", + "fuji provia 4000f rdpiii film", + "fuji provia 400f film", + "fuji provia 400x rdpiii film", + "fuji provia 800z rdpiii film", + "fuji superia 200 film", + "fuji superia 400 film", + "fuji superia reala 100 film", + "fuji superia reala 400 film", + "fuji superia venus 800 film", + "fuji velvia 100 film", + "fuji velvia 100f film", + "fuji velvia 50 film", + "fujicolor pro", + "fujifilm 120 film", + "fujifilm 135 film", + "fujifilm neopan acros 100", + "fujifilm pro 400h", + "fujifilm xt3", + "ilford delta 100 film", + "ilford delta 3200", + "ilford delta 3200 film", + "ilford fp4 plus 125 film", + "ilford hp5 film", + "ilford hp5 plus 400 film", + "ilford hp5 plus b&w", + "ilford pan f plus 50 film", + "impossible project film", + "infrared film", + "kodak 126 film", + "kodak aps film", + "kodak ektachrome 100 plus film", + "kodak ektachrome 100gx film", + "kodak ektachrome 64t film", + "kodak ektachrome e100", + "kodak ektar 100 film", + "kodak elite 100s film", + "kodak elite 200s film", + "kodak elite 400s film", + "kodak elite 800s film", + "kodak elite chrome 200 film", + "kodak elite chrome extra color 100 film", + "kodak gold 200", + "kodak max 400 film", + "kodak portra 160 film", + "kodak portra 400", + "kodak portra 400 film", + "kodak portra 800 film", + "kodak professional elite chrome extra color 200 film", + "kodak professional elite chrome extra color 400 film", + "kodak professional elite chrome extra color 800 film", + "kodak professional portra 400nc film", + "kodak professional portra 400vc film", + "kodak professional portra 800 film", + "kodak professional supra endura vc 400 film", + "kodak professional supra endura vc 800 film", + "kodak professional supra endura vcc 400 film", + "kodak professional supra endura vcce 400 film", + "kodak professional ultramax 400 film", + "kodak proimage 100 film", + "kodak royal gold 100 film", + "kodak royal gold 200 film", + "kodak royal gold 400 film", + "kodak t-max 100 film", + "kodak t-max 3200 film", + "kodak t-max 400", + "kodak t-max 400 film", + "kodak tri-x 400 film", + "kodak ultra max 800", + "kodak ultramax 400 film", + "kodak vision3", + "kodak vision3 imax", + "lomochrome color film", + "lomography color negative film 800", + "lomography earl grey 100 film", + "lomography lady grey 400 film", + "lomography redscale film", + "lomography xprochrome film", + "muted low grain", + "polaroid 600 film", + "polaroid originals color film", + "polaroid sx-70 film", + "porta 160", + "prominent grain", + "rollei retro 400s", + "slide film", + "tri-x 400 b&w", + "ultrafine xtreme film", + "velvia 100", + "with a specific film", + "x-ray film" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/5-dof.json b/nodes/prompt_data/camera/905-dof.json similarity index 89% rename from nodes/prompt_data/camera/5-dof.json rename to nodes/prompt_data/camera/905-dof.json index d735675..06cd6c6 100644 --- a/nodes/prompt_data/camera/5-dof.json +++ b/nodes/prompt_data/camera/905-dof.json @@ -11,12 +11,13 @@ "macro depth of field", "moderate depth of field", "moderate shallow depth of field", + "motion depth of field", "night photography depth of field", "panoramic depth of field", "slightly deep depth of field", "still life depth of field", "street photography depth of field", - "motion depth of field", "very deep depth of field", - "very shallow depth of field" + "very shallow depth of field", + "with a specific depth of field" ] \ No newline at end of file diff --git a/nodes/prompt_data/camera/906-iso.json b/nodes/prompt_data/camera/906-iso.json new file mode 100644 index 0000000..bf54ee5 --- /dev/null +++ b/nodes/prompt_data/camera/906-iso.json @@ -0,0 +1,19 @@ +[ + "iso 50", + "iso 64", + "iso 100", + "iso 200", + "iso 400", + "iso 800", + "iso 1600", + "iso 3200", + "iso 6400", + "iso 12800", + "base iso", + "high iso", + "low iso", + "low-medium iso", + "medium iso", + "very high iso", + "with a specific iso" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/907-exposure.json b/nodes/prompt_data/camera/907-exposure.json new file mode 100644 index 0000000..46a09e7 --- /dev/null +++ b/nodes/prompt_data/camera/907-exposure.json @@ -0,0 +1,8 @@ +[ + "normal exposure", + "overexposure", + "severely overexposure", + "severely underexposure", + "underexposure", + "with a specific exposure" +] \ No newline at end of file diff --git a/nodes/prompt_data/camera/999-movement.json b/nodes/prompt_data/camera/999-movement.json index 33ef472..ced18e6 100644 --- a/nodes/prompt_data/camera/999-movement.json +++ b/nodes/prompt_data/camera/999-movement.json @@ -1,31 +1,95 @@ [ - "fixed camera", - "follow camera", - "free camera", - "chaotic camera", - "pan left", - "pan right", - "tilt up", - "tilt down", - "pedestal up", - "pedestal down", - "zoom in", - "zoom out", - "push in", - "push out", - "dolly shot", - "dolly zoom shot", - "tracking shot", - "handheld shot", - "handheld tracking shot", - "static shot", - "steadicam shot", - "arc shot", - "crane shot", - "tilt-shift shot", - "drone shot", - "orbit shot", - "truck left", - "truck right", - "shake camera" -] + "360-degree crane shot", + "360-degree crane shot starting high and descending", + "360-degree pan", + "360-degree steadicam shot circling", + "360-degree steadicam shot moving", + "aerial shot circling", + "aerial shot flying over", + "aerial shot flying through", + "aerial shot following", + "aerial shot panning", + "aerial shot rising", + "aerial shot spiraling down", + "arc shot", + "chaotic camera", + "crane shot", + "crane shot ascending", + "crane shot descending", + "crane shot pulling back", + "crane shot pulling up", + "dolly in", + "dolly shot", + "dolly zoom shot", + "drone shot", + "dutch angle handheld shot circling", + "dutch angle pan", + "dutch angle shot", + "dutch angle tilt", + "dutch angle tracking shot", + "dutch pan", + "dutch tilt", + "dutch tilt shot", + "fixed camera", + "follow camera", + "free camera", + "handheld shot", + "handheld shot circling", + "handheld shot running", + "handheld shot trailing", + "handheld shot weaving", + "handheld tracking shot", + "high angle dutch shot", + "high angle shot", + "jib shot", + "orbit shot", + "pan left", + "pan right", + "panning", + "pedestal down", + "pedestal up", + "pull back", + "pull focus", + "push in", + "push out", + "quick zoom in", + "rack focus", + "shake camera", + "slow motion pan", + "slow motion shot", + "slow motion whip pan", + "slow motion whip zoom in", + "slow pan", + "slow push in", + "slow tilt up", + "slow zoom in", + "slow zoom out", + "static shot", + "steadicam circling shot", + "steadicam shot", + "steadicam shot circling", + "steadicam shot following", + "steadicam shot leading", + "steadicam shot moving", + "steadicam shot orbiting", + "steadicam shot pushing", + "tilt down", + "tilt up", + "tilt-shift shot", + "time-lapse shot", + "tracking shot", + "tracking shot following", + "tracking shot moving", + "traveling shot", + "truck left", + "truck right", + "whip pan", + "whip tilt down", + "whip tilt up", + "whip zoom in", + "whip zoom out", + "with a specific camera movement", + "zoom in", + "zoom in push", + "zoom out" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/1-happy.txt b/nodes/prompt_data/expression/1-happy.txt index 0a26a86..cd8a55d 100644 --- a/nodes/prompt_data/expression/1-happy.txt +++ b/nodes/prompt_data/expression/1-happy.txt @@ -1,15 +1,31 @@ content expression pleased expression -happy expression glad expression -cheerful expression amused expression -delighted expression +cheerful expression +light-hearted expression +happy expression +glee expression +jolly expression +jovial expression joyful expression +delighted expression +delight expression +gaiety expression +mirthful expression +hilarious expression excited expression thrilled expression +exhilarated expression elated expression +elation expression in love expression overjoyed expression +beaming expression +radiant expression +blissful expression ecstatic expression -jubilant expression \ No newline at end of file +jubilant expression +euphoric expression +euphoria expression +exuberant expression \ No newline at end of file diff --git a/nodes/prompt_data/expression/10-negative_mood.json b/nodes/prompt_data/expression/10-negative_mood.json new file mode 100644 index 0000000..1efc63b --- /dev/null +++ b/nodes/prompt_data/expression/10-negative_mood.json @@ -0,0 +1,164 @@ +[ + "feeling animosity", + "feeling aching", + "feeling agonized", + "feeling alienated", + "feeling anguish", + "feeling antsy", + "feeling anxious", + "feeling apprehensive", + "feeling ashamed", + "feeling avarice", + "feeling aversion", + "feeling belittled", + "feeling betrayed", + "feeling bitchy", + "feeling bitterness", + "feeling blah", + "feeling bored", + "feeling carelessness", + "feeling chastised", + "feeling cheerless", + "feeling clumsy", + "feeling confrontational", + "feeling cornered", + "feeling covetous", + "feeling cowardice", + "feeling crestfallen", + "feeling cruelty", + "feeling crummy", + "feeling crushing", + "feeling dark", + "feeling defeated", + "feeling dejected", + "feeling delusional", + "feeling demoralized", + "feeling depression", + "feeling despair", + "feeling desperate", + "feeling devastated", + "feeling disappointment", + "feeling discomfort", + "feeling disgraced", + "feeling disquieting", + "feeling disrespected", + "feeling disruptive", + "feeling dissatisfied", + "feeling distraught", + "feeling disturbing", + "feeling drained", + "feeling dread", + "feeling edgy", + "feeling embarrassed", + "feeling envious", + "feeling exacerbated", + "feeling exasperated", + "feeling exhaustion", + "feeling fatigued", + "feeling fidgety", + "feeling foreboding", + "feeling forlorn", + "feeling frenzied", + "feeling fretful", + "feeling frustrated", + "feeling frustration", + "feeling grief", + "feeling grim", + "feeling groggy", + "feeling guilt", + "feeling guilt-ridden", + "feeling harassed", + "feeling hatred", + "feeling hopeless", + "feeling humiliated", + "feeling hurting", + "feeling hysterical", + "feeling ill at ease", + "feeling impatient", + "feeling impertinent", + "feeling impotent", + "feeling in mourning", + "feeling in pain", + "feeling insane", + "feeling insecure", + "feeling insulted", + "feeling irrational", + "feeling jealousy", + "feeling jittery", + "feeling lamenting", + "feeling lazy", + "feeling lethargic", + "feeling listless", + "feeling loneliness", + "feeling lonely", + "feeling long-suffering", + "feeling lost", + "feeling love sickness", + "feeling low", + "feeling merciless", + "feeling miserable", + "feeling misery", + "feeling morbid", + "feeling mortified", + "feeling nervous", + "feeling nervousness", + "feeling offended", + "feeling pained", + "feeling paranoia", + "feeling paranoid", + "feeling pathetic", + "feeling pessimism", + "feeling petty", + "feeling possessive", + "feeling pouty", + "feeling prickly", + "feeling querulous", + "feeling rash", + "feeling reckless", + "feeling regret", + "feeling regretful", + "feeling restless", + "feeling scandalized", + "feeling self-doubt", + "feeling self-pity", + "feeling shame", + "feeling shattered", + "feeling sinister", + "feeling sleepy", + "feeling sluggish", + "feeling snappish", + "feeling snippy", + "feeling somber", + "feeling sorry", + "feeling spiteful", + "feeling spooky", + "feeling stiff", + "feeling stressed", + "feeling stubborn", + "feeling stupid", + "feeling superficial", + "feeling tense", + "feeling tired", + "feeling tormented", + "feeling tortured", + "feeling traumatic", + "feeling troubled", + "feeling uncomfortable", + "feeling unease", + "feeling unmotivated", + "feeling unpleasant", + "feeling unreliable", + "feeling unsatisfied", + "feeling unsettling", + "feeling unstable", + "feeling unsteady", + "feeling vain", + "feeling vengefulness", + "feeling victimized", + "feeling violated", + "feeling weak", + "feeling weary", + "feeling worthless", + "feeling yellow", + "feeling zonked" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/11-complex_mood.json b/nodes/prompt_data/expression/11-complex_mood.json new file mode 100644 index 0000000..cc303f9 --- /dev/null +++ b/nodes/prompt_data/expression/11-complex_mood.json @@ -0,0 +1,104 @@ +[ + "feeling aloof", + "feeling ambivalent", + "feeling apathetic", + "feeling bashful", + "feeling bemused", + "feeling cautious", + "feeling compelled", + "feeling conflicted", + "feeling confusion", + "feeling contemplative", + "feeling contrite", + "feeling craftiness", + "feeling critical", + "feeling curious", + "feeling cynical", + "feeling dependent", + "feeling discombobulated", + "feeling disconcerted", + "feeling disconnected", + "feeling disenchanted", + "feeling disillusioned", + "feeling disoriented", + "feeling dominant", + "feeling facetious", + "feeling flippant", + "feeling flustered", + "feeling hesitant", + "feeling hyper", + "feeling impish", + "feeling indecisive", + "feeling indifferent", + "feeling inhibited", + "feeling inquisitive", + "feeling intense", + "feeling interested", + "feeling intrigued", + "feeling introspective", + "feeling irreverent", + "feeling jaded", + "feeling judgmental", + "feeling languid", + "feeling lascivious", + "feeling longing", + "feeling lustful", + "feeling maudlin", + "feeling mischievous", + "feeling mixed", + "feeling moody", + "feeling mysterious", + "feeling nostalgic", + "feeling obligated", + "feeling obsessed", + "feeling overwhelmed", + "feeling pensive", + "feeling piqued", + "feeling quiet", + "feeling reflective", + "feeling reserved", + "feeling resigned", + "feeling reticent", + "feeling sarcastic", + "feeling sassy", + "feeling sensitive", + "feeling sensitivity", + "feeling serious", + "feeling sexual", + "feeling shy", + "feeling silly", + "feeling skeptical", + "feeling sober", + "feeling solemn", + "feeling still", + "feeling subdued", + "feeling submissive", + "feeling subtle", + "feeling subversive", + "feeling suspicious", + "feeling thoughtful", + "feeling timid", + "feeling timidity", + "feeling titillated", + "feeling uncertainty", + "feeling unconcerned", + "feeling undecided", + "feeling unimpressed", + "feeling uninterested", + "feeling unpredictable", + "feeling unsettled", + "feeling urgency", + "feeling vacant", + "feeling vigilant", + "feeling vulnerable", + "feeling wary", + "feeling waving", + "feeling weird", + "feeling whimsical", + "feeling willful", + "feeling wistful", + "feeling wonder", + "feeling yearning", + "feeling yielding", + "feeling zoned out" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/12-other.json b/nodes/prompt_data/expression/12-other.json new file mode 100644 index 0000000..ad989ef --- /dev/null +++ b/nodes/prompt_data/expression/12-other.json @@ -0,0 +1,5 @@ +[ + "has a specific expression", + "has a specific mood", + "expressionless" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/2-sad.json b/nodes/prompt_data/expression/2-sad.json index 20878d4..efe8f86 100644 --- a/nodes/prompt_data/expression/2-sad.json +++ b/nodes/prompt_data/expression/2-sad.json @@ -1,13 +1,23 @@ [ - "disappointed expression", - "down expression", - "sad expression", - "upset expression", - "unhappy expression", - "distressed expression", - "sorrowful expression", - "heartbroken expression", - "grief-stricken expression", - "grieving expression", - "devastated expression" + "disappointed expression", + "down expression", + "bleak expression", + "joyless expression", + "cheerless expression", + "downcast expression", + "dreary expression", + "sad expression", + "upset expression", + "gloomy expression", + "unhappy expression", + "melancholic expression", + "depressed expression", + "distressed expression", + "sorrowful expression", + "heavy-hearted expression", + "heartbroken expression", + "grief-stricken expression", + "mournful expression", + "grieving expression", + "devastated expression" ] \ No newline at end of file diff --git a/nodes/prompt_data/expression/3-angry.yaml b/nodes/prompt_data/expression/3-angry.yaml index da1c8ac..7f2f458 100644 --- a/nodes/prompt_data/expression/3-angry.yaml +++ b/nodes/prompt_data/expression/3-angry.yaml @@ -1,11 +1,26 @@ -- annoyed expression -- irritated expression -- frustrated expression -- angry expression -- mad expression -- cross expression -- furious expression -- outraged expression -- enraged expression -- livid expression -- fuming expression + - annoyed expression + - peeved expression + - cross expression + - irritated expression + - agitation expression + - irritation expression + - riled expression + - frustrated expression + - provoked expression + - aggravation expression + - resentment expression + - rancorous expression + - indignant expression + - indignation expression + - angry expression + - mad expression + - furious expression + - fury expression + - outraged expression + - enraged expression + - infuriated expression + - inflamed expression + - choleric expression + - livid expression + - fuming expression + - wrath expression \ No newline at end of file diff --git a/nodes/prompt_data/expression/4-shock.toml b/nodes/prompt_data/expression/4-shock.toml deleted file mode 100644 index 67a8b9b..0000000 --- a/nodes/prompt_data/expression/4-shock.toml +++ /dev/null @@ -1,10 +0,0 @@ -options = [ - "surprised expression", - "taken aback expression", - "astonished expression", - "amazed expression", - "shocked expression", - "stunned expression", - "astonuded expression", - "flabbergasted expression" -] \ No newline at end of file diff --git a/nodes/prompt_data/expression/4-surprised.toml b/nodes/prompt_data/expression/4-surprised.toml new file mode 100644 index 0000000..be40341 --- /dev/null +++ b/nodes/prompt_data/expression/4-surprised.toml @@ -0,0 +1,18 @@ +options = [ + "surprised expression", + "taken aback expression", + "startled expression", + "awe expression", + "awestruck expression", + "astonished expression", + "amazed expression", + "incredulous expression", + "disbelief expression", + "shocked expression", + "stunned expression", + "astounded expression", + "stupefied expression", + "flabbergasted expression", + "dismayed expression", + "appalled expression" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/5-confused.csv b/nodes/prompt_data/expression/5-confused.csv index e840687..da2d0a5 100644 --- a/nodes/prompt_data/expression/5-confused.csv +++ b/nodes/prompt_data/expression/5-confused.csv @@ -1,5 +1,11 @@ -confused expression -bewildered expression -dazed expression +uncertain expression +unsure expression +doubtful expression +questioning expression skeptical expression -perplexed expression \ No newline at end of file +confused expression +puzzled expression +perplexed expression +bewildered expression +baffled expression +dazed expression \ No newline at end of file diff --git a/nodes/prompt_data/expression/6-disgusted.json b/nodes/prompt_data/expression/6-disgusted.json new file mode 100644 index 0000000..d2c3b04 --- /dev/null +++ b/nodes/prompt_data/expression/6-disgusted.json @@ -0,0 +1,8 @@ +[ + "disgusted expression", + "nauseated expression", + "sickened expression", + "repulsed expression", + "revolted expression", + "loathing expression" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/6-other.json b/nodes/prompt_data/expression/6-other.json deleted file mode 100644 index 1246a85..0000000 --- a/nodes/prompt_data/expression/6-other.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - "has a specific expression", - "expressionless", - "serene expression", - "worried expression", - "apprehensive expression", - "anxious expression", - "fearful expression", - "terrified expression", - "panicked expression", - "disgusted expression", - "contemptuous expression", - "revolted expression", - "disdainful expression", - "bored expression", - "curious expression", - "relaxed expression", - "embrressed expression", - "confident expression", - "calm expression", - "cautious expression", - "envious expression", - "nervous expression", - "peaceful expression", - "pensive expression", - "prideful expression", - "proud expression", - "relieved expression", - "sarcastic expression", - "serious expression", - "shy expression", - "silly expression" -] \ No newline at end of file diff --git a/nodes/prompt_data/expression/7-fearful.json b/nodes/prompt_data/expression/7-fearful.json new file mode 100644 index 0000000..dee0977 --- /dev/null +++ b/nodes/prompt_data/expression/7-fearful.json @@ -0,0 +1,35 @@ +[ + "creepy expression", + "creepy-crawly expression", + "eerie expression", + "chilling expression", + "spine-tingling expression", + "hair-raising expression", + "goosebumps expression", + "shaky expression", + "shaken expression", + "alarmed expression", + "scared expression", + "fearful expression", + "menaced expression", + "threatened expression", + "frightening expression", + "spine-chilling expression", + "ominous expression", + "endangered expression", + "panic expression", + "panic-stricken expression", + "panicked expression", + "terror expression", + "terrified expression", + "terrorizing expression", + "petrifying expression", + "horror expression", + "nightmarish expression", + "macabre expression", + "ghostly expression", + "ghoulish expression", + "phobia expression", + "jump scared expression", + "trembling expression" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/8-contemptuous.json b/nodes/prompt_data/expression/8-contemptuous.json new file mode 100644 index 0000000..902993f --- /dev/null +++ b/nodes/prompt_data/expression/8-contemptuous.json @@ -0,0 +1,9 @@ +[ + "smug expression", + "haughty expression", + "pompous expression", + "contemptuous expression", + "scorn expression", + "derisive expression", + "disdainful expression" +] \ No newline at end of file diff --git a/nodes/prompt_data/expression/9-positive_mood.json b/nodes/prompt_data/expression/9-positive_mood.json new file mode 100644 index 0000000..2038861 --- /dev/null +++ b/nodes/prompt_data/expression/9-positive_mood.json @@ -0,0 +1,108 @@ +[ + "feeling admiration", + "feeling adoration", + "feeling affection", + "feeling agape", + "feeling altruistic", + "feeling ambition", + "feeling anticipation", + "feeling appreciative", + "feeling assertive", + "feeling attentive", + "feeling attracted", + "feeling benevolent", + "feeling blessed", + "feeling blithe", + "feeling calm", + "feeling capable", + "feeling captivated", + "feeling cherished", + "feeling comfortable", + "feeling comforted", + "feeling comical", + "feeling compassion", + "feeling confidence", + "feeling confident", + "feeling consideration", + "feeling contentment", + "feeling cooperative", + "feeling creative", + "feeling determination", + "feeling devoted", + "feeling diverted", + "feeling eager", + "feeling emboldened", + "feeling empathy", + "feeling empowered", + "feeling enchanted", + "feeling enthusiasm", + "feeling equanimity", + "feeling excitement", + "feeling expansive", + "feeling expectant", + "feeling feisty", + "feeling flattered", + "feeling friendly", + "feeling fulfilled", + "feeling generous", + "feeling grateful", + "feeling gratitude", + "feeling heartfelt", + "feeling heartwarming", + "feeling hope", + "feeling idealistic", + "feeling immersed", + "feeling infatuated", + "feeling inspired", + "feeling invigorated", + "feeling kind-hearted", + "feeling love", + "feeling lucky", + "feeling mellow", + "feeling modest", + "feeling moved", + "feeling obedient", + "feeling optimistic", + "feeling pacified", + "feeling passionate", + "feeling patient", + "feeling peaceful", + "feeling perky", + "feeling pride", + "feeling prideful", + "feeling proud", + "feeling ravished", + "feeling reassured", + "feeling refreshed", + "feeling relaxed", + "feeling relief", + "feeling relieved", + "feeling resolute", + "feeling reverent", + "feeling rich", + "feeling robust", + "feeling romantic", + "feeling roused", + "feeling satisfied", + "feeling serene", + "feeling soothed", + "feeling sophisticated", + "feeling splendid", + "feeling stirred", + "feeling successful", + "feeling sympathy", + "feeling tender", + "feeling touched", + "feeling tranquility", + "feeling triumphant", + "feeling trusting", + "feeling understanding", + "feeling upbeat", + "feeling vibrant", + "feeling vivacious", + "feeling youthful", + "feeling zeal", + "feeling zealous", + "feeling zen", + "feeling zestful" +] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/1-combination.json b/nodes/prompt_data/facial_action/1-combination.json index 8d762f4..fc913d7 100644 --- a/nodes/prompt_data/facial_action/1-combination.json +++ b/nodes/prompt_data/facial_action/1-combination.json @@ -1,14 +1,472 @@ [ - "has a specific facial action", - "beaming", - "crying", - "gazing", - "grimacing", - "grinning", - "jaw drops", - "laughing", - "smiling", - "smirking", - "sneering", - "staring" + "amused expression with slightly upturned lips and soft eyes", + "barely contained grief with clenched fists", + "bawling", + "bawling loudly with red, puffy eyes", + "bawling loudly with reddened face", + "beaming", + "beaming grin with sparkling eyes and dimples", + "beaming smile that lights up the entire face", + "beaming with pride, chest puffed and chin high", + "bemused smile with one eyebrow cocked and head tilted", + "biting lower lip with a furrowed brow", + "blank stare with slightly parted lips", + "blank stare with slightly parted lips and a relaxed brow", + "blinking", + "blubbering", + "blubbering incoherently with hiccuping sobs", + "blushing cheeks with a subtle, satisfied grin", + "blushing cheeks with averted gaze and nervous smile", + "boisterous laugh with clapping hands and stomping feet", + "breathless laughter causing hiccups and gasps", + "brief tightening of the lips and narrowing of the eyes", + "bright eyes with an eager, engaging smile", + "bright smile with nose crinkled in delight", + "bright-eyed enthusiasm with a wide, toothy grin", + "broad grin with nose crinkle and squinted eyes", + "broad grin with teeth showing and eyes crinkling", + "broad, unwavering smile with direct eye contact", + "bursting into peals of laughter, head thrown back", + "cackling", + "cackling mischievously with hunched shoulders", + "cackling with a hint of mischief in narrowed eyes", + "calm face with attentive eyes and a gentle smile", + "cheeky smile with dimples and a slight head tilt", + "chest-heaving sobs with trembling hands", + "chin lifted with a broad smile and puffed chest", + "choked sobs", + "choking back sobs with clenched jaw", + "chortling", + "chortling with head tilted back and eyes half-closed", + "chuckling", + "chuckling while shaking head in disbelief", + "clenched jaw with a muscle pulsing in the temple", + "clenched jaw with a pulsing temple", + "clenched jaw with a pulsing temple and intense eyes", + "clenched jaw with a pulsing temple and narrowed eyes", + "clenched jaw with flared nostrils and intense eyes", + "clenched jaw with flared nostrils and narrowed eyes", + "clenched teeth with bulging eyes and tensed neck muscles", + "clenched teeth with bulging eyes in frustration", + "clenched teeth with bulging neck veins and narrowed eyes", + "clenched teeth with flared nostrils", + "clenched teeth with one eye twitching and tensed jaw muscles", + "completely neutral expression with steady gaze", + "controlled crying with occasional deep breaths", + "crinkled nose with a playful stuck-out tongue", + "crying", + "crying and laughing simultaneously in hysteria", + "crying silently with face hidden in hands", + "deeply creased laugh lines with twinkling eyes", + "dejected expression with glistening eyes", + "downturned mouth with narrowed, intense eyes", + "dreamy expression with a faraway look and soft smile", + "dropped jaw with a blank stare", + "exaggerated duck lips with posed grin", + "exaggerated eye roll with a head tilt and sigh", + "explosive laughter bursting forth unexpectedly", + "eyes brimming with unshed tears", + "fits of giggles causing body to double over", + "frown with a quivering lower lip and downcast eyes", + "frown with a quivering lower lip and furrowed brow", + "frown with a slightly protruding lower lip in disappointment", + "frown with a trembling lower lip and misty eyes", + "frown with downcast eyes and slightly hunched shoulders", + "frown with downturned corners of the mouth", + "frown with downturned corners of the mouth and a creased forehead", + "frown with downturned corners of the mouth and creased forehead", + "frown with downturned corners of the mouth and furrowed brow", + "frowning", + "full-bodied laugh causing chair to rock back", + "furrowed brow paired with a thoughtful finger on the chin", + "furrowed brow with a concentrated gaze and slightly narrowed eyes", + "furrowed brow with a concentrated gaze and slightly parted lips", + "furrowed brow with a distant gaze and slightly parted lips", + "furrowed brow with a sideways glance of suspicion", + "furrowed brow with a slightly open mouth and distant gaze", + "furrowed brow with a thoughtful pout", + "furrowed brow with compassionate eyes and slight head tilt", + "furrowed brow with lip bite and an intense gaze", + "furrowed brow with lip bite and focused gaze", + "furrowed brow with lip bite and intense gaze", + "furrowed brow with lip caught between teeth in concentration", + "furrowed brow with lips pressed into a thin line of disapproval", + "furrowed brow with narrowed eyes and slightly flared nostrils", + "furrowed brow with pursed lips and a contemplative gaze", + "furrowed brow with pursed lips and a distant gaze", + "furrowed brow with pursed lips and a far-off gaze", + "furrowed brow with pursed lips and a scrutinizing gaze", + "furrowed brow with pursed lips in deep thought", + "furrowed brow with slightly parted lips and a concentrated gaze", + "furrowed brow with slightly parted lips and a distant stare", + "furrowed brow with squinted eyes", + "furrowed brow with widened eyes and slightly open mouth", + "furrowed brow with widened eyes and slightly parted lips", + "gasping", + "gazing", + "giggling", + "giggling fit causing hiccups and snorts", + "giggling fit with shoulders shaking and hand covering mouth", + "giggling while biting lower lip, trying to contain it", + "giggly smile with rosy cheeks and bright eyes", + "gleeful expression with wide eyes and open-mouthed smile", + "goofy smile with crossed eyes and stuck-out tongue", + "grimace with eyes squeezed shut and shoulders tensed", + "grimace with one eye squeezed shut", + "grimace with one eye squeezed shut and teeth gritted", + "grimace with one eye squeezed shut and tensed jaw muscles", + "grimace with one eye squeezed shut and wrinkled forehead", + "grimace with one eye squeezed shut and wrinkled nose", + "grimace with wrinkled nose and one eye closed", + "grimace with wrinkled nose and squinted eyes", + "grimacing", + "grinning", + "grinning from ear to ear with sparkling eyes", + "guffawing", + "guffawing with slapped knee and wide-open mouth", + "half-smile with a distant gaze and relaxed features", + "half-smile with a distant gaze and relaxed shoulders", + "half-smile with a faraway look and relaxed shoulders", + "half-smile with crinkled eyes and a knowing look", + "half-smile with crinkled eyes and a slight blush", + "half-smile with crinkled eyes and a slight head tilt", + "half-smile with one corner of the mouth raised and a twinkle in the eyes", + "half-smile with one raised eyebrow", + "half-smile with softened eyes and slightly tilted head", + "has a specific facial action", + "hearty belly laugh with eyes crinkled and head thrown back", + "hearty chuckle rumbling from deep in the chest", + "heaving sobs with sharp intakes of breath", + "heavy-lidded eyes with a soft, tired smile", + "heavy-lidded eyes with slack features", + "howling in despair", + "howling with laughter, bent over and clutching stomach", + "impish grin with a glint in the eye and wrinkled nose", + "inconsolable crying with curled-up body", + "intense focus with slightly narrowed eyes and set jaw", + "intense stare with slightly squinted eyes and set jaw", + "jaw drops", + "joyous laughter with arms outstretched and head back", + "kissing", + "laughing", + "lip bite with a coy glance and slightly flushed cheeks", + "lip bite with a coy glance and slightly raised eyebrows", + "lip bite with a sidelong glance and slight blush", + "lip bite with a sidelong glance and slightly raised eyebrows", + "lip bite with a sideways glance and slightly flushed cheeks", + "lip curl with a sideways glance and a slightly jutted chin", + "lip curl with a sideways glance and slightly raised chin", + "lip curl with narrowed eyes and a slight head tilt", + "lip curl with narrowed eyes and a slightly raised chin", + "lip curl with narrowed eyes and slightly flared nostrils", + "lip trembling, on the verge of tears", + "lips pressed into a thin line with a stern gaze", + "lopsided frown with one raised eyebrow", + "lopsided grin with a dimple and a mischievous glint", + "lopsided grin with a dimple on one cheek and sparkling eyes", + "lopsided grin with a mischievous glint in the eyes", + "lopsided smile with a faraway, dreamy look", + "making a silly face", + "mirthful chuckle with eyes sparkling and nose slightly crinkled", + "mischievous grin with eyes twinkling and dimples showing", + "momentary downturn of mouth corners and eye lowering", + "momentary widening of the eyes with raised eyebrows", + "mournful sobbing with drooped shoulders", + "mouth agape with raised eyebrows and widened eyes", + "muffled crying into a pillow", + "mumbling", + "narrowed eyes with pursed lips and slight head tilt", + "nervous laughter with darting eyes and fidgeting hands", + "nodding", + "noisy blubbering with snotty nose", + "nose scrunch with one raised eyebrow and half-smile", + "nose wrinkle with squinted eyes and stuck-out tongue", + "open-mouthed gasp with a hand covering part of the face", + "open-mouthed gasp with hand over the chest", + "open-mouthed gasp with raised eyebrows and a hand over the heart", + "open-mouthed gasp with raised eyebrows and widened eyes", + "open-mouthed gasp with widened eyes and raised eyebrows", + "open-mouthed gasp with widened eyes and raised shoulders", + "open-mouthed grin with crinkled eyes and slightly flushed cheeks", + "open-mouthed grin with dimples and slightly squinted eyes", + "open-mouthed grin with nose crinkle and squinted eyes", + "open-mouthed grin with sparkling eyes and slightly flushed cheeks", + "open-mouthed grin with sparkling eyes and slightly raised cheeks", + "open-mouthed laugh with crinkled nose and closed eyes", + "open-mouthed laugh with crinkled nose and flushed cheeks", + "open-mouthed laugh with eyes squeezed shut in mirth", + "open-mouthed laugh with thrown-back head", + "open-mouthed laugh with thrown-back head and closed eyes", + "open-mouthed laugh with thrown-back head and crinkled eyes", + "open-mouthed smile with crinkled eyes", + "open-mouthed smile with crinkled eyes and dimples", + "open-mouthed smile with crinkled eyes and raised cheeks", + "open-mouthed smile with dimples and slightly flushed cheeks", + "open-mouthed smile with dimples and sparkling eyes", + "open-mouthed smile with nose crinkle and slightly flushed cheeks", + "open-mouthed smile with sparkling eyes and dimples", + "open-mouthed yawn with scrunched-up eyes and a stretched neck", + "open-mouthed yawn with scrunched-up eyes and raised eyebrows", + "open-mouthed yawn with scrunched-up eyes and stretched neck", + "open-mouthed yawn with scrunched-up face and stretched arms", + "open-mouthed yawn with scrunched-up nose", + "open-mouthed yawn with scrunched-up nose and closed eyes", + "polite smile with alert eyes and raised eyebrows", + "polite, practiced smile with alert eyes", + "pouting", + "pouty expression with arms crossed and eyes rolling", + "pouty expression with downcast eyes and crossed arms", + "pouty expression with downcast eyes and slumped posture", + "pouty expression with furrowed brow and crossed arms", + "pouty expression with furrowed brow and slightly jutted chin", + "pouty expression with jutted chin and narrowed eyes", + "pouty lower lip paired with puppy dog eyes", + "pouty lower lip with puppy-dog eyes", + "pouty lower lip with wide, innocent eyes and raised eyebrows", + "pouty lower lip with wide, innocent eyes and raised inner eyebrows", + "pouty lower lip with wide, pleading eyes and furrowed brow", + "pouty lower lip with wide, pleading eyes and raised eyebrows", + "protruding lower lip with furrowed brow and crossed arms", + "puckered lips and squinted eyes as if tasting something sour", + "puckered lips with a sideways glance", + "puckered lips with narrowed eyes and a slight head shake", + "puckered lips with one eye closed and a wink", + "puckered lips with one eye closed and head tilted", + "puckered lips with one eyebrow raised and a sidelong glance", + "puckered lips with squinted eyes and a playful wink", + "puckered lips with squinted eyes and a slight head shake", + "puckered lips with squinted eyes and a slight head tilt", + "puffed cheeks and crossed eyes in a comical expression", + "puffed-out cheeks releasing air in a drawn-out sigh", + "puffed-out cheeks with bulging eyes", + "puffed-out cheeks with bulging eyes and a comical expression", + "puffed-out cheeks with bulging eyes and a surprised expression", + "puffed-out cheeks with bulging eyes and raised eyebrows", + "puffed-out cheeks with crossed eyes", + "puffed-out cheeks with crossed eyes and a silly grin", + "puffed-out cheeks with crossed eyes and raised eyebrows", + "puffed-out cheeks with crossed eyes and stuck-out tongue", + "puffed-out cheeks with raised eyebrows and a comical expression", + "puffed-out cheeks with raised eyebrows and bulging eyes", + "puffed-out cheeks with widened eyes and raised eyebrows", + "pursed lips with narrowed eyes", + "quick, one-sided lip corner raise", + "quiet sniffles with downcast gaze", + "quiet tears with trembling lower lip", + "quiet weeping with occasional sniffles", + "quivering chin with downcast eyes", + "quivering chin with glassy eyes and slightly parted lips", + "quivering chin with glassy eyes and trembling lips", + "quivering chin with misty eyes and slightly parted lips", + "quivering chin with misty eyes on the verge of tears", + "quivering chin with watery eyes and slightly parted lips", + "quivering lower lip with downcast eyes and furrowed brow", + "quivering upper lip with misty eyes and a flushed face", + "quivering upper lip with tear-filled eyes and a red face", + "quivering upper lip with tear-filled eyes and a reddened face", + "quivering upper lip with watery eyes and a flushed face", + "quivering upper lip with watery eyes and flushed cheeks", + "raised eyebrow with a half-smirk and twinkling eyes", + "raised eyebrow with a knowing smirk and glinting eyes", + "raised eyebrow with a sideways glance and doubtful smirk", + "raised eyebrows with a crooked smile and a knowing look", + "raised eyebrows with a crooked smile and a mischievous twinkle", + "raised eyebrows with a half-smile and head shake", + "raised eyebrows with a half-smile and questioning gaze", + "raised eyebrows with a lopsided grin and a mischievous glint", + "raised eyebrows with a lopsided grin and twinkling eyes", + "raised eyebrows with a mischievous smirk and glinting eyes", + "raised eyebrows with a playful smirk and twinkling eyes", + "raised eyebrows with a skeptical tilt of the head", + "raised eyebrows with a slight gasp and widened eyes", + "raised eyebrows with a slight head tilt and half-smile", + "raised eyebrows with a slight head tilt and questioning gaze", + "raised eyebrows with a surprised gasp and widened eyes", + "raised eyebrows with an 'o'-shaped mouth and a shocked expression", + "raised eyebrows with an 'o'-shaped mouth and widened eyes", + "raised eyebrows with an 'o'-shaped mouth in shock", + "raised eyebrows with an incredulous stare and slightly open mouth", + "raised eyebrows with lips pressed together, suppressing laughter", + "raised eyebrows with wide eyes and covered mouth", + "raised eyebrows with widened eyes", + "raised eyebrows with widened eyes and an open-mouthed gasp", + "raised eyebrows with widened eyes and dropped jaw", + "raised eyebrows with widened eyes and slightly parted lips", + "raised eyebrows with widened eyes in sudden realization", + "ranting", + "rapid eyebrow raise and eye widening", + "raucous laughter echoing loudly with wide-open mouth", + "relaxed features with a hint of a peaceful smile", + "restrained, emotionless expression with alert eyes", + "roaring laughter with tears forming in the corners of eyes", + "rolled eyes with a slight head tilt", + "rollicking laughter causing slapping of thighs", + "sardonic laugh with head tilted and eyes narrowed", + "scowl with furrowed brow and a slightly protruding lower lip", + "scowl with furrowed brow and narrowed eyes", + "scowl with furrowed brow and slightly bared teeth", + "scowl with furrowed brow and slightly protruding lower lip", + "scowl with narrowed eyes and a clenched jaw", + "scowl with narrowed eyes and a slightly jutted chin", + "scowl with narrowed eyes and flared nostrils", + "scowl with narrowed eyes and slightly flared nostrils", + "scrunched nose with tongue slightly protruding and eyes crinkled", + "scrunched nose with twinkling eyes and open-mouthed smile", + "scrunched-up face with closed eyes", + "scrunched-up face with eyes tightly shut, bracing for impact", + "scrunched-up face with heaving shoulders", + "scrunched-up face with stuck-out tongue and tightly closed eyes", + "scrunched-up face with tongue sticking out and eyes squeezed shut", + "scrunched-up face with tongue sticking out slightly", + "scrunched-up nose with a cheeky grin and narrowed eyes", + "scrunched-up nose with a mischievous grin and narrowed eyes", + "scrunched-up nose with closed eyes and a broad grin", + "scrunched-up nose with squinted eyes and a playful grin", + "scrunched-up nose with squinted eyes and stuck-out tongue", + "set jaw and narrowed eyes with a slightly trembling lip", + "sideways glance with a mysterious half-smile", + "sideways head tilt with a slight smile", + "sideways smirk with one raised eyebrow", + "sighing", + "silent laughter with mouth wide open and body shaking", + "silent scream of anguish with contorted features", + "silent tears streaming down cheeks", + "slack-jawed amazement with eyebrows reaching the hairline", + "slack-jawed expression with a bewildered look and widened eyes", + "slack-jawed expression with a blank stare and relaxed features", + "slack-jawed expression with a dazed look and relaxed features", + "slack-jawed expression with a glazed, distant stare", + "slack-jawed expression with a stunned look and raised eyebrows", + "slack-jawed expression with furrowed brow and widened eyes", + "slack-jawed expression with raised eyebrows and a bewildered look", + "slack-jawed expression with raised eyebrows and a dazed look", + "slack-jawed expression with raised eyebrows and wide eyes", + "slack-jawed expression with raised eyebrows and widened eyes", + "slack-jawed with raised eyebrows", + "slight frown with downcast eyes and fidgeting hands", + "slight frown with downcast eyes and slumped shoulders", + "slight frown with downcast eyes and wringing hands", + "slight frown with furrowed brow and downcast eyes", + "slight frown with narrowed eyes and a tilted head", + "slight frown with one corner of the mouth turned down", + "slight frown with one eyebrow raised questioningly", + "slight pout with furrowed brow and crossed arms", + "slight pout with furrowed brow and hunched shoulders", + "slight pout with furrowed brow and pleading eyes", + "slight pout with puppy-dog eyes and drooping shoulders", + "slight pout with puppy-dog eyes and flushed cheeks", + "slight pout with puppy-dog eyes and hunched shoulders", + "slight pout with puppy-dog eyes and raised inner eyebrows", + "slight pout with puppy-dog eyes and slumped shoulders", + "slight smile with a faraway look and relaxed features", + "slight smile with crow's feet and a relaxed jawline", + "slight smile with eyes crinkled at the corners and relaxed forehead", + "slight smile with softened eyes and a relaxed brow", + "slight smile with softened eyes and a relaxed forehead", + "slight smile with softened eyes and a tilted head", + "slight smile with softened eyes and relaxed brow", + "slight smile with softened eyes and relaxed jawline", + "slight, brief upturn of the mouth corners", + "slightly pursed lips with a thoughtful, distant gaze", + "sly chuckle with a raised eyebrow and half-smirk", + "smiling", + "smiling softly with eyes crinkling at the corners", + "smirking", + "smirking with one corner of the mouth turned up", + "sneering", + "snickering", + "snickering behind a fist with eyes creased in amusement", + "sniffling", + "sniffling with a runny nose", + "sniggering", + "sniggering with a sidelong glance and curved lips", + "snorting laugh with scrunched-up nose and closed eyes", + "sobbing", + "sobbing quietly with trembling body", + "sobbing uncontrollably with gasping breaths", + "soft focus eyes with a gentle, nostalgic smile", + "soft smile with crow's feet and a gentle gaze", + "soft smile with relaxed eyes and a slight head tilt", + "soundless crying with closed eyes", + "split-second nose wrinkle and upper lip raise", + "squinted eyes and pursed lips in deep concentration", + "squinted eyes with a slight head shake and pursed lips", + "squinted eyes with flared nostrils and a scrutinizing gaze", + "squinted eyes with flared nostrils and a slight head shake", + "squinted eyes with flared nostrils and a slight head tilt", + "squinted eyes with flared nostrils and pursed lips", + "squinted eyes with nose scrunched up in disgust", + "squinted eyes with pursed lips and a slight head tilt", + "squinted eyes with pursed lips and a tilted head", + "squinting eyes with a slightly open mouth and tilted head", + "staring", + "stifled giggle with pursed lips and shaking shoulders", + "stifled sobs with bite-marked lips", + "streaming tears with vacant stare", + "suppressed laugh causing reddened cheeks and watery eyes", + "tear-choked voice with quivering chin", + "tear-stained cheeks with puffy eyes", + "tearful mumbling with quivering voice", + "tearful smile with upturned lips and glistening eyes", + "tears of frustration with gritted teeth", + "teary hiccups with gasping breaths", + "teary-eyed with a quivering pout", + "tight-lipped expression with one eyebrow arched high", + "tight-lipped expression with one eyebrow raised skeptically", + "tight-lipped grimace with one eye twitching and clenched fists", + "tight-lipped grimace with one eye twitching and clenched jaw", + "tight-lipped grimace with one eyebrow raised and narrowed eyes", + "tight-lipped smile with crinkled eyes and dimples", + "tight-lipped smile with narrowed, suspicious eyes", + "tight-lipped smile with one dimple and a skeptical gaze", + "tight-lipped smile with one eyebrow raised inquisitively", + "tight-lipped smile with slightly raised eyebrows", + "tittering", + "tittering behind a raised hand with eyes darting around", + "trembling lower lip with watery eyes", + "ugly crying with scrunched-up face", + "uncontrollable laughter causing gasping for air", + "wailing", + "wailing in anguish with thrown-back head", + "wailing loudly with flailing arms", + "wailing with hands covering face", + "weary eyes with a forced, tight-lipped smile", + "weeping", + "weeping bitterly with flushed cheeks", + "weeping openly with mascara-streaked cheeks", + "weeping openly with streams of tears", + "weeping silently with tears dripping off chin", + "weeping softly with downcast eyes", + "whimpering", + "whimpering softly with hunched shoulders", + "whimpering softly with puppy-dog eyes", + "whimpering with furrowed brow", + "whooping with joy", + "whooping with joy, fists pumped in the air", + "wicked grin with narrowed eyes and raised eyebrows", + "wide grin with dimples and sparkling eyes", + "wide grin with eyes crinkling at the corners in joy", + "wide grin with eyes squeezed shut in elation", + "wide grin with furrowed brow and fidgeting hands", + "wide-eyed amazement with jaw slightly dropped", + "wide-eyed wonder with slightly parted lips", + "wide-eyed wonder with slightly parted lips in awe", + "winking", + "wrinkled forehead with a confused expression and tilted head", + "wrinkled forehead with a confused pout and tilted head", + "wrinkled forehead with a slight pout and questioning eyes", + "wrinkled forehead with a thoughtful expression and distant gaze", + "wrinkled forehead with a thoughtful pout and downcast eyes", + "wrinkled forehead with eyebrows knitted together in confusion", + "wrinkled forehead with parted lips and a confused gaze", + "wrinkled forehead with parted lips and a puzzled expression", + "wrinkled forehead with pursed lips and squinted eyes", + "wrinkled forehead with wide eyes and an 'o'-shaped mouth", + "wrinkled forehead with wide eyes and slightly parted lips", + "wrinkled nose and squinted eyes reacting to a strong odor", + "wrinkled nose with curled upper lip", + "wrinkled nose with slightly parted lips and raised eyebrows", + "wry smile with one eyebrow slightly raised", + "yawning", + "yawning widely with stretching arms and drooping eyelids" ] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/2-eyebrows.json b/nodes/prompt_data/facial_action/2-eyebrows.json index e60e7af..68884d0 100644 --- a/nodes/prompt_data/facial_action/2-eyebrows.json +++ b/nodes/prompt_data/facial_action/2-eyebrows.json @@ -1,13 +1,19 @@ [ - "an eyebrow raised", - "eyebrows frown", - "eyebrows furrowed", - "eyebrows lowered", - "eyebrows knit", - "eyebrows raised", - "left eyebrow raised", - "right eyebrow raised", - "left eyebrow lowered", - "right eyebrow lowered", - "scowling" + "an eyebrow raised", + "eyebrows frown", + "eyebrows knit", + "eyebrows knitted together", + "eyebrows lowered", + "furrowed brows", + "inner eyebrows raised", + "left eyebrow lowered", + "left eyebrow raised", + "one eyebrow arched high", + "one eyebrow cocked", + "one eyebrow raised", + "raised eyebrows", + "relaxed brows", + "right eyebrow lowered", + "right eyebrow raised", + "scowling" ] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/3-eyes.json b/nodes/prompt_data/facial_action/3-eyes.json index c851206..087d06a 100644 --- a/nodes/prompt_data/facial_action/3-eyes.json +++ b/nodes/prompt_data/facial_action/3-eyes.json @@ -1,12 +1,63 @@ [ - "eyes closed", - "eyes rolling", - "eyes squinting", - "eyes widen", - "eyes winking", - "left eye closed, right eye opened", - "left eye opened, right eye closed", - "left eye squinting", - "right eye squinting", - "upturned eyes" + "attentive eyes", + "averted gaze", + "bewildered look", + "blank stare", + "blinking", + "bright eyes", + "closed eyes", + "compassionate eyes", + "crested eyes", + "darting eyes", + "dazed look", + "distant gaze", + "dreamy expression", + "drooping eyelids", + "eye lowering", + "eye widening", + "eyes darting around", + "eyes rolled", + "eyes rolling", + "eyes squeezed shut", + "eyes squinting", + "eyes tightly shut", + "eyes widen", + "eyes winking", + "faraway look", + "focused gaze", + "glassy eyes", + "glazed and distant stare", + "glistening eyes", + "half-closed eyes", + "heavy-lidded eyes", + "incredulous stare", + "intense eyes", + "left eye closed, right eye opened", + "left eye opened, right eye closed", + "left eye squinting", + "looking down", + "looking left", + "looking right", + "looking up", + "misty eyes", + "narrowing of the eyes", + "one eye closed", + "one eye squeezed shut", + "one eye twitching", + "puppy dog eyes", + "questioning gaze", + "red, puffy eyes", + "right eye squinting", + "scrutinizing gaze", + "soft eyes", + "sparkling eyes", + "squinted eyes", + "steady gaze", + "tear-filled eyes", + "twinkling eyes", + "upturned eyes", + "vacant stare", + "watery eyes", + "weary eyes", + "wide eyes" ] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/4-nose.json b/nodes/prompt_data/facial_action/4-nose.json index 7c28e7f..205c8e8 100644 --- a/nodes/prompt_data/facial_action/4-nose.json +++ b/nodes/prompt_data/facial_action/4-nose.json @@ -1,7 +1,15 @@ [ - "nose twitched", - "nose wrinkled", - "nostril flared", - "left nostril flared", - "right nostril flared" + "flared nostrils", + "left nostril flared", + "nose crinkled", + "nose scrunch", + "nose twitched", + "nose wrinkle", + "nose wrinkled", + "right nostril flared", + "runny nose", + "scrunched-up nose", + "slightly flared nostrils", + "snotty nose", + "wrinkled nose" ] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/5-mouth.json b/nodes/prompt_data/facial_action/5-mouth.json index 7c9fa8b..d65e5b9 100644 --- a/nodes/prompt_data/facial_action/5-mouth.json +++ b/nodes/prompt_data/facial_action/5-mouth.json @@ -1,15 +1,48 @@ [ - "bite lip", - "lick lips", - "purse lips", - "mouth closed", - "mouth frowning", - "mouth opened", - "mouth wide opened", - "mouth slightly opened", - "mouth pouting", - "raise left corner of the mouth", - "raise right corner of the mouth", - "gnashing teeth", - "stick out tongue" + "bite lip", + "biting lower lip", + "clenched jaw", + "clenched teeth", + "dropped jaw", + "duck lips", + "gnashing teeth", + "hiccups", + "jaw drops", + "lick lips", + "lip bite", + "lip curl", + "lips pressed into a thin line", + "lips pressed together", + "mouth agape", + "mouth closed", + "mouth frowning", + "mouth opened", + "mouth pouting", + "mouth slightly opened", + "mouth wide opened", + "o-shaped mouth", + "open-mouthed", + "open-mouthed yawn", + "parted lips", + "pouty lower lip", + "protruding lower lip", + "protruding tongue", + "puckered lips", + "purse lips", + "pursed lips", + "quivering lower lip", + "quivering upper lip", + "raise left corner of the mouth", + "raise right corner of the mouth", + "set jaw", + "slack-jawed", + "slightly parted lips", + "slightly upturned lips", + "sour taste reaction", + "teeth gritted", + "teeth showing", + "tensed jaw", + "tightening of the lips", + "tongue sticking out", + "trembling lower lip" ] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/6-cheeks.json b/nodes/prompt_data/facial_action/6-cheeks.json index 451b50e..c718b3a 100644 --- a/nodes/prompt_data/facial_action/6-cheeks.json +++ b/nodes/prompt_data/facial_action/6-cheeks.json @@ -1,10 +1,18 @@ [ - "blushing", - "face goes pale", - "cheeks bloating", - "left cheek bloating", - "right cheek bloating", - "cheeks twitched", - "left cheek twitched", - "right cheek twitched" + "blushing cheeks", + "cheeks bloating", + "cheeks twitched", + "dimples on cheeks", + "face goes pale", + "flushed cheeks", + "left cheek bloating", + "left cheek twitched", + "puffed cheeks", + "puffed-out cheeks", + "reddened cheeks", + "right cheek bloating", + "right cheek twitched", + "rosy cheeks", + "slightly flushed cheeks", + "tear-streaked cheeks" ] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/7-chin.json b/nodes/prompt_data/facial_action/7-chin.json index daeeef6..5763309 100644 --- a/nodes/prompt_data/facial_action/7-chin.json +++ b/nodes/prompt_data/facial_action/7-chin.json @@ -1,6 +1,10 @@ [ - "chin lifted", - "crooked chin", - "tucked chin", - "chin trembled" + "chin high", + "chin lifted", + "crooked chin", + "jutted chin", + "quivering chin", + "slightly jutted chin", + "trembling chin", + "tucked chin" ] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/8-head.json b/nodes/prompt_data/facial_action/8-head.json new file mode 100644 index 0000000..d8a8157 --- /dev/null +++ b/nodes/prompt_data/facial_action/8-head.json @@ -0,0 +1,7 @@ +[ + "head back", + "head shake", + "head thrown back", + "head tilted", + "sideways head tilt" +] \ No newline at end of file diff --git a/nodes/prompt_data/facial_action/999-injured.json b/nodes/prompt_data/facial_action/999-injured.json index 81bdf13..9c96226 100644 --- a/nodes/prompt_data/facial_action/999-injured.json +++ b/nodes/prompt_data/facial_action/999-injured.json @@ -1,33 +1,98 @@ [ - "bleeding eyelids", - "bleeding left eyelid", - "bleeding right eyelid", - "bruised eyelids", - "bruised left eyelid", - "bruised right eyelid", - "swollen eyelids", - "swollen left eyelid", - "swollen right eyelid", - "nose bleed", - "nose bruised", - "nostril bleed", - "left nostril bleed", - "right nostril bleed", - "lip bleeding", - "mouth bruised", - "bluish face", - "cheeks bruised", - "left cheek bruised", - "right cheek bruised", - "cheeks bleeding", - "left cheek bleeding", - "right cheek bleeding", - "puff out cheeks", - "puff out left cheek", - "puff out right cheek", - "swollen cheeks", - "swollen left cheek", - "swollen right cheek", - "chin bruised", - "chin bleeding" + "bleeding from eyelid", + "bleeding from left eyelid", + "bleeding from right eyelid", + "bruised eyelid", + "bruised left eyelid", + "bruised right eyelid", + "swollen eyelid", + "swollen left eyelid", + "swollen right eyelid", + "cut on eyelid", + "laceration on left eyelid", + "laceration on right eyelid", + "black eye", + "left black eye", + "right black eye", + "puffy eyelids", + "bluish discoloration around eyes", + "bruised cheek", + "bruised left cheek", + "bruised right cheek", + "swollen cheek", + "swollen left cheek", + "swollen right cheek", + "cut on cheek", + "laceration on left cheek", + "laceration on right cheek", + "cheek contusion", + "facial bruising", + "facial swelling", + "abrasion on cheek", + "bruised chin", + "cut on chin", + "laceration on chin", + "swollen chin", + "chin contusion", + "split chin", + "bleeding from chin", + "bleeding from lip", + "cut on lip", + "split lip", + "swollen lip", + "bruised lip", + "laceration on upper lip", + "laceration on lower lip", + "nosebleed", + "bleeding from nose", + "broken nose", + "swollen nose", + "bruised nose", + "nasal fracture", + "nose contusion", + "bleeding from nostril", + "left nostril bleeding", + "right nostril bleeding", + "facial laceration", + "abrasion on forehead", + "bruised forehead", + "swollen forehead", + "cut on forehead", + "gash on eyebrow", + "bleeding from eyebrow", + "bruised eyebrow", + "swollen eyebrow", + "facial cuts and abrasions", + "multiple facial contusions", + "jaw contusion", + "swollen jaw", + "bruised jaw", + "temple contusion", + "bleeding from temple", + "swollen temple", + "facial hematoma", + "cheek hematoma", + "eye hematoma", + "facial edema", + "periorbital edema", + "facial puffiness", + "facial discoloration", + "reddened cheek", + "purplish bruise on face", + "yellowish bruise on face", + "facial scar tissue", + "fresh facial wound", + "oozing facial wound", + "crusted blood on face", + "dried blood around nostrils", + "blood trickling from mouth", + "bloodshot eyes", + "subconjunctival hemorrhage", + "torn earlobe", + "bruised ear", + "swollen ear", + "laceration behind ear", + "abrasion on neck", + "bruised neck", + "neck contusion" ] \ No newline at end of file diff --git a/nodes/prompt_data/lighting/1-time.json b/nodes/prompt_data/lighting/1-time.json index 070bcc2..da8fe44 100644 --- a/nodes/prompt_data/lighting/1-time.json +++ b/nodes/prompt_data/lighting/1-time.json @@ -1,16 +1,29 @@ [ - "afternoon lighting", - "blue hour lighting", - "crepuscular rays light", - "dawn lighting", - "dusk lighting", - "evening lighting", - "golden hour lighting", - "midday lighting", - "morning lighting", - "night lighting", - "sunrise lighting", - "sunset lighting", - "twilight hues lighting", - "twilight hour lighting" + "afternoon lighting", + "afternoon twilight", + "blue hour lighting", + "crepuscular rays light", + "dawn lighting", + "daybreak lighting", + "dusk lighting", + "early morning light", + "evening blue hour", + "evening lighting", + "evening twilight", + "golden hour lighting", + "late afternoon lighting", + "late night lighting", + "midday lighting", + "midnight lighting", + "morning blue hour", + "morning lighting", + "morning twilight", + "night lighting", + "pre-dawn lighting", + "predawn lighting", + "sunrise lighting", + "sunset lighting", + "twilight", + "twilight hour lighting", + "twilight hues lighting" ] \ No newline at end of file diff --git a/nodes/prompt_data/lighting/2-nature.json b/nodes/prompt_data/lighting/2-nature.json index f9fc7bf..943ac20 100644 --- a/nodes/prompt_data/lighting/2-nature.json +++ b/nodes/prompt_data/lighting/2-nature.json @@ -1,6 +1,11 @@ [ + "aurora borealis lighting", + "autumn lighting", + "bioluminescent lighting", "bright and sunny lighting", "bright daylight", + "bright sunlight", + "caustics lights", "celestial sky illumination lighting", "cloudy day diffused light", "cloudy daylight", @@ -14,6 +19,7 @@ "firelight", "firelight flicker lighting", "fog and mist light", + "foggy light", "glowing fireflies lighting", "halos light", "harsh sunlight", @@ -22,25 +28,25 @@ "lightning light", "magical enchanted forest lighting", "mist light", + "misty lighting", "moonlight", "natural lighting", - "overcast", + "overcast diffused sunlight", + "overcast lighting", "rainbow halo", + "rainy lighting", "reflections light", "scattering light", - "shimmering lake reflections lighting", "skylight", "spooky halloween lights", + "spring lighting", + "starlight", "starry night lighting", - "subtle ambient glow lighting", - "sun rays", + "summer lighting", "sunlight", "sunny lighting", - "sunrise at the mountains lighting", - "sunrise over the ocean lighting", - "sunset silhouette lighting", "thuderstorms light", - "torchlight", "underwater illumination lighting", - "warm sunset glow lighting" + "water reflections lighting", + "winter lighting" ] \ No newline at end of file diff --git a/nodes/prompt_data/lighting/3-artificial.json b/nodes/prompt_data/lighting/3-artificial.json index c2c5396..f5649d7 100644 --- a/nodes/prompt_data/lighting/3-artificial.json +++ b/nodes/prompt_data/lighting/3-artificial.json @@ -1,10 +1,13 @@ [ + "3 spots lighting", "ambient lighting", + "antique lighting", "arc sparks lighting", "area light", "artificial indoor lighting", "artificial lighting", "artificial outdoor lighting", + "barn lighting", "bright festive holiday lights", "bright stadium lights", "broad lighting", @@ -13,10 +16,12 @@ "campfire lighting", "candle light", "caustics light", + "christmas lights", "christmas tree lights", "cinematic lighting", - "city lights lighting", - "city street light", + "city lights", + "city street lights", + "cityscape lighting", "clamshell lighting", "classic chandelier lighting", "classic gas lamp", @@ -24,66 +29,69 @@ "concert lighting", "corona light", "cove lighting", - "cozy book reading nook lighting", - "creepy haunted house lighting", - "dazzling disco lights", + "dekatron light", "diffused lighting", "directional lighting", "disco lighting", - "dramatic high contrast lighting", - "dramatic opera house lighting", - "dramatic spotlight lighting", "edison bulb lighting", "eerie torchlight", "electric arc lighting", - "electric disco dance floor lighting", + "electric disco lighting", + "electroluminescent wire", "elegant crystal lighting", "enchanted garden lanterns lighting", "enchanting bioluminescence lighting", "enveloping fog lights lighting", - "exotic tiki torches lighting", - "fill light", + "fireplace lighting", "flash light", "floating chinese lanterns lighting", + "fluorescent lamps", "fluorescent lighting", - "fluorescent office lighting", - "glimmering disco ball lighting", - "glimmering water reflections lighting", - "glistening icicle lights", - "glittering cityscape lighting", + "fluorescent tube", "global illumination", "glow in the dark", - "glow sitck", + "glow stick lighting", "glowing carnival rides lighting", "glowing jack-o'-lanterns lighting", "glowing lighthouse beacon lighting", "glowing neon lighting", + "glowing radioactivity", + "grids light", "hard shadows lighting", "harsh overhead lighting", "hdr lighting", "heat haze light", "hemisphere light", + "high contrast lighting", "high key lighting", + "icicle lights", "incandescent lighting", "indirect lighting", "indoor lighting", - "industrial warehouse lighting", - "intense police searchlight", - "intimate candlelit bath lighting", + "industrial lighting", "key light", "lantern light", + "lanterns lighting", "laser lights", "led lighting", "lens flare light", "light painting lighting", - "loop lighting", - "luminous jellyfish aquarium lighting", + "light pollution", + "lit by beauty dish", + "lit by broad light", + "lit by dish reflector", + "lit by emitting diodes", + "lit by halogen lamps", + "low pressure sodium lamps", + "metal halide lamps", "modern led strips lighting", "neon cold lighting", "neon glow lighting", "neon lighting", "nightclub lighting", "nostalgic retro diner glow lighting", + "old lighting", + "opera house lighting", "orb light", "outdoor lighting", "panel light", @@ -91,39 +99,37 @@ "practical lighting", "radiant stadium floodlights", "radiant streetlamps lighting", - "rembrandt lighting", "reminiscent film lighting", "retro neon lights", "retro neon signs lighting", - "rim lighting", - "rustic barn lighting", - "rustic campfire lighting", - "rustic fireplace lighting", - "rustic lanterns lighting", + "searchlight", + "snoot light", "soft ambient lighting", "softbox lighting", "spacecraft lighting", "speedlight", "split lighting", "spotlight", + "stadium lights", "stage lighting", "still life lighting", "street lamp lighting", "streetlights", "strip light", + "stripbox light", "strobe light", "studio lighting", "studio portrait lighting", "subdued desk lamp lighting", "subdued nightlight", + "theatre lighting", "three-point lighting", + "torch lighting", "torchlit", "tungsten lighting", - "twinkling christmas stars lighting", - "twinkling fairy lights", + "ultraviolet light", + "underwater illumination", "uv lighting", - "vibrant stage lighting", "vintage film noir lighting", - "vivid art gallery spotlights", - "warm fireplace embers lighting" + "x ray light" ] \ No newline at end of file diff --git a/nodes/prompt_data/lighting/4-diriection.json b/nodes/prompt_data/lighting/4-diriection.json index e24f1c7..d2e2b1f 100644 --- a/nodes/prompt_data/lighting/4-diriection.json +++ b/nodes/prompt_data/lighting/4-diriection.json @@ -1,5 +1,9 @@ [ "backlit", + "broad lighting", + "edge lighting", + "fill lighting", + "light from behind", "light from bottom", "light from bottom-left", "light from bottom-right", @@ -10,10 +14,13 @@ "light from top", "light from top-left", "light from top-right", + "loop lighting", "overhead lighting", + "rim lighting", "side lighting", "sidelit", "silhouette lighting", + "split lighting", "top light", "under lighting" ] \ No newline at end of file diff --git a/nodes/prompt_data/lighting/5-mood.json b/nodes/prompt_data/lighting/5-mood.json index 4d6ffb3..17e4446 100644 --- a/nodes/prompt_data/lighting/5-mood.json +++ b/nodes/prompt_data/lighting/5-mood.json @@ -1,43 +1,59 @@ [ "abstract light patterns", + "beautifully lit", + "black lighting", "blinding light", "bloom light", "chiaroscuro lighting", - "cold light", + "cinematic lighting", + "cold lighting", "colorful light", "cool and blue lighting", + "cozy book reading nook lighting", + "creepy haunted house lighting", "dim and cozy lighting", "dim light", + "dramatic high contrast", "dramatic lighting", - "dreamlike fairy circle lights", + "dreamlike fairy lights", "dreamy lighting", + "dual orange and blue lighting", + "dual purple and yellow lighting", + "dual red and green lighting", + "eerie light", + "ethereal lighting", + "flat lighting", "glare light", "hard lighting", "harsh lighting", "high contrast lighting", "high key lighting", "holy light", + "horror lighting", "low contrast lighting", "low key lighting", + "magic lighting", "moody and mysterious lighting", "moody lighting", + "morbid light", + "nostalgic lighting", + "perfect lighting", "radiant angelic lighting", + "rembrandt lighting", "rim lighting", - "sci-fi futuristic lighting", - "sci-fi holographic projections lighting", - "serene zen garden illumination lighting", "shadow light", "shimmering light", - "silhouette lighting", - "sinister back alley lighting", + "sinister lighting", "soft and diffused lighting", "soft and warm lighting", - "soft illumination lighting", "soft lighting", "soft meditation lighting", "soft pastel glow lighting", - "soft shadows lighting", + "soft shadows", + "thriller lighting", + "vintage film noir lighting", "volumetric lighting", - "warm light", + "waning light", + "warm lighting", "whimsical fairy tale lighting" ] \ No newline at end of file diff --git a/nodes/prompt_data/motion/1-performance.json b/nodes/prompt_data/motion/1-performance.json index 4e1763f..9ab6806 100644 --- a/nodes/prompt_data/motion/1-performance.json +++ b/nodes/prompt_data/motion/1-performance.json @@ -1,57 +1,138 @@ [ - "absurdist theater performance", - "artistic dance", - "ballet dance", - "ballroom dance", - "belly dance", - "bharatanatyam dance", - "breakdance", - "children's theater performance", - "circus retro performance", - "classical dance", - "classical theater performance", - "comedy performance", - "contemporary ballet", - "contemporary dance", - "dance performance", - "disco retro performance", - "drama performance", - "experimental theater performance", - "farce performance", - "folkloric dance", - "flamenco dance", - "happening performance", - "hip-hop dance", - "icelandic contemporary folk music performance", - "ice luge", - "improvisational theater performance", - "irish dancing celebration", - "irish st. patrick's day parade performance", - "jazz dance", - "kabuki theater performance", - "kathak dance", - "line dance", - "lounge singer retro performance", - "luchador performance", - "mardi gras performance", - "melodrama performance", - "mime performance", - "musical theater performance", - "national folk music performance", - "nouveau circus performance", - "opera performance", - "physical theater performance", - "pole dance", - "salsa dance", - "stand-up comedy performance", - "street art performance", - "street theater performance", - "swing dance", - "tap dance", - "tango dance", - "traditional dance", - "tropical luau performance", - "verbatim theater performance", - "voodoo ceremony occult performance", - "waltz dance" + "in the absurdist theater performance", + "in the children's theater performance", + "in the circus retro performance", + "in the classical theater performance", + "in the comedy performance", + "in the disco retro performance", + "in the drama performance", + "in the experimental theater performance", + "in the farce performance", + "in the happening performance", + "in the icelandic contemporary folk music performance", + "in the improvisational theater performance", + "in the irish st. patrick's day parade performance", + "in the kabuki theater performance", + "in the lounge singer retro performance", + "in the luchador performance", + "in the mardi gras performance", + "in the melodrama performance", + "in the mime performance", + "in the musical theater performance", + "in the national folk music performance", + "in the nouveau circus performance", + "in the opera performance", + "in the physical theater performance", + "in the stand-up comedy performance", + "in the street art performance", + "in the street theater performance", + "in the tropical luau performance", + "in the verbatim theater performance", + "in the voodoo ceremony occult performance", + "performing african dance", + "performing afro-cuban dance", + "performing argentine tango", + "performing artistic dance", + "performing bachata", + "performing balinese legong dance", + "performing ballet", + "performing ballroom dance", + "performing belly dance", + "performing belly dance fusion", + "performing bhangra dance", + "performing bharatanatyam dance", + "performing bihu dance", + "performing bollywood dance", + "performing boogaloo dance", + "performing breakdance", + "performing butoh dance", + "performing capoeira dance", + "performing cha-cha", + "performing chhau dance", + "performing chinese lion dance", + "performing classical dance", + "performing contemporary ballet", + "performing contemporary dance", + "performing cossack dance", + "performing cumbia", + "performing dandiya dance", + "performing dragon dance", + "performing english country dance", + "performing filipino folk dance", + "performing finnish tango", + "performing flamenco", + "performing folkloric dance", + "performing forró dance", + "performing foxtrot", + "performing garba dance", + "performing garba raas dance", + "performing ghumura dance", + "performing hip-hop dance", + "performing house dance", + "performing hula dance", + "performing indonesian kecak dance", + "performing irish step dance", + "performing japanese butoh-fu dance", + "performing jazz dance", + "performing jhumur dance", + "performing jive", + "performing k-pop dance", + "performing kabuki dance", + "performing kala dance", + "performing kalbelia dance", + "performing karagattam dance", + "performing kathak dance", + "performing kathakali dance", + "performing khmer classical dance", + "performing koli dance", + "performing krumping dance", + "performing kuchipudi dance", + "performing lambada dance", + "performing latin dance", + "performing lavani dance", + "performing lezim dance", + "performing line dance", + "performing locking dance", + "performing mambo", + "performing manipuri dance", + "performing mathuri dance", + "performing maypole dance", + "performing merengue", + "performing middle eastern dance", + "performing modern dance", + "performing mohiniyattam dance", + "performing morris dance", + "performing noh dance", + "performing norwegian halling dance", + "performing odissi dance", + "performing pole dance", + "performing polka", + "performing pop and lock dance", + "performing popping dance", + "performing povada dance", + "performing quickstep", + "performing robot dance", + "performing rumba", + "performing russian folk dance", + "performing salsa", + "performing samba dance", + "performing santhali dance", + "performing sattriya dance", + "performing scottish country dance", + "performing scottish highland dance", + "performing sidi goma dance", + "performing swing dance", + "performing sword dance", + "performing tahitian dance", + "performing tai chi fan dance", + "performing tango", + "performing tap dance", + "performing thai classical dance", + "performing traditional dance", + "performing ukrainian hopak dance", + "performing vogue dance", + "performing waacking dance", + "performing waltz", + "performing yakshagana dance", + "performing zumba" ] \ No newline at end of file diff --git a/nodes/prompt_data/motion/2-pose.json b/nodes/prompt_data/motion/2-pose.json index b9646b8..959db01 100644 --- a/nodes/prompt_data/motion/2-pose.json +++ b/nodes/prompt_data/motion/2-pose.json @@ -1,37 +1,56 @@ [ "adjusting clothing", + "affectionate actions", + "affectionate gesture", "against a wall", "ajusting hair", + "arm at side", + "arm over partner’s shoulder", "arm raised, bent elbow, one leg forward, standing pose, confident stance", "arm raised, standing straight, looking forward", + "arm support", + "arms behind back", + "arms crossed", "arms crossed, facing camera, slight head tilt", "arms crossed, head slightly tilted", "arms crossed, looking away", "arms on table, standing straight, slight torso twist", + "arms outstretched", "arms raised, elbows bent, flexing biceps, confident stance", "arms up", + "arms wide open", "back arch pose", + "back arched", "battle pose", + "beauty shot pose", "bending forward, one hand raised, facing camera", "bending pose", + "blowing a kiss", "captivating pose", "cartwheel pose", "casual stroll pose", "chassing pose", + "chest out", "cinematic pose", - "close-up beauty shot pose", + "claw pose", + "closing eyes and tilting head", "confident stance", "contrapposto pose", + "crossing fingers", + "crouching", + "crouching down with hands on ground in front of body", "crouching down, chin resting, looking sideways", "crouching pose", "crouching, facing camera, hands on knees", "crouching, looking forward", "crouching, looking forward, left hand on ground, right arm resting on leg", + "dancing in mid-air", "dynamic action pose", "dynamic jump pose", "dynamic pose", "dynamic sitting pose", "eating", + "elbows on knees", "expressive female pose", "extreme pose", "facing away, head turned, one hand touching thigh", @@ -67,15 +86,20 @@ "facing forward, slight head tilt, hair pulled back", "facing forward, slight tilt", "facing forward, slight tilt, relaxed stance", - "facing sideways, slight twist, playful stance", "facing left", "facing right", + "facing sideways, slight twist, playful stance", "fashion model pose", "feminine pose", "fighting", "finger pointing", + "fist on chin", "flipping hair", + "frowning", "gazing into the distance", + "gentle touch", + "giving thumbs down", + "giving thumbs up", "glamour pose", "half-turned, looking back, one arm bent", "hand in hair", @@ -88,6 +112,7 @@ "hand in hair, slightly turned, standing upright", "hand in hair, standing straight", "hand on cheek, sitting down, head slightly tilted", + "hand on chin", "hand on chin, looking forward, slight tilt", "hand on face, leaning slightly", "hand on hat, facing camera, slightly leaning", @@ -98,21 +123,34 @@ "hand on head, standing straight, slight twist, confident stance", "hand on hip, slight body tilt, chin down, forward-facing", "hand-on-hip", + "hands above head", + "hands behind back", + "hands behind head", + "hands clasped in front", + "hands gripping an object", "hands hang naturally at sides", "hands in hair, seated, legs crossed", + "hands in pockets", + "hands in prayer position", + "hands on face", "hands on face, slight head tilt, facing camera", + "hands on hips", "hands on hips, facing camera, confident stance", "hands on hips, slight lean, confident stance", "hands on hips, standing straight, slight body twist", "hands on hips, straight posture", + "hands raised in victory", "hands raised, head tilt, standing straight", "hands raised, slight twist, standing straight", + "hands resting on hips", + "hands resting on table", "handstand", "has a specific pose", "head cocked, hand on chin, facing camera", "head tilt, facing camera", "head tilt, facing upwards, holding flowers", "head tilted slightly, eyes looking forward, hand touching hair", + "head tilted to the side", "head tilted, hand in hair, facing camera", "head tilted, hand on chin", "head tilted, hand on neck, relaxed demeanor, bare shoulders", @@ -121,30 +159,81 @@ "head tilted, sitting, hand on neck", "head turned, facing upward, flowing hair", "head turned, looking back, hand on hip", - "headshot pose", "high fashion pose", + "holding an object close to body, such as a pet or child", + "holding an object in both hands, such as a musical instrument or sports equipment", + "holding an object in one hand", + "holding an object in one hand, such as a flower or book", + "holding an object out in front of body, such as a camera or phone", "holding bag", + "holding both hands on cheeks", + "holding both hands over heart", "holding glass", "holding hair, straight stance", + "holding hands above head", + "holding hands behind back", + "holding hands in front of body", + "holding hands in prayer position", + "holding hands on hips, elbows in", + "holding hands on hips, elbows out", + "holding hands over head in victory sign", "holding headset", "holding ice cream", "holding microphone", + "holding one hand on cheek", + "holding one hand on chin", + "holding one hand over heart", "holding pen", "holding phone", "hugging", + "hugging oneself", + "index finger raised", "interacting with props", "jojo pose", "jumping", + "jumping in mid-air", "kneeling", "kneeling down, facing camera, leaning forward", + "kneeling on both knees", + "kneeling on one knee", "kneeling position, hand in hair", + "kneeling with arms outstretched", + "kneeling with both knees on ground and hands clasped in front of body", + "kneeling with both legs extended", + "kneeling with hands clasped in front", + "kneeling with hands on hips", + "kneeling with hands on nearby object", + "kneeling with one foot flat on ground and one knee raised", + "kneeling with one leg extended", "kneeling, hand on forehead, facing camera", "kneeling, leaning forward, facing camera", "kneeling, leaning forward, hands on handles", "kung fu pose", + "laughing", "leaning", + "leaning against a nearby object", + "leaning against a railing or fence", + "leaning against a tree", + "leaning against a wall", + "leaning back", "leaning back, angled towards camera, relaxed posture", "leaning back, one leg bent, one leg extended", + "leaning backward with arms crossed", + "leaning backward with arms outstretched", + "leaning backward with hands behind back", + "leaning backward with hands clasped behind head", + "leaning backward with hands on hips", + "leaning backward with one hand on hip, other hand on thigh", + "leaning backward with one leg crossed in front of the other", + "leaning backward with weight on one foot", + "leaning forward", + "leaning forward with arms on nearby object", + "leaning forward with arms outstretched", + "leaning forward with elbows on knees", + "leaning forward with hands clasped in front", + "leaning forward with hands clasped in front of face", + "leaning forward with hands on ground in front of body", + "leaning forward with hands on knees", "leaning forward, arching back, looking away", "leaning forward, hands on thighs", "leaning forward, hands under chin, facing camera", @@ -157,15 +246,57 @@ "leaning on tree, gently touching hair, standing pose, relaxed demeanor", "leaning on wall, facing camera, one leg raised", "left: standing straight, right hand raised, left: standing, hand on hip", + "legs crossed", "lifting pose", + "looking afar", + "looking ahead", + "looking angry with furrowed brow", + "looking at another", + "looking at viewer", + "looking away", "looking back over shoulder", "looking back, slight twist, hand on hip", "looking back, slight twist, right hand resting", + "looking confident with hands on hips", + "looking contemplative with hand on chin", + "looking down", + "looking down with head bowed", "looking forward, hand on head, slightly tilted head", "looking forward, head tilted", "looking forward, slight head tilt, relaxed posture", + "looking nervous with hands clasped", + "looking off into the distance", + "looking off to the side", + "looking over one shoulder", "looking over shoulder, three-quarter turn, hand on hip", + "looking playful with tongue sticking out or smiling mischievously", + "looking relaxed with arms outstretched", + "looking sad with downturned mouth and eyes", + "looking serious with arms crossed", + "looking straight at the camera", + "looking straight into the camera", + "looking surprised with wide eyes and open mouth", + "looking thoughtful with hand on forehead", + "looking to the side", + "looking to the side with head turned", + "looking up", + "looking up with head tilted back", + "looking worried with furrowed brow", "lying down", + "lying down with arms above head", + "lying down with arms outstretched to sides", + "lying down with both legs raised", + "lying down with head propped up on elbow", + "lying down with head resting on hand", + "lying down with one leg raised and one leg bent", + "lying on back with arms outstretched", + "lying on back with both legs raised", + "lying on back with one leg raised", + "lying on side with arms crossed", + "lying on side with arms outstretched", + "lying on side with head propped up on hand", + "lying on stomach with arms outstretched", + "lying on their back", "magic pose", "masculine pose", "meditation pose", @@ -174,22 +305,44 @@ "natural a-pose, standing with the arms outstreched", "natural t-pose, standing with the arms outstreched", "one arm bent, hip jutted out", + "one arm draped over shoulder", + "one arm holding the other elbow", + "one foot resting on a ledge", "one hand on face", + "one hand on waist", + "one hand raised", "one leg extended, leaning back", "one leg up", "over-the-shoulder look", + "own hands together", + "paw pose", "peace sign, looking forward, head tilted", + "pouting", "power pose", + "pray hand on hip", + "praying", + "propped up on one elbow resting", + "propped up on one hand sitting", + "propped up on one hand standing", + "putting both hands on waist", + "putting one hand on waist", "reaching", "reading book", + "reclining", "reclining, arms raised, directly facing camera, relaxed demeanor", "relaxing", "relaxing sitting", + "resting both arms on chair or couch", + "resting both hands on table or desk", + "resting one arm on chair or couch", + "resting one hand on table or desk", "riding", "royal pose", "running", + "running or jogging along a path or trail", "s-curve", "s-shape", + "saluting", "seated on couch, leaning forward, hands supporting chin, legs crossed, looking upward", "seated position, facing camera", "seated position, looking forward, slight tilt, relaxed posture", @@ -202,8 +355,11 @@ "seated, relaxed, looking aside", "seated, slightly leaning", "seated, slightly leaning, facing camera", + "shaking head", "sitting", "sitting cross-legged", + "sitting cross-legged on floor", + "sitting down with legs crossed", "sitting down, arms crossed, facing camera", "sitting down, arms raised, head tilted", "sitting down, arms rested, legs crossed", @@ -227,10 +383,30 @@ "sitting down, slightly leaned forward", "sitting down, slightly leaning forward, facing camera", "sitting down, touching hat", + "sitting on a bench", + "sitting on a chair", + "sitting on a stool", "sitting on bench, leaning forward, casually posed", "sitting on chair, legs crossed, leaning forward, holding drink, facing camera", + "sitting on edge of chair or bench", "sitting on floor, facing camera, one leg bent", + "sitting on one hip with legs bent to one side", + "sitting on the ground", "sitting pose, one hand on chin, legs crossed, head slightly tilted", + "sitting with arms crossed", + "sitting with both legs extended", + "sitting with hands on knees", + "sitting with hands on lap", + "sitting with knees bent and feet on ground", + "sitting with legs apart", + "sitting with legs crossed", + "sitting with legs folded under body", + "sitting with one hand on hip", + "sitting with one hand on nearby object", + "sitting with one knee up", + "sitting with one leg extended", + "sitting with one leg extended and one leg bent", + "sitting with weight on one side", "sitting, arm raised, head tilted", "sitting, arms raised, facing camera", "sitting, arms raised, head tilted", @@ -258,17 +434,24 @@ "skipping", "slight pose", "slightly tilted head", + "smiling with lips closed", + "smiling with teeth showing", "smoking", + "squatting", + "squatting down with hands clasped in front of body", "squatting position, hands in hair", "squatting position, head tilt, one hand raised", "squatting position, left arm resting, right hand on waist", "standing", + "standing on one leg", + "standing on tiptoes", "standing pose, facing camera, slight tilt", "standing pose, hands on ledge, facing camera", "standing pose, leaning on counter, one arm bent, facing camera", "standing pose, one hand raised, facing camera, hip jutted", "standing pose, one leg crossed, hand on hip, facing camera", "standing pose, slightly bent arm, hand touching hair, hip tilted, confident stance, half-turned towards camera", + "standing straight", "standing straight, facing camera", "standing straight, facing camera, hands on hips", "standing straight, facing camera, leaf in hand", @@ -291,9 +474,37 @@ "standing straight, hands relaxed, facing camera", "standing straight, hands resting", "standing straight, hands together, relaxed posture", + "standing with arms crossed", + "standing with arms outstretched", + "standing with arms outstretched to sides", + "standing with arms raised above head", + "standing with chin down", + "standing with chin up", + "standing with eyes closed", + "standing with eyes looking away", + "standing with eyes looking towards camera", + "standing with feet shoulder-width apart", + "standing with feet wider apart", + "standing with hands clasped in front", + "standing with hands on hips", + "standing with head tilted back", + "standing with head tilted to one side", + "standing with head tilted to other side", + "standing with one arm raised, hand above head", + "standing with one arm raised, hand on hip", + "standing with one arm resting on nearby object", + "standing with one foot in front of the other", + "standing with one hand in pocket", + "standing with one hand on hip, other hand on thigh", + "standing with one leg bent at the knee, foot resting on nearby object", + "standing with one leg crossed in front of the other", + "standing with weight on one foot", + "sticking out tongue", + "stretching arms", "stretching pose", "the over-the-shoulder look", "tilted head", + "torso twisted", "touching ear", "touching face", "touching hair", @@ -301,6 +512,12 @@ "vibrant pose", "vogue pose", "walking", + "walking along a path or trail with a relaxed gait", + "walking away from the camera with a purposeful stride", + "walking towards the camera with a confident stride", "waving hand", + "winking with both eyes", + "winking with one eye", + "yawning", "yoga pose" ] \ No newline at end of file diff --git a/nodes/prompt_data/scene/1-background.json b/nodes/prompt_data/scene/1-background.json index 643a5ee..11a8396 100644 --- a/nodes/prompt_data/scene/1-background.json +++ b/nodes/prompt_data/scene/1-background.json @@ -1,571 +1,1604 @@ [ - "aboard a sprawling interstellar spaceship", - "above the clouds", - "along the amazon river wildlife", - "amethyst dreamwing", - "among biomechanical wonders", - "among forgotten technology", - "among mythical beasts", - "among space travelers", - "among water lilies in a pond", - "as nature reclaiming civilization", - "at a black market cybernetics clinic", - "at a bustling galactic trade hub", - "at a cafe", - "at a carnival freakshow", - "at a chrono-mystical carnival", - "at a city transportation hub", - "at a clandestine hacker's hideout", - "at a concert", - "at a dark carnival", - "at a demonic portal", - "at a festival", - "at a futuristic ai-controlled mega-city", - "at a gym", - "at a harbor at sunset", - "at a hotel", - "at a lakeside cabin in autumn", - "at a museum", - "at a parisian cafe scene", - "at a parisian street cafe in spring", - "at a party", - "at a quantum portal nexus", - "at a steam-powered carnival", - "at a steampunk ball", - "at a street art gallery opening", - "at a street art mural festival", - "at a street carnival celebration", - "at a street carnival parade", - "at a street fashion boutique", - "at a street fashion runway", - "at a street fashion show extravaganza", - "at a street food truck fiesta", - "at a street jazz performance", - "at a street musicians' jam session", - "at a street performers' showcase", - "at a street protest rally", - "at a street skateboarding session", - "at a surreal clockwork opera", - "at an island luau", - "at an urban park skateboarding", - "at an urban rooftop party", - "at an urban street basketball game", - "at dawn's awakening", - "at dawn's promise", - "at daybreak's hope", - "at dusk's embrace", - "at eerie midnight", - "at high noon blaze", - "at home", - "at midnight dance", - "at noonday radiance", - "at noontime reverberation", - "at plague mass grave", - "at sunrise over a wheat field", - "at sunset over a tranquil lake", - "at the beach", - "at the clockwork circus of time", - "at the doorways to unknown realms", - "at the eiffel tower at night", - "at the lake", - "at the ocean", - "at the river", - "at the sea", - "at the waterfall", - "at twilight's whispers", - "at voodoo altar", - "at voodoo ceremony", - "at work", - "aurora skydancer", - "azure skywing", - "backstage at ballet rehearsal", - "beside a shimmering fairy pond", - "beside a volcano", - "boating on a tranquil pond", - "by a cemetery statue", - "cerulean wavecrest", - "crimson firebreath", - "crimson inferno", - "crystal frostclaw", - "crystal moonshroud", - "deep in the woods", - "during a city biking commute", - "during a deep sea discovery", - "during a digital rebellion", - "during a future war", - "during a galactic conflict", - "during a humpback whale breach", - "during a space rebellion", - "during a virtual rebellion", - "during an african cheetah sprint", - "during an african elephant migration", - "during an african serengeti migration", - "during an alien invasion", - "during an arctic wildlife encounter", - "during midday hustle", - "during monarch butterfly migration", - "during ocean exploration", - "during space colonization", - "during the age of exploration", - "during the ai uprising", - "during the dance of fireflies", - "during the rain of falling stars", - "during the robot uprising", - "emerald forestwhisper", - "emerald venomspine", - "exploring a dinosaur era", - "golden serpentwing", - "in a bioluminescent urban jungle", - "in a biomechanical dreamscape", - "in a biopunk world", - "in a black hole", - "in a boreal forest moose encounter", - "in a budapest cityscape", - "in a butcher shop", - "in a cabinet of curiosities", - "in a canal in venice at dusk", - "in a cassette bedroom", - "in a castle in the clouds", - "in a city of whispering machines", - "in a city street market", - "in a city under siege", - "in a cityscape at dusk", - "in a clockwork menagerie", - "in a clockwork wonderland", - "in a cogged dreamscape", - "in a cogwheel wonderland", - "in a copenhagen cityscape", - "in a coral polyp microcosm", - "in a crystal cavern", - "in a cybernetic playground", - "in a cybernetic renaissance", - "in a cybernetic wonderland", - "in a cyberpunk anomaly", - "in a cyberpunk city", - "in a cyberpunk dreamscape", - "in a cyberpunk enigma", - "in a cyberpunk metropolis", - "in a cyberpunk underwater abyss", - "in a data hacker's nightmare", - "in a datastream mirage", - "in a digital data fortress", - "in a digital garden of delights", - "in a dream world", - "in a dreamlike world", - "in a dublin cityscape", - "in a dystopian datastream", - "in a dystopian dreamscape", - "in a fairytale land", - "in a fantasy realm", - "in a fantasy world", - "in a field of poppies in a breeze", - "in a foreboding castle", - "in a frankfurt cityscape", - "in a future dystopia", - "in a futuristic world", - "in a futuristic-cyberpunk cityscape", - "in a galactic empire", - "in a garden in full bloom", - "in a goth boudoir", - "in a grand castle", - "in a grass land", - "in a hall", - "in a hidden city", - "in a hidden oasis", - "in a hidden paradise", - "in a hidden sanctuary", - "in a hidden valley", - "in a high-tech orbital station", - "in a historical setting", - "in a holographic paradox", - "in a holographic reality", - "in a holographic utopia", - "in a hong kong cityscape", - "in a jakarta cityscape", - "in a kyoto cityscape", - "in a lab", - "in a labyrinth", - "in a lost temple", - "in a machine rebellion fantasia", - "in a magical kingdom", - "in a magical school", - "in a magical vortex", - "in a mechanical dreamscape symphony", - "in a mechanical menagerie ballroom", - "in a mechanical menagerie parade", - "in a mechanical world", - "in a medieval kingdom", - "in a metropolis of mirrors", - "in a moonlit dream", - "in a moonlit forest glade", - "in a munich cityscape", - "in a mystical land", - "in a mythological age", - "in a neo-victorian dreamscape", - "in a neon dreamscape", - "in a neon future cult", - "in a neon jungle", - "in a neon metropolis", - "in a neon noir detective", - "in a neon racer sci-fi", - "in a neon-lit city", - "in a neurological wasteland", - "in a new york cityscape", - "in a palace", - "in a parallel universe", - "in a peaceful meadow in summer", - "in a pixelated nightmare", - "in a post-apocalyptic wasteland", - "in a post-human utopia", - "in a prague cityscape", - "in a psychedelic cyber alley", - "in a psycho-cybernetic landscape", - "in a quantum dreamscape", - "in a quantum kaleidoscope", - "in a quantum labyrinth", - "in a quantum mirage", - "in a quantum mirage forest", - "in a quantum singularity", - "in a quantum steam-driven enigma", - "in a quantum tesseract enigma", - "in a rain-soaked metropolis", - "in a revolutionary battle scene", - "in a rio de janeiro cityscape", - "in a robotic society", - "in a robotic utopia", - "in a rococo interior", - "in a savannah wildlife spectacle", - "in a secret garden", - "in a secret underground city", - "in a sinister laboratory", - "in a space opera", - "in a space western", - "in a specific ancient place", - "in a specific future place", - "in a specific modern place", - "in a specific nature place", - "in a specific outspace place", - "in a specific scene", - "in a steam-driven enigma", - "in a steampunk alchemical garden", - "in a steampunk dreamscape architect", - "in a studio", - "in a supernatural mystery", - "in a swamp", - "in a temple", - "in a terraformed colony", - "in a terrarium", - "in a terrarium bottle", - "in a tiki bar", - "in a tiki outdoor shower", - "in a tokyo cityscape", - "in a torture chamber", - "in a transhumanism era", - "in a tropical bathroom", - "in a tropical hotel", - "in a tropical paradise", - "in a tropical rainforest canopy", - "in a utopian society", - "in a utrecht cityscape", - "in a valley", - "in a vaporwave city", - "in a victorian laboratory", - "in a vienna cityscape", - "in a virtual paradise", - "in a virtual reality", - "in a virtual reality mirage", - "in a volcano lair", - "in a voodoo shop", - "in a world of cybernetic augmentation", - "in a world of genetic engineering", - "in a world where ancient gods walk", - "in a xiamen cityscape", - "in a yokohama cityscape", - "in a zurich cityscape", - "in afternoon bliss", - "in afternoon lull", - "in alternate dimensions", - "in amsterdam", - "in an abandoned asylum", - "in an advanced alien civilization", - "in an ai-powered society", - "in an alchemist's study", - "in an alternate history", - "in an amsterdam cityscape", - "in an ancient enchanted forest", - "in an antarctic penguin parade", - "in an edinburgh cityscape", - "in an enchanted forest", - "in an ethereal particle dance", - "in an icy tundra", - "in an impressionistic self-portrait", - "in an istanbul cityscape", - "in an osaka cityscape", - "in an otherworld", - "in an underground world", - "in an underwater coral reef wonderland", - "in an underwater kingdom", - "in antarctica", - "in art deco architecture", - "in aspen", - "in athens", - "in atlantis", - "in bangkok", - "in barcelona", - "in berlin", - "in bikini bottom", - "in bionic nightmares", - "in biotechno fusion", - "in brazil", - "in bruges", - "in canada", - "in chicago", - "in cinque terre", - "in clockwork cityscape dreams", - "in clockwork dreams", - "in copenhagen", - "in cubist uncertainty", - "in dappled sunlight through trees", - "in dubai", - "in dublin", - "in dunder mifflin", - "in entangled realities", - "in fairyland", - "in fields of lavender in provence", - "in fields of sunflowers in bloom", - "in france", - "in front of a black background", - "in front of a blue background", - "in front of a colorful background", - "in front of a green background", - "in front of a grey background", - "in front of a red background", - "in front of a white background", - "in gotham city", - "in gothic architecture", - "in gothic revival architecture", - "in graveyard mist", - "in greendale", - "in hallstatt", - "in hawkins", - "in hogwarts", - "in honeybee hive activity", - "in hong kong", - "in istanbul", - "in japan", - "in jerusalem", - "in kuala lumpur", - "in kyoto", - "in london", - "in los angeles", - "in machu picchu", - "in mecca", - "in metropolis", - "in miami", - "in middle earth", - "in middle-earth", - "in midnight reverie", - "in moonlit reflection", - "in mordor", - "in morning light on the seine", - "in mumbai", - "in nantucket", - "in narnia", - "in neo-tokyo redux", - "in neon tokyo", - "in neural interface delirium", - "in neverland", - "in new orleans", - "in new york city", - "in niagara falls", - "in north american wilderness serenity", - "in observer's paradox", - "in oz", - "in pandora", - "in paris", - "in petra", - "in post-apocalyptic dreams", - "in prague", - "in psychedelic cyberspace", - "in quahog", - "in quantum alchemical fusion", - "in quantum chromatic symphony", - "in quantum cityscapes", - "in quantum constellation ballet", - "in quantum fractal realities", - "in quantum interference symphony", - "in quantum reflections", - "in retro-futuristic surreality", - "in rio de janeiro", - "in rococo architecture", - "in rome", - "in russia", - "in salem", - "in schrodinger's garden", - "in seoul", - "in shambhala", - "in shanghai", - "in shirakawa-go", - "in singapore", - "in space", - "in springfield", - "in stained glass", - "in stars hollow", - "in steam-fueled dreams", - "in steam-powered cyberpunk", - "in steampunk explorer's dreams", - "in sydney", - "in synthetic dreams", - "in synthetic sentience", - "in tatooine", - "in techno-esotericism", - "in the amazon rainforest", - "in the amazon rainforest biodiversity", - "in the arctic", - "in the astral citadel of astraeus", - "in the australian outback encounter", - "in the australian reef life", - "in the celestial gardens of zephyria", - "in the city of eldertide", - "in the city of tomorrow", - "in the clockwork city of gearspring", - "in the clockwork dreamscape", - "in the country", - "in the crystal cave", - "in the crystal caverns of lumaria", - "in the crystal labyrinth of prisms", - "in the deep sea", - "in the desert", - "in the desert kingdom of mirage", - "in the desert of mirrors", - "in the dragon's lair", - "in the dreaming realm of morpheus", - "in the elemental nexus of convergence", - "in the elemental planes nexus", - "in the enchanted isles of luminescia", - "in the enchanted library of whispers", - "in the endless corridor of mirrors", - "in the ethereal observatory of astromancers", - "in the fish in the desert mirage", - "in the floating isles of aether", - "in the forest of eternal twilight", - "in the forest of mirrors", - "in the forgotten ruins of eldertemples", - "in the grand canyon", - "in the great barrier reef", - "in the great wall of china", - "in the hollow mountain of emberforge", - "in the jungle", - "in the kingdom of the unicorn", - "in the library of whispering pages", - "in the milky way galaxy", - "in the palace of dreams", - "in the rain of upside-down umbrellas", - "in the realm of cosmic horror", - "in the sahara desert", - "in the shadowed realm of umbrathor", - "in the suburbs", - "in the sunken kingdom of atlantis", - "in the symphony of broken instruments", - "in the symphony of disjointed melodies", - "in the taj mahal", - "in the tower of oblivion", - "in the underwater forest of whispers", - "in the vale of shadows", - "in the valley of the damned", - "in the valley of the lost", - "in the victorian era", - "in the wandering forest of eldertrees", - "in the wild west", - "in tokyo", - "in transcendent cyberspace", - "in twilight in a venetian canal", - "in twilight serenity", - "in twin peaks", - "in valhalla", - "in vatican city", - "in venice", - "in vienna", - "in wavefunction symphony", - "in westeros", - "in wonderland", - "in xanadu", - "in yellowstone national park", - "lost in space", - "lost in time", - "near a space anomaly", - "obsidian nightshade", - "on a cafe terrace at night", - "on a cassette wall", - "on a city street art scavenger hunt", - "on a coastal cliff at sunrise", - "on a country path in autumn", - "on a distant planet", - "on a figurine shelf", - "on a floating island", - "on a floating island in the sky", - "on a jungle canopy adventure", - "on a lunar colony", - "on a misty morning hush", - "on a mystical island", - "on a neuro-interface odyssey", - "on a pirate adventure", - "on a planetary exploration mission", - "on a rainy day in the city", - "on a seaside cliff at dawn", - "on a steampunk astral odyssey", - "on a surreal airship odyssey", - "on a virtual reality odyssey", - "on a winter morning frost", - "on an african big five safari", - "on an african safari adventure", - "on an exoplanet", - "on an island", - "on mount everest", - "on mount olympus", - "on the astral plane", - "on the carousel of forgotten dreams", - "on the chessboard of surreal strategies", - "on the endless staircase ascent", - "on the floating islands of imagination", - "on the island of dreams", - "onyx deathwing", - "opal dreamseeker", - "ruby flameheart", - "sapphire stormrider", - "sapphire stormsurge", - "shadowy nightstalker", - "through interdimensional travel", - "topaz thunderstrike", - "under an ancient curse", - "under aurora borealis", - "under starlit silence", - "under the blooming cherry blossoms", - "under the eyes in the sky", - "underwater", - "verdant forestgale", - "while navigating the multiverse", - "while street bazaar browsing", - "with a bengal tiger in the jungle", - "with a cyberpunk street shaman", - "with a gorilla family in the jungle", - "with a red-eyed tree frog in the rainforest", - "with a siberian tiger stalking prey", - "with an african nile crocodile basking", - "with an alaskan brown bear fishing", - "with arctic foxes in the snow", - "with children playing by the seashore", - "with diffraction spikes", - "with mad scientist machinery", - "with majestic mountain wildlife", - "with street vendors in marrakech", - "with the ability of mind upload", - "with the melting clocks of dali's vision", - "with the mirrored faces of identity", - "with the mirrored masks of identity", - "within a digital utopia", - "within a lost civilization", - "within an ancient civilization", - "within the virtual realms", - "within virtual reality" + "nature\\a blanket of snow transforms the landscape into a winter wonderland", + "nature\\a canopy of colorful hot air balloons fills the sky at dawn", + "nature\\a canopy of stars twinkles overhead on a clear night", + "nature\\a cloudless sky, painted in shades of blue and white", + "nature\\a cool, refreshing sea breeze blowing in from the ocean", + "nature\\a dazzling display of stars overhead on a clear night", + "nature\\a dense fog blankets the rolling hills, creating an ethereal atmosphere", + "nature\\a dense fog shrouds the landscape in an air of mystery", + "nature\\a dense mist hangs over the tranquil landscape, creating an otherworldly atmosphere", + "nature\\a fiery sunrise paints the sky in shades of orange and pink", + "nature\\a fiery sunset paints the sky in warm, shimmering hues", + "nature\\a gentle rain falls on the emerald-green landscape, nourishing the earth", + "nature\\a golden sunrise paints the sky in shades of pink and orange", + "nature\\a golden sunset casts long shadows across the rolling hills", + "nature\\a picture-perfect sunset, with oranges and pinks streaking across the sky", + "nature\\a quaint village with flower boxes in every window", + "nature\\a rainbow arcs across the sky after a passing storm", + "nature\\a rainbow spans the horizon after a summer shower", + "nature\\a rural farm with fields of crops and grazing cows", + "nature\\a sea of clouds stretches to the horizon, obscuring the valley below", + "nature\\a thunderstorm rolling in over a prairie landscape", + "nature\\a vibrant rainbow spans the sky after the rain", + "nature\\a warm, golden sun shining down from a clear blue sky", + "nature\\above the clouds", + "nature\\along a winding country road", + "nature\\along the amazon river wildlife", + "nature\\among the flowers", + "nature\\among the sunflowers stretching towards the sun", + "nature\\among the wildflowers", + "nature\\at a cascading waterfall in a forest glade", + "nature\\at a colorful hot spring with steam rising from the water", + "nature\\at a distant island visible on the horizon, like a mirage", + "nature\\at a lighthouse on a rocky shoreline", + "nature\\at a massive sandstone arch carved by the wind and water", + "nature\\at a roaring waterfall cascading over rocks", + "nature\\at a serene oasis in the middle of a desert", + "nature\\at a series of cascading waterfalls nestled in a forest", + "nature\\at a series of hot springs nestled in a forest", + "nature\\at a sunrise over a wheat field", + "nature\\at a towering sea stack rising out of the ocean", + "nature\\at a towering waterfall cascading into a deep pool", + "nature\\at a vibrant, colorful reef visible just offshore", + "nature\\at ayers rock", + "nature\\at niagara falls", + "nature\\at sunrise over a wheat field", + "nature\\at sunset over a tranquil lake", + "nature\\at the beach", + "nature\\at the beach access", + "nature\\at the boat ramp", + "nature\\at the campground", + "nature\\at the grand canyon", + "nature\\at the lake", + "nature\\at the lighthouse", + "nature\\at the marina", + "nature\\at the ocean", + "nature\\at the picnic area", + "nature\\at the river", + "nature\\at the rock formation", + "nature\\at the sea", + "nature\\at the waterfall", + "nature\\at the wind farm", + "nature\\at toujinbou", + "nature\\beside a shimmering fairy pond", + "nature\\beside a volcano", + "nature\\boating on a tranquil pond", + "nature\\breathtaking beauty of the norwegian fjords is a photographer's dream", + "nature\\breathtaking fjords of norway are a photographer's dream", + "nature\\brightly colored hot air balloons dot the sky at sunrise", + "nature\\by a cemetery statue", + "nature\\by the giant sequoia tree", + "nature\\by the sea", + "nature\\by the stream", + "nature\\by the tree", + "nature\\by the wind turbine", + "nature\\carved into a rock face", + "nature\\deep in the woods", + "nature\\dramatic cliffs of santorini offer breathtaking views of the aegean sea", + "nature\\dramatic landscapes of iceland are like something out of a fairy tale, with waterfalls, glaciers, and volcanic terrain", + "nature\\dramatic landscapes of new zealand offer endless opportunities for adventure", + "nature\\dramatic landscapes of new zealand's south island are a playground for outdoor enthusiasts, with hiking, skiing, and bungee jumping", + "nature\\during a deep sea discovery", + "nature\\during a humpback whale breach", + "nature\\during an african cheetah sprint", + "nature\\during an african elephant migration", + "nature\\during an african serengeti migration", + "nature\\during an arctic wildlife encounter", + "nature\\during monarch butterfly migration", + "nature\\during ocean exploration", + "nature\\during the dance of fireflies", + "nature\\great barrier reef is a vibrant underwater paradise teeming with life", + "nature\\high up in the trees", + "nature\\in a babbling brook winds through a tranquil forest glade", + "nature\\in a boreal forest moose encounter", + "nature\\in a calm lake reflects the starry sky in its crystal-clear waters", + "nature\\in a cascading waterfall plunges into a crystal-clear pool below", + "nature\\in a cave", + "nature\\in a cluster of towering saguaro cacti stands silhouetted against the desert sky", + "nature\\in a cluster of volcanic islands rises from the deep blue sea", + "nature\\in a collection of brightly colored fishing boats bobbing in the water", + "nature\\in a collection of colorful beach towels draped over chairs and umbrellas", + "nature\\in a colorful autumn forest with vibrant foliage", + "nature\\in a colorful canyon with towering walls of rock", + "nature\\in a colorful desert landscape with towering sandstone formations", + "nature\\in a colorful garden filled with tulips, daisies, and other summer blooms", + "nature\\in a colorful geothermal landscape with bubbling mud pools and geysers", + "nature\\in a colorful geothermal landscape with hot springs and bubbling mud pots", + "nature\\in a colorful geothermal landscape with hot springs and steam vents", + "nature\\in a colorful river canyon with towering walls of rock", + "nature\\in a colorful river delta with a variety of wildlife", + "nature\\in a colorful river delta with a variety of wildlife and plant species", + "nature\\in a colorful wildflower meadow with a variety of species", + "nature\\in a coral polyp microcosm", + "nature\\in a coral reef teeming with colorful fish and other marine life", + "nature\\in a crystal cavern", + "nature\\in a deep blue lake surrounded by rugged mountains", + "nature\\in a deep canyon cuts through the glowing earth", + "nature\\in a deep, narrow gorge with rushing waterfalls", + "nature\\in a dense forest is alive with the chirping of birds and the rustling of leaves", + "nature\\in a dense forest is alive with the sound of birdsong", + "nature\\in a dense forest with a variety of hiking trails", + "nature\\in a dense forest with towering trees and a variety of wildlife", + "nature\\in a dense jungle filled with exotic flora and fauna", + "nature\\in a dense jungle with a variety of plant and animal species", + "nature\\in a dense jungle with a variety of primates and other wildlife", + "nature\\in a dense mangrove forest with a variety of bird and marine life", + "nature\\in a dense mangrove forest with a variety of wildlife", + "nature\\in a dense, misty forest with towering trees and lush undergrowth", + "nature\\in a dramatic fjord surrounded by towering peaks", + "nature\\in a dramatic fjord with steep cliffs and cascading waterfalls", + "nature\\in a dramatic karst landscape with towering limestone cliffs and caves", + "nature\\in a dramatic karst landscape with towering limestone cliffs and underground rivers", + "nature\\in a field of blooming tulips stretches toward the horizon", + "nature\\in a field of cherry blossoms bursts into bloom in the spring", + "nature\\in a field of golden wheat sways in the gentle breeze", + "nature\\in a field of lavender blooms in shades of purple and blue", + "nature\\in a field of poppies in a breeze", + "nature\\in a field of sunflowers stretches toward the horizon, turning to face the sun", + "nature\\in a field of wildflowers sways in the breeze, creating a riot of color", + "nature\\in a field of wildflowers under a bright blue sky", + "nature\\in a former quarry", + "nature\\in a frozen tundra with snow-covered hills and valleys", + "nature\\in a garden filled with butterflies and hummingbirds", + "nature\\in a garden in full bloom", + "nature\\in a grass land", + "nature\\in a grove of towering sequoias inspires awe and reverence", + "nature\\in a herd of wild horses gallops across the open plains", + "nature\\in a hidden oasis", + "nature\\in a hidden paradise", + "nature\\in a hidden valley", + "nature\\in a hidden waterfall tumbles down a moss-covered rock face", + "nature\\in a labyrinth of limestone caves hides underground wonders", + "nature\\in a lush forest with a peaceful stream running through it", + "nature\\in a lush green valley is cradled between towering mountain peaks", + "nature\\in a lush meadow surrounded by rugged peaks", + "nature\\in a lush rainforest teems with exotic wildlife and vibrant foliage", + "nature\\in a lush river valley with fertile farmland", + "nature\\in a majestic waterfall thunders over a rocky precipice", + "nature\\in a meadow of lavender or other fragrant herbs", + "nature\\in a meandering river winds its way through a lush green valley", + "nature\\in a meandering river winds its way through a sun-drenched valley", + "nature\\in a moonlit forest glade", + "nature\\in a natural cave system", + "nature\\in a network of fjords cuts deep into the rugged coastline", + "nature\\in a network of hiking trails leads through a pristine wilderness", + "nature\\in a network of winding trails leads through a dense forest", + "nature\\in a pair of lazy hammocks strung up between two palm trees", + "nature\\in a peaceful estuary with a variety of bird species", + "nature\\in a peaceful fjord with calm waters and steep cliffs", + "nature\\in a peaceful meadow in summer", + "nature\\in a peaceful meadow is carpeted with fragrant wildflowers", + "nature\\in a peaceful meadow with a variety of wildflowers and grasses", + "nature\\in a peaceful mountain valley with a variety of plant and animal species", + "nature\\in a peaceful river delta with a variety of bird species", + "nature\\in a peaceful river valley with a variety of bird species", + "nature\\in a peaceful wetland with a variety of bird species", + "nature\\in a picturesque meadow filled with wildflowers", + "nature\\in a picturesque river gorge with towering cliffs", + "nature\\in a picturesque valley with a meandering river", + "nature\\in a pristine alpine meadow is carpeted with colorful wildflowers", + "nature\\in a remote wilderness area with crystal-clear lakes", + "nature\\in a remote wilderness area with crystal-clear lakes and streams", + "nature\\in a remote wilderness area with crystal-clear streams and rivers", + "nature\\in a remote wilderness area with deep canyons and narrow gorges", + "nature\\in a remote wilderness area with glaciers and ice fields", + "nature\\in a remote wilderness area with pristine lakes and rivers", + "nature\\in a remote wilderness area with snow-covered peaks and alpine meadows", + "nature\\in a remote wilderness area with towering waterfalls", + "nature\\in a remote wilderness area with towering waterfalls and ancient forests", + "nature\\in a remote wilderness area with towering waterfalls and rugged gorges", + "nature\\in a roaring waterfall cascades between moss-covered rocks", + "nature\\in a rocky cave on the beach", + "nature\\in a rocky desert landscape with colorful sandstone formations", + "nature\\in a rocky desert landscape with towering mesas", + "nature\\in a rocky outcrop provides a vantage point to watch the sunrise", + "nature\\in a rocky promontory offers panoramic views of the rugged coastline", + "nature\\in a rugged canyon carved by a river", + "nature\\in a rugged canyon offers breathtaking views of the surrounding landscape", + "nature\\in a rugged coastline is battered by crashing waves", + "nature\\in a rugged desert canyon with narrow passages and towering walls", + "nature\\in a rugged desert landscape with towering mesas and rock formations", + "nature\\in a rugged mountain range with deep canyons and narrow gorges", + "nature\\in a rugged mountain range with deep canyons and rushing rivers", + "nature\\in a rugged mountain range with jagged peaks and deep valleys", + "nature\\in a rugged mountain range with jagged peaks and glaciers", + "nature\\in a rugged mountain range with snow-covered peaks", + "nature\\in a rugged mountain range with snow-covered peaks and glaciers", + "nature\\in a rugged mountain range with sweeping views and deep valleys", + "nature\\in a sandstone canyon", + "nature\\in a savannah wildlife spectacle", + "nature\\in a secluded cove is lapped by gentle turquoise waters", + "nature\\in a secluded cove with a pristine beach", + "nature\\in a secret garden", + "nature\\in a serene bay with calm waters and sandy beaches", + "nature\\in a serene estuary with calm waters and sandy beaches", + "nature\\in a serene lagoon with calm, turquoise water", + "nature\\in a serene mountain lake reflects the surrounding peaks like a mirror", + "nature\\in a solitary lighthouse stands sentinel over the rocky coastline", + "nature\\in a sparkling river winds its way through a verdant valley", + "nature\\in a specific nature scene", + "nature\\in a sun-kissed beach is lapped by crystal-clear waters", + "nature\\in a swamp", + "nature\\in a sweeping desert landscape with isolated rock formations", + "nature\\in a sweeping desert landscape with sand dunes and rock formations", + "nature\\in a sweeping grassy plain with herds of grazing animals", + "nature\\in a sweeping sand dune desert with isolated oases", + "nature\\in a towering mountain peak is bathed in the golden light of dawn", + "nature\\in a towering mountain range with snow-capped peaks", + "nature\\in a towering red rock formation rises from the desert floor", + "nature\\in a towering sand dune desert with isolated oases and nomadic tribes", + "nature\\in a towering sand dune offers panoramic views of the desert below", + "nature\\in a tranquil bay is dotted with colorful fishing boats", + "nature\\in a tranquil lagoon is home to a dazzling array of tropical fish", + "nature\\in a tranquil lake reflects the starry sky in its crystal-clear waters", + "nature\\in a tranquil oasis provides respite from the harsh desert sun", + "nature\\in a tranquil pond is surrounded by vibrant green foliage", + "nature\\in a tranquil pond reflects the golden hues of autumn leaves", + "nature\\in a tranquil stream meanders through a sun-dappled forest", + "nature\\in a tropical paradise", + "nature\\in a tropical rainforest canopy", + "nature\\in a tropical rainforest with lush vegetation and exotic wildlife", + "nature\\in a valley", + "nature\\in a vast desert landscape with isolated rock formations and sandstone cliffs", + "nature\\in a vast desert landscape with sand dunes and rocky outcroppings", + "nature\\in a vast desert plain with towering sand dunes", + "nature\\in a vast grassland with herds of grazing animals", + "nature\\in a vast grassland with herds of grazing animals and rolling hills", + "nature\\in a vast plain covered in wildflowers", + "nature\\in a vast savanna with a variety of wildlife", + "nature\\in a vast savanna with a variety of wildlife and bird species", + "nature\\in a vast wetland with a variety of bird and plant species", + "nature\\in a vibrant coral reef is home to a diverse array of marine life", + "nature\\in a vibrant coral reef with a variety of marine life", + "nature\\in a vineyard with rows of grapevines stretching towards the horizon", + "nature\\in a volcanic crater with a stunning view of the surrounding landscape", + "nature\\in a volcanic landscape with steaming vents and lava fields", + "nature\\in a wide-open plain with herds of grazing animals", + "nature\\in a wide-open savanna with herds of grazing animals", + "nature\\in a winding river canyon with towering walls of rock", + "nature\\in alpine lakes are deep blue and sparkling", + "nature\\in alpine lakes shimmer like jewels in the mountains", + "nature\\in alpine lakes sparkle like jewels in the mountains", + "nature\\in an alpine valley surrounded by snow-capped peaks", + "nature\\in an antarctic penguin parade", + "nature\\in an enchanted forest", + "nature\\in an icy tundra", + "nature\\in an underwater coral reef wonderland", + "nature\\in antarctica", + "nature\\in arch-shaped rock formations offer breathtaking views of the horizon", + "nature\\in black sand beaches are bordered by powerful waves", + "nature\\in blooming wildflowers carpet the meadows in a riot of color", + "nature\\in blossoming cherry blossoms carpet the ground in pink", + "nature\\in blossoming cherry trees line the banks of a tranquil river", + "nature\\in brazil", + "nature\\in bright red poppy fields color the hills", + "nature\\in bright yellow rapeseed fields brighten the countryside", + "nature\\in canada", + "nature\\in colorful coral reefs are home to a dazzling array of marine life", + "nature\\in crater lakes offer perfect reflections of the surrounding mountains", + "nature\\in crystal-clear lakes mirror the surrounding mountains", + "nature\\in crystal-clear pools dot the landscape, inviting a refreshing swim", + "nature\\in crystal-clear rivers wind through lush green valleys", + "nature\\in crystal-clear streams babble through moss-covered forests", + "nature\\in dappled sunlight through trees", + "nature\\in deep gorges are home to diverse wildlife", + "nature\\in deep gorges are inhabited by diverse wildlife", + "nature\\in deep gorges offer dizzying views of the valleys below", + "nature\\in desert oases sparkle like jewels in the sun", + "nature\\in dormant volcanoes dominate the landscape with their imposing shapes", + "nature\\in dormant volcanoes dominate the landscape with their imposing silhouette", + "nature\\in emerald-green rice paddies cascade down the hillsides", + "nature\\in eroded rock formations resemble natural sculptures", + "nature\\in fields of colorful flowers stretch as far as the eye can see", + "nature\\in fields of golden barley ripple in the afternoon sun", + "nature\\in fields of golden wheat sway in the gentle breeze", + "nature\\in fields of lavender in provence", + "nature\\in fields of sunflowers in bloom", + "nature\\in france", + "nature\\in frozen lakes reflect the snowy peaks of the surrounding mountains", + "nature\\in frozen waterfalls gleam in the winter light", + "nature\\in frozen waterfalls glisten in the winter light", + "nature\\in geysers spout hot water into the frigid air", + "nature\\in glacial fjords are bordered by sheer cliffs", + "nature\\in glacial fjords are lined with steep cliffs", + "nature\\in glacial rivers wind between rocky peaks", + "nature\\in glacial rivers wind through rocky peaks", + "nature\\in glaciers thunder as they crack into the ocean", + "nature\\in glittering glaciers shine under the arctic sun", + "nature\\in glittering glaciers sparkle under the arctic sun", + "nature\\in golden cornfields sway in the summer breeze", + "nature\\in golden sand dunes stretch as far as the eye can see", + "nature\\in grassy plains stretch as far as the eye can see, interrupted only by the occasional grove of trees", + "nature\\in green valleys are crossed by crystal-clear rivers", + "nature\\in green valleys are dotted with small, picturesque houses", + "nature\\in honeybee hive activity", + "nature\\in immaculate snowfields glisten under the winter sun", + "nature\\in isolated beaches are bordered by sheer cliffs and palm trees swaying in the wind", + "nature\\in jagged peaks pierce the sky in dramatic silhouettes", + "nature\\in jagged peaks pierce the sky like spears", + "nature\\in japan", + "nature\\in lavender fields perfume the air with their enchanting scent", + "nature\\in lush forests resonate with the song of birds", + "nature\\in lush forests resound with the song of birds", + "nature\\in majestic fjords carve through the wild coastline", + "nature\\in majestic fjords cut through the wild coastline", + "nature\\in majestic red rock formations rise from the desert floor", + "nature\\in majestic redwoods tower overhead in ancient forests", + "nature\\in marshes are home to a multitude of exotic birds", + "nature\\in marshlands are home to a multitude of exotic birds", + "nature\\in mist-covered forests are home to elusive wildlife", + "nature\\in mist-covered mountains rise from the valley floor", + "nature\\in moonlit reflection", + "nature\\in multicolored tulip fields create a patchwork of vibrant colors", + "nature\\in multicolored tulip fields extend to the horizon", + "nature\\in natural arches stand like gates to another world", + "nature\\in natural arches stand like gateways to another world", + "nature\\in niagara falls", + "nature\\in north american wilderness serenity", + "nature\\in pristine alpine meadows are dotted with wildflowers", + "nature\\in purple lavender fields contrast against the blue sky", + "nature\\in purple lavender fields contrast with the blue sky", + "nature\\in red canyons glow in the light of the setting sun", + "nature\\in red canyons shine in the light of the setting sun", + "nature\\in red sand deserts stretch beneath a cloudless sky", + "nature\\in roaring waterfalls create clouds of iridescent mist", + "nature\\in rock formations in the shape of arches offer stunning views of the horizon", + "nature\\in rocky plateaus offer panoramic views of the valleys below", + "nature\\in rolling green hills are dotted with sheep grazing peacefully", + "nature\\in rolling hills are cloaked in a tapestry of autumn colors", + "nature\\in rolling meadows are dotted with wildflowers", + "nature\\in rolling meadows undulate like a sea of green", + "nature\\in rolling sand dunes stretch as far as the eye can see", + "nature\\in rugged coastlines are battered by crashing waves", + "nature\\in rushing rivers wind through rugged canyons", + "nature\\in rushing rivers wind through steep canyons", + "nature\\in russia", + "nature\\in salt deserts shimmer in the bright sun", + "nature\\in salt deserts shine in the bright sun", + "nature\\in sand dunes ripple in the desert wind", + "nature\\in secluded beaches are bordered by steep cliffs and palm trees swaying in the wind", + "nature\\in smoking volcanoes dominate the landscape with their imposing silhouette", + "nature\\in snow-capped mountain peaks are mirrored in the calm waters of lakes", + "nature\\in snow-capped mountain peaks are reflected in the calm waters of the lakes", + "nature\\in snow-capped mountain ranges stretch as far as the eye can see", + "nature\\in snow-capped peaks pierce the horizon in every direction", + "nature\\in snow-capped peaks shimmer under the moonlight", + "nature\\in snow-capped peaks shine in the light of the full moon", + "nature\\in snow-covered fields gleam in the winter sun", + "nature\\in steep cliffs plunge into the turquoise ocean", + "nature\\in strange rock formations create lunar landscapes", + "nature\\in sun-drenched vineyards stretch across rolling hills", + "nature\\in sunflower fields follow the sun's path throughout the day", + "nature\\in terraced rice fields sculpt the hills with their geometric beauty", + "nature\\in the amazon rainforest", + "nature\\in the amazon rainforest biodiversity", + "nature\\in the arctic", + "nature\\in the arctic region", + "nature\\in the australian outback encounter", + "nature\\in the australian reef life", + "nature\\in the avalon region", + "nature\\in the bamboo forest", + "nature\\in the beach park", + "nature\\in the botanical garden", + "nature\\in the canyon", + "nature\\in the canyon region", + "nature\\in the cave", + "nature\\in the cavern", + "nature\\in the cloud forest", + "nature\\in the community park", + "nature\\in the copse", + "nature\\in the country", + "nature\\in the countryside", + "nature\\in the crater", + "nature\\in the crystal cave", + "nature\\in the crystal clear turquoise waters lapping gently against the shore", + "nature\\in the deep sea", + "nature\\in the desert", + "nature\\in the desert region", + "nature\\in the expanse", + "nature\\in the farmyard", + "nature\\in the field", + "nature\\in the fjord", + "nature\\in the folly", + "nature\\in the forest", + "nature\\in the forest region", + "nature\\in the garden", + "nature\\in the glacial region", + "nature\\in the grand canyon", + "nature\\in the grand canyon region", + "nature\\in the grassland", + "nature\\in the grassy", + "nature\\in the great barrier reef", + "nature\\in the iceberg region", + "nature\\in the jungle", + "nature\\in the jungle region", + "nature\\in the library park", + "nature\\in the long grass", + "nature\\in the marshland region", + "nature\\in the meadow", + "nature\\in the mountains", + "nature\\in the mountains loom majestically against the azure blue sky", + "nature\\in the mountains rise majestically against the azure sky", + "nature\\in the national park", + "nature\\in the nature reserve", + "nature\\in the orchard", + "nature\\in the park", + "nature\\in the pasture", + "nature\\in the polar region", + "nature\\in the public garden", + "nature\\in the rainforest", + "nature\\in the rock pool", + "nature\\in the rural area", + "nature\\in the sahara desert", + "nature\\in the sahara desert", + "nature\\in the savannah region", + "nature\\in the sculpture garden", + "nature\\in the senote", + "nature\\in the serengeti", + "nature\\in the sinkhole", + "nature\\in the treetops", + "nature\\in the treetops of a rainforest", + "nature\\in the tundra region", + "nature\\in the valley", + "nature\\in the village", + "nature\\in the vineyard", + "nature\\in the volcano region", + "nature\\in the wilderness", + "nature\\in the wildflower meadow", + "nature\\in the wildlife sanctuary", + "nature\\in the woodland", + "nature\\in the woods", + "nature\\in thundering glaciers grind against the mountains", + "nature\\in thundering waterfalls create clouds of iridescent mist", + "nature\\in thundering waterfalls create sparkling rainbows", + "nature\\in towering cliffs offer panoramic views of the coastline below", + "nature\\in towering palm trees sway in the gentle ocean breeze", + "nature\\in towering redwoods create a cathedral-like canopy", + "nature\\in towering sandstone cliffs are carved by centuries of wind and rain", + "nature\\in towering waterfalls plunge into mist-filled pools below", + "nature\\in tropical islands are lined with palm trees and pristine beaches", + "nature\\in tropical islands are lined with palm trees and sandy beaches", + "nature\\in tropical jungles teem with life and color", + "nature\\in verdant hills are dotted with picturesque cottages", + "nature\\in verdant meadows undulate like a sea of green", + "nature\\in verdant oases offer a haven of freshness in the desert", + "nature\\in verdant oases provide a haven of freshness in the midst of the desert", + "nature\\in verdant valleys are dotted with picturesque cottages", + "nature\\in vibrant coral reefs teem with life beneath the waves", + "nature\\in vibrant fields of bright red poppies color the hills", + "nature\\in wheat fields sway in the summer breeze", + "nature\\in wheat fields undulate in the summer breeze", + "nature\\in white sand dunes stretch as far as the eye can see", + "nature\\in white sandy beaches stretch along the turquoise coast", + "nature\\in wildflower meadows burst with vibrant colors in springtime", + "nature\\in yellowstone national park", + "nature\\lush rainforests of costa rica are home to an incredible diversity of plant and animal life", + "nature\\lush rainforests of costa rica are home to exotic wildlife and stunning waterfalls", + "nature\\lush vineyards of tuscany are a feast for the eyes and the palate", + "nature\\majestic beauty of the canadian rockies is a sight to behold, with towering mountains, crystal-clear lakes, and lush forests", + "nature\\majestic grand canyon offers breathtaking vistas at every turn", + "nature\\majestic victoria falls is one of the largest and most impressive waterfalls in the world", + "nature\\misty valleys are shrouded in mystery and enchantment", + "nature\\natural beauty of the swiss alps is unparalleled, with snow-capped peaks, crystal-clear lakes, and lush green valleys", + "nature\\natural beauty of yellowstone national park is unparalleled, with geysers, hot springs, and wildlife", + "nature\\near a school of playful dolphins jumping and diving in the distance", + "nature\\northern lights dance in the night sky", + "nature\\northern lights sway like ribbons of light in the night sky", + "nature\\on a beach at sunset", + "nature\\on a beach with a long pier stretching out to sea", + "nature\\on a beachside boardwalk lined with palm trees", + "nature\\on a boat ride on a river or lake", + "nature\\on a cliff", + "nature\\on a cliff face overlooking the sea", + "nature\\on a cliff ledge over a waterfall", + "nature\\on a coastal cliff at sunrise", + "nature\\on a colorful salt flat with unique mineral formations", + "nature\\on a colorful salt flat with unique mineral formations and diverse wildlife", + "nature\\on a country path in autumn", + "nature\\on a country road winding through fields and forests", + "nature\\on a dramatic coastline with towering cliffs and crashing waves", + "nature\\on a floating platform on a river", + "nature\\on a glacier", + "nature\\on a hillside overlooking a city", + "nature\\on a jungle canopy adventure", + "nature\\on a lake surrounded by colorful sailboats", + "nature\\on a lush, tropical island with palm-fringed beaches", + "nature\\on a massive glacier with icy blue hues", + "nature\\on a massive sand dune rising out of the desert", + "nature\\on a misty mountain peak surrounded by clouds", + "nature\\on a mountain lake surrounded by trees", + "nature\\on a narrow strip of land between two steep cliffs", + "nature\\on a peaceful river with calm waters and rocky banks", + "nature\\on a picturesque coastline with rugged cliffs and sandy beaches", + "nature\\on a picturesque highland lake with snow-capped peaks in the background", + "nature\\on a picturesque river with a variety of fish species", + "nature\\on a platform above a waterfall", + "nature\\on a platform over a lake", + "nature\\on a remote island with pristine beaches and crystal-clear water", + "nature\\on a remote island with rugged coastlines and diverse marine life", + "nature\\on a rocky beach with crashing waves and tidal pools", + "nature\\on a rocky beach with crystal-clear water", + "nature\\on a rocky coastline with hidden caves and sea stacks", + "nature\\on a rocky coastline with hidden coves and tidal pools", + "nature\\on a rocky outcropping in the sea", + "nature\\on a rocky outcropping with a panoramic view of the ocean", + "nature\\on a rocky outcropping with a panoramic view of the surrounding landscape", + "nature\\on a rolling green hill dotted with grazing sheep", + "nature\\on a rolling hillside covered in vineyards", + "nature\\on a rugged coastal headland with stunning vistas", + "nature\\on a rugged coastline with hidden coves and sea caves", + "nature\\on a rugged coastline with sea arches and natural bridges", + "nature\\on a rugged highland plateau with sweeping views", + "nature\\on a rugged mountain pass with steep switchbacks", + "nature\\on a rugged mountain pass with sweeping views", + "nature\\on a sand dune in a desert", + "nature\\on a sandbar in a lagoon", + "nature\\on a seaside cliff at dawn", + "nature\\on a serene alpine lake with a mirrored surface", + "nature\\on a serene alpine lake with a mirrored surface and snow-capped peaks", + "nature\\on a serene lake nestled in a forested valley", + "nature\\on a serene lake surrounded by a dense forest", + "nature\\on a serene lake surrounded by dense forests and snow-capped peaks", + "nature\\on a serene lake surrounded by forests and mountains", + "nature\\on a serene lake surrounded by mountains and forests", + "nature\\on a serene river with calm waters and rocky banks", + "nature\\on a small island in the middle of a river", + "nature\\on a snow-covered alpine peak with a stunning view", + "nature\\on a steep hillside in a rainforest", + "nature\\on a sun-kissed beach populated by happy vacationers and locals alike", + "nature\\on a tiny island in a lake", + "nature\\on a tiny island in the middle of the ocean", + "nature\\on a towering glacier with icy blue hues and crevasses", + "nature\\on a towering sandstone formation with a panoramic view", + "nature\\on a towering sea cliff with panoramic ocean views", + "nature\\on a towering sea cliff with panoramic ocean views and seabird colonies", + "nature\\on a towering volcanic peak with a snow-capped summit", + "nature\\on a tropical island with lush rainforest and coral reefs", + "nature\\on a volcanic island with rugged coastlines and lava fields", + "nature\\on a winding river with rapids and waterfalls", + "nature\\on a windswept coastal landscape with rugged cliffs and rocky beaches", + "nature\\on a windswept coastal plain with a variety of seabirds and marine life", + "nature\\on a windswept plain dotted with towering rock formations", + "nature\\on an african big five safari", + "nature\\on an african safari adventure", + "nature\\on an island", + "nature\\on mount everest", + "nature\\on mount fuji", + "nature\\on stilts in a river delta", + "nature\\on the beach", + "nature\\on the biking trail", + "nature\\on the boardwalk", + "nature\\on the brightly colored seashells scattered along the beach", + "nature\\on the cliffs", + "nature\\on the edge of a volcano", + "nature\\on the edge of a volcano crater", + "nature\\on the fishing pier", + "nature\\on the glacier", + "nature\\on the hiking trail", + "nature\\on the hill", + "nature\\on the hillside", + "nature\\on the island", + "nature\\on the lake", + "nature\\on the mountain", + "nature\\on the nature trail", + "nature\\on the path", + "nature\\on the pier", + "nature\\on the plains", + "nature\\on the pond", + "nature\\on the public golf course", + "nature\\on the river", + "nature\\on the riverbank", + "nature\\on the rock face", + "nature\\on the rocky outcrop", + "nature\\on the salt flats", + "nature\\on the seafront promenade", + "nature\\on the shoreline", + "nature\\on the side of a mountain", + "nature\\on the ski slope", + "nature\\on the soft, powdery white sand stretching as far as the eye can see", + "nature\\on the top of a mesa in the desert", + "nature\\on the top of a rock spire", + "nature\\on the top of a rocky island", + "nature\\on the top of a sand dune in a desert", + "nature\\on the volcano", + "nature\\over a flock of pelicans soaring gracefully overhead", + "nature\\over a flock of seagulls diving into the water for fish", + "nature\\picturesque hilltop villages offer spectacular views of the surrounding countryside", + "nature\\pristine beaches of fiji are the perfect place to unwind and relax", + "nature\\pristine beaches of the maldives are the perfect place to escape the hustle and bustle of everyday life", + "nature\\pristine beaches of the seychelles are the perfect place to escape the hustle and bustle of everyday life, with secluded coves and turquoise waters", + "nature\\pristine beaches of the seychelles are the perfect place to relax and unwind", + "nature\\pristine beaches of the seychelles are the perfect place to unwind and relax, with crystal-clear waters and powdery white sand", + "nature\\quaint fishing villages nestle against rocky cliffs", + "nature\\quaint hilltop villages offer spectacular views of the surrounding countryside", + "nature\\remote beauty of antarctica is a once-in-a-lifetime experience for adventurous travelers", + "nature\\remote beauty of the galapagos islands is a paradise for nature lovers and wildlife enthusiasts", + "nature\\rugged beauty of iceland's landscapes is truly awe-inspiring", + "nature\\rugged beauty of the scottish highlands is a paradise for hikers and nature lovers", + "nature\\rugged beauty of the scottish highlands is a paradise for outdoor enthusiasts, with hiking, climbing, and wildlife watching", + "nature\\serene beauty of the amalfi coast is a feast for the senses, with picturesque villages clinging to the cliffs above the sea", + "nature\\serene beauty of the swiss alps beckons adventurous travelers", + "nature\\sparkling waters of the maldives offer a tranquil escape from the world", + "nature\\spectacular sunsets paint the sky in glowing shades of red", + "nature\\spectacular sunsets paint the sky in shades of red", + "nature\\stunning landscapes of patagonia are a playground for outdoor adventurers, with hiking, climbing, and wildlife watching", + "nature\\sun-kissed beaches of the seychelles are the epitome of tropical paradise", + "nature\\suspended from a cliff by cables", + "nature\\the feel of the warm, tropical sun on your face and body", + "nature\\the feel of warm sand between your toes as you walk along the shore", + "nature\\the gentle lapping of water on the shore, like a lullaby", + "nature\\the gentle rhythm of waves lulling you into a state of relaxation", + "nature\\the gentle rustling of palm fronds overhead", + "nature\\the gentle sound of water lapping at the shore, like a soothing balm", + "nature\\the milky way stretches across the night sky like a celestial highway", + "nature\\the northern lights shimmer like ribbons of light in the night sky", + "nature\\the rhythmic sound of waves crashing against the shore", + "nature\\the salty scent of sea air mingling with the fragrant aroma of tropical flowers", + "nature\\the salty taste of sea spray on your lips", + "nature\\the scent of coconut oil wafting on the breeze", + "nature\\the setting sun bathes the valley in golden light", + "nature\\the sight of a brilliant rainbow appearing over the water", + "nature\\the soothing sound of palm fronds rustling in the breeze", + "nature\\the sound of distant reggae music adding to the tropical vibe", + "nature\\the sound of distant thunderstorms, adding an air of mystery to the scene", + "nature\\the sound of gentle rain falling on the water's surface", + "nature\\the sound of gentle waves lapping against the shore, like a whisper", + "nature\\the sound of seagulls and other shorebirds calling out to one another", + "nature\\the sound of the wind whispering through the palm", + "nature\\the warm touch of the sun on your skin as you stretch out on the sand", + "nature\\the warm, golden light of the sun setting over the water", + "nature\\towering cliffs of yosemite national park inspire awe and wonder", + "nature\\towering peaks of the himalayas offer some of the world's most challenging and rewarding treks", + "nature\\tranquil lakes of canada's banff national park are a haven for outdoor enthusiasts", + "nature\\under a canopy of green leaves forming a tunnel over a pathway", + "nature\\under a collection of colorful beach umbrellas providing welcome shade", + "nature\\under a lone beach umbrella casting a welcome patch of shade", + "nature\\under a row of towering palm trees swaying in the gentle breeze", + "nature\\under aurora borealis", + "nature\\under starlit silence", + "nature\\under the blooming cherry blossoms", + "nature\\under the canopy", + "nature\\under the rain of falling stars", + "nature\\underwater", + "nature\\vibrant colors of the great barrier reef are a wonder to behold, with coral reefs teeming with life", + "nature\\vibrant sunsets paint the sky in shades of orange and pink", + "nature\\with a bengal tiger in the jungle", + "nature\\with a gorilla family in the jungle", + "nature\\with a red-eyed tree frog in the rainforest", + "nature\\with a sea view", + "nature\\with a siberian tiger stalking prey", + "nature\\with an african nile crocodile basking", + "nature\\with an alaskan brown bear fishing", + "nature\\with arctic foxes in the snow", + "nature\\with children playing by the seashore", + "nature\\with majestic mountain wildlife", + "city\\at a carnival freakshow", + "city\\at a city fair", + "city\\at a city transportation hub", + "city\\at a farmer's market overflowing with fresh produce", + "city\\at a festival", + "city\\at a street art gallery opening", + "city\\at a street art mural festival", + "city\\at a street carnival celebration", + "city\\at a street carnival parade", + "city\\at a street fashion boutique", + "city\\at a street fashion runway", + "city\\at a street fashion show extravaganza", + "city\\at a street food truck fiesta", + "city\\at a street jazz performance", + "city\\at a street musicians' jam session", + "city\\at a street performers' showcase", + "city\\at a street protest rally", + "city\\at a street skateboarding session", + "city\\on a venice gondola ride", + "city\\at a village fair", + "city\\at an island luau", + "city\\at an urban park skateboarding", + "city\\at an urban rooftop party", + "city\\at an urban street basketball game", + "city\\at disney land", + "city\\at the airport", + "city\\at the amusement park", + "city\\at the bus station", + "city\\at the beach resort", + "city\\at the carnival", + "city\\at the college campus", + "city\\at the eiffel tower", + "city\\at the eiffel tower at night", + "city\\at the farmers market", + "city\\at the fountain", + "city\\at the gas station", + "city\\at the harbor", + "city\\at the ice cream stand", + "city\\at the iconic skyline of new york city", + "city\\at the india's holi festival", + "city\\at the market", + "city\\at the mini golf course", + "city\\at the park and ride lot", + "city\\at the resort", + "city\\at the skate park", + "city\\at the skateboard park", + "city\\at the stadium", + "city\\at the street market", + "city\\at the top of a tall building", + "city\\at the train station", + "city\\at the trolley station", + "city\\at the water park", + "city\\at the water tower", + "city\\at the zoo", + "city\\between lanes on a highway", + "city\\downtown traffic signals street lights neon signs decorative signs building", + "city\\during a city biking commute", + "city\\in a budapest cityscape", + "city\\in a city park with lush green trees and flowers in full bloom", + "city\\in a city street market", + "city\\in a city under siege", + "city\\in a cityscape at dusk", + "city\\in a copenhagen cityscape", + "city\\in a dublin cityscape", + "city\\in a frankfurt cityscape", + "city\\in a hong kong cityscape", + "city\\in a jakarta cityscape", + "city\\in a kyoto cityscape", + "city\\in a munich cityscape", + "city\\in a new york cityscape", + "city\\in a prague cityscape", + "city\\in a rain-soaked metropolis", + "city\\in a rio de janeiro cityscape", + "city\\in a small town square with a fountain and flowers", + "city\\in a specific city scene", + "city\\in a tokyo cityscape", + "city\\in a utrecht cityscape", + "city\\in a vienna cityscape", + "city\\in a xiamen cityscape", + "city\\in a yokohama cityscape", + "city\\in a zurich cityscape", + "city\\in amsterdam", + "city\\in an amsterdam cityscape", + "city\\in an edinburgh cityscape", + "city\\in an istanbul cityscape", + "city\\in an osaka cityscape", + "city\\in aspen", + "city\\in athens", + "city\\in bangkok", + "city\\in barcelona", + "city\\in berlin", + "city\\in bruges", + "city\\in chicago", + "city\\in cinque terre", + "city\\in city lights twinkle like stars in the night", + "city\\in copenhagen", + "city\\in dubai", + "city\\in dublin", + "city\\in gotham city", + "city\\in greendale", + "city\\in hallstatt", + "city\\in hawkins", + "city\\in hong kong", + "city\\in istanbul", + "city\\in jerusalem", + "city\\in kuala lumpur", + "city\\in kyoto", + "city\\in london", + "city\\in los angeles", + "city\\in mecca", + "city\\in metropolis", + "city\\in miami", + "city\\in morning light on the seine", + "city\\in mumbai", + "city\\in nantucket", + "city\\in new orleans", + "city\\in new york city", + "city\\in paris", + "city\\in prague", + "city\\in quahog", + "city\\in rome", + "city\\in salem", + "city\\in seoul", + "city\\in shanghai", + "city\\in shirakawa-go", + "city\\in singapore", + "city\\in springfield", + "city\\in stars hollow", + "city\\in sydney", + "city\\in the bustling markets of bangkok", + "city\\in the cityscape", + "city\\in the cityscape kingdom", + "city\\in the colorful markets of marrakech", + "city\\in the colorful streets of havana", + "city\\in the historic streets of rome", + "city\\in the megalopolis", + "city\\in the romantic streets of paris", + "city\\in the shopping district", + "city\\in the skyline kingdom", + "city\\in the skyscraper", + "city\\in the suburbs", + "city\\in the tower", + "city\\in the town", + "city\\in the town square", + "city\\in the tranquil canals of venice", + "city\\in the vibrant cities of japan", + "city\\in tokyo", + "city\\in twin peaks", + "city\\in vatican city", + "city\\in venice", + "city\\in vienna", + "city\\on a cafe terrace at night", + "city\\on a city street art scavenger hunt", + "city\\on a pier extending into the sea", + "city\\on a rainy day in the city", + "city\\on the baseball field", + "city\\on the basketball court", + "city\\on the bridge", + "city\\on the city street", + "city\\on the playground", + "city\\on the rooftop", + "city\\on the rooftopm tokyo(city) building skyscraper", + "city\\on the soccer field", + "city\\on the sports field", + "city\\on the suspension bridge", + "city\\on the tennis court", + "city\\on the track", + "city\\on the viaduct", + "city\\protruding from a high platform", + "city\\protruding from a tall building", + "city\\stunning architecture of barcelona is a testament to the city's rich heritage", + "city\\vibrant colors of rio de janeiro's carnival are a feast for the eyes, with elaborate costumes, samba music, and street parades", + "city\\while street bazaar browsing", + "city\\with street vendors in marrakech", + "home\\at home", + "home\\at the bed and breakfast", + "home\\at the chalet", + "home\\at the cottage", + "home\\at the doghouse", + "home\\at the farmhouse", + "home\\at the lake house", + "home\\at the ranch house", + "home\\by the fireplace", + "home\\in a cassette bedroom", + "home\\in a goth boudoir", + "home\\in a lakeside cabin in autumn", + "home\\in a specific home scene", + "home\\in a tiki outdoor shower", + "home\\in a tropical bathroom", + "home\\in the adobe home", + "home\\in the apartment", + "home\\in the attic", + "home\\in the basement", + "home\\in the bathroom", + "home\\in the bedroom", + "home\\in the brownstone", + "home\\in the bungalow", + "home\\in the cabin", + "home\\in the cape cod", + "home\\in the carriage house", + "home\\in the cave house", + "home\\in the chalet", + "home\\in the closet", + "home\\in the cob home", + "home\\in the colonial", + "home\\in the condominium", + "home\\in the container home", + "home\\in the cottage", + "home\\in the craftsman", + "home\\in the den", + "home\\in the detached house", + "home\\in the dining room", + "home\\in the dome home", + "home\\in the dormer", + "home\\in the duplex", + "home\\in the earth sheltered home", + "home\\in the earthship", + "home\\in the entertainment room", + "home\\in the farmhouse", + "home\\in the farmhouse kitchen", + "home\\in the floating home", + "home\\in the fourplex", + "home\\in the garage", + "home\\in the garage apartment", + "home\\in the geodesic dome", + "home\\in the glass house", + "home\\in the green roof home", + "home\\in the guest house", + "home\\in the guest room", + "home\\in the hallway", + "home\\in the home office", + "home\\in the house", + "home\\in the houseboat", + "home\\in the hut", + "home\\in the igloo", + "home\\in the in-law suite", + "home\\in the kitchen", + "home\\in the laundry room", + "home\\in the living roof home", + "home\\in the living room", + "home\\in the loft", + "home\\in the log cabin", + "home\\in the mansion", + "home\\in the manufactured home", + "home\\in the media room", + "home\\in the micro home", + "home\\in the midcentury modern", + "home\\in the mobile home", + "home\\in the modular home", + "home\\in the motorhome", + "home\\in the mudroom", + "home\\in the multigenerational home", + "home\\in the nursery", + "home\\in the pantry", + "home\\in the parlor", + "home\\in the patio home", + "home\\in the playhouse", + "home\\in the playroom", + "home\\in the pool house", + "home\\in the prefab home", + "home\\in the ranch", + "home\\in the rec room", + "home\\in the rooming house", + "home\\in the sauna", + "home\\in the shared housing", + "home\\in the shed", + "home\\in the shipping container home", + "home\\in the shotgun house", + "home\\in the single family home", + "home\\in the solar home", + "home\\in the stone home", + "home\\in the storage room", + "home\\in the straw bale home", + "home\\in the study", + "home\\in the sunroom", + "home\\in the teepee", + "home\\in the tent", + "home\\in the thatched roof home", + "home\\in the tiny home", + "home\\in the tipi", + "home\\in the townhouse", + "home\\in the trailer", + "home\\in the treehouse", + "home\\in the triplex", + "home\\in the tudor", + "home\\in the underwater home", + "home\\in the victorian", + "home\\in the villa", + "home\\in the wigwam", + "home\\in the yacht", + "home\\in the yurt", + "home\\on a cassette wall", + "home\\on a figurine shelf", + "home\\on the deck", + "home\\on the patio", + "home\\on the porch", + "indoor\\at a cafe", + "indoor\\at a concert", + "indoor\\at a gym", + "indoor\\at a hotel", + "indoor\\at a museum", + "indoor\\at the ice rink", + "indoor\\at the motel", + "indoor\\at the police station", + "indoor\\at the post office", + "indoor\\at the power plant", + "indoor\\at the public pool", + "indoor\\at the public swimming pool", + "indoor\\at the solar power station", + "indoor\\at the university", + "indoor\\at the water treatment plant", + "indoor\\at work", + "indoor\\backstage at ballet rehearsal", + "indoor\\in a butcher shop", + "indoor\\in a cabinet of curiosities", + "indoor\\in a converted missile silo", + "indoor\\in a geodesic dome in the forest", + "indoor\\in a hall", + "indoor\\in a lab", + "indoor\\in a rococo interior", + "indoor\\in a specific indoor scene", + "indoor\\in a studio", + "indoor\\in a terrarium", + "indoor\\in a terrarium bottle", + "indoor\\in a tiki bar", + "indoor\\in a torture chamber", + "indoor\\in a victorian laboratory", + "indoor\\in a voodoo shop", + "indoor\\in an abandoned asylum", + "indoor\\in an abandoned mine shaft", + "indoor\\in art deco architecture", + "indoor\\in dunder mifflin", + "indoor\\in gothic architecture", + "indoor\\in gothic revival architecture", + "indoor\\in rococo architecture", + "indoor\\in stained glass", + "indoor\\in the aquarium", + "indoor\\in the arena", + "indoor\\in the art gallery", + "indoor\\in the art museum", + "indoor\\in the auditorium", + "indoor\\in the barn", + "indoor\\in the boardroom", + "indoor\\in the bookstore", + "indoor\\in the break room", + "indoor\\in the brewery", + "indoor\\in the cafe", + "indoor\\in the chemical plant", + "indoor\\in the children's museum", + "indoor\\in the church", + "indoor\\in the classroom", + "indoor\\in the clinic", + "indoor\\in the community center", + "indoor\\in the concert hall", + "indoor\\in the conference room", + "indoor\\in the conservatory", + "indoor\\in the copy room", + "indoor\\in the corridor", + "indoor\\in the department store", + "indoor\\in the fire station", + "indoor\\in the food court", + "indoor\\in the fossil fuel power station", + "indoor\\in the government building", + "indoor\\in the greenhouse", + "indoor\\in the gym", + "indoor\\in the gymnasium", + "indoor\\in the high school", + "indoor\\in the history museum", + "indoor\\in the hospital", + "indoor\\in the hospital room", + "indoor\\in the hotel", + "indoor\\in the hotel room", + "indoor\\in the hydroelectric power plant", + "indoor\\in the laboratory", + "indoor\\in the library", + "indoor\\in the mail room", + "indoor\\in the meeting room", + "indoor\\in the movie theater", + "indoor\\in the museum", + "indoor\\in the nuclear missile silo", + "indoor\\in the nuclear power plant", + "indoor\\in the nursing home", + "indoor\\in the office", + "indoor\\in the office building", + "indoor\\in the oil refinery", + "indoor\\in the orphanage", + "indoor\\in the parking garage", + "indoor\\in the planetarium", + "indoor\\in the reception", + "indoor\\in the research facility", + "indoor\\in the restaurant", + "indoor\\in the school", + "indoor\\in the science center", + "indoor\\in the server room", + "indoor\\in the shopping mall", + "indoor\\in the sports complex", + "indoor\\in the sports stadium", + "indoor\\in the stadium", + "indoor\\in the synagogue", + "indoor\\in the theater", + "indoor\\in the training room", + "indoor\\in the vault", + "indoor\\in the workshop", + "indoor\\on the oil platform", + "ancient\\a blanket of mist descends upon the ancient forest", + "ancient\\among forgotten technology", + "ancient\\ancient city of petra is a unesco world heritage site and one of the seven wonders of the world", + "ancient\\ancient ruins of machu picchu offer a glimpse into the past", + "ancient\\ancient ruins of petra are a testament to the ingenuity of the nabateans, who carved an entire city out of the rock", + "ancient\\ancient ruins of tikal rise from the jungles of guatemala, offering a glimpse into the mayan civilization", + "ancient\\ancient temples of angkor wat are a testament to cambodia's rich history", + "ancient\\at machu picchu", + "ancient\\at mont saint michel", + "ancient\\at plague mass grave", + "ancient\\at stonehenge", + "ancient\\at the eldritch grove within the ancient sylvan thicket", + "ancient\\at the jungle of reverie with ancient serpent temples", + "ancient\\at the minaret", + "ancient\\at the pyramid", + "ancient\\at the temporal bastion encapsulated in aeon sands", + "ancient\\at the temporal bastion frozen in the sands of ages", + "ancient\\at the temporal bastion submerged in aeon sand", + "ancient\\at the tower of babel", + "ancient\\during the age of exploration", + "ancient\\iconic pyramids of giza are a symbol of ancient egypt's rich history and culture", + "ancient\\in a historical setting", + "ancient\\in a lost temple", + "ancient\\in a medieval kingdom", + "ancient\\in a mythological age", + "ancient\\in a specific imaginary ancient scene", + "ancient\\in a specific real ancient scene", + "ancient\\in a temple", + "ancient\\in a world where ancient gods walk", + "ancient\\in an alchemist's study", + "ancient\\in ancient ruins stand as silent sentinels amidst the wilderness", + "ancient\\in ancient ruins stand like sentinels in the morning mist", + "ancient\\in ancient ruins stand sentinel in the morning mist", + "ancient\\in atlantis", + "ancient\\in exploring a dinosaur era", + "ancient\\in machu picchu", + "ancient\\in petra", + "ancient\\in the ancient forest", + "ancient\\in the ancient kingdom", + "ancient\\in the ancient ruins", + "ancient\\in the ancient temple", + "ancient\\in the atlantis region", + "ancient\\in the castle", + "ancient\\in the cathedral", + "ancient\\in the dinosaur kingdom", + "ancient\\in the dungeon", + "ancient\\in the forbidden city", + "ancient\\in the forgotten ruins of eldertemples", + "ancient\\in the fort", + "ancient\\in the fortress", + "ancient\\in the great wall of china", + "ancient\\in the hagia sophia", + "ancient\\in the kingdom of the unicorn", + "ancient\\in the lost city region", + "ancient\\in the palace", + "ancient\\in the prehistoric kingdom", + "ancient\\in the ruins", + "ancient\\in the ruins region", + "ancient\\in the sagrada familia", + "ancient\\in the sea fort", + "ancient\\in the st. basil's cathedral", + "ancient\\in the st. peter's basilica", + "ancient\\in the sunken kingdom of atlantis", + "ancient\\in the taj mahal", + "ancient\\in the temple", + "ancient\\in the victorian era", + "ancient\\in valhalla", + "ancient\\in xanadu", + "ancient\\nazca terrestrial painting", + "ancient\\on the great wall of china", + "ancient\\remote beauty of easter island is a testament to the resilience of the rapa nui people, who carved giant stone statues known as moai", + "ancient\\under an ancient curse", + "ancient\\within a lost civilization", + "ancient\\within an ancient civilization", + "fantasy\\among mythical beasts", + "fantasy\\at the astral apex atop the elemental convergence spire", + "fantasy\\at the celestial forge crafting timeless artifacts", + "fantasy\\at the celestial haven above the astral clouds", + "fantasy\\at the celestial nexus within the astral veil", + "fantasy\\at the celestial spire among nebulaic drifts", + "fantasy\\at the crystal labyrinth beneath the shimmering crystal dome", + "fantasy\\at the dreamer's haven within the enchanted woods", + "fantasy\\at the emerald sky haven atop floating plateaus", + "fantasy\\at the ethereal islands of illusory vistas", + "fantasy\\at the ethereal isles of illusory reflections", + "fantasy\\at the fabled islands of aetheric illusions", + "fantasy\\at the fae enclave within the whispering thicket", + "fantasy\\at the fae nexus linking enchanted realms", + "fantasy\\at the gargantuan summit among the roaming titans", + "fantasy\\at the giants' sky citadel among the roaming clouds", + "fantasy\\at the harmonic glade with melodious elemental pools", + "fantasy\\at the harmonic springs with elemental harmonies", + "fantasy\\at the magma sanctum encased in volcanic expanse", + "fantasy\\at the magma sanctum within the elemental caldera", + "fantasy\\at the moonlit haven within the enigmatic dream forest", + "fantasy\\at the moonshadow glade within the verdant mystic forest", + "fantasy\\at the mycelium marsh with luminescent mushroom canopies", + "fantasy\\at the nexus gateway of interdimensional portals", + "fantasy\\at the quartz citadel within the luminous crystal cave", + "fantasy\\at the skyward observatory above the aetherial cloudscape", + "fantasy\\at the titan's summit amid the colossal mountains", + "fantasy\\at voodoo altar", + "fantasy\\at voodoo ceremony", + "fantasy\\in a castle in the clouds", + "fantasy\\in a cogged dreamscape", + "fantasy\\in a dream world", + "fantasy\\in a dreamlike world", + "fantasy\\in a fairytale land", + "fantasy\\in a fantasy realm", + "fantasy\\in a fantasy world", + "fantasy\\in a foreboding castle", + "fantasy\\in a grand castle", + "fantasy\\in a hidden city", + "fantasy\\in a hidden sanctuary", + "fantasy\\in a labyrinth", + "fantasy\\in a magical kingdom", + "fantasy\\in a magical school", + "fantasy\\in a magical vortex", + "fantasy\\in a mechanical dreamscape symphony", + "fantasy\\in a metropolis of mirrors", + "fantasy\\in a moonlit dream", + "fantasy\\in a mystical land", + "fantasy\\in a neo-victorian dreamscape", + "fantasy\\in a palace", + "fantasy\\in a pixelated nightmare", + "fantasy\\in a secret underground city", + "fantasy\\in a specific dream scene", + "fantasy\\in a specific fairy scene", + "fantasy\\in a steampunk dreamscape", + "fantasy\\in a supernatural mystery", + "fantasy\\in amethyst dream", + "fantasy\\in an ancient enchanted forest", + "fantasy\\in an ethereal particle dance", + "fantasy\\in an otherworld", + "fantasy\\in an underground world", + "fantasy\\in an underwater kingdom", + "fantasy\\in atlantis", + "fantasy\\in aurora skydancer", + "fantasy\\in azure skywing", + "fantasy\\in cerulean wavecrest", + "fantasy\\in clockwork dreams", + "fantasy\\in crimson firebreath", + "fantasy\\in crimson inferno", + "fantasy\\in crystal frostclaw", + "fantasy\\in crystal moonshroud", + "fantasy\\in emerald forestwhisper", + "fantasy\\in emerald venomspine", + "fantasy\\in explorer's dreams", + "fantasy\\in fairyland", + "fantasy\\in golden serpentwing", + "fantasy\\in hogwarts", + "fantasy\\in middle earth", + "fantasy\\in mordor", + "fantasy\\in narnia", + "fantasy\\in neverland", + "fantasy\\in onyx deathwing", + "fantasy\\in opal dreamseeker", + "fantasy\\in pandora", + "fantasy\\in ruby flameheart", + "fantasy\\in sapphire stormrider", + "fantasy\\in sapphire stormsurge", + "fantasy\\in shadowy nightstalker", + "fantasy\\in shambhala", + "fantasy\\in steam-fueled dreams", + "fantasy\\in the aquatic kingdom", + "fantasy\\in the arcane archive storing mystical tomes", + "fantasy\\in the astral citadel of astraeus", + "fantasy\\in the beach kingdom", + "fantasy\\in the candied wonderland of everlasting sweets", + "fantasy\\in the candy kingdom", + "fantasy\\in the candyland region", + "fantasy\\in the castle region", + "fantasy\\in the cavern kingdom", + "fantasy\\in the celestial gardens of zephyria", + "fantasy\\in the celestial sanctum beneath the thundering veil", + "fantasy\\in the celestial sanctum beneath the thunderstorm veil", + "fantasy\\in the celestial spire housing astral observatories", + "fantasy\\in the chocolate kingdom", + "fantasy\\in the city of eldertide", + "fantasy\\in the cloud kingdom", + "fantasy\\in the confectionery realm of infinite sweet delights", + "fantasy\\in the coral kingdom", + "fantasy\\in the crystal caves", + "fantasy\\in the crystal kingdom", + "fantasy\\in the crystal spire at the apex of elemental convergence", + "fantasy\\in the desert kingdom of mirage", + "fantasy\\in the desert of mirrors", + "fantasy\\in the diamond region", + "fantasy\\in the dragon's lair", + "fantasy\\in the dream kingdom", + "fantasy\\in the dreaming realm of morpheus", + "fantasy\\in the dreamland kingdom", + "fantasy\\in the echoing abyss beneath the obsidian mountains", + "fantasy\\in the echoing abyss beneath the obsidian peaks", + "fantasy\\in the elemental nexus with harmonizing realms", + "fantasy\\in the enchanted confectionery realm of eternal sweets", + "fantasy\\in the enchanted isles of luminescia", + "fantasy\\in the enchanted library of whispers", + "fantasy\\in the enchanted meadow surrounded by wisps", + "fantasy\\in the enchanted region", + "fantasy\\in the ethereal observatory of astromancers", + "fantasy\\in the fairy kingdom", + "fantasy\\in the feywild nexus linking fey realms", + "fantasy\\in the fire kingdom", + "fantasy\\in the firefly kingdom", + "fantasy\\in the floating isles of aether", + "fantasy\\in the forest of eternal twilight", + "fantasy\\in the forest of mirrors", + "fantasy\\in the ghost kingdom", + "fantasy\\in the grimoire archive storing arcane chronicles", + "fantasy\\in the haunted kingdom", + "fantasy\\in the heaven's gate region", + "fantasy\\in the hollow mountain of emberforge", + "fantasy\\in the illusionary mirage within the desert mirage sands", + "fantasy\\in the kingdom of the unicorn", + "fantasy\\in the labyrinth of everchanging halls", + "fantasy\\in the lava kingdom", + "fantasy\\in the library of whispering pages", + "fantasy\\in the luminous grove bathed in eternal moonlight", + "fantasy\\in the magic kingdom", + "fantasy\\in the mirage oasis concealed within the mirage sands", + "fantasy\\in the mirage oasis with illusory palm groves", + "fantasy\\in the mushroom city", + "fantasy\\in the mushroom kingdom", + "fantasy\\in the music kingdom", + "fantasy\\in the myconid haven with luminescent fungal canopies", + "fantasy\\in the myconid haven with luminous fungal canopies", + "fantasy\\in the mystic forest", + "fantasy\\in the mystic kingdom", + "fantasy\\in the mythical kingdom", + "fantasy\\in the ninja region", + "fantasy\\in the oasis mirage hidden in the mirage sands", + "fantasy\\in the ocean kingdom", + "fantasy\\in the palace of dreams", + "fantasy\\in the pirate kingdom", + "fantasy\\in the rain of upside-down umbrellas", + "fantasy\\in the shadowed realm of umbrathor", + "fantasy\\in the slime kingdom", + "fantasy\\in the snowy kingdom", + "fantasy\\in the solar kingdom", + "fantasy\\in the stargazer's refuge beneath the veil of storms", + "fantasy\\in the starlit dunes with shifting constellations", + "fantasy\\in the subterranean kingdom", + "fantasy\\in the sugar rush kingdom", + "fantasy\\in the sunken kingdom of atlantis", + "fantasy\\in the sunset kingdom", + "fantasy\\in the sylvan enclave within the ancient grove", + "fantasy\\in the symphony of broken instruments", + "fantasy\\in the symphony of disjointed melodies", + "fantasy\\in the thunderstorm aerie overlooking radiant waterfalls", + "fantasy\\in the tomekeeper's citadel filled with arcane grimoires", + "fantasy\\in the tower of oblivion", + "fantasy\\in the toy kingdom", + "fantasy\\in the tropical kingdom", + "fantasy\\in the underground kingdom", + "fantasy\\in the undersea kingdom", + "fantasy\\in the underwater forest of whispers", + "fantasy\\in the underwater kingdom", + "fantasy\\in the underworld kingdom", + "fantasy\\in the underworld region", + "fantasy\\in the vale of shadows", + "fantasy\\in the valley of the damned", + "fantasy\\in the valley of the lost", + "fantasy\\in the vineyard kingdom", + "fantasy\\in the volcanic kingdom", + "fantasy\\in the wandering forest of eldertrees", + "fantasy\\in the waterfall kingdom", + "fantasy\\in the whimsical mirage surrounded by illusionary sands", + "fantasy\\in the whispering chasm beneath the veiled cliffs", + "fantasy\\in the whispering woods with enchanted willows", + "fantasy\\in the wild west region", + "fantasy\\in topaz thunderstrike", + "fantasy\\in valhalla", + "fantasy\\in verdant forestgale", + "fantasy\\in wonderland", + "fantasy\\in xanadu", + "fantasy\\nightmare region", + "fantasy\\on a floating island in the sky", + "fantasy\\on a mystical island", + "fantasy\\on a pirate adventure", + "fantasy\\on mount olympus", + "fantasy\\on the carousel of forgotten dreams", + "fantasy\\on the floating islands of imagination", + "fantasy\\on the island of dreams", + "fantasy\\spooky kingdom", + "fantasy\\under the eyes in the sky", + "fantasy\\with the melting clocks of dali's vision", + "sci-fi\\aboard a sprawling interstellar spaceship", + "sci-fi\\among biomechanical wonders", + "sci-fi\\among space travelers", + "sci-fi\\at a black market cybernetics clinic", + "sci-fi\\at a bustling galactic trade hub", + "sci-fi\\at a chrono-mystical carnival", + "sci-fi\\at a clandestine hacker's hideout", + "sci-fi\\at a futuristic ai-controlled mega-city", + "sci-fi\\at a quantum portal nexus", + "sci-fi\\at a steam-powered carnival", + "sci-fi\\at a steampunk ball", + "sci-fi\\at a surreal clockwork opera", + "sci-fi\\at the chronomancer's workshop amidst gears of time", + "sci-fi\\at the clockwork circus of time", + "sci-fi\\at the clockwork spire amidst the gears of time", + "sci-fi\\at the cybernetic megapolis within the digital frontier", + "sci-fi\\at the digital metropolis within the cybernetic frontier", + "sci-fi\\at the floating hotel", + "sci-fi\\at the neon metropolis within the digital frontier", + "sci-fi\\at the skyborne aegis within the aetherial expanse", + "sci-fi\\at the skyborne observatory amidst nebula drifts", + "sci-fi\\at the skyward archipelago of floating temples", + "sci-fi\\at the starlight observatory amid the endless nebulae", + "sci-fi\\at the starlight observatory amid the eternal nebulae", + "sci-fi\\at the starlit citadel amidst cosmic cascades", + "sci-fi\\at the temporal bastion encapsulated in aeon sands", + "sci-fi\\at the temporal bastion frozen in the sands of ages", + "sci-fi\\at the temporal bastion submerged in aeon sand", + "sci-fi\\autonomous vehicles on a futuristic highway", + "sci-fi\\climate-controlled dome protecting a lush garden in a desert", + "sci-fi\\drone delivery system operating in a bustling city", + "sci-fi\\during a digital rebellion", + "sci-fi\\during a future war", + "sci-fi\\during a galactic conflict", + "sci-fi\\during a space rebellion", + "sci-fi\\during a virtual rebellion", + "sci-fi\\during an alien invasion", + "sci-fi\\during space colonization", + "sci-fi\\during the ai uprising", + "sci-fi\\during the robot uprising", + "sci-fi\\high-speed train traveling through a futuristic tunnel", + "sci-fi\\in a bioluminescent urban jungle", + "sci-fi\\in a biomechanical dreamscape", + "sci-fi\\in a biopunk world", + "sci-fi\\in a black hole", + "sci-fi\\in a clockwork menagerie", + "sci-fi\\in a clockwork wonderland", + "sci-fi\\in a cogwheel wonderland", + "sci-fi\\in a cybernetic playground", + "sci-fi\\in a cybernetic renaissance", + "sci-fi\\in a cybernetic wonderland", + "sci-fi\\in a cyberpunk anomaly", + "sci-fi\\in a cyberpunk city", + "sci-fi\\in a cyberpunk dreamscape", + "sci-fi\\in a cyberpunk enigma", + "sci-fi\\in a cyberpunk metropolis", + "sci-fi\\in a cyberpunk underwater abyss", + "sci-fi\\in a data hacker's nightmare", + "sci-fi\\in a datastream mirage", + "sci-fi\\in a digital data fortress", + "sci-fi\\in a digital garden of delights", + "sci-fi\\in a dystopian datastream", + "sci-fi\\in a dystopian dreamscape", + "sci-fi\\in a floating city", + "sci-fi\\in a future dystopia", + "sci-fi\\in a futuristic space colony orbiting earth", + "sci-fi\\in a futuristic world", + "sci-fi\\in a futuristic-cyberpunk cityscape", + "sci-fi\\in a galactic empire", + "sci-fi\\in a high-tech orbital station", + "sci-fi\\in a holographic paradox", + "sci-fi\\in a holographic reality", + "sci-fi\\in a holographic utopia", + "sci-fi\\in a machine rebellion fantasia", + "sci-fi\\in a mechanical menagerie ballroom", + "sci-fi\\in a mechanical menagerie parade", + "sci-fi\\in a mechanical world", + "sci-fi\\in a neo-victorian dreamscape", + "sci-fi\\in a neon dreamscape", + "sci-fi\\in a neon future cult", + "sci-fi\\in a neon jungle", + "sci-fi\\in a neon metropolis", + "sci-fi\\in a neon noir detective", + "sci-fi\\in a neon racer sci-fi", + "sci-fi\\in a neon-lit city", + "sci-fi\\in a neurological wasteland", + "sci-fi\\in a parallel universe", + "sci-fi\\in a post-apocalyptic wasteland", + "sci-fi\\in a post-human utopia", + "sci-fi\\in a psychedelic cyber alley", + "sci-fi\\in a psycho-cybernetic landscape", + "sci-fi\\in a quantum dreamscape", + "sci-fi\\in a quantum kaleidoscope", + "sci-fi\\in a quantum labyrinth", + "sci-fi\\in a quantum mirage", + "sci-fi\\in a quantum mirage forest", + "sci-fi\\in a quantum singularity", + "sci-fi\\in a quantum steam-driven enigma", + "sci-fi\\in a quantum tesseract enigma", + "sci-fi\\in a robotic society", + "sci-fi\\in a robotic utopia", + "sci-fi\\in a specific futuristic scene", + "sci-fi\\in a steam-driven enigma", + "sci-fi\\in a steampunk alchemical garden", + "sci-fi\\in a steampunk dreamscape architect", + "sci-fi\\in a terraformed colony", + "sci-fi\\in a transhumanism era", + "sci-fi\\in a utopian society", + "sci-fi\\in a vaporwave city", + "sci-fi\\in a virtual paradise", + "sci-fi\\in a virtual reality", + "sci-fi\\in a virtual reality environment with immersive experiences", + "sci-fi\\in a virtual reality mirage", + "sci-fi\\in a world of cybernetic augmentation", + "sci-fi\\in a world of genetic engineering", + "sci-fi\\in alternate dimensions", + "sci-fi\\in an advanced alien civilization", + "sci-fi\\in an ai-powered society", + "sci-fi\\in bionic nightmares", + "sci-fi\\in biotechno fusion", + "sci-fi\\in entangled realities", + "sci-fi\\in neo-tokyo redux", + "sci-fi\\in neon tokyo", + "sci-fi\\in neural interface delirium", + "sci-fi\\in post-apocalyptic dreams", + "sci-fi\\in psychedelic cyberspace", + "sci-fi\\in quantum alchemical fusion", + "sci-fi\\in quantum chromatic symphony", + "sci-fi\\in quantum cityscapes", + "sci-fi\\in quantum constellation ballet", + "sci-fi\\in quantum fractal realities", + "sci-fi\\in quantum interference symphony", + "sci-fi\\in quantum reflections", + "sci-fi\\in retro-futuristic surreality", + "sci-fi\\in steam-powered cyberpunk", + "sci-fi\\in synthetic dreams", + "sci-fi\\in synthetic sentience", + "sci-fi\\in tatooine", + "sci-fi\\in techno-esotericism", + "sci-fi\\in the abyssal citadel with bioluminescent corals", + "sci-fi\\in the abyssal grotto with bioluminescent sea creatures", + "sci-fi\\in the advanced city skyline with flying cars", + "sci-fi\\in the advanced medical facility with futuristic healing technology", + "sci-fi\\in the ai-driven research center with cutting-edge technology", + "sci-fi\\in the astral sanctuary at the heart of cosmic streams", + "sci-fi\\in the astral sanctuary at the nexus of cosmic streams", + "sci-fi\\in the augmented reality park with interactive elements", + "sci-fi\\in the celestial starcruiser voyaging through celestial nebulae", + "sci-fi\\in the city of tomorrow", + "sci-fi\\in the clockwork city of gearspring", + "sci-fi\\in the cosmic starcruiser voyaging through nebulae", + "sci-fi\\in the crystal labyrinth of prisms", + "sci-fi\\in the crystaline abyssal city of submerged spires", + "sci-fi\\in the cyberpunk kingdom", + "sci-fi\\in the cyberpunk metropolis with neon lights and towering skyscrapers", + "sci-fi\\in the future kingdom", + "sci-fi\\in the futuristic sports stadium with holographic displays and interactive features", + "sci-fi\\in the galactic starship sailing through celestial oceans", + "sci-fi\\in the high-tech laboratory with advanced ai robots", + "sci-fi\\in the industrial kingdom", + "sci-fi\\in the lunar kingdom", + "sci-fi\\in the milky way galaxy", + "sci-fi\\in the neon kingdom", + "sci-fi\\in the nexus gateway connecting multiversal realms", + "sci-fi\\in the realm of cosmic horror", + "sci-fi\\in the renewable energy-powered city with solar panels and wind turbines", + "sci-fi\\in the rift of temporal anomalies", + "sci-fi\\in the robot kingdom", + "sci-fi\\in the robotic manufacturing plant with automated assembly lines", + "sci-fi\\in the sci-fi kingdom", + "sci-fi\\in the smart grid energy system with interconnected devices and sensors", + "sci-fi\\in the smart home with holographic interfaces", + "sci-fi\\in the space region", + "sci-fi\\in the space station", + "sci-fi\\in the space station with a view of distant planets", + "sci-fi\\in the steampunk city", + "sci-fi\\in the steampunk region", + "sci-fi\\in the stormforged bastion above the roiling storms", + "sci-fi\\in the stormforged observatory overlooking ephemeral falls", + "sci-fi\\in the temporal nexus traversing ephemeral realms", + "sci-fi\\in the temporal rift crossing the streams of eternity", + "sci-fi\\in the time kingdom", + "sci-fi\\in the toxic kingdom", + "sci-fi\\in the underwater city with transparent domes", + "sci-fi\\in the wasteland kingdom", + "sci-fi\\in transcendent cyberspace", + "sci-fi\\in wavefunction symphony", + "sci-fi\\lost in space", + "sci-fi\\lost in time", + "sci-fi\\near a space anomaly", + "sci-fi\\on a distant planet", + "sci-fi\\on a lunar colony", + "sci-fi\\on a neuro-interface odyssey", + "sci-fi\\on a planetary exploration mission", + "sci-fi\\on a steampunk astral odyssey", + "sci-fi\\on a surreal airship odyssey", + "sci-fi\\on a virtual reality odyssey", + "sci-fi\\on an exoplanet", + "sci-fi\\on the astral plane", + "sci-fi\\on the moon base with astronauts exploring the lunar surface", + "sci-fi\\on the space elevator", + "sci-fi\\through interdimensional travel", + "sci-fi\\vertical farming skyscraper in a megacity", + "sci-fi\\while navigating the multiverse", + "sci-fi\\with a cyberpunk street shaman", + "sci-fi\\with mad scientist machinery", + "sci-fi\\with the ability of mind upload", + "sci-fi\\within a digital utopia", + "sci-fi\\within the virtual realms", + "sci-fi\\within virtual reality", + "time\\at a specific time", + "time\\at dawn's awakening", + "time\\at dawn's promise", + "time\\at daybreak's hope", + "time\\at dusk's embrace", + "time\\at eerie midnight", + "time\\at high noon blaze", + "time\\at midnight dance", + "time\\at noonday radiance", + "time\\at noontime reverberation", + "time\\at twilight's whispers", + "time\\during midday hustle", + "time\\in afternoon bliss", + "time\\in afternoon lull", + "time\\in graveyard mist", + "time\\in midnight reverie", + "time\\in twilight serenity", + "time\\on a misty morning hush", + "time\\on a winter morning frost", + "other\\in a specific scene", + "other\\in front of a black background", + "other\\in front of a blue background", + "other\\in front of a colorful background", + "other\\in front of a green background", + "other\\in front of a grey background", + "other\\in front of a red background", + "other\\in front of a white background" ] \ No newline at end of file diff --git a/nodes/prompt_data/scene/2-atmasphere.json b/nodes/prompt_data/scene/2-atmasphere.json index 9e630ba..da80908 100644 --- a/nodes/prompt_data/scene/2-atmasphere.json +++ b/nodes/prompt_data/scene/2-atmasphere.json @@ -1,6 +1,7 @@ [ "abyssal silence atmosphere", "aggressive atmosphere", + "apocalyptic atmosphere", "awe atmosphere", "bad dream atmosphere", "beautiful atmosphere", @@ -41,6 +42,7 @@ "hdr atmosphere", "horror atmosphere", "hushed reverence atmosphere", + "in a specific atmosphere", "joy atmosphere", "kawaii atmosphere", "light cheery atmosphere", diff --git a/nodes/prompt_data/scene/3-color.json b/nodes/prompt_data/scene/3-color.json deleted file mode 100644 index d397ffc..0000000 --- a/nodes/prompt_data/scene/3-color.json +++ /dev/null @@ -1,145 +0,0 @@ -[ - "almond color tone", - "amber color tone", - "apricot orange color tone", - "ash gray color tone", - "beige color tone", - "black and white color tone", - "black color tone", - "blue color tone", - "brick red color tone", - "bronze color tone", - "brown color tone", - "caramel color tone", - "carnation pink color tone", - "cerulean color tone", - "charcoal grey color tone", - "chocolate color tone", - "cinnamon brown color tone", - "classic chrome color tone", - "cool blue color tone", - "coral orange color tone", - "cream color tone", - "creamy white color tone", - "cyan color tone", - "denim blue color tone", - "duo color tone", - "emerald green color tone", - "forest green color tone", - "fuchsia color tone", - "gold color tone", - "goldfish orange color tone", - "grass green color tone", - "gray color tone", - "green color tone", - "gritty contrast color tone", - "holographic gradient color tone", - "honey color tone", - "indigo color tone", - "ivory color tone", - "jade green color tone", - "lavender color tone", - "lemon yellow color tone", - "lilac purple color tone", - "lime green color tone", - "magenta color tone", - "mahogany color tone", - "marigold color tone", - "maroon color tone", - "mauve color tone", - "midnight blue color tone", - "mint green color tone", - "mocha brown color tone", - "monochrome color tone", - "muted color tone", - "navy blue color tone", - "olive green color tone", - "orange color tone", - "orchid pink color tone", - "pansy color tone", - "paprika red color tone", - "pastel hues color tone", - "peach color tone", - "peachy pink color tone", - "pearl color tone", - "periwinkle color tone", - "pine color tone", - "pink color tone", - "plum purple color tone", - "pomegranate color tone", - "prismatic color tone", - "purple color tone", - "raisin color tone", - "raspberry color tone", - "red and black color tone", - "red color tone", - "red copper color tone", - "retro color tone", - "rose color tone", - "rose gold color tone", - "rouge color tone", - "royal blue color tone", - "ruby red color tone", - "russian violet color tone", - "rust brown color tone", - "rustic color tone", - "saffron yellow color tone", - "salmon pink color tone", - "sand color tone", - "sapphire blue color tone", - "scarlet color tone", - "seafoam green color tone", - "sepia color tone", - "shine color tone", - "sienna color tone", - "silver color tone", - "sky blue color tone", - "slate gray color tone", - "smoky black color tone", - "snow white color tone", - "soft pastel color tone", - "soft pink color tone", - "spectrum color tone", - "split color tone", - "spring green color tone", - "star flash color tone", - "steady blue color tone", - "steel blue color tone", - "steel gray color tone", - "sunset gradient color tone", - "sweet color tone", - "tan brown color tone", - "tan color tone", - "tangerine color tone", - "tangerine orange color tone", - "taupe color tone", - "tawny color tone", - "tea color tone", - "teak color tone", - "teal color tone", - "teal green color tone", - "techni color tone", - "terracotta orange color tone", - "titanium color tone", - "topaz yellow color tone", - "transparent iridescent color tone", - "tri color tone", - "tropical color tone", - "true blue color tone", - "turquoise color tone", - "vanilla color tone", - "vermillion color tone", - "vibrant color tone", - "vintage color tone", - "violet color tone", - "warm brown color tone", - "warm color tone", - "warm orange color tone", - "white and greens color tone", - "white color tone", - "whopper color tone", - "wine red color tone", - "yellow and blacks color tone", - "yellow color tone", - "yellow green color tone" -] \ No newline at end of file diff --git a/nodes/prompt_data/scene/3-weather.json b/nodes/prompt_data/scene/3-weather.json new file mode 100644 index 0000000..90348ed --- /dev/null +++ b/nodes/prompt_data/scene/3-weather.json @@ -0,0 +1,111 @@ +[ + "day\\after rain", + "day\\balmy day", + "day\\blustery day", + "day\\boiling day", + "day\\breezy day", + "day\\brisk day", + "day\\calm day", + "day\\chilly day", + "day\\clear day", + "day\\cloudy day", + "day\\cold day", + "day\\cool day", + "day\\crisp day", + "day\\damp day", + "day\\dry day", + "day\\foggy day", + "day\\freezing day", + "day\\frigid day", + "day\\frosty day", + "day\\hazy day", + "day\\hot day", + "day\\humid day", + "day\\mild day", + "day\\misty day", + "day\\muggy day", + "day\\overcast day", + "day\\partly cloudy day", + "day\\rainy day", + "day\\refreshing day", + "day\\scorching day", + "day\\sizzling day", + "day\\smoggy day", + "day\\snowy day", + "day\\stormy day", + "day\\sultry day", + "day\\sunny day", + "day\\sweltering day", + "day\\warm day", + "day\\wet day", + "day\\windy day", + "beauty\\rainbow", + "beauty\\sun dog", + "beauty\\sun halo", + "beauty\\moon halo", + "beauty\\aurora australis", + "beauty\\aurora borealis", + "beauty\\crepuscular rays", + "beauty\\god rays", + "beauty\\sun rays", + "clouds\\altocumulus clouds", + "clouds\\altostratus clouds", + "clouds\\cirrocumulus clouds", + "clouds\\cirrostratus clouds", + "clouds\\cirrus clouds", + "clouds\\cumulonimbus clouds", + "clouds\\cumulus clouds", + "clouds\\nimbostratus clouds", + "clouds\\stratocumulus clouds", + "clouds\\stratus clouds", + "clouds\\funnel clouds", + "wind\\gusts of wind", + "wind\\cyclone", + "wind\\hurricane", + "wind\\monsoon", + "wind\\tornado", + "wind\\twister", + "wind\\typhoon", + "wind\\water spout", + "rain\\freezing rain", + "rain\\frozen rain", + "rain\\heavy rain", + "rain\\rain shower", + "rain\\downpour rain", + "rain\\drizzle rain", + "rain\\smattering rain", + "rain\\sprinkle rain", + "rain\\tempest rain", + "snow\\heavy snow", + "snow\\light snow", + "snow\\snow flurry", + "snow\\snow squall", + "snow\\thunder snow", + "snow\\blizzard", + "snow\\sleet", + "storm\\snow storm", + "storm\\dust storm", + "storm\\ice storm", + "storm\\lightning storm", + "storm\\heat lightning storm", + "storm\\storm surge", + "storm\\hail storm", + "storm\\wind storm", + "storm\\sand storm", + "storm\\thunder storm", + "storm\\haboob storm", + "storm\\microburst storm", + "frozen\\frozen drizzle", + "frozen\\glace", + "frozen\\hail", + "frozen\\ice pellets", + "frozen\\icicles", + "frozen\\hoar frost", + "frozen\\white frost", + "other\\deluge", + "other\\flood", + "other\\drought", + "other\\avalanche", + "other\\black ice", + "other\\in a specific weather" +] \ No newline at end of file diff --git a/nodes/prompt_data/scene/900-color_description.yml b/nodes/prompt_data/scene/900-color_description.yml new file mode 100644 index 0000000..86dd415 --- /dev/null +++ b/nodes/prompt_data/scene/900-color_description.yml @@ -0,0 +1,36 @@ + - bold + - bright + - clear + - cool + - dark + - deep + - faded + - glossy + - glowing + - harsh + - hazy + - iridescent + - light + - misty + - muted + - natural + - opulent + - organic + - pale + - pure + - radiant + - rich + - rustic + - sheer + - shimmering + - soft + - sparkling + - strong + - subdued + - subtle + - translucent + - transparent + - very dark + - very light + - vibrant + - warm \ No newline at end of file diff --git a/nodes/prompt_data/scene/901-color.json b/nodes/prompt_data/scene/901-color.json new file mode 100644 index 0000000..997b6a5 --- /dev/null +++ b/nodes/prompt_data/scene/901-color.json @@ -0,0 +1,285 @@ +[ + "tone\\almond color tone", + "tone\\amber color tone", + "tone\\apricot orange color tone", + "tone\\aqua color tone", + "tone\\ash gray color tone", + "tone\\azure color tone", + "tone\\beige color tone", + "tone\\black color tone", + "tone\\blue color tone", + "tone\\brick red color tone", + "tone\\bronze color tone", + "tone\\brown color tone", + "tone\\burgundy color tone", + "tone\\caramel color tone", + "tone\\carnation pink color tone", + "tone\\cerulean color tone", + "tone\\charcoal grey color tone", + "tone\\chartreuse color tone", + "tone\\chocolate color tone", + "tone\\cinnamon brown color tone", + "tone\\classic chrome color tone", + "tone\\cobalt color tone", + "tone\\cool blue color tone", + "tone\\coral orange color tone", + "tone\\cream and chocolate color tone", + "tone\\cream color tone", + "tone\\creamy white color tone", + "tone\\crimson color tone", + "tone\\cyan color tone", + "tone\\denim blue color tone", + "tone\\ecru color tone", + "tone\\emerald green color tone", + "tone\\forest green color tone", + "tone\\fuchsia color tone", + "tone\\gold color tone", + "tone\\goldfish orange color tone", + "tone\\grass green color tone", + "tone\\gray color tone", + "tone\\green color tone", + "tone\\grey color tone", + "tone\\gritty contrast color tone", + "tone\\holographic gradient color tone", + "tone\\honey color tone", + "tone\\indigo color tone", + "tone\\ivory color tone", + "tone\\jade green color tone", + "tone\\lavender color tone", + "tone\\lemon color tone", + "tone\\lemon yellow color tone", + "tone\\lilac purple color tone", + "tone\\lime color tone", + "tone\\lime green color tone", + "tone\\magenta color tone", + "tone\\mahogany color tone", + "tone\\marigold color tone", + "tone\\maroon color tone", + "tone\\mauve color tone", + "tone\\midnight blue color tone", + "tone\\mint green color tone", + "tone\\mocha brown color tone", + "tone\\monochrome color tone", + "tone\\muted color tone", + "tone\\navy blue color tone", + "tone\\navy color tone", + "tone\\ocher color tone", + "tone\\olive green color tone", + "tone\\orange color tone", + "tone\\orchid pink color tone", + "tone\\pansy color tone", + "tone\\paprika red color tone", + "tone\\pastel hues color tone", + "tone\\peach color tone", + "tone\\peachy pink color tone", + "tone\\pearl color tone", + "tone\\periwinkle color tone", + "tone\\pine color tone", + "tone\\pink color tone", + "tone\\platinum color tone", + "tone\\plum purple color tone", + "tone\\pomegranate color tone", + "tone\\prismatic color tone", + "tone\\purple color tone", + "tone\\raisin color tone", + "tone\\raspberry color tone", + "tone\\red color tone", + "tone\\red copper color tone", + "tone\\retro color tone", + "tone\\rose color tone", + "tone\\rose gold color tone", + "tone\\rouge color tone", + "tone\\royal blue color tone", + "tone\\ruby red color tone", + "tone\\russet color tone", + "tone\\russian violet color tone", + "tone\\rust brown color tone", + "tone\\rustic color tone", + "tone\\saffron color tone", + "tone\\saffron yellow color tone", + "tone\\salmon pink color tone", + "tone\\sand color tone", + "tone\\sapphire blue color tone", + "tone\\scarlet color tone", + "tone\\seafoam green color tone", + "tone\\sepia color tone", + "tone\\shine color tone", + "tone\\sienna color tone", + "tone\\silver color tone", + "tone\\sky blue color tone", + "tone\\slate gray color tone", + "tone\\smoky black color tone", + "tone\\snow white color tone", + "tone\\soft pastel color tone", + "tone\\soft pink color tone", + "tone\\spectrum color tone", + "tone\\split color tone", + "tone\\spring green color tone", + "tone\\star flash color tone", + "tone\\steady blue color tone", + "tone\\steel blue color tone", + "tone\\steel gray color tone", + "tone\\sunset gradient color tone", + "tone\\sweet color tone", + "tone\\tan brown color tone", + "tone\\tan color tone", + "tone\\tangerine color tone", + "tone\\tangerine orange color tone", + "tone\\taupe color tone", + "tone\\tawny color tone", + "tone\\tea color tone", + "tone\\teak color tone", + "tone\\teal color tone", + "tone\\teal green color tone", + "tone\\techni color tone", + "tone\\terracotta orange color tone", + "tone\\titanium color tone", + "tone\\topaz yellow color tone", + "tone\\transparent iridescent color tone", + "tone\\tropical color tone", + "tone\\true blue color tone", + "tone\\turquoise color tone", + "tone\\ultramarine color tone", + "tone\\vanilla color tone", + "tone\\vermillion color tone", + "tone\\vibrant color tone", + "tone\\vintage color tone", + "tone\\violet color tone", + "tone\\warm brown color tone", + "tone\\warm color tone", + "tone\\warm orange color tone", + "tone\\white color tone", + "tone\\whopper color tone", + "tone\\wine red color tone", + "tone\\yellow color tone", + "duotone\\beige and black color tone", + "duotone\\black and white color tone", + "duotone\\brown and white color tone", + "duotone\\gray and yellow color tone", + "duotone\\green and purple color tone", + "duotone\\lavender and gold color tone", + "duotone\\light blue and burgundy color tone", + "duotone\\light blue and dark blue color tone", + "duotone\\light green and dark green color tone", + "duotone\\light purple and dark purple color tone", + "duotone\\lime green and ivory color tone", + "duotone\\magenta and blue color tone", + "duotone\\orange and cyan color tone", + "duotone\\peach and navy color tone", + "duotone\\pink and black color tone", + "duotone\\pink and teal color tone", + "duotone\\red and black color tone", + "duotone\\red and green color tone", + "duotone\\red and yellow color tone", + "duotone\\silver and maroon color tone", + "duotone\\sky blue and rose color tone", + "duotone\\teal and pink color tone", + "duotone\\turquoise and magenta color tone", + "duotone\\white and black color tone", + "duotone\\white and blue color tone", + "duotone\\white and green color tone", + "duotone\\yellow and black color tone", + "duotone\\yellow and green color tone", + "duotone\\yellow and violet color tone", + "grading\\bold color grading", + "grading\\bright color grading", + "grading\\cool color grading", + "grading\\cool-toned color grading", + "grading\\cross-processed color grading", + "grading\\day-for-night color grading", + "grading\\desaturated color grading", + "grading\\earthy color grading", + "grading\\faded color grading", + "grading\\film noir color grading", + "grading\\filmic color grading", + "grading\\high-key color grading", + "grading\\low-key color grading", + "grading\\monochromatic color grading", + "grading\\muted color grading", + "grading\\neon color grading", + "grading\\night-for-day color grading", + "grading\\pastel color grading", + "grading\\quadtone color grading", + "grading\\saturated color grading", + "grading\\split-tone color grading", + "grading\\sunset color grading", + "grading\\traditional color grading", + "grading\\tritone color grading", + "grading\\vibrant color grading", + "grading\\warm color grading", + "grading\\warm-toned color grading", + "palette\\autumn harvest\\burnt orange, mustard yellow, deep red, olive green, rust color", + "palette\\autumn harvest\\pumpkin orange, deep red, olive green, mustard yellow, chocolate brown", + "palette\\autumn leaves\\deep red, burnt orange, olive green, mustard yellow, chocolate brown", + "palette\\autumn leaves\\orange color, olive green, burgundy, mustard yellow, brown", + "palette\\autumnal bliss\\deep red, burnt orange, olive green, mustard yellow, plum purple", + "palette\\beach house\\seafoam green, soft yellow, sky blue, sand color, coral pink", + "palette\\beach house\\soft blue, sandy beige, pale pink, coral pink, sea blue", + "palette\\berry tones\\raspberry red, plum purple, deep blue, fuchsia pink, wine red", + "palette\\black and white chic\\black, white, gray, silver color, gold color", + "palette\\bold and beautiful\\royal purple, emerald green, scarlet red, golden yellow, electric blue", + "palette\\bold and bright\\hot pink, lime green, bright blue, orange color, yellow", + "palette\\bright and bold\\hot pink, electric blue, bright green, yellow, red", + "palette\\bright and sunny\\sunshine yellow, sky blue, coral pink, hot pink, green", + "palette\\bright lights\\fuchsia, electric blue, chartreuse, tangerine, neon purple", + "palette\\candy shop\\bubblegum pink, lemon drop yellow, cotton candy blue, grape purple, mint green", + "palette\\citrus crush\\lemon yellow, orange color, lime green, pale pink, white", + "palette\\city lights\\metallic gold color, deep purple, sky blue, fuchsia, steel gray", + "palette\\city skyline\\gray, pale blue, mustard yellow, brick red, rusty orange", + "palette\\classic elegance\\ivory color, soft gray, blush pink, deep red, dark navy", + "palette\\coastal escape\\seafoam green, teal, sand color, ivory color, navy blue", + "palette\\cosmic colors\\dark blue, violet, emerald green, gold color, fuchsia pink", + "palette\\cotton candy\\pale pink, lavender color, powder blue, bubblegum pink, mint green", + "palette\\country charm\\cream color, sage green, pale pink, cornflower blue, soft brown", + "palette\\dark and moody\\dark green, charcoal gray, deep purple, navy blue, black", + "palette\\desert oasis\\sand color, cactus green, terracotta color, mustard yellow, sky blue", + "palette\\desert sunset\\peach color, terracotta color, dusty pink, mustard yellow, lavender color", + "palette\\earth tones\\brown, olive green, mustard yellow, beige, deep red", + "palette\\enchanted forest\\forest green, olive green, pale blue, pale yellow, soft brown", + "palette\\enchanted garden\\lilac purple, pale pink, buttercup yellow, sage green, soft gray", + "palette\\fiesta\\magenta, tangerine orange, sunflower yellow, turquoise color, lime green", + "palette\\fire and ice\\scarlet red, ice blue, charcoal gray, white, black", + "palette\\fresh picked\\tomato red, carrot orange, lemon yellow, granny smith apple green, sky blue", + "palette\\gentle breeze\\sky blue, powder blue, pale pink, cream color, seafoam green", + "palette\\glitter and glam\\silver color, gold color, black, white, pink", + "palette\\greenery\\emerald green, olive green, forest green, sage green, mint green", + "palette\\ice cream shop\\mint green, bubblegum pink, lemon yellow, lavender color, baby blue", + "palette\\industrial chic\\gunmetal gray, rusty red, deep brown, copper color, beige", + "palette\\jewel tones\\amethyst purple, ruby red, sapphire blue, emerald green, topaz yellow", + "palette\\mellow yellows\\pale yellow, mustard yellow, beige, soft gray, white", + "palette\\midnight sky\\midnight blue, charcoal gray, deep purple, navy blue, slate blue", + "palette\\minimalist\\black, white, gray, beige, navy blue", + "palette\\modern neutrals\\beige, gray, black, white, navy blue", + "palette\\monochrome mood\\dark gray, medium gray, light gray, white, black", + "palette\\moroccan nights\\deep blue, burnt orange, mustard yellow, pale pink, cream color", + "palette\\muted tones\\dusty rose color, muted green, beige, pale gray, soft blue", + "palette\\nautical\\navy blue, red, white, beige, sky blue", + "palette\\ocean breeze\\powder blue, teal, sand color, shell pink, seagrass green", + "palette\\ocean depths\\deep blue, emerald green, turquoise color, pale gray, navy blue", + "palette\\oceanfront\\turquoise color, pale blue, sandy beige, seafoam green, white", + "palette\\oceanic depths\\deep blue, teal, navy blue, powder blue, white", + "palette\\pastel dreams\\lavender color, sky blue, peach color, pale pink, mint green", + "palette\\pastel perfection\\lavender color, pale pink, powder blue, mint green, peach color", + "palette\\peacock feathers\\peacock blue, gold color, deep purple, olive green, burnt orange", + "palette\\rainbow brights\\red, orange color, yellow, green, blue, purple", + "palette\\retro pop\\hot pink, turquoise color, lemon yellow, lime green, bright orange", + "palette\\romantic evening\\soft gray, dusty rose color, deep purple, charcoal gray, black", + "palette\\romantic roses\\pale pink, soft green, blush, dusty lavender color, cream color", + "palette\\rustic charm\\burnt orange, mustard yellow, soft green, deep red, brown", + "palette\\seaside escape\\pale blue, seafoam green, sandy beige, coral pink, white", + "palette\\soft and subtle\\beige, cream color, soft gray, pale pink, sky blue", + "palette\\soothing hues\\light blue, pale pink, soft green, lavender color, cream color", + "palette\\spring blooms\\pale pink, lavender color, soft green, coral pink, yellow", + "palette\\spring garden\\lavender color, pale pink, butter yellow, light green, soft blue", + "palette\\starry night\\navy blue, black, silver gray, pale blue, white", + "palette\\summer sorbet\\lemon yellow, tangerine orange, raspberry pink, lime green, sky blue", + "palette\\summer sunshine\\sunshine yellow, coral pink, turquoise color, lavender color, ivory color", + "palette\\sunset at the beach\\coral pink, peach color, sky blue, sand color, burnt orange", + "palette\\sunset dreams\\peach color, coral pink, burnt orange, pale yellow, lilac purple", + "palette\\vintage beach\\dusty blue, beige, coral pink, pale yellow, cream color", + "palette\\vintage rose\\dusty rose color, sage green, cream color, wine red, charcoal gray", + "palette\\wildflower fields\\lavender color, pale pink, soft green, yellow, coral", + "palette\\winter wonderland\\icy blue, snowy white, silver gray, dark green, ruby red", + "palette\\winter woods\\forest green, cranberry red, champagne gold color, slate blue, pale gray", + "a specific color tone" +] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 9567aa8..f0de91d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui-jakeupgrade" description = "ComfyUI workflow customization by Jake." -version = "2.2.2" +version = "2.2.3" license = {file = "LICENSE"} dependencies = ["opencv-python", "piexif", "torch", "torchvision", "numpy", "pillow", "simpleeval", "functools", "PyYAML", "toml"] diff --git a/replacement/ComfyUI_IPAdapter_plus/IPAdapterPlus.py b/replacement/ComfyUI_IPAdapter_plus/IPAdapterPlus.py deleted file mode 100644 index a16f1c3..0000000 --- a/replacement/ComfyUI_IPAdapter_plus/IPAdapterPlus.py +++ /dev/null @@ -1,2059 +0,0 @@ -import torch -import os -import math -import folder_paths -import copy - -import comfy.model_management as model_management -from node_helpers import conditioning_set_values -from comfy.clip_vision import load as load_clip_vision -from comfy.sd import load_lora_for_models -import comfy.utils - -import torch.nn as nn -from PIL import Image -try: - import torchvision.transforms.v2 as T -except ImportError: - import torchvision.transforms as T - -from .image_proj_models import MLPProjModel, MLPProjModelFaceId, ProjModelFaceIdPlus, Resampler, ImageProjModel -from .CrossAttentionPatch import Attn2Replace, ipadapter_attention -from .utils import ( - encode_image_masked, - tensor_to_size, - contrast_adaptive_sharpening, - tensor_to_image, - image_to_tensor, - ipadapter_model_loader, - insightface_loader, - get_clipvision_file, - get_ipadapter_file, - get_lora_file, -) - -# set the models directory -if "ipadapter" not in folder_paths.folder_names_and_paths: - current_paths = [os.path.join(folder_paths.models_dir, "ipadapter")] -else: - current_paths, _ = folder_paths.folder_names_and_paths["ipadapter"] -folder_paths.folder_names_and_paths["ipadapter"] = (current_paths, folder_paths.supported_pt_extensions) - -WEIGHT_TYPES = ["linear", "ease in", "ease out", 'ease in-out', 'reverse in-out', 'weak input', 'weak output', 'weak middle', 'strong middle', 'style transfer', 'composition', 'strong style transfer', 'style and composition', 'style transfer precise', 'composition precise'] - -""" -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Main IPAdapter Class -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -""" -class IPAdapter(nn.Module): - def __init__(self, ipadapter_model, cross_attention_dim=1024, output_cross_attention_dim=1024, clip_embeddings_dim=1024, clip_extra_context_tokens=4, is_sdxl=False, is_plus=False, is_full=False, is_faceid=False, is_portrait_unnorm=False, is_kwai_kolors=False, encoder_hid_proj=None, weight_kolors=1.0): - super().__init__() - - self.clip_embeddings_dim = clip_embeddings_dim - self.cross_attention_dim = cross_attention_dim - self.output_cross_attention_dim = output_cross_attention_dim - self.clip_extra_context_tokens = clip_extra_context_tokens - self.is_sdxl = is_sdxl - self.is_full = is_full - self.is_plus = is_plus - self.is_portrait_unnorm = is_portrait_unnorm - self.is_kwai_kolors = is_kwai_kolors - - if is_faceid and not is_portrait_unnorm: - self.image_proj_model = self.init_proj_faceid() - elif is_full: - self.image_proj_model = self.init_proj_full() - elif is_plus or is_portrait_unnorm: - self.image_proj_model = self.init_proj_plus() - else: - self.image_proj_model = self.init_proj() - - self.image_proj_model.load_state_dict(ipadapter_model["image_proj"]) - self.ip_layers = To_KV(ipadapter_model["ip_adapter"], encoder_hid_proj=encoder_hid_proj, weight_kolors=weight_kolors) - - self.multigpu_clones = {} - - def create_multigpu_clone(self, device): - if device not in self.multigpu_clones: - orig_multigpu_clones = self.multigpu_clones - try: - self.multigpu_clones = {} - new_clone = copy.deepcopy(self) - new_clone = new_clone.to(device) - orig_multigpu_clones[device] = new_clone - finally: - self.multigpu_clones = orig_multigpu_clones - - def get_multigpu_clone(self, device): - return self.multigpu_clones.get(device, self) - - def init_proj(self): - image_proj_model = ImageProjModel( - cross_attention_dim=self.cross_attention_dim, - clip_embeddings_dim=self.clip_embeddings_dim, - clip_extra_context_tokens=self.clip_extra_context_tokens - ) - return image_proj_model - - def init_proj_plus(self): - image_proj_model = Resampler( - dim=self.cross_attention_dim, - depth=4, - dim_head=64, - heads=20 if self.is_sdxl and not self.is_kwai_kolors else 12, - num_queries=self.clip_extra_context_tokens, - embedding_dim=self.clip_embeddings_dim, - output_dim=self.output_cross_attention_dim, - ff_mult=4 - ) - return image_proj_model - - def init_proj_full(self): - image_proj_model = MLPProjModel( - cross_attention_dim=self.cross_attention_dim, - clip_embeddings_dim=self.clip_embeddings_dim - ) - return image_proj_model - - def init_proj_faceid(self): - if self.is_plus: - image_proj_model = ProjModelFaceIdPlus( - cross_attention_dim=self.cross_attention_dim, - id_embeddings_dim=512, - clip_embeddings_dim=self.clip_embeddings_dim, - num_tokens=self.clip_extra_context_tokens, - ) - else: - image_proj_model = MLPProjModelFaceId( - cross_attention_dim=self.cross_attention_dim, - id_embeddings_dim=512, - num_tokens=self.clip_extra_context_tokens, - ) - return image_proj_model - - @torch.inference_mode() - def get_image_embeds(self, clip_embed, clip_embed_zeroed, batch_size): - torch_device = model_management.get_torch_device() - intermediate_device = model_management.intermediate_device() - - if batch_size == 0: - batch_size = clip_embed.shape[0] - intermediate_device = torch_device - elif batch_size > clip_embed.shape[0]: - batch_size = clip_embed.shape[0] - - clip_embed = torch.split(clip_embed, batch_size, dim=0) - clip_embed_zeroed = torch.split(clip_embed_zeroed, batch_size, dim=0) - - image_prompt_embeds = [] - uncond_image_prompt_embeds = [] - - for ce, cez in zip(clip_embed, clip_embed_zeroed): - image_prompt_embeds.append(self.image_proj_model(ce.to(torch_device)).to(intermediate_device)) - uncond_image_prompt_embeds.append(self.image_proj_model(cez.to(torch_device)).to(intermediate_device)) - - del clip_embed, clip_embed_zeroed - - image_prompt_embeds = torch.cat(image_prompt_embeds, dim=0) - uncond_image_prompt_embeds = torch.cat(uncond_image_prompt_embeds, dim=0) - - torch.cuda.empty_cache() - - #image_prompt_embeds = self.image_proj_model(clip_embed) - #uncond_image_prompt_embeds = self.image_proj_model(clip_embed_zeroed) - return image_prompt_embeds, uncond_image_prompt_embeds - - @torch.inference_mode() - def get_image_embeds_faceid_plus(self, face_embed, clip_embed, s_scale, shortcut, batch_size): - torch_device = model_management.get_torch_device() - intermediate_device = model_management.intermediate_device() - - if batch_size == 0: - batch_size = clip_embed.shape[0] - intermediate_device = torch_device - elif batch_size > clip_embed.shape[0]: - batch_size = clip_embed.shape[0] - - face_embed_batch = torch.split(face_embed, batch_size, dim=0) - clip_embed_batch = torch.split(clip_embed, batch_size, dim=0) - - embeds = [] - for face_embed, clip_embed in zip(face_embed_batch, clip_embed_batch): - embeds.append(self.image_proj_model(face_embed.to(torch_device), clip_embed.to(torch_device), scale=s_scale, shortcut=shortcut).to(intermediate_device)) - - embeds = torch.cat(embeds, dim=0) - del face_embed_batch, clip_embed_batch - torch.cuda.empty_cache() - #embeds = self.image_proj_model(face_embed, clip_embed, scale=s_scale, shortcut=shortcut) - return embeds - -class To_KV(nn.Module): - def __init__(self, state_dict, encoder_hid_proj=None, weight_kolors=1.0): - super().__init__() - - if encoder_hid_proj is not None: - hid_proj = nn.Linear(encoder_hid_proj["weight"].shape[1], encoder_hid_proj["weight"].shape[0], bias=True) - hid_proj.weight.data = encoder_hid_proj["weight"] * weight_kolors - hid_proj.bias.data = encoder_hid_proj["bias"] * weight_kolors - - self.to_kvs = nn.ModuleDict() - for key, value in state_dict.items(): - if encoder_hid_proj is not None: - linear_proj = nn.Linear(value.shape[1], value.shape[0], bias=False) - linear_proj.weight.data = value - self.to_kvs[key.replace(".weight", "").replace(".", "_")] = nn.Sequential(hid_proj, linear_proj) - else: - self.to_kvs[key.replace(".weight", "").replace(".", "_")] = nn.Linear(value.shape[1], value.shape[0], bias=False) - self.to_kvs[key.replace(".weight", "").replace(".", "_")].weight.data = value - -def set_model_patch_replace(model, patch_kwargs, key): - to = model.model_options["transformer_options"].copy() - if "patches_replace" not in to: - to["patches_replace"] = {} - else: - to["patches_replace"] = to["patches_replace"].copy() - - if "attn2" not in to["patches_replace"]: - to["patches_replace"]["attn2"] = {} - else: - to["patches_replace"]["attn2"] = to["patches_replace"]["attn2"].copy() - - if key not in to["patches_replace"]["attn2"]: - to["patches_replace"]["attn2"][key] = Attn2Replace(ipadapter_attention, **patch_kwargs) - model.model_options["transformer_options"] = to - else: - to["patches_replace"]["attn2"][key].add(ipadapter_attention, **patch_kwargs) - -def ipadapter_execute(model, - ipadapter, - clipvision, - insightface=None, - image=None, - image_composition=None, - image_negative=None, - weight=1.0, - weight_composition=1.0, - weight_faceidv2=None, - weight_kolors=1.0, - weight_type="linear", - combine_embeds="concat", - start_at=0.0, - end_at=1.0, - attn_mask=None, - pos_embed=None, - neg_embed=None, - unfold_batch=False, - embeds_scaling='V only', - layer_weights=None, - encode_batch_size=0, - style_boost=None, - composition_boost=None, - enhance_tiles=1, - enhance_ratio=1.0,): - device = model_management.get_torch_device() - dtype = model_management.unet_dtype() - if dtype not in [torch.float32, torch.float16, torch.bfloat16]: - dtype = torch.float16 if model_management.should_use_fp16() else torch.float32 - - is_full = "proj.3.weight" in ipadapter["image_proj"] - is_portrait_unnorm = "portraitunnorm" in ipadapter - is_plus = (is_full or "latents" in ipadapter["image_proj"] or "perceiver_resampler.proj_in.weight" in ipadapter["image_proj"]) and not is_portrait_unnorm - output_cross_attention_dim = ipadapter["ip_adapter"]["1.to_k_ip.weight"].shape[1] - is_sdxl = output_cross_attention_dim == 2048 - is_kwai_kolors_faceid = "perceiver_resampler.layers.0.0.to_out.weight" in ipadapter["image_proj"] and ipadapter["image_proj"]["perceiver_resampler.layers.0.0.to_out.weight"].shape[0] == 4096 - is_faceidv2 = "faceidplusv2" in ipadapter or is_kwai_kolors_faceid - is_kwai_kolors = (is_sdxl and "layers.0.0.to_out.weight" in ipadapter["image_proj"] and ipadapter["image_proj"]["layers.0.0.to_out.weight"].shape[0] == 2048) or is_kwai_kolors_faceid - is_portrait = "proj.2.weight" in ipadapter["image_proj"] and not "proj.3.weight" in ipadapter["image_proj"] and not "0.to_q_lora.down.weight" in ipadapter["ip_adapter"] and not is_kwai_kolors_faceid - is_faceid = is_portrait or "0.to_q_lora.down.weight" in ipadapter["ip_adapter"] or is_portrait_unnorm or is_kwai_kolors_faceid - - if is_faceid and not insightface: - raise Exception("insightface model is required for FaceID models") - - if is_faceidv2: - weight_faceidv2 = weight_faceidv2 if weight_faceidv2 is not None else weight*2 - - if is_kwai_kolors_faceid: - cross_attention_dim = 4096 - elif is_kwai_kolors: - cross_attention_dim = 2048 - elif (is_plus and is_sdxl and not is_faceid) or is_portrait_unnorm: - cross_attention_dim = 1280 - else: - cross_attention_dim = output_cross_attention_dim - - if is_kwai_kolors_faceid: - clip_extra_context_tokens = 6 - elif (is_plus and not is_faceid) or is_portrait or is_portrait_unnorm: - clip_extra_context_tokens = 16 - else: - clip_extra_context_tokens = 4 - - if image is not None and image.shape[1] != image.shape[2]: - print("\033[33mINFO: the IPAdapter reference image is not a square, CLIPImageProcessor will resize and crop it at the center. If the main focus of the picture is not in the middle the result might not be what you are expecting.\033[0m") - - if isinstance(weight, list): - weight = torch.tensor(weight).unsqueeze(-1).unsqueeze(-1).to(device, dtype=dtype) if unfold_batch else weight[0] - - if style_boost is not None: - weight_type = "style transfer precise" - elif composition_boost is not None: - weight_type = "composition precise" - - # special weight types - if layer_weights is not None and layer_weights != '': - weight = { int(k): float(v)*weight for k, v in [x.split(":") for x in layer_weights.split(",")] } - weight_type = weight_type if weight_type == "style transfer precise" or weight_type == "composition precise" else "linear" - elif weight_type == "style transfer": - weight = { 6:weight } if is_sdxl else { 0:weight, 1:weight, 2:weight, 3:weight, 9:weight, 10:weight, 11:weight, 12:weight, 13:weight, 14:weight, 15:weight } - elif weight_type == "composition": - weight = { 3:weight } if is_sdxl else { 4:weight*0.25, 5:weight } - elif weight_type == "strong style transfer": - if is_sdxl: - weight = { 0:weight, 1:weight, 2:weight, 4:weight, 5:weight, 6:weight, 7:weight, 8:weight, 9:weight, 10:weight } - else: - weight = { 0:weight, 1:weight, 2:weight, 3:weight, 6:weight, 7:weight, 8:weight, 9:weight, 10:weight, 11:weight, 12:weight, 13:weight, 14:weight, 15:weight } - elif weight_type == "style and composition": - if is_sdxl: - weight = { 3:weight_composition, 6:weight } - else: - weight = { 0:weight, 1:weight, 2:weight, 3:weight, 4:weight_composition*0.25, 5:weight_composition, 9:weight, 10:weight, 11:weight, 12:weight, 13:weight, 14:weight, 15:weight } - elif weight_type == "strong style and composition": - if is_sdxl: - weight = { 0:weight, 1:weight, 2:weight, 3:weight_composition, 4:weight, 5:weight, 6:weight, 7:weight, 8:weight, 9:weight, 10:weight } - else: - weight = { 0:weight, 1:weight, 2:weight, 3:weight, 4:weight_composition, 5:weight_composition, 6:weight, 7:weight, 8:weight, 9:weight, 10:weight, 11:weight, 12:weight, 13:weight, 14:weight, 15:weight } - elif weight_type == "style transfer precise": - weight_composition = style_boost if style_boost is not None else weight - if is_sdxl: - weight = { 3:weight_composition, 6:weight } - else: - weight = { 0:weight, 1:weight, 2:weight, 3:weight, 4:weight_composition*0.25, 5:weight_composition, 9:weight, 10:weight, 11:weight, 12:weight, 13:weight, 14:weight, 15:weight } - elif weight_type == "composition precise": - weight_composition = weight - weight = composition_boost if composition_boost is not None else weight - if is_sdxl: - weight = { 0:weight*.1, 1:weight*.1, 2:weight*.1, 3:weight_composition, 4:weight*.1, 5:weight*.1, 6:weight, 7:weight*.1, 8:weight*.1, 9:weight*.1, 10:weight*.1 } - else: - weight = { 0:weight, 1:weight, 2:weight, 3:weight, 4:weight_composition*0.25, 5:weight_composition, 6:weight*.1, 7:weight*.1, 8:weight*.1, 9:weight, 10:weight, 11:weight, 12:weight, 13:weight, 14:weight, 15:weight } - - clipvision_size = 224 if not is_kwai_kolors else 336 - - img_comp_cond_embeds = None - face_cond_embeds = None - if is_faceid: - if insightface is None: - raise Exception("Insightface model is required for FaceID models") - - from insightface.utils import face_align - - insightface.det_model.input_size = (640,640) # reset the detection size - image_iface = tensor_to_image(image) - face_cond_embeds = [] - image = [] - - for i in range(image_iface.shape[0]): - for size in [(size, size) for size in range(640, 256, -64)]: - insightface.det_model.input_size = size # TODO: hacky but seems to be working - face = insightface.get(image_iface[i]) - if face: - if not is_portrait_unnorm: - face_cond_embeds.append(torch.from_numpy(face[0].normed_embedding).unsqueeze(0)) - else: - face_cond_embeds.append(torch.from_numpy(face[0].embedding).unsqueeze(0)) - image.append(image_to_tensor(face_align.norm_crop(image_iface[i], landmark=face[0].kps, image_size=336 if is_kwai_kolors_faceid else 256 if is_sdxl else 224))) - - if 640 not in size: - print(f"\033[33mINFO: InsightFace detection resolution lowered to {size}.\033[0m") - break - else: - raise Exception('InsightFace: No face detected.') - face_cond_embeds = torch.stack(face_cond_embeds).to(device, dtype=dtype) - image = torch.stack(image) - del image_iface, face - - if image is not None: - img_cond_embeds = encode_image_masked(clipvision, image, batch_size=encode_batch_size, tiles=enhance_tiles, ratio=enhance_ratio, clipvision_size=clipvision_size) - if image_composition is not None: - img_comp_cond_embeds = encode_image_masked(clipvision, image_composition, batch_size=encode_batch_size, tiles=enhance_tiles, ratio=enhance_ratio, clipvision_size=clipvision_size) - - if is_plus: - img_cond_embeds = img_cond_embeds.penultimate_hidden_states - image_negative = image_negative if image_negative is not None else torch.zeros([1, clipvision_size, clipvision_size, 3]) - img_uncond_embeds = encode_image_masked(clipvision, image_negative, batch_size=encode_batch_size, clipvision_size=clipvision_size).penultimate_hidden_states - if image_composition is not None: - img_comp_cond_embeds = img_comp_cond_embeds.penultimate_hidden_states - else: - img_cond_embeds = img_cond_embeds.image_embeds if not is_faceid else face_cond_embeds - if image_negative is not None and not is_faceid: - img_uncond_embeds = encode_image_masked(clipvision, image_negative, batch_size=encode_batch_size, clipvision_size=clipvision_size).image_embeds - else: - img_uncond_embeds = torch.zeros_like(img_cond_embeds) - if image_composition is not None: - img_comp_cond_embeds = img_comp_cond_embeds.image_embeds - del image_negative, image_composition - - image = None if not is_faceid else image # if it's face_id we need the cropped face for later - elif pos_embed is not None: - img_cond_embeds = pos_embed - - if neg_embed is not None: - img_uncond_embeds = neg_embed - else: - if is_plus: - img_uncond_embeds = encode_image_masked(clipvision, torch.zeros([1, clipvision_size, clipvision_size, 3]), clipvision_size=clipvision_size).penultimate_hidden_states - else: - img_uncond_embeds = torch.zeros_like(img_cond_embeds) - del pos_embed, neg_embed - else: - raise Exception("Images or Embeds are required") - - # ensure that cond and uncond have the same batch size - img_uncond_embeds = tensor_to_size(img_uncond_embeds, img_cond_embeds.shape[0]) - - img_cond_embeds = img_cond_embeds.to(device, dtype=dtype) - img_uncond_embeds = img_uncond_embeds.to(device, dtype=dtype) - if img_comp_cond_embeds is not None: - img_comp_cond_embeds = img_comp_cond_embeds.to(device, dtype=dtype) - - # combine the embeddings if needed - if combine_embeds != "concat" and img_cond_embeds.shape[0] > 1 and not unfold_batch: - if combine_embeds == "add": - img_cond_embeds = torch.sum(img_cond_embeds, dim=0).unsqueeze(0) - if face_cond_embeds is not None: - face_cond_embeds = torch.sum(face_cond_embeds, dim=0).unsqueeze(0) - if img_comp_cond_embeds is not None: - img_comp_cond_embeds = torch.sum(img_comp_cond_embeds, dim=0).unsqueeze(0) - elif combine_embeds == "subtract": - img_cond_embeds = img_cond_embeds[0] - torch.mean(img_cond_embeds[1:], dim=0) - img_cond_embeds = img_cond_embeds.unsqueeze(0) - if face_cond_embeds is not None: - face_cond_embeds = face_cond_embeds[0] - torch.mean(face_cond_embeds[1:], dim=0) - face_cond_embeds = face_cond_embeds.unsqueeze(0) - if img_comp_cond_embeds is not None: - img_comp_cond_embeds = img_comp_cond_embeds[0] - torch.mean(img_comp_cond_embeds[1:], dim=0) - img_comp_cond_embeds = img_comp_cond_embeds.unsqueeze(0) - elif combine_embeds == "average": - img_cond_embeds = torch.mean(img_cond_embeds, dim=0).unsqueeze(0) - if face_cond_embeds is not None: - face_cond_embeds = torch.mean(face_cond_embeds, dim=0).unsqueeze(0) - if img_comp_cond_embeds is not None: - img_comp_cond_embeds = torch.mean(img_comp_cond_embeds, dim=0).unsqueeze(0) - elif combine_embeds == "norm average": - img_cond_embeds = torch.mean(img_cond_embeds / torch.norm(img_cond_embeds, dim=0, keepdim=True), dim=0).unsqueeze(0) - if face_cond_embeds is not None: - face_cond_embeds = torch.mean(face_cond_embeds / torch.norm(face_cond_embeds, dim=0, keepdim=True), dim=0).unsqueeze(0) - if img_comp_cond_embeds is not None: - img_comp_cond_embeds = torch.mean(img_comp_cond_embeds / torch.norm(img_comp_cond_embeds, dim=0, keepdim=True), dim=0).unsqueeze(0) - img_uncond_embeds = img_uncond_embeds[0].unsqueeze(0) # TODO: better strategy for uncond could be to average them - - if attn_mask is not None: - attn_mask = attn_mask.to(device, dtype=dtype) - - encoder_hid_proj = None - - if is_kwai_kolors_faceid and hasattr(model.model, "diffusion_model") and hasattr(model.model.diffusion_model, "encoder_hid_proj"): - encoder_hid_proj = model.model.diffusion_model.encoder_hid_proj.state_dict() - - ipa = IPAdapter( - ipadapter, - cross_attention_dim=cross_attention_dim, - output_cross_attention_dim=output_cross_attention_dim, - clip_embeddings_dim=img_cond_embeds.shape[-1], - clip_extra_context_tokens=clip_extra_context_tokens, - is_sdxl=is_sdxl, - is_plus=is_plus, - is_full=is_full, - is_faceid=is_faceid, - is_portrait_unnorm=is_portrait_unnorm, - is_kwai_kolors=is_kwai_kolors, - encoder_hid_proj=encoder_hid_proj, - weight_kolors=weight_kolors - ).to(device, dtype=dtype) - - if is_faceid and is_plus: - cond = ipa.get_image_embeds_faceid_plus(face_cond_embeds, img_cond_embeds, weight_faceidv2, is_faceidv2, encode_batch_size) - # TODO: check if noise helps with the uncond face embeds - uncond = ipa.get_image_embeds_faceid_plus(torch.zeros_like(face_cond_embeds), img_uncond_embeds, weight_faceidv2, is_faceidv2, encode_batch_size) - else: - cond, uncond = ipa.get_image_embeds(img_cond_embeds, img_uncond_embeds, encode_batch_size) - if img_comp_cond_embeds is not None: - cond_comp = ipa.get_image_embeds(img_comp_cond_embeds, img_uncond_embeds, encode_batch_size)[0] - - cond = cond.to(device, dtype=dtype) - uncond = uncond.to(device, dtype=dtype) - - cond_alt = None - if img_comp_cond_embeds is not None: - cond_alt = { 3: cond_comp.to(device, dtype=dtype) } - - del img_cond_embeds, img_uncond_embeds, img_comp_cond_embeds, face_cond_embeds - - sigma_start = model.get_model_object("model_sampling").percent_to_sigma(start_at) - sigma_end = model.get_model_object("model_sampling").percent_to_sigma(end_at) - - patch_kwargs = { - "ipadapter": ipa, - "weight": weight, - "cond": cond, - "cond_alt": cond_alt, - "uncond": uncond, - "weight_type": weight_type, - "mask": attn_mask, - "sigma_start": sigma_start, - "sigma_end": sigma_end, - "unfold_batch": unfold_batch, - "embeds_scaling": embeds_scaling, - } - - number = 0 - if not is_sdxl: - for id in [1,2,4,5,7,8]: # id of input_blocks that have cross attention - patch_kwargs["module_key"] = str(number*2+1) - set_model_patch_replace(model, patch_kwargs, ("input", id)) - number += 1 - for id in [3,4,5,6,7,8,9,10,11]: # id of output_blocks that have cross attention - patch_kwargs["module_key"] = str(number*2+1) - set_model_patch_replace(model, patch_kwargs, ("output", id)) - number += 1 - patch_kwargs["module_key"] = str(number*2+1) - set_model_patch_replace(model, patch_kwargs, ("middle", 1)) - else: - for id in [4,5,7,8]: # id of input_blocks that have cross attention - block_indices = range(2) if id in [4, 5] else range(10) # transformer_depth - for index in block_indices: - patch_kwargs["module_key"] = str(number*2+1) - set_model_patch_replace(model, patch_kwargs, ("input", id, index)) - number += 1 - for id in range(6): # id of output_blocks that have cross attention - block_indices = range(2) if id in [3, 4, 5] else range(10) # transformer_depth - for index in block_indices: - patch_kwargs["module_key"] = str(number*2+1) - set_model_patch_replace(model, patch_kwargs, ("output", id, index)) - number += 1 - for index in range(10): - patch_kwargs["module_key"] = str(number*2+1) - set_model_patch_replace(model, patch_kwargs, ("middle", 1, index)) - number += 1 - - return (model, image) - -""" -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Loaders -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -""" -class IPAdapterUnifiedLoader: - def __init__(self): - self.lora = None - self.clipvision = { "file": None, "model": None } - self.ipadapter = { "file": None, "model": None } - self.insightface = { "provider": None, "model": None } - - @classmethod - def INPUT_TYPES(s): - return {"required": { - "model": ("MODEL", ), - "preset": (['None', 'LIGHT - SD1.5 only (low strength)', 'STANDARD (medium strength)', 'VIT-G (medium strength)', 'PLUS (high strength)', 'PLUS FACE (portraits)', 'FULL FACE - SD1.5 only (portraits stronger)'], ), - }, - "optional": { - "ipadapter": ("IPADAPTER", ), - }} - - RETURN_TYPES = ("MODEL", "IPADAPTER", ) - RETURN_NAMES = ("model", "ipadapter", ) - FUNCTION = "load_models" - CATEGORY = "ipadapter" - - def load_models(self, model, preset, lora_strength=0.0, provider="CPU", ipadapter=None): - pipeline = { "clipvision": { 'file': None, 'model': None }, "ipadapter": { 'file': None, 'model': None }, "insightface": { 'provider': None, 'model': None } } - - if preset == "None": - return (model, pipeline,) - else: - if ipadapter is not None: - pipeline = ipadapter - - if 'insightface' not in pipeline: - pipeline['insightface'] = { 'provider': None, 'model': None } - - if 'ipadapter' not in pipeline: - pipeline['ipadapter'] = { 'file': None, 'model': None } - - if 'clipvision' not in pipeline: - pipeline['clipvision'] = { 'file': None, 'model': None } - - # 1. Load the clipvision model - clipvision_file = get_clipvision_file(preset) - if clipvision_file is None: - raise Exception("ClipVision model not found.") - - if clipvision_file != self.clipvision['file']: - if clipvision_file != pipeline['clipvision']['file']: - self.clipvision['file'] = clipvision_file - self.clipvision['model'] = load_clip_vision(clipvision_file) - print(f"\033[33mINFO: Clip Vision model loaded from {clipvision_file}\033[0m") - else: - self.clipvision = pipeline['clipvision'] - - # 2. Load the ipadapter model - is_sdxl = isinstance(model.model, (comfy.model_base.SDXL, comfy.model_base.SDXLRefiner, comfy.model_base.SDXL_instructpix2pix)) - ipadapter_file, is_insightface, lora_pattern = get_ipadapter_file(preset, is_sdxl) - if ipadapter_file is None: - raise Exception("IPAdapter model not found.") - - if ipadapter_file != self.ipadapter['file']: - if pipeline['ipadapter']['file'] != ipadapter_file: - self.ipadapter['file'] = ipadapter_file - self.ipadapter['model'] = ipadapter_model_loader(ipadapter_file) - print(f"\033[33mINFO: IPAdapter model loaded from {ipadapter_file}\033[0m") - else: - self.ipadapter = pipeline['ipadapter'] - - # 3. Load the lora model if needed - if lora_pattern is not None: - lora_file = get_lora_file(lora_pattern) - lora_model = None - if lora_file is None: - raise Exception("LoRA model not found.") - - if self.lora is not None: - if lora_file == self.lora['file']: - lora_model = self.lora['model'] - else: - self.lora = None - torch.cuda.empty_cache() - - if lora_model is None: - lora_model = comfy.utils.load_torch_file(lora_file, safe_load=True) - self.lora = { 'file': lora_file, 'model': lora_model } - print(f"\033[33mINFO: LoRA model loaded from {lora_file}\033[0m") - - if lora_strength > 0: - model, _ = load_lora_for_models(model, None, lora_model, lora_strength, 0) - - # 4. Load the insightface model if needed - if is_insightface: - if provider != self.insightface['provider']: - if pipeline['insightface']['provider'] != provider: - self.insightface['provider'] = provider - self.insightface['model'] = insightface_loader(provider) - print(f"\033[33mINFO: InsightFace model loaded with {provider} provider\033[0m") - else: - self.insightface = pipeline['insightface'] - - return (model, { 'clipvision': self.clipvision, 'ipadapter': self.ipadapter, 'insightface': self.insightface }, ) - -class IPAdapterUnifiedLoaderFaceID(IPAdapterUnifiedLoader): - @classmethod - def INPUT_TYPES(s): - return {"required": { - "model": ("MODEL", ), - "preset": (['None', 'FACEID', 'FACEID PLUS - SD1.5 only', 'FACEID PLUS V2', 'FACEID PORTRAIT (style transfer)', 'FACEID PORTRAIT UNNORM - SDXL only (strong)'], ), - "lora_strength": ("FLOAT", { "default": 0.6, "min": 0, "max": 1, "step": 0.01 }), - "provider": (["CPU", "CUDA", "ROCM", "DirectML", "OpenVINO", "CoreML"], ), - }, - "optional": { - "ipadapter": ("IPADAPTER", ), - }} - - RETURN_NAMES = ("MODEL", "ipadapter", ) - CATEGORY = "ipadapter/faceid" - -class IPAdapterUnifiedLoaderCommunity(IPAdapterUnifiedLoader): - @classmethod - def INPUT_TYPES(s): - return {"required": { - "model": ("MODEL", ), - "preset": (['None', 'Composition', 'Kolors'], ), - }, - "optional": { - "ipadapter": ("IPADAPTER", ), - }} - - CATEGORY = "ipadapter/loaders" - -class IPAdapterModelLoader: - @classmethod - def INPUT_TYPES(s): - return {"required": { "ipadapter_file": (folder_paths.get_filename_list("ipadapter"), )}} - - RETURN_TYPES = ("IPADAPTER",) - FUNCTION = "load_ipadapter_model" - CATEGORY = "ipadapter/loaders" - - def load_ipadapter_model(self, ipadapter_file): - ipadapter_file = folder_paths.get_full_path("ipadapter", ipadapter_file) - return (ipadapter_model_loader(ipadapter_file),) - -class IPAdapterInsightFaceLoader: - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "provider": (["CPU", "CUDA", "ROCM"], ), - "model_name": (['buffalo_l', 'antelopev2'], ) - }, - } - - RETURN_TYPES = ("INSIGHTFACE",) - FUNCTION = "load_insightface" - CATEGORY = "ipadapter/loaders" - - def load_insightface(self, provider, model_name): - return (insightface_loader(provider, model_name=model_name),) - -""" -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Main Apply Nodes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -""" -class IPAdapterSimple: - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 3, "step": 0.05 }), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "weight_type": (['standard', 'prompt is more important', 'style transfer'], ), - }, - "optional": { - "attn_mask": ("MASK",), - } - } - - RETURN_TYPES = ("MODEL",) - FUNCTION = "apply_ipadapter" - CATEGORY = "ipadapter" - - def apply_ipadapter(self, model, ipadapter, image, weight, start_at, end_at, weight_type, attn_mask=None): - if weight_type.startswith("style"): - weight_type = "style transfer" - elif weight_type == "prompt is more important": - weight_type = "ease out" - else: - weight_type = "linear" - - ipa_args = { - "image": image, - "weight": weight, - "start_at": start_at, - "end_at": end_at, - "attn_mask": attn_mask, - "weight_type": weight_type, - "insightface": ipadapter['insightface']['model'] if 'insightface' in ipadapter else None, - } - - if 'ipadapter' not in ipadapter: - raise Exception("IPAdapter model not present in the pipeline. Please load the models with the IPAdapterUnifiedLoader node.") - if 'clipvision' not in ipadapter: - raise Exception("CLIPVision model not present in the pipeline. Please load the models with the IPAdapterUnifiedLoader node.") - if ipadapter['ipadapter']['file'] == None or ipadapter['clipvision']['file'] == None: - return (model,) - else: - return ipadapter_execute(model.clone(), ipadapter['ipadapter']['model'], ipadapter['clipvision']['model'], **ipa_args) - -class IPAdapterAdvanced: - def __init__(self): - self.unfold_batch = False - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - - RETURN_TYPES = ("MODEL",) - FUNCTION = "apply_ipadapter" - CATEGORY = "ipadapter" - - def apply_ipadapter(self, model, ipadapter, start_at=0.0, end_at=1.0, weight=1.0, weight_style=1.0, weight_composition=1.0, expand_style=False, weight_type="linear", combine_embeds="concat", weight_faceidv2=None, image=None, image_style=None, image_composition=None, image_negative=None, clip_vision=None, attn_mask=None, insightface=None, embeds_scaling='V only', layer_weights=None, ipadapter_params=None, encode_batch_size=0, style_boost=None, composition_boost=None, enhance_tiles=1, enhance_ratio=1.0, weight_kolors=1.0): - is_sdxl = isinstance(model.model, (comfy.model_base.SDXL, comfy.model_base.SDXLRefiner, comfy.model_base.SDXL_instructpix2pix)) - - if 'ipadapter' in ipadapter and ipadapter['ipadapter']['file'] == None: - return (model,) - else: - if 'ipadapter' in ipadapter: - ipadapter_model = ipadapter['ipadapter']['model'] - clip_vision = clip_vision if clip_vision is not None else ipadapter['clipvision']['model'] - else: - ipadapter_model = ipadapter - - if clip_vision is None: - raise Exception("Missing CLIPVision model.") - - if image_style is not None: # we are doing style + composition transfer - if not is_sdxl: - raise Exception("Style + Composition transfer is only available for SDXL models at the moment.") # TODO: check feasibility for SD1.5 models - - image = image_style - weight = weight_style - if image_composition is None: - image_composition = image_style - - weight_type = "strong style and composition" if expand_style else "style and composition" - if ipadapter_params is not None: # we are doing batch processing - image = ipadapter_params['image'] - attn_mask = ipadapter_params['attn_mask'] - weight = ipadapter_params['weight'] - weight_type = ipadapter_params['weight_type'] - start_at = ipadapter_params['start_at'] - end_at = ipadapter_params['end_at'] - else: - # at this point weight can be a list from the batch-weight or a single float - weight = [weight] - - image = image if isinstance(image, list) else [image] - - work_model = model.clone() - - for i in range(len(image)): - if image[i] is None: - continue - - ipa_args = { - "image": image[i], - "image_composition": image_composition, - "image_negative": image_negative, - "weight": weight[i], - "weight_composition": weight_composition, - "weight_faceidv2": weight_faceidv2, - "weight_type": weight_type if not isinstance(weight_type, list) else weight_type[i], - "combine_embeds": combine_embeds, - "start_at": start_at if not isinstance(start_at, list) else start_at[i], - "end_at": end_at if not isinstance(end_at, list) else end_at[i], - "attn_mask": attn_mask if not isinstance(attn_mask, list) else attn_mask[i], - "unfold_batch": self.unfold_batch, - "embeds_scaling": embeds_scaling, - "insightface": insightface if insightface is not None else ipadapter['insightface']['model'] if 'insightface' in ipadapter else None, - "layer_weights": layer_weights, - "encode_batch_size": encode_batch_size, - "style_boost": style_boost, - "composition_boost": composition_boost, - "enhance_tiles": enhance_tiles, - "enhance_ratio": enhance_ratio, - "weight_kolors": weight_kolors, - } - - work_model, face_image = ipadapter_execute(work_model, ipadapter_model, clip_vision, **ipa_args) - - del ipadapter - return (work_model, face_image, ) - -class IPAdapterBatch(IPAdapterAdvanced): - def __init__(self): - self.unfold_batch = True - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - "encode_batch_size": ("INT", { "default": 0, "min": 0, "max": 4096 }), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - -class IPAdapterStyleComposition(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image_style": ("IMAGE",), - "image_composition": ("IMAGE",), - "weight_style": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "weight_composition": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "expand_style": ("BOOLEAN", { "default": False }), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"], {"default": "average"}), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - - CATEGORY = "ipadapter/style_composition" - -class IPAdapterStyleCompositionBatch(IPAdapterStyleComposition): - def __init__(self): - self.unfold_batch = True - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image_style": ("IMAGE",), - "image_composition": ("IMAGE",), - "weight_style": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "weight_composition": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "expand_style": ("BOOLEAN", { "default": False }), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - -class IPAdapterFaceID(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 3, "step": 0.05 }), - "weight_faceidv2": ("FLOAT", { "default": 1.0, "min": -1, "max": 5.0, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - "insightface": ("INSIGHTFACE",), - } - } - - CATEGORY = "ipadapter/faceid" - RETURN_TYPES = ("MODEL","IMAGE",) - RETURN_NAMES = ("MODEL", "face_image", ) - -class IPAAdapterFaceIDBatch(IPAdapterFaceID): - def __init__(self): - self.unfold_batch = True - -class IPAdapterFaceIDKolors(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 3, "step": 0.05 }), - "weight_faceidv2": ("FLOAT", { "default": 1.0, "min": -1, "max": 5.0, "step": 0.05 }), - "weight_kolors": ("FLOAT", { "default": 1.0, "min": -1, "max": 5.0, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - "insightface": ("INSIGHTFACE",), - } - } - - CATEGORY = "ipadapter/faceid" - RETURN_TYPES = ("MODEL","IMAGE",) - RETURN_NAMES = ("MODEL", "face_image", ) - -class IPAdapterTiled: - def __init__(self): - self.unfold_batch = False - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 3, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "sharpening": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - - RETURN_TYPES = ("MODEL", "IMAGE", "MASK", ) - RETURN_NAMES = ("MODEL", "tiles", "masks", ) - FUNCTION = "apply_tiled" - CATEGORY = "ipadapter/tiled" - - def apply_tiled(self, model, ipadapter, image, weight, weight_type, start_at, end_at, sharpening, combine_embeds="concat", image_negative=None, attn_mask=None, clip_vision=None, embeds_scaling='V only', encode_batch_size=0): - - if 'ipadapter' in ipadapter and ipadapter['ipadapter']['file'] == None: - return (model,) - else: - # 1. Select the models - if 'ipadapter' in ipadapter: - ipadapter_model = ipadapter['ipadapter']['model'] - clip_vision = clip_vision if clip_vision is not None else ipadapter['clipvision']['model'] - else: - ipadapter_model = ipadapter - clip_vision = clip_vision - - if clip_vision is None: - raise Exception("Missing CLIPVision model.") - - del ipadapter - - # 2. Extract the tiles - tile_size = 256 # I'm using 256 instead of 224 as it is more likely divisible by the latent size, it will be downscaled to 224 by the clip vision encoder - _, oh, ow, _ = image.shape - if attn_mask is None: - attn_mask = torch.ones([1, oh, ow], dtype=image.dtype, device=image.device) - - image = image.permute([0,3,1,2]) - attn_mask = attn_mask.unsqueeze(1) - # the mask should have the same proportions as the reference image and the latent - attn_mask = T.Resize((oh, ow), interpolation=T.InterpolationMode.BICUBIC, antialias=True)(attn_mask) - - # if the image is almost a square, we crop it to a square - if oh / ow > 0.75 and oh / ow < 1.33: - # crop the image to a square - image = T.CenterCrop(min(oh, ow))(image) - resize = (tile_size*2, tile_size*2) - - attn_mask = T.CenterCrop(min(oh, ow))(attn_mask) - # otherwise resize the smallest side and the other proportionally - else: - resize = (int(tile_size * ow / oh), tile_size) if oh < ow else (tile_size, int(tile_size * oh / ow)) - - # using PIL for better results - imgs = [] - for img in image: - img = T.ToPILImage()(img) - img = img.resize(resize, resample=Image.Resampling['LANCZOS']) - imgs.append(T.ToTensor()(img)) - image = torch.stack(imgs) - del imgs, img - - # we don't need a high quality resize for the mask - attn_mask = T.Resize(resize[::-1], interpolation=T.InterpolationMode.BICUBIC, antialias=True)(attn_mask) - - # we allow a maximum of 4 tiles - if oh / ow > 4 or oh / ow < 0.25: - crop = (tile_size, tile_size*4) if oh < ow else (tile_size*4, tile_size) - image = T.CenterCrop(crop)(image) - attn_mask = T.CenterCrop(crop)(attn_mask) - - attn_mask = attn_mask.squeeze(1) - - if sharpening > 0: - image = contrast_adaptive_sharpening(image, sharpening) - - image = image.permute([0,2,3,1]) - - _, oh, ow, _ = image.shape - - # find the number of tiles for each side - tiles_x = math.ceil(ow / tile_size) - tiles_y = math.ceil(oh / tile_size) - overlap_x = max(0, (tiles_x * tile_size - ow) / (tiles_x - 1 if tiles_x > 1 else 1)) - overlap_y = max(0, (tiles_y * tile_size - oh) / (tiles_y - 1 if tiles_y > 1 else 1)) - - base_mask = torch.zeros([attn_mask.shape[0], oh, ow], dtype=image.dtype, device=image.device) - - # extract all the tiles from the image and create the masks - tiles = [] - masks = [] - for y in range(tiles_y): - for x in range(tiles_x): - start_x = int(x * (tile_size - overlap_x)) - start_y = int(y * (tile_size - overlap_y)) - tiles.append(image[:, start_y:start_y+tile_size, start_x:start_x+tile_size, :]) - mask = base_mask.clone() - mask[:, start_y:start_y+tile_size, start_x:start_x+tile_size] = attn_mask[:, start_y:start_y+tile_size, start_x:start_x+tile_size] - masks.append(mask) - del mask - - # 3. Apply the ipadapter to each group of tiles - model = model.clone() - for i in range(len(tiles)): - ipa_args = { - "image": tiles[i], - "image_negative": image_negative, - "weight": weight, - "weight_type": weight_type, - "combine_embeds": combine_embeds, - "start_at": start_at, - "end_at": end_at, - "attn_mask": masks[i], - "unfold_batch": self.unfold_batch, - "embeds_scaling": embeds_scaling, - "encode_batch_size": encode_batch_size, - } - # apply the ipadapter to the model without cloning it - model, _ = ipadapter_execute(model, ipadapter_model, clip_vision, **ipa_args) - - return (model, torch.cat(tiles), torch.cat(masks), ) - -class IPAdapterTiledBatch(IPAdapterTiled): - def __init__(self): - self.unfold_batch = True - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 3, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "sharpening": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - "encode_batch_size": ("INT", { "default": 0, "min": 0, "max": 4096 }), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - -class IPAdapterEmbeds: - def __init__(self): - self.unfold_batch = False - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "pos_embed": ("EMBEDS",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 3, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "neg_embed": ("EMBEDS",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - - RETURN_TYPES = ("MODEL",) - FUNCTION = "apply_ipadapter" - CATEGORY = "ipadapter/embeds" - - def apply_ipadapter(self, model, ipadapter, pos_embed, weight, weight_type, start_at, end_at, neg_embed=None, attn_mask=None, clip_vision=None, embeds_scaling='V only'): - ipa_args = { - "pos_embed": pos_embed, - "neg_embed": neg_embed, - "weight": weight, - "weight_type": weight_type, - "start_at": start_at, - "end_at": end_at, - "attn_mask": attn_mask, - "embeds_scaling": embeds_scaling, - "unfold_batch": self.unfold_batch, - } - - if 'ipadapter' in ipadapter and ipadapter['ipadapter']['file'] == None: - return (model,) - else: - if 'ipadapter' in ipadapter: - ipadapter_model = ipadapter['ipadapter']['model'] - clip_vision = clip_vision if clip_vision is not None else ipadapter['clipvision']['model'] - else: - ipadapter_model = ipadapter - clip_vision = clip_vision - - if clip_vision is None and neg_embed is None: - raise Exception("Missing CLIPVision model.") - - del ipadapter - - return ipadapter_execute(model.clone(), ipadapter_model, clip_vision, **ipa_args) - -class IPAdapterEmbedsBatch(IPAdapterEmbeds): - def __init__(self): - self.unfold_batch = True - -class IPAdapterMS(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "weight_faceidv2": ("FLOAT", { "default": 1.0, "min": -1, "max": 5.0, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - "layer_weights": ("STRING", { "default": "", "multiline": True }), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - "insightface": ("INSIGHTFACE",), - } - } - - CATEGORY = "ipadapter/dev" - -class IPAdapterClipVisionEnhancer(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - "enhance_tiles": ("INT", { "default": 2, "min": 1, "max": 16 }), - "enhance_ratio": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.05 }), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - - CATEGORY = "ipadapter/dev" - -class IPAdapterClipVisionEnhancerBatch(IPAdapterClipVisionEnhancer): - def __init__(self): - self.unfold_batch = True - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - "enhance_tiles": ("INT", { "default": 2, "min": 1, "max": 16 }), - "enhance_ratio": ("FLOAT", { "default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05 }), - "encode_batch_size": ("INT", { "default": 0, "min": 0, "max": 4096 }), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - -class IPAdapterFromParams(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "ipadapter_params": ("IPADAPTER_PARAMS", ), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "clip_vision": ("CLIP_VISION",), - } - } - - CATEGORY = "ipadapter/params" - -class IPAdapterPreciseStyleTransfer(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "style_boost": ("FLOAT", { "default": 1.0, "min": -5, "max": 5, "step": 0.05 }), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - -class IPAdapterPreciseStyleTransferBatch(IPAdapterPreciseStyleTransfer): - def __init__(self): - self.unfold_batch = True - -class IPAdapterPreciseComposition(IPAdapterAdvanced): - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "model": ("MODEL", ), - "ipadapter": ("IPADAPTER", ), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1, "max": 5, "step": 0.05 }), - "composition_boost": ("FLOAT", { "default": 0.0, "min": -5, "max": 5, "step": 0.05 }), - "combine_embeds": (["concat", "add", "subtract", "average", "norm average"],), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "embeds_scaling": (['V only', 'K+V', 'K+V w/ C penalty', 'K+mean(V) w/ C penalty'], ), - }, - "optional": { - "image_negative": ("IMAGE",), - "attn_mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - -class IPAdapterPreciseCompositionBatch(IPAdapterPreciseComposition): - def __init__(self): - self.unfold_batch = True - -""" -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Helpers -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -""" -class IPAdapterEncoder: - @classmethod - def INPUT_TYPES(s): - return {"required": { - "ipadapter": ("IPADAPTER",), - "image": ("IMAGE",), - "weight": ("FLOAT", { "default": 1.0, "min": -1.0, "max": 3.0, "step": 0.01 }), - }, - "optional": { - "mask": ("MASK",), - "clip_vision": ("CLIP_VISION",), - } - } - - RETURN_TYPES = ("EMBEDS", "EMBEDS",) - RETURN_NAMES = ("pos_embed", "neg_embed",) - FUNCTION = "encode" - CATEGORY = "ipadapter/embeds" - - def encode(self, ipadapter, image, weight, mask=None, clip_vision=None): - - if 'ipadapter' in ipadapter and ipadapter['ipadapter']['file'] == None: - return (None, None,) - else: - if 'ipadapter' in ipadapter: - ipadapter_model = ipadapter['ipadapter']['model'] - clip_vision = clip_vision if clip_vision is not None else ipadapter['clipvision']['model'] - else: - ipadapter_model = ipadapter - clip_vision = clip_vision - - if clip_vision is None: - raise Exception("Missing CLIPVision model.") - - is_plus = "proj.3.weight" in ipadapter_model["image_proj"] or "latents" in ipadapter_model["image_proj"] or "perceiver_resampler.proj_in.weight" in ipadapter_model["image_proj"] - is_kwai_kolors = is_plus and "layers.0.0.to_out.weight" in ipadapter_model["image_proj"] and ipadapter_model["image_proj"]["layers.0.0.to_out.weight"].shape[0] == 2048 - - clipvision_size = 224 if not is_kwai_kolors else 336 - - # resize and crop the mask to 224x224 - if mask is not None and mask.shape[1:3] != torch.Size([clipvision_size, clipvision_size]): - mask = mask.unsqueeze(1) - transforms = T.Compose([ - T.CenterCrop(min(mask.shape[2], mask.shape[3])), - T.Resize((clipvision_size, clipvision_size), interpolation=T.InterpolationMode.BICUBIC, antialias=True), - ]) - mask = transforms(mask).squeeze(1) - #mask = T.Resize((image.shape[1], image.shape[2]), interpolation=T.InterpolationMode.BICUBIC, antialias=True)(mask.unsqueeze(1)).squeeze(1) - - img_cond_embeds = encode_image_masked(clip_vision, image, mask, clipvision_size=clipvision_size) - - if is_plus: - img_cond_embeds = img_cond_embeds.penultimate_hidden_states - img_uncond_embeds = encode_image_masked(clip_vision, torch.zeros([1, clipvision_size, clipvision_size, 3]), clipvision_size=clipvision_size).penultimate_hidden_states - else: - img_cond_embeds = img_cond_embeds.image_embeds - img_uncond_embeds = torch.zeros_like(img_cond_embeds) - - if weight != 1: - img_cond_embeds = img_cond_embeds * weight - - return (img_cond_embeds, img_uncond_embeds, ) - -class IPAdapterCombineEmbeds: - @classmethod - def INPUT_TYPES(s): - return {"required": { - "embed1": ("EMBEDS",), - "method": (["concat", "add", "subtract", "average", "norm average", "max", "min"], ), - }, - "optional": { - "embed2": ("EMBEDS",), - "embed3": ("EMBEDS",), - "embed4": ("EMBEDS",), - "embed5": ("EMBEDS",), - }} - - RETURN_TYPES = ("EMBEDS",) - FUNCTION = "batch" - CATEGORY = "ipadapter/embeds" - - def batch(self, embed1, method, embed2=None, embed3=None, embed4=None, embed5=None): - if method=='concat' and embed2 is None and embed3 is None and embed4 is None and embed5 is None: - return (embed1, ) - - embeds = [embed1, embed2, embed3, embed4, embed5] - embeds = [embed for embed in embeds if embed is not None] - embeds = torch.cat(embeds, dim=0) - - if method == "add": - embeds = torch.sum(embeds, dim=0).unsqueeze(0) - elif method == "subtract": - embeds = embeds[0] - torch.mean(embeds[1:], dim=0) - embeds = embeds.unsqueeze(0) - elif method == "average": - embeds = torch.mean(embeds, dim=0).unsqueeze(0) - elif method == "norm average": - embeds = torch.mean(embeds / torch.norm(embeds, dim=0, keepdim=True), dim=0).unsqueeze(0) - elif method == "max": - embeds = torch.max(embeds, dim=0).values.unsqueeze(0) - elif method == "min": - embeds = torch.min(embeds, dim=0).values.unsqueeze(0) - - return (embeds, ) - -class IPAdapterNoise: - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "type": (["fade", "dissolve", "gaussian", "shuffle"], ), - "strength": ("FLOAT", { "default": 1.0, "min": 0, "max": 1, "step": 0.05 }), - "blur": ("INT", { "default": 0, "min": 0, "max": 32, "step": 1 }), - }, - "optional": { - "image_optional": ("IMAGE",), - } - } - - RETURN_TYPES = ("IMAGE",) - FUNCTION = "make_noise" - CATEGORY = "ipadapter/utils" - - def make_noise(self, type, strength, blur, image_optional=None): - if image_optional is None: - image = torch.zeros([1, 224, 224, 3]) - else: - transforms = T.Compose([ - T.CenterCrop(min(image_optional.shape[1], image_optional.shape[2])), - T.Resize((224, 224), interpolation=T.InterpolationMode.BICUBIC, antialias=True), - ]) - image = transforms(image_optional.permute([0,3,1,2])).permute([0,2,3,1]) - - seed = int(torch.sum(image).item()) % 1000000007 # hash the image to get a seed, grants predictability - torch.manual_seed(seed) - - if type == "fade": - noise = torch.rand_like(image) - noise = image * (1 - strength) + noise * strength - elif type == "dissolve": - mask = (torch.rand_like(image) < strength).float() - noise = torch.rand_like(image) - noise = image * (1-mask) + noise * mask - elif type == "gaussian": - noise = torch.randn_like(image) * strength - noise = image + noise - elif type == "shuffle": - transforms = T.Compose([ - T.ElasticTransform(alpha=75.0, sigma=(1-strength)*3.5), - T.RandomVerticalFlip(p=1.0), - T.RandomHorizontalFlip(p=1.0), - ]) - image = transforms(image.permute([0,3,1,2])).permute([0,2,3,1]) - noise = torch.randn_like(image) * (strength*0.75) - noise = image * (1-noise) + noise - - del image - noise = torch.clamp(noise, 0, 1) - - if blur > 0: - if blur % 2 == 0: - blur += 1 - noise = T.functional.gaussian_blur(noise.permute([0,3,1,2]), blur).permute([0,2,3,1]) - - return (noise, ) - -class PrepImageForClipVision: - @classmethod - def INPUT_TYPES(s): - return {"required": { - "image": ("IMAGE",), - "interpolation": (["LANCZOS", "BICUBIC", "HAMMING", "BILINEAR", "BOX", "NEAREST"],), - "crop_position": (["top", "bottom", "left", "right", "center", "pad"],), - "sharpening": ("FLOAT", {"default": 0.0, "min": 0, "max": 1, "step": 0.05}), - }, - } - - RETURN_TYPES = ("IMAGE",) - FUNCTION = "prep_image" - - CATEGORY = "ipadapter/utils" - - def prep_image(self, image, interpolation="LANCZOS", crop_position="center", sharpening=0.0): - size = (224, 224) - _, oh, ow, _ = image.shape - output = image.permute([0,3,1,2]) - - if crop_position == "pad": - if oh != ow: - if oh > ow: - pad = (oh - ow) // 2 - pad = (pad, 0, pad, 0) - elif ow > oh: - pad = (ow - oh) // 2 - pad = (0, pad, 0, pad) - output = T.functional.pad(output, pad, fill=0) - else: - crop_size = min(oh, ow) - x = (ow-crop_size) // 2 - y = (oh-crop_size) // 2 - if "top" in crop_position: - y = 0 - elif "bottom" in crop_position: - y = oh-crop_size - elif "left" in crop_position: - x = 0 - elif "right" in crop_position: - x = ow-crop_size - - x2 = x+crop_size - y2 = y+crop_size - - output = output[:, :, y:y2, x:x2] - - imgs = [] - for img in output: - img = T.ToPILImage()(img) # using PIL for better results - img = img.resize(size, resample=Image.Resampling[interpolation]) - imgs.append(T.ToTensor()(img)) - output = torch.stack(imgs, dim=0) - del imgs, img - - if sharpening > 0: - output = contrast_adaptive_sharpening(output, sharpening) - - output = output.permute([0,2,3,1]) - - return (output, ) - -class IPAdapterSaveEmbeds: - def __init__(self): - self.output_dir = folder_paths.get_output_directory() - - @classmethod - def INPUT_TYPES(s): - return {"required": { - "embeds": ("EMBEDS",), - "filename_prefix": ("STRING", {"default": "IP_embeds"}) - }, - } - - RETURN_TYPES = () - FUNCTION = "save" - OUTPUT_NODE = True - CATEGORY = "ipadapter/embeds" - - def save(self, embeds, filename_prefix): - full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, self.output_dir) - file = f"{filename}_{counter:05}.ipadpt" - file = os.path.join(full_output_folder, file) - - torch.save(embeds, file) - return (None, ) - -class IPAdapterLoadEmbeds: - @classmethod - def INPUT_TYPES(s): - input_dir = folder_paths.get_input_directory() - files = [os.path.relpath(os.path.join(root, file), input_dir) for root, dirs, files in os.walk(input_dir) for file in files if file.endswith('.ipadpt')] - return {"required": {"embeds": [sorted(files), ]}, } - - RETURN_TYPES = ("EMBEDS", ) - FUNCTION = "load" - CATEGORY = "ipadapter/embeds" - - def load(self, embeds): - path = folder_paths.get_annotated_filepath(embeds) - return (torch.load(path).cpu(), ) - -class IPAdapterWeights: - @classmethod - def INPUT_TYPES(s): - return {"required": { - "weights": ("STRING", {"default": '1.0, 0.0', "multiline": True }), - "timing": (["custom", "linear", "ease_in_out", "ease_in", "ease_out", "random"], { "default": "linear" } ), - "frames": ("INT", {"default": 0, "min": 0, "max": 9999, "step": 1 }), - "start_frame": ("INT", {"default": 0, "min": 0, "max": 9999, "step": 1 }), - "end_frame": ("INT", {"default": 9999, "min": 0, "max": 9999, "step": 1 }), - "add_starting_frames": ("INT", {"default": 0, "min": 0, "max": 9999, "step": 1 }), - "add_ending_frames": ("INT", {"default": 0, "min": 0, "max": 9999, "step": 1 }), - "method": (["full batch", "shift batches", "alternate batches"], { "default": "full batch" }), - }, "optional": { - "image": ("IMAGE",), - } - } - - RETURN_TYPES = ("FLOAT", "FLOAT", "INT", "IMAGE", "IMAGE", "WEIGHTS_STRATEGY") - RETURN_NAMES = ("weights", "weights_invert", "total_frames", "image_1", "image_2", "weights_strategy") - FUNCTION = "weights" - CATEGORY = "ipadapter/weights" - - def weights(self, weights='', timing='custom', frames=0, start_frame=0, end_frame=9999, add_starting_frames=0, add_ending_frames=0, method='full batch', weights_strategy=None, image=None): - import random - - frame_count = image.shape[0] if image is not None else 0 - if weights_strategy is not None: - weights = weights_strategy["weights"] - timing = weights_strategy["timing"] - frames = weights_strategy["frames"] - start_frame = weights_strategy["start_frame"] - end_frame = weights_strategy["end_frame"] - add_starting_frames = weights_strategy["add_starting_frames"] - add_ending_frames = weights_strategy["add_ending_frames"] - method = weights_strategy["method"] - frame_count = weights_strategy["frame_count"] - else: - weights_strategy = { - "weights": weights, - "timing": timing, - "frames": frames, - "start_frame": start_frame, - "end_frame": end_frame, - "add_starting_frames": add_starting_frames, - "add_ending_frames": add_ending_frames, - "method": method, - "frame_count": frame_count, - } - - # convert the string to a list of floats separated by commas or newlines - weights = weights.replace("\n", ",") - weights = [float(weight) for weight in weights.split(",") if weight.strip() != ""] - - if timing != "custom": - frames = max(frames, 2) - start = 0.0 - end = 1.0 - - if len(weights) > 0: - start = weights[0] - end = weights[-1] - - weights = [] - - end_frame = min(end_frame, frames) - duration = end_frame - start_frame - if start_frame > 0: - weights.extend([start] * start_frame) - - for i in range(duration): - n = duration - 1 - if timing == "linear": - weights.append(start + (end - start) * i / n) - elif timing == "ease_in_out": - weights.append(start + (end - start) * (1 - math.cos(i / n * math.pi)) / 2) - elif timing == "ease_in": - weights.append(start + (end - start) * math.sin(i / n * math.pi / 2)) - elif timing == "ease_out": - weights.append(start + (end - start) * (1 - math.cos(i / n * math.pi / 2))) - elif timing == "random": - weights.append(random.uniform(start, end)) - - weights[-1] = end if timing != "random" else weights[-1] - if end_frame < frames: - weights.extend([end] * (frames - end_frame)) - - if len(weights) == 0: - weights = [0.0] - - frames = len(weights) - - # repeat the images for cross fade - image_1 = None - image_2 = None - - # Calculate the min and max of the weights - min_weight = min(weights) - max_weight = max(weights) - - if image is not None: - - if "shift" in method: - image_1 = image[:-1] - image_2 = image[1:] - - weights = weights * image_1.shape[0] - image_1 = image_1.repeat_interleave(frames, 0) - image_2 = image_2.repeat_interleave(frames, 0) - elif "alternate" in method: - image_1 = image[::2].repeat_interleave(2, 0) - image_1 = image_1[1:] - image_2 = image[1::2].repeat_interleave(2, 0) - - # Invert the weights relative to their own range - mew_weights = weights + [max_weight - (w - min_weight) for w in weights] - - mew_weights = mew_weights * (image_1.shape[0] // 2) - if image.shape[0] % 2: - image_1 = image_1[:-1] - else: - image_2 = image_2[:-1] - mew_weights = mew_weights + weights - - weights = mew_weights - image_1 = image_1.repeat_interleave(frames, 0) - image_2 = image_2.repeat_interleave(frames, 0) - else: - weights = weights * image.shape[0] - image_1 = image.repeat_interleave(frames, 0) - - # add starting and ending frames - if add_starting_frames > 0: - weights = [weights[0]] * add_starting_frames + weights - image_1 = torch.cat([image[:1].repeat(add_starting_frames, 1, 1, 1), image_1], dim=0) - if image_2 is not None: - image_2 = torch.cat([image[:1].repeat(add_starting_frames, 1, 1, 1), image_2], dim=0) - if add_ending_frames > 0: - weights = weights + [weights[-1]] * add_ending_frames - image_1 = torch.cat([image_1, image[-1:].repeat(add_ending_frames, 1, 1, 1)], dim=0) - if image_2 is not None: - image_2 = torch.cat([image_2, image[-1:].repeat(add_ending_frames, 1, 1, 1)], dim=0) - - # reverse the weights array - weights_invert = weights[::-1] - - frame_count = len(weights) - - return (weights, weights_invert, frame_count, image_1, image_2, weights_strategy,) - -class IPAdapterWeightsFromStrategy(IPAdapterWeights): - @classmethod - def INPUT_TYPES(s): - return {"required": { - "weights_strategy": ("WEIGHTS_STRATEGY",), - }, "optional": { - "image": ("IMAGE",), - } - } - -class IPAdapterPromptScheduleFromWeightsStrategy(): - @classmethod - def INPUT_TYPES(s): - return {"required": { - "weights_strategy": ("WEIGHTS_STRATEGY",), - "prompt": ("STRING", {"default": "", "multiline": True }), - }} - - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("prompt_schedule", ) - FUNCTION = "prompt_schedule" - CATEGORY = "ipadapter/weights" - - def prompt_schedule(self, weights_strategy, prompt=""): - frames = weights_strategy["frames"] - add_starting_frames = weights_strategy["add_starting_frames"] - add_ending_frames = weights_strategy["add_ending_frames"] - frame_count = weights_strategy["frame_count"] - - out = "" - - prompt = [p for p in prompt.split("\n") if p.strip() != ""] - - if len(prompt) > 0 and frame_count > 0: - # prompt_pos must be the same size as the image batch - if len(prompt) > frame_count: - prompt = prompt[:frame_count] - elif len(prompt) < frame_count: - prompt += [prompt[-1]] * (frame_count - len(prompt)) - - if add_starting_frames > 0: - out += f"\"0\": \"{prompt[0]}\",\n" - for i in range(frame_count): - out += f"\"{i * frames + add_starting_frames}\": \"{prompt[i]}\",\n" - if add_ending_frames > 0: - out += f"\"{frame_count * frames + add_starting_frames}\": \"{prompt[-1]}\",\n" - - return (out, ) - -class IPAdapterCombineWeights: - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "weights_1": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05 }), - "weights_2": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05 }), - }} - RETURN_TYPES = ("FLOAT", "INT") - RETURN_NAMES = ("weights", "count") - FUNCTION = "combine" - CATEGORY = "ipadapter/utils" - - def combine(self, weights_1, weights_2): - if not isinstance(weights_1, list): - weights_1 = [weights_1] - if not isinstance(weights_2, list): - weights_2 = [weights_2] - weights = weights_1 + weights_2 - - return (weights, len(weights), ) - -class IPAdapterRegionalConditioning: - @classmethod - def INPUT_TYPES(s): - return {"required": { - #"set_cond_area": (["default", "mask bounds"],), - "image": ("IMAGE",), - "image_weight": ("FLOAT", { "default": 1.0, "min": -1.0, "max": 3.0, "step": 0.05 }), - "prompt_weight": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 10.0, "step": 0.05 }), - "weight_type": (WEIGHT_TYPES, ), - "start_at": ("FLOAT", { "default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - "end_at": ("FLOAT", { "default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001 }), - }, "optional": { - "mask": ("MASK",), - "positive": ("CONDITIONING",), - "negative": ("CONDITIONING",), - }} - - RETURN_TYPES = ("IPADAPTER_PARAMS", "CONDITIONING", "CONDITIONING", ) - RETURN_NAMES = ("IPADAPTER_PARAMS", "POSITIVE", "NEGATIVE") - FUNCTION = "conditioning" - - CATEGORY = "ipadapter/params" - - def conditioning(self, image, image_weight, prompt_weight, weight_type, start_at, end_at, mask=None, positive=None, negative=None): - set_area_to_bounds = False #if set_cond_area == "default" else True - - if mask is not None: - if positive is not None: - positive = conditioning_set_values(positive, {"mask": mask, "set_area_to_bounds": set_area_to_bounds, "mask_strength": prompt_weight}) - if negative is not None: - negative = conditioning_set_values(negative, {"mask": mask, "set_area_to_bounds": set_area_to_bounds, "mask_strength": prompt_weight}) - - ipadapter_params = { - "image": [image], - "attn_mask": [mask], - "weight": [image_weight], - "weight_type": [weight_type], - "start_at": [start_at], - "end_at": [end_at], - } - - return (ipadapter_params, positive, negative, ) - -class IPAdapterCombineParams: - @classmethod - def INPUT_TYPES(s): - return {"required": { - "params_1": ("IPADAPTER_PARAMS",), - "params_2": ("IPADAPTER_PARAMS",), - }, "optional": { - "params_3": ("IPADAPTER_PARAMS",), - "params_4": ("IPADAPTER_PARAMS",), - "params_5": ("IPADAPTER_PARAMS",), - }} - - RETURN_TYPES = ("IPADAPTER_PARAMS",) - FUNCTION = "combine" - CATEGORY = "ipadapter/params" - - def combine(self, params_1, params_2, params_3=None, params_4=None, params_5=None): - ipadapter_params = { - "image": params_1["image"] + params_2["image"], - "attn_mask": params_1["attn_mask"] + params_2["attn_mask"], - "weight": params_1["weight"] + params_2["weight"], - "weight_type": params_1["weight_type"] + params_2["weight_type"], - "start_at": params_1["start_at"] + params_2["start_at"], - "end_at": params_1["end_at"] + params_2["end_at"], - } - - if params_3 is not None: - ipadapter_params["image"] += params_3["image"] - ipadapter_params["attn_mask"] += params_3["attn_mask"] - ipadapter_params["weight"] += params_3["weight"] - ipadapter_params["weight_type"] += params_3["weight_type"] - ipadapter_params["start_at"] += params_3["start_at"] - ipadapter_params["end_at"] += params_3["end_at"] - if params_4 is not None: - ipadapter_params["image"] += params_4["image"] - ipadapter_params["attn_mask"] += params_4["attn_mask"] - ipadapter_params["weight"] += params_4["weight"] - ipadapter_params["weight_type"] += params_4["weight_type"] - ipadapter_params["start_at"] += params_4["start_at"] - ipadapter_params["end_at"] += params_4["end_at"] - if params_5 is not None: - ipadapter_params["image"] += params_5["image"] - ipadapter_params["attn_mask"] += params_5["attn_mask"] - ipadapter_params["weight"] += params_5["weight"] - ipadapter_params["weight_type"] += params_5["weight_type"] - ipadapter_params["start_at"] += params_5["start_at"] - ipadapter_params["end_at"] += params_5["end_at"] - - return (ipadapter_params, ) - -""" -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Register -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -""" -NODE_CLASS_MAPPINGS = { - # Main Apply Nodes - "IPAdapter": IPAdapterSimple, - "IPAdapterAdvanced": IPAdapterAdvanced, - "IPAdapterBatch": IPAdapterBatch, - "IPAdapterFaceID": IPAdapterFaceID, - "IPAdapterFaceIDKolors": IPAdapterFaceIDKolors, - "IPAAdapterFaceIDBatch": IPAAdapterFaceIDBatch, - "IPAdapterTiled": IPAdapterTiled, - "IPAdapterTiledBatch": IPAdapterTiledBatch, - "IPAdapterEmbeds": IPAdapterEmbeds, - "IPAdapterEmbedsBatch": IPAdapterEmbedsBatch, - "IPAdapterStyleComposition": IPAdapterStyleComposition, - "IPAdapterStyleCompositionBatch": IPAdapterStyleCompositionBatch, - "IPAdapterMS": IPAdapterMS, - "IPAdapterClipVisionEnhancer": IPAdapterClipVisionEnhancer, - "IPAdapterClipVisionEnhancerBatch": IPAdapterClipVisionEnhancerBatch, - "IPAdapterFromParams": IPAdapterFromParams, - "IPAdapterPreciseStyleTransfer": IPAdapterPreciseStyleTransfer, - "IPAdapterPreciseStyleTransferBatch": IPAdapterPreciseStyleTransferBatch, - "IPAdapterPreciseComposition": IPAdapterPreciseComposition, - "IPAdapterPreciseCompositionBatch": IPAdapterPreciseCompositionBatch, - - # Loaders - "IPAdapterUnifiedLoader": IPAdapterUnifiedLoader, - "IPAdapterUnifiedLoaderFaceID": IPAdapterUnifiedLoaderFaceID, - "IPAdapterModelLoader": IPAdapterModelLoader, - "IPAdapterInsightFaceLoader": IPAdapterInsightFaceLoader, - "IPAdapterUnifiedLoaderCommunity": IPAdapterUnifiedLoaderCommunity, - - # Helpers - "IPAdapterEncoder": IPAdapterEncoder, - "IPAdapterCombineEmbeds": IPAdapterCombineEmbeds, - "IPAdapterNoise": IPAdapterNoise, - "PrepImageForClipVision": PrepImageForClipVision, - "IPAdapterSaveEmbeds": IPAdapterSaveEmbeds, - "IPAdapterLoadEmbeds": IPAdapterLoadEmbeds, - "IPAdapterWeights": IPAdapterWeights, - "IPAdapterCombineWeights": IPAdapterCombineWeights, - "IPAdapterWeightsFromStrategy": IPAdapterWeightsFromStrategy, - "IPAdapterPromptScheduleFromWeightsStrategy": IPAdapterPromptScheduleFromWeightsStrategy, - "IPAdapterRegionalConditioning": IPAdapterRegionalConditioning, - "IPAdapterCombineParams": IPAdapterCombineParams, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - # Main Apply Nodes - "IPAdapter": "IPAdapter", - "IPAdapterAdvanced": "IPAdapter Advanced", - "IPAdapterBatch": "IPAdapter Batch (Adv.)", - "IPAdapterFaceID": "IPAdapter FaceID", - "IPAdapterFaceIDKolors": "IPAdapter FaceID Kolors", - "IPAAdapterFaceIDBatch": "IPAdapter FaceID Batch", - "IPAdapterTiled": "IPAdapter Tiled", - "IPAdapterTiledBatch": "IPAdapter Tiled Batch", - "IPAdapterEmbeds": "IPAdapter Embeds", - "IPAdapterEmbedsBatch": "IPAdapter Embeds Batch", - "IPAdapterStyleComposition": "IPAdapter Style & Composition SDXL", - "IPAdapterStyleCompositionBatch": "IPAdapter Style & Composition Batch SDXL", - "IPAdapterMS": "IPAdapter Mad Scientist", - "IPAdapterClipVisionEnhancer": "IPAdapter ClipVision Enhancer", - "IPAdapterClipVisionEnhancerBatch": "IPAdapter ClipVision Enhancer Batch", - "IPAdapterFromParams": "IPAdapter from Params", - "IPAdapterPreciseStyleTransfer": "IPAdapter Precise Style Transfer", - "IPAdapterPreciseStyleTransferBatch": "IPAdapter Precise Style Transfer Batch", - "IPAdapterPreciseComposition": "IPAdapter Precise Composition", - "IPAdapterPreciseCompositionBatch": "IPAdapter Precise Composition Batch", - - # Loaders - "IPAdapterUnifiedLoader": "IPAdapter Unified Loader", - "IPAdapterUnifiedLoaderFaceID": "IPAdapter Unified Loader FaceID", - "IPAdapterModelLoader": "IPAdapter Model Loader", - "IPAdapterInsightFaceLoader": "IPAdapter InsightFace Loader", - "IPAdapterUnifiedLoaderCommunity": "IPAdapter Unified Loader Community", - - # Helpers - "IPAdapterEncoder": "IPAdapter Encoder", - "IPAdapterCombineEmbeds": "IPAdapter Combine Embeds", - "IPAdapterNoise": "IPAdapter Noise", - "PrepImageForClipVision": "Prep Image For ClipVision", - "IPAdapterSaveEmbeds": "IPAdapter Save Embeds", - "IPAdapterLoadEmbeds": "IPAdapter Load Embeds", - "IPAdapterWeights": "IPAdapter Weights", - "IPAdapterWeightsFromStrategy": "IPAdapter Weights From Strategy", - "IPAdapterPromptScheduleFromWeightsStrategy": "Prompt Schedule From Weights Strategy", - "IPAdapterCombineWeights": "IPAdapter Combine Weights", - "IPAdapterRegionalConditioning": "IPAdapter Regional Conditioning", - "IPAdapterCombineParams": "IPAdapter Combine Params", -} \ No newline at end of file diff --git a/replacement/ComfyUI_IPAdapter_plus/IPAdapterPlus.zip b/replacement/ComfyUI_IPAdapter_plus/IPAdapterPlus.zip new file mode 100644 index 0000000000000000000000000000000000000000..69c22ea151e6ede79a0753e79b0b01fd80771a38 GIT binary patch literal 14629 zcmZ{LQ*bX1%w=u6{nfT_ZQJIpZQHhO+qP}<*0$aKe>*$-va?Ahncy)`XU{vfN3fJG>kOe{Y}C(*0AI+PttIFw10Nf@d~xTJ5btqd zmYiL5;L3oML|%7@+Xb8~IWPvC?Rs!!mUtkK%a8|I=gLxS9963qKkjB3H%q{V4n&>B zHEQ02~^QAh_J^SZ9)U?K5A)y9X=B408=|N2&Q*C{Srlh#!19 z{0JMj351XFd)Vjd+6a0u`}1PQ!Y$?=jg-S`=2An-*J)_M0Ux>vd z^oo?0Xgdp!08uvGPj;Kuvaw9Xz0cU$lxQ?MxbmXX5V9m)< zQ>2%=GJ+-HU+Lr_7rADjI9Q!wOVA?vrRBq5)@40%JcoYse*QU%+7Aexu~MR9t-LN_ zyGIc%ceJ*SJlv}zhcWx&rxDK`$*r))N|~m|16hcSZ)qvBI7mwyX*si7fW`N;lp8ii z|IP&ZR7>ya?dbU}1^{)1(6eAsxVC>Xq-vy*z5pj$oT1PH&laQ7_&F5JQMCq>e800J znsxSxn;7?rS*mg|&GGPuG?`qM%$#BFv~v8?4^K1Nl7qBCvm7yZo2Ff|PTBIj_|mQ$ zfBP8_@tAZRMm>pj%-`Vci)hRu4_7vA{{heou!*-v2>;^M>r<-LX)q&dti^xEK8p)d z#2%#V=G`V5bWAf%O}WCMm`fr@shq!73N!%cL_KC8iLnZKulQ1yulx_u6sU_X-n`K2 zMckrV$1%7Mk-6bvT+<|DR;@zUUc+WJk;i5W)RS}Xgik;%{Kj47C>YYYNx58*q-Uxv zdlNZPfuiEAgdW?;Fhr#r=_|Ywz2$rT0JAw`r3f2lPUhB^(nTfo(h=$G!5YdJcK`Ad zt~DkFXnHF}(2X)TxKY&2DA$v<(LCBvjNLS`3&5GJx|%%7;r3ND)64=-oK9rJa;llU zi4+Y2am~q`qd0fb$MMs3WWQFjYmoMb;0DG`L7f?MdlLa(JEAQ4aj?yEK+{p&y1)^V z&8W4wy>?P4)>hJ+1>JC8D^;3zY1<^cgRnKW9Z#?nTEJF8^uk^-(Xk+!I?^D867Z-2_y!V;}p3WKycYJ)N>jCjC0 zBYm{fWyGk9D95|{sq>1*(~~Ew3C=u2_VCy+&}ys4Q2?APcmf_v_U@O!9Q`+8W>Crk z4MjsxhC5@R@r>|EPHK=Zqr@{y40+UjlkZ@qu1-xi!H-t8lp4LhikkvRy(P-}!Iv44 z_q;Fzz?L%^6{KoP#e(i0CAcUD{Lr~3|8c6O{?o5toL3Zyn2-ueVc8PRA*^e1S!3j( zNONguOG%ltCSXAf?Y4&eQ2SC77dnRp0_(${C$|U9mdUm_k`&q&S1=#0EMU>>NVi1Nd4!gzd*6 zYGH|Mzo!9o%C|+}6397|O!Spfzc`_9oo&bhG0_9XndSiwKZ}QI0%3|~4o-QeIvZSK zy|KqVh?o@ch+SJKX1dlZQFrLi16j{q#b#sn=&Tc5IG|>Q@nw`1W_ziSp(Q+Cf57># zAVP}8#bd5f5eh#RS2$&hbIS!$8yC-wRXYJA2AOw#(uB27&QE`jlpZ_8kyC?0D50D@ z%}s7tm(kV)<;&Xl37;Cmna=?9GkO#=VCEH(3T3U~p@~>509EKu9!!+~=b(%khkR&` z^?7f?2{8&6X$|3{)IJ-(Nj63yPs0Y{I}Y1)1E~ApT8*goAE4I}nn*NR=nrQosV@ze z61*mv)KaCPDhT`YQMG+m^+I|fBD5GFuX8ogZK1c zBOmy1J#SQdwjPhBg<^L;Qnm?KUta01!J!f~EOTCPB)*l4*1sk{-cMcb)EdK`kmnrclQ-a8%$N zrsi@W2@~{!N5B{w5+d8SsHK#hu*y%$dFp~k1AmD9vYU8s-+P?8(kv(B8I?? z4U~(!_NyK^V%GALlp1g}lQTu4p_`@kO#W&ms53U+5$9a)%_3+~Oil*wlMbY4Awdya zIArAuQI(F+2qz@@M!WvOCx*iHF%yh}76P6s`&5JDRS)xu9htGvV>JjHR(p6GuB8mL z+UK^)ngZwIuUabVZx-uAFKF_-CN9hc`%*9}9!N=z$)xgvSX5*PX1$nN)CR+=D;2t z5f{GkwTWU30Jzo=LPsMxz4k0(B%Wf;Yi3{l>}c7gC7%MU-YNb@wgdW2l00uqU7Z6j zD0So&kE)D$_=89UG|QJufRLkRHEvMgYnRw`sIA7dqlOv0c3-WXExw&?>?>lQZ-cDw z=j1)7{5wLJrWOiXA44K82C^ICi#|+Usjn7Vf83NcD~L!vOa!s@vSvIm3OCw(*hvr( z**bxeefB)CKVPR%W4h*Q*oeF)2B|RZE614pG(bm{5P}OKAX|u?E9|PSEQ%0#`pFUk z5~2UZMtNs-OwA5Lmr*>4(KrVYGb+;K$l1oisbL5mmkUH2(K4^puXtY^kEXc$z|geK z<@_Jiie?=XO}A3Fl9Y8Q&v@yJptVf??w~tXMwjF70iX3UAET&mHcFO z))PjCWTQ6)kIg7-Pv&iP{%7XYKP8%YFaGN@JpS!_bpqbbPTs#6kS0zM$07#>S)4^G zhph$)H}NM8?J_J^^Z*6MV}~wKmlaR|wZcLN`gkgghL4!2UnL|TOXMn)2juWcMPaEV z`i)qp#-A161p7am>+XRz=k$&BrvJ9Rsm*{6St=pFSg~|s28;*B@6MB+v3}wL5&h8| zW^w(O_?{)fnsUflDh1d01PKoM3^99yo5m>AO!Y9=;3#nO*NEg*3pbzAP^CkJoENXi zhU?M?6J!$J61FfE z-odBScCN5*pOozFMCwi*N(pY4MC7y+oRqWhHqrcSA1NXKu!)L$Tn3=>U1ft3Hul84 zmt=nS@~P^t?f3yW!m4G49ZOKPMRQko5DG3>Ra)?Ct2E$&X|Vqi#U_0f(m=JRqccsV zT`vXHQt46`Z5Fj}EHSG5MMlxx%qA?amaITbZBVG;g0C^5sI^uoD!+-=_2$x=KQ;Hv z2;3F)_(qj(SG3~(X_VWCIu#|EBhY@Vu^6@vs)P%Tq`tGzshY>0>~cc*rfp7=UJIlB zV`L)ikSblYdN-ZcZfP>l5$(-YaQsZz{jX34Mw-gK;4P&$p16%GYJysJc%l-0gsYbQWXU zMR6vFFHkp~{iR)OmxlyY1wf2#T4%TZoBvKqGQ)T8u_y6E)2${1LBblgAiD`!a^}e< zLR4J}J%TAste5H!^hd)C@z z*x%4Pt`erBW62Va1H8>rT+CL8VN|Jh#whwE8P3t^v<{v_j~^WfgweqRCe{2k^F=)w z%Ac%UQv64Z5~GaK?RM@`doXgK^f!EoRW3==yv(gt9!yr+)aRdUq+*Jypuee$g~s3( z3NrFee!*zd$se7-B<6wh~2AcdLZ*y-d3EpX*A7AdUK#jcC4QA)>I^@j+RoLAHMcwlV-PLJ}O?7&B_ zAZret_zZcbnsT_-8ba_|Sy}0;Kgsc03EEo_c2;ShR8H=pr?4w2C0LjEMU|aiWe=M< zmE6(*U6bRk&T%^*U$8P3z?+V1md+80t;lg7wWwa~q@QYJH$}>CCEE3*%6o~D&udwy zBFt{D>IxinI|Mte)OuwV2DZXEmsB^CKcz}P?^N+q z+OmkfP=nuqnzX%TR9X+_-WeCac*&46iat!ksu^L8h3M5rdzTlI(~bvZN|WhTx{;1- z6$?(+@LQC&4~H;iU>#w^qI$mcW2Z?Vj?8#{XofonCIu?L}mrIapEQ!Tq(A)Dv8)ir}D&*`5soa30Q7$Z!yqwD` zS(tM6ub5|R{iR2h%tnUnfZw4xH?u;cY9FF6fQ)7}QNu6L{iT3{h@TMH@5y{YBA%4* z`Di5gumO=*(n%=LnXVYLKog{5QDk9B#p&<4);PFS1jKs{=$SMFP!XgH<0B6hP$n{* z3iO^a@B}BLZ%)XHR+FQ-5+9ng0X%J*?Xdho&0EsjQquJvX!xiy@O0L`GwZcJS~Hu3 zRlsyNR54XPb2H$#{ZAHER~fqjg7aa_9lEcuF6Gon4X~)h>O(97t3HeNi=Q}5D^z*t8}LfKXxUtd3zA_ zYUA#NbgygcJr6`xg?bmE;Jamn8T+R!lrvAQHA$#O*}6UbCN#aAE{kXM^y(vCQ#2U8 zwMn4UUPs$VTdHgL_C9RL-xdfUwVg_E_YyRg)?XsL!p1zS8@K{JmVo+y!yq-+Q&t0s3993tEn0(8qsT<#EJF6Fps~*rtH2@PhOK%;dZ0S4ha@zlp{9 zAg;8eGes?^O_A)K6QehKl4AH`6DQ=R0Rntm9v;oFl_tmJTNf+43$Jwu$3w!AedM*k z-tCXsz>lU2`i4sV`hI@xUd_J;NQiigO(@$1=_NNexYs_92P<>wmGRG)?dY-X+DTTB ztMd*5@+#1yOEnAu@$)oTxq=-nPO5IhwCM$-Y7dFWDt3@V0QYTgPOIO+gQcZeG zmVKi>k{*01qPT!?MzKEz+eNS24`c<>sr2*p)(hiP$yFkj9f9b()MS20&YP^`3oxmZ zQO|g&tDfixFpu5nn9LhaFO0O-4qy2ZB(_$V3V!qB#6NIluo_;1bqSk=ySJM~2TVqZ zcg1yMuaDYuqu(?%tY@2KtRiKTB)yM}#^xqaIuW@-&x#nSD>_ zHjgb@Dx-?QR&W<#=*mU%*6d8T>vEQ#6IV%#KRVS{?Btlgzkm9MIwcawBncg zVDE*zxyCB^w|{JUHIS$Y9I}cHg3#B-{^@u4WQtD+WCS`QwXXLYNnJ$X}7A0ZM}SCk3BAFi_KrPb+euM5iO=8!6gbQk9*$ zA(!XyswryWO7!YnSt@KSDt^!EI-eeO;i}VhH7PG&j9#>{QmVuQD~1Vh8{EwYFsGfB zRNUexh0%C9!C59;bf~CpeUZ#6>NR_bnZ{uH9PImm*V0Alrrp!54x8B+4plrW3{=R= zgsp)*b37e@wdH3AC!0r0do~l*bsb}D%7Bm3ruHPQD;_orW`Uz(9WB2CCv8#y4)Qi+ zqHuzNbC!`!r*lKkA-`xZd!jLsNfn;Fv%1k_`p;R-{tU`yt=*#%9137*mYsNAQ4aGb~e#o5a2k0Mg$nurKr z`Yj@&ez&Jw#;)S`$dpVCrYqEb`*X!MCyMmtgaHFHbl$X1&_j+dT$`4y;i=Kb_g2^%buG9=5KD zNX(E@?{q0yDE1SbtYmx_6557K^<=Gq0K1dHKh=Xu$Qw;|seQC+DfPQlRDrl7IE#Hs zz>_IaG$1eQ3zdVV&Lj)UPc^SH8SARE`s{5^j@V(U;{mI-XM?B6vsgiNMUV27uA7-x zE2_gnLw0>zP#Q^M2(tcy0p;X%xA6(G3{bQh$9Gor6l#ncPm^w8n@mgbe4o?&aT=D4 z6Q0t_GI-4>m7$6+8|%EcUCM z8>lDCNh$)zuZOfrRYHkj%me>TfX(c?nozTcbD|9ByACq<3cl58rIE|{pVnE8+~Hr% zt%)aUvy&x6N9gM=M87@$f#b0OTOcdRJ-fN2GxtNpgak)Swq%C^sh;^iOdU`PTjP)l zr50ZNSA7s&7y4$!*maiYb7l<-TW>cBWTH$ah_U-*KYy87B!1>oel_bCU;Db_k{qm* zeoL9%Wi~FYcFk5n7JN~reNm@Hj@yZ`!j+KNwFJ^~~9I+*+sbmLGR#AM+)s zK5$)eADSx~#%r$Pj>`)J4lqIm!GUk&Vx&+%i(Mdsl0xX6{cA(~(Rj~v{;64cvUW+7 zcSEd}CW_86|4_{}75eWYua}xdctu`}c$VBd512@~!NZrP1A^WZZZRF%%uFwG)h#dV z?lRLFE~!8t3TF|D+!JFGmyo+SVMDUBCcYBTp!S1o6|^tGE|9D*uUG*CqacNi*JQC( zETf%Q(x>r2j&(*S1Y8oHGU(;>S>5im(D9b;mxh+-_|BYzUJjy#kjOCs%&e)) z3eVpCosi8-a5yIP>GSe?!3eAvyobWRfb}qqB%fh}QqE$dp%|r?Y#DIrxDCwfgfv(3 zOERL!LqupMCZ1ACZq!Z-O-nhW8%jdy+SE{43SVUFX5CHBdz8IQzKAv~2(8Ng#D=&rT;@SojFN(fvkaO@%sPW3<+L*!+h~EBYn8(ZUiP8L zMpcQim5TYB2h+qaKSdB#*kdO$4SAxKOkfhSxph)I@I9X9t?VE3 zbQYVJL1#)@BATnHY|q7BXPsR$`&QcmjRe*V&y+t*@yt|J3lv@C!S5@2E2q>M^l-1P zakWC~@oM)@dfER5@~dXR-1J>8Jzyjs`Uyp(aBmkJW$v^EEE=&XSv&;QJmvFcp*v$< zJPO8r`#q%>qzwmT|JFjQO+BNZYR_cr)jSWCNN-ryF(}WXJa%$7r{k+k{>qfJS7n@F zhkBAN?-8n{5JXoy?YuLzD6KT6Rl)D(K*w&MSCoAU|Wzs1&R1*VzEI!zEf)A(m;Db$QLT zLH~#t3_D}*UAO|JnVXfB5pze${%8cQ`VCWUJS5$1o41F_!`zRS_FDHVph;TKk3hb2 z?*43YXb{4qg~iHR1g@1Getrpp;8$O?Q}q&p=8guzT}I@NmaS=E@GV7+y^J41>@zei zP;!W}uT4R_5_%dEJRU*~SNk(XJyT?T_Hd-<4*jM%SD;@GT_uoZ-B;42HR%qFi%$U| z=r5v=WQSwQYe+u9E52bxh8qQxF9x9IAz~L9P2YQVV-F3X9+W&>ybdf2o8ZCzfEr>F zp`G6GWIP+vaUmW;|J^eJwh_JefYICUSNS<&uE1H5I6lH{(Jy%_wi(wz*%w5OZ{9#- zRAj(!d40Zf;?a3u`MG($^MfmyW|>cx9H`Y%_H|$zI)gSRm1yq<*)L*pmoH$rzKtRk z{|}E26jRKU7wz79SbE$uB1F3tweo8WK~GW43%c0ae(LyCnyvJ111fWfVDF+@^})0k zX0!r}BEI3hJU^qlH7~ewiQ7LXr2~>c57g2u4|XgzfkB^Q5FBF!X)lgWLZ$@0$_J%F zgi}E!^zX1O7E)cgb7d}3!3T91|9+IHG8+b5I7t-4p$q31)WC^6iqhNh?QvZk{{V9_ zJ(_*RW7KoNc1b6;-QPzXenv|wP_|f2aEA@Q6;UNO#R(9x-D|3VMEvijK-=C^C4~T$lk&A%Dp5<8Rc^@rsDy0PIF84tp^E*Pq zMaSOjw*mAD19PiqHa;&U1=J^m#q)y*tJ%g`DgtoI5kg(Md*B)Ncd|Z!ItA4Pvrz~y zsR0b599p~vBzhr2QXkso3u) z$DGHD1CKaDU?nBNaWvra-9jiR_Sh=fs?lPEl#DCse4y6I2R*TEPy5yUmwdU`~o1yq#qu+^C{63#aY9%$jmBYUHu@&Fzt zL%UJpcb()Yfmu%sy27-YD3K!yslTjZ{d7bBi@1JAZ-Z0oR-=SVw%>0BDqg`mw%?Vc zR(UBHgT(^UkUXJEf4!7&)PgnJ6iH6qL{%*NFx9~OosgMY$R^vAJo$_p&Z)AfjAcpk z#@8pc>kYa|s9D>ci)C~ZC9jK%R>-ncz8>e_uy~wYN=rwPaO0C5&a0-2{dBsM8eSslUh?3NO@ogf+QmP^4B z8+v%#lFjXHX>}a-r+O!&^h?&LS9xMX+YWY2D_{q;^40pi#{Igr^-J$TX`vJ~3W6nw zyTiwsQ`t8IduV28NA))e&%|1Ah3F^3=cJ^L)`mIlF;l>r*i>}aliZa5{qAD`vois& z;c242?FzOhIOJvTXf5CWvkj<6y{})_O}y>}v9EzbrSNJ=k>#Lzm1UhvCs|nQ4++;D zJ}XWW0S%C?jr7mXZUS4I9B3cQkRPK#KJ*N%?53kL6w9$``>w()bVjs=PA<{fF!a;F zQ(se8XGxr9 zJmoD9Bvj(AA7*Tq88aVY8?+ck3&QPdlu@rfefQ!UhDkOAUs{K+`(;`n3_beMk)~ zBP`)~4rpEB!w^~CImdkcz>DUuopI%@BQBCW=wz@jH@SuVsvXKFoICu?Ame% zMt{z9;(Kw7lxBS@W8)OVaB{MH_N{hU|KN@MbtbJZYb~nytZ3he z#Vj&F_cf=5R+6PhSYAV7Hx#vG@es&`=?4DQg(|<<%kYzIt@s9p9tG3Sc>Ha*myF@e zrt*d!Z*wOC#V>6O&7b*l-Iy)s)#IBU1&yqr-mW$P3eq9(Rno~EnJ@GVp{nJT0M4Di zT2YD2DtN2KQZu<=vT_D9CRa1JXJky@Czsg3)gX+LAe=SRm1?teh)>>tgXMM0(+60& z_TWAme2WKudu_)vf-bdwA=!uD`LU%dM z95<#4rcR-br=Ds~PL6$vEb}fwc?5tn`-+E$aBh`zo$%<#$}6bU{&B7;M=TEv?Lhx5 z8JocwmCK&P%4#`RH~BgS9I9TZS_lA7Z$`79h?LXRPpe_>~bO-G^Msc)Q7Ml9vzh8KE8DUw&wCcOM98$~;Tst3Ih;rpyQJyl#f~S?omS%x~d7IPQHC!hfGU zUBeg9ja%AN-z!t`t#s$_*^`+rD4IHBl8(lbj=Z)@_|Ig@wl1wZ8BYFa?vj!0j+8F9 zooL^8(p6Hb`eQ;~n^Gmgx?k&PtxIJ)x%P1>)ulxqlco6VfWhvq#8jL-`6@#Fe4S6W zDd6hliHNWS;ZO-DGyt1C&e`dPYz$=|9lj|m3waoe6(!V9&24Cq)GlKh!ui~#%`Gp) zBY0zLr2o|(IU28a?Q}AAKwVA)mrR($$>>endGFPLbnAFcpDNL|bDc+WtnNSB81b(~ zMyw!-*1x)JgjwkiS~Q2AFY+yrHs^a_??+d5BP{jGdVVdt$A4>8IWd0bela(tGnN%q zkv}jH?$vhOV2d$fp81?hV&On=W{7elj!R@31Y=VLYXKJ7cc4WXX!VpN=I8_M7RkPF z`WFW8eK_0wVJ)m~m7;U;;lt49YSCH-@J?fq?Hs=7)uOhPT>Fq#R{GA|zmxanI1Ejk zB+>TW#`Pjk4M%5zaRj=)FW9+=#Ajs$em_6QX-{7xZf}tK|N1_t>-qi-bnIf&_hjO_ zUc#e%x9?uBN_%S=vvYrSl|Y~KAuT{f$?q9T)G7jVS+moQ_Q1LuUgMU+t1!*f77Q&< zn=BSjniQJ-gRQ?9Q@mcMoS`&>Gie6IWcRM|L7)+mZ|4mLs0PjWs^dGaU3S&_ugg|& zF$gsf>thM8GKZA))}Xv2+7F`uC&C@RS~6D-2lE?S4C_mSzSs*V&=8$w%J>zH`yyvt ze4W*$RVdcjr2@6lD3S73d()3ntklw4=&m-S_pXX|qCfC2ju!~=pl8;IftV=9g}Pp- zwWCd$xr6+b-R6K>Pm2KIx~`YV~cA4hJ2guzP;KQmvQRojdGb3|w*q?{xu*3IThof~YxxlY1lTF51e z7-}rgUpKD!whd7_Dm;>w+mEuaYlA>38rD7!LgQtoc8GFy1n3dxt2-3Ayjmqb;g?tb zf;o~ndww?8zU|HVKXPPsz;RV1JxGKc;{CEnsyez?7M;XOEKcj?vm8dHUE@W93%bP} zb(Ag;2=)Dc-!Hv3QsOM3=Fa}a2xO)Cl`5Po-l!Doxs+*Z!F2!zcSWD&7C|P#-g7x- zEerdU1Fj;tWI|Ki@ENX5QQoKEQcR4I{gmI@~=H-YU95XlQ5Ov*G5o&-O$| zH;=#WZ&;m&=@OvbOp=)avGz?#{U!vdwz87CKl|JpPoOH1WP48~9R;Vw@FH-j%1g~C z2L^P!oHMiPo!Aw;b@m_XE6=ei6VwOI?@gR-cT7I|I*I8ij;?-Sk7T5=oRu)I0NwKC`Ppf?MylN$*zyo)~dBhf0>g(Jh z3|l@%*@7QFwm}?)+`8NoKoIba)N0^OdIbU$oZfz9;qu3Oh1Zxi6W(rJ#ALGwxUvRV zycAeK&Ntu~0#pfF|6KFHg))Lss8w4aV|xC09u?7Zs8EmKfZIgg8Z$4#@URP^Pe^t& z+PtuGY-^Ru1-BSUk}p6(CtiTm1I$$wyrSAU4y~#s5J_psxcg=30pd=mnlKMa3?iy2 z!G>0XCXp4`j#H4D22X;7b8ka1 z8fywfK~jfX0UL|r$SB?&Dt}!S+jC!5DQ^r;TBO(C3WV^MHSGw5 z<-O3)C(#Wi2(#;CD$AiC0dbPKuYdt@xGpF|B&#{&bm7K1-e8sSvZW#;qFo$! zHG7D;BnO+Ow5I3UHFRDHttgYEZmkqw^dJUJreSWxC1C~TXIy7;AIgYtWvA;1BV9$Y zCW4MfQO;EYt@Ar&P_<0W!D4H6;;qp-zv!bzG!Yq(nN3Cd7$06 zCHBPp7UCnb$vU5OQb-D~O|3;m-@^D8cw+qRWNCjtmhtazle5`N{d|miyRkyQvZcNU z89xjPSJUVo3A9^BUlx7sE3D6yQg7m^zOBKXP&|s>65*^2&;%t;!ylMLD>QHD6xuTl z{W}MLKGYGVDBK>p>xaat&$w*Uy>me$cm`)(mCn-%8fwsQO$8c|y~xO{1+HP@AW3mv zzT79vkgOP-dF41({W*9S7p6>z2OI;omgOcQb0(>kl#bw=(svDRwNCujjlkK6DQ?RL zy6VUYHv^xP%;rN*O*vGw+R(P|P>dlvn&y0LrQ?{_nh0)L z*Xv_I?W3O*gMC+QOU$&CV6o?x- z_sAsTVE)e^RsXVF>D-5o^=g(RnjA>NB)}Jbcxa?5@pQ zXKqv&9*j#xR_OGG>HJlf$!?;guGe*S18@3x{3aIumasAZ^ZmHIxDh|U%e)EPFg2xy z0=Jc@3QRRn9q$QCAO0Z`bNa&TnR$rV>=wa(5XDTgEs#q43SM14(X}5S zWj!VX`~6Otwu%;I-|HHyX6tKlJajZDWOgsevuihU&nKq3ScD_d)rx_?!BZgIY@fF3 zHF;h7D13SZc{afB{1cCzCv)q2_EfN2X}W6N;JI@3J6?b_c?%=yetMEu^@ZrFa5YWG znH2&2q3#&$7O#qr*_T#>FvpMS&@K;nH~7S|Ig!CP)nqT-JdWz6 z=F(dNbq$;(KnOi?Fjh^4UQMiv#1m7v!hz92FxU~MDB4+OSi*`evWz9kIyA@8VqnT3 z05nqDEjZ8&$^J}TQ9R`D>eih!r(k}lbcO0KZ0ld4ZODN+O0;Q8ebP89Uqyu*PQ=X< zo-khFq2SBD^}J$`!f$!6_gE%}E!D^oKbWJ1{R9m0@M(mL-}JFZ(60^DoO1mfbm@El z?2egp1nc9p_c6ru(>ZwzIrQp^edTQQ!l=ddwS!FB?P7+7@^ufN*2}W?G^66ZZLW(6 zU+0!Ie9G#-n5~+$w z#F_tDB$*77wj+HkI-xjRJak9(Ojp}64!Z&v8>NApMazt;GqFIj+50Dh~9emuZ@ zixl?+`cj4~9CcJ>&&m>fmG&c&VYb!L3(xZL%N=th##uR6-)S^de_7$+mW>SeN_N)m z69~gXAk<#$W`p;llO!wZfkV?kJc+UG$0gi(kdB-f`yafVUA`g5{OxtM(K%P2a5RLi zE+&iEp`UqzBXuEQaHM6?kD3@Ik;xLC4<`!tkrM^J89hPaSC%xVJh`ki<;`p^&#QfS zb9Tgeb6Tp)nl3!K>@?+1=`PQ^ZFqCq>dGEJ%gY{9pPg;<9d?y(i3(>AgC&4Fwkebo zk>{jlcfX$=E-YU*jt|G~65LHf4=|JF7QIt+4thT3kxngV&~*{;cy@7}X71nY^$Y8@ z1%OfpupYP{$lWme=lLY+n&SR}@*pY&zCnj@Lp%{~6FVx!(BjUDeo*TxVCxEC$vT}V zh~4#aJ)a6nA;DWAn3B4)MEh(6793i%4C~F}644HssY@8`VuAD}p+He9kzh$ES}}|+ zSHGD!O3V~Q=0CvT6V}MY84^b!IS?p7bJy+C{LhhvrQHXR+GOM2`9JF^xXHEpoIi6X z=~9_66i-#-(JtjuC-BIi4VT`+f5jde+T(DrEe910qv!K0$*zuf_9H#vLl+7=VuCrk z+QQ;F=*OXu5yarY_QAx&2FQVTz$u&UuSf+DDeSire=JF11h9cE!%>k~W$tSDehz~s zS&b>b(BkSXAz>BN$!IX{y?D7W;n_kdUs5h<`x}^hWcWAfLs9*s`S2$8-ER-8#`5%h z0b!|a6;P+pjHK!7VB z#5g()30zrqK%lE!r8okn3s>9hEvWu@a5f+%R=xIqHs>OmsLw^u!%5%NrK_7)JRV(e z&8czQ&vPTshDqBlqJ|(11(Q}EA62Ds)6z!){3)1;CSe^W$U;>r1|tqd5=ZNkOd{>2 z2DfR0vB;CP=_sgFoL)x_X_8PfFwPH>nfFe@xmoFX$;z*ayz!#erDACUUQDTB4eB#F zcrp0FtDn7SaWaadwbox9B*Ds8zYCIs6Hz3jtB2ze(UKANjtdJmg+!p%L=5;xiWK@K z>Oz&t!xPMtgLJZD1*Fh0?w7I6hdtBi6uPLHR;d~_D5Hl3D_o-6ky0CaK2a5