commit f7c5de64df882eec891c9c61bcdd80a4cc973301 Author: Eric Rollei <97568200+EricRollei@users.noreply.github.com> Date: Thu Nov 6 23:25:32 2025 -0800 Add DeepInv service documentation - Created comprehensive DeepInv Service Setup & Usage Guide - Added DeepInv node to main README with usage examples - Documented DiffUNet, RAM, and other pretrained model presets - Included service endpoints, VRAM management, and troubleshooting tips diff --git a/Docs/DEEPINV_SERVICE_GUIDE.md b/Docs/DEEPINV_SERVICE_GUIDE.md new file mode 100644 index 0000000..c504ab6 --- /dev/null +++ b/Docs/DEEPINV_SERVICE_GUIDE.md @@ -0,0 +1,104 @@ +# DeepInv Service Setup & Usage Guide + +This guide explains how to run the external DeepInv service that powers the **DeepInv Denoise (Eric)** node and how to work with its presets, including DiffUNet and RAM. + +## 1. Overview + + +## 2. Prerequisites + +- **Python environment**: Use the dedicated DeepInv virtual environment included with this project (recommended) or any environment with Python 3.10+. +- **Dependencies**: Install DeepInv and the service requirements. + + ```powershell + # From the project root + & .venv\Scripts\Activate.ps1 # or activate your own env + pip install deepinv fastapi uvicorn pydantic + ``` + +- **Weights**: Place optional pretrained weights in one of the locations the service scans: + 1. `models/pretrained_weights/` + 2. `models/` + 3. Directory pointed to by `DEEPINV_PRETRAINED_DIR` + + The service automatically detects filenames such as: + - `diffusion_ffhq_10m.pt`, `diffusion_openai.pt` (DiffUNet) + - `ram.pth` (Reconstruct Anything Model) + - All SwinIR, DnCNN, DRUNet, and SCUNet checkpoints + +If a weight is missing, DeepInv will download it on demand when possible. + +## 3. Launching the Service + +From the repository root: + +```powershell +& .venv\Scripts\Activate.ps1 +python -m external_tools.deepinv_service.service +``` + +Environment variables: + +| Variable | Description | Default | +| --- | --- | --- | +| `DEEPINV_SERVICE_PORT` | Port the service listens on | `6112` | +| `DEEPINV_PRETRAINED_DIR` | Extra directory to search for weights | _unset_ | + +> **Tip:** Run the service before starting ComfyUI so the node can connect immediately. + +## 4. HTTP Endpoints + +| Method | Path | Purpose | +| --- | --- | --- | +| `GET` | `/health` | Quick readiness check; returns `{ "status": "ok" }`. | +| `POST` | `/denoise` | Main inference endpoint (see payload below). | +| `POST` | `/cache/clear` | Flushes cached models and releases GPU memory (clears CUDA caches for each model). | + +### 4.1 `/denoise` Payload + +```json +{ + "input_path": "C:/Temp/input.npy", + "output_path": "C:/Temp/output.npy", + "model": "diffunet_ffhq", + "sigma": 0.08, + "prefer_gpu": true +} +``` + +- `input_path` / `output_path`: Absolute paths to `.npy` tensors in NHWC float32 `[0, 1]` format. +- `model`: One of the registered presets (`drunet`, `dncnn_light`, `dncnn_lipschitz`, `diffunet_ffhq`, `diffunet_imagenet`, `ram_denoise`, `scunet_real_psnr`, `swinir_noise15`, `swinir_noise25`, `swinir_noise50`). +- `sigma`: Noise level in `[0, 1]`. Models such as DiffUNet and RAM will use this value directly; fixed-weight models (SCUNet, SwinIR) ignore it. +- `prefer_gpu`: When `true`, the service tries CUDA first and falls back to CPU if a memory error occurs. + +The response includes the model name, device used, sigma, output path, and basic statistics about the result. + +## 5. VRAM Management & Fallbacks + +- The service caches each model per device (e.g., `diffunet_imagenet-cuda:0`). Use `POST /cache/clear` to drop cached models and free VRAM without restarting the server. +- Large checkpoints (e.g., `diffunet_imagenet`) can exceed 20β€―GB of VRAM during inference. If CUDA raises an out-of-memory error, the service automatically retries on CPU. +- Inputs are internally padded to multiples of 32 pixels for DiffUNet, then cropped back to their original size. +- For extremely tight memory budgets you can run the service with `prefer_gpu=false` to stay on CPU from the start. + +## 6. Using the ComfyUI Node + +1. **Start the service** (`python -m external_tools.deepinv_service.service`). +2. **Launch ComfyUI** and add the `DeepInv Denoise (Eric)` node. +3. Choose a preset from the dropdown: + - Legacy models: DRUNet, DnCNN (light & Lipschitz) + - New diffusion/foundation models: DiffUNet (FFHQ & ImageNet) and RAM + - SwinIR noise-specific models +4. Adjust the sigma slider (0–0.5 recommended). DiffUNet/RAM respond to sigma; SwinIR/SCUNet do not. +5. Toggle `prefer_gpu` when you want CUDA execution. +6. Optional: Specify a custom `service_url` input if the service runs on another machine or port. + +When processing completes, the node returns the denoised tensor and a multi-line info string summarizing the run. + +## 7. Troubleshooting + +- **"Weight not found"**: Ensure the file is in one of the search directories or set `DEEPINV_PRETRAINED_DIR` before launching the service. +- **Timeouts / connection errors**: Confirm the service is running and that the port is reachable. Reboot if Windows firewall blocks the local port. +- **High VRAM usage after multiple runs**: Invoke `POST /cache/clear` or restart the service to drop cached models and flush CUDA allocator buffers. +- **DiffUNet fails silently**: Check the service console for padding or resolution warnings. The node’s info output also mirrors service errors. + +With the server running and weights in place, the DeepInv presets integrate seamlessly with your ComfyUI workflows.```} diff --git a/Docs/README.md b/Docs/README.md new file mode 100644 index 0000000..a9efed9 --- /dev/null +++ b/Docs/README.md @@ -0,0 +1,452 @@ +# Eric's Advanced Image Processing Nodes for ComfyUI + +A comprehensive collection of advanced image processing nodes for ComfyUI, featuring state-of-the-art denoising, enhancement, and restoration techniques with GPU acceleration and specialized film grain processing. + +## πŸš€ Features + +### **🎬 NEW: GPU-Accelerated Film Grain Processing** +- **Automatic Grain Analysis**: Intelligent detection of authentic film grain, digital noise, and simulated overlays +- **Specialized Processing**: Tailored denoising strategies for each grain type +- **GPU Acceleration**: CUDA-accelerated wavelet transforms for high-performance processing +- **Preservation Controls**: Fine-tuned grain preservation from 0% to 100% +- **Multi-stage Processing**: Advanced processing pipelines for optimal results + + +### **Denoising Algorithms** +- **GPU Wavelet Denoising**: Hardware-accelerated wavelet transforms with CuPy + - BayesShrink, VisuShrink, SureShrink adaptive thresholding + - Multiple wavelet families (Daubechies, Biorthogonal, Coiflets, etc.) + - Regular and stationary (translation-invariant) wavelet transforms + - Automatic CPU fallback for compatibility +- **Non-Local Means**: Texture-preserving denoising for natural images +- **Adaptive Enhancement**: Intelligent image analysis with automatic parameter optimization + +### **Frequency Domain Processing** +- **Homomorphic Filtering**: Illumination and reflectance separation +- **Phase-Preserving Enhancement**: Frequency domain enhancement with natural results +- **Multi-scale FFT Enhancement**: Pyramidal frequency processing +- **Adaptive Frequency Filtering**: Content-aware frequency domain operations + +### **Restoration Techniques** +- **Richardson-Lucy Deconvolution**: Advanced iterative deconvolution +- **Wiener Filtering**: Optimal noise-to-signal ratio restoration +- **Point Spread Function (PSF) Modeling**: Gaussian, motion, and custom PSF support + +### **Advanced Features** +- **GPU Memory Management**: Intelligent memory usage with automatic cleanup +- **Batch Processing**: Efficient processing of multiple images +- **Adaptive Parameter Selection**: Automatic parameter optimization per image +- **Memory Management**: Optimized for large images and batch processing +- **Progress Tracking**: Real-time processing feedback +- **Comprehensive Error Handling**: Robust operation with fallback mechanisms + +## πŸ“¦ Installation + +1. **Clone or download** this repository to your ComfyUI custom nodes directory: + ``` + ComfyUI/custom_nodes/Eric_Image_Processing_Nodes/ + ``` + +2. **Install dependencies** using your ComfyUI Python environment: + ```bash + # Navigate to the node directory + cd ComfyUI/custom_nodes/Eric_Image_Processing_Nodes + + # Install requirements + pip install -r requirements.txt + ``` + +3. **Optional: Install CuPy for GPU acceleration**: + ```bash + # For CUDA 11.x + pip install cupy-cuda11x + + # For CUDA 12.x + pip install cupy-cuda12x + ``` + +4. **Restart ComfyUI** to load the new nodes + +## πŸ“˜ Documentation Highlights + +- [DeepInv Service Setup & Usage Guide](./DEEPINV_SERVICE_GUIDE.md) – Run the FastAPI helper service and explore presets for the `DeepInv Denoise (Eric)` node. + +## ️ Available Nodes + +### **🎬 NEW: Film Grain Processing Nodes** + +- `Advanced Film Grain Processing (Eric)` - Comprehensive grain analysis and specialized denoising +- `GPU Wavelet Denoising (Eric)` - Hardware-accelerated wavelet transforms with CuPy +- `Film Grain Analysis (Eric)` - Diagnostic tool for grain type detection and analysis + +### **Denoising Nodes** + +- `Wavelet Denoise (Eric)` - Advanced wavelet denoising with multiple methods +- `Stationary Wavelet Denoise (Eric)` - Translation-invariant wavelet denoising +- `Non-Local Means Denoise (Eric)` - Texture-preserving denoising +- `Adaptive Image Enhancement (Eric)` - Intelligent enhancement with content analysis +- `DeepInv Denoise (Eric)` - DiffUNet, RAM, SwinIR, and classical denoisers served by the external DeepInv service + +**Note**: When recommendations mention "adaptive" denoising, this refers to the `Adaptive Image Enhancement (Eric)` node, which automatically analyzes your image and applies appropriate denoising techniques. + +### **Frequency Enhancement Nodes** + +- `Homomorphic Filter (Eric)` - Illumination correction and enhancement +- `Phase Preserving Enhancement (Eric)` - Natural frequency domain enhancement +- `Multiscale FFT Enhancement (Eric)` - Multi-resolution frequency processing +- `Adaptive Frequency Filter (Eric)` - Content-aware frequency filtering + +### **Restoration Nodes** + +- `Richardson-Lucy Deconvolution (Eric)` - Advanced deconvolution for blur removal +- `Wiener Filter Restoration (Eric)` - Optimal signal restoration + +### **Utility Nodes** + +- `Batch Image Processing (Eric)` - Efficient batch processing with consistent parameters + +## 🎯 Usage Examples + +### **Basic Denoising** + +1. Load your noisy image +2. Add `Wavelet Denoise (Eric)` node +3. Connect image input +4. Adjust parameters: + - **Wavelet Type**: `db8` for natural images, `haar` for simple images + - **Method**: `BayesShrink` for adaptive thresholding + - **Sigma**: Leave at 0 for auto-estimation +5. Process and view results + +### **Illumination Correction** + +1. Load image with uneven lighting +2. Add `Homomorphic Filter (Eric)` node +3. Adjust parameters: + - **d0**: 30-60 for moderate correction + - **gamma_h**: 1.5-2.5 for detail enhancement + - **gamma_l**: 0.5-0.8 for illumination suppression +4. Process to see improved lighting + +### **Batch Processing** + +1. Load multiple images as a batch +2. Add `Batch Image Processing (Eric)` node +3. Select processing method (e.g., `wavelet_denoise`) +4. Configure parameters +5. Enable `show_progress` to monitor processing +6. Process entire batch efficiently + +### **Adaptive Enhancement** + +1. Load any image +2. Add `Adaptive Image Enhancement (Eric)` node +3. Set `auto_detect_type` to True +4. Choose enhancement level (conservative/moderate/aggressive) +5. Enable `show_analysis` to see content analysis +6. Process for intelligent enhancement + +### **DeepInv Diffusion Denoising** + +1. Start the external DeepInv service (see [guide](./DEEPINV_SERVICE_GUIDE.md)): + + ```powershell + python -m external_tools.deepinv_service.service + ``` + +1. Launch ComfyUI and add `DeepInv Denoise (Eric)`. +1. Pick a preset (DiffUNet, RAM, SwinIR, DRUNet, DnCNN, SCUNet). +1. Set `sigma` (0.0-0.5) for DiffUNet/RAM or leave at default for fixed-noise models. +1. Toggle `prefer_gpu` if CUDA resources are available. +1. Optionally target a remote instance by setting `service_url`. + +### **🎬 Film Grain Processing** + +1. **Automatic Processing**: + - Load image with grain/noise + - Add `Advanced Film Grain Processing (Eric)` node + - Set `processing_mode` to "auto_analyze" + - Adjust `preservation_level` (0.0-1.0) + - Enable `use_gpu` for faster processing + - Process to get automatically optimized results + +2. **Manual Processing for Specific Grain Types**: + - Set `processing_mode` to "manual_specify" + - Choose appropriate `grain_type`: + - **Authentic Film**: For real film grain (use preservation 0.7-0.9) + - **Digital Noise**: For high-ISO camera noise (use preservation 0.2-0.5) + - **Simulated Overlay**: For artificial grain effects (use preservation 0.0-0.3) + - Select `denoising_method` (gpu_wavelet recommended) + - Enable `multi_stage_processing` for best results + +3. **GPU-Accelerated Wavelet Only**: + - Add `GPU Wavelet Denoising (Eric)` node + - Set `use_gpu` to True + - Choose `wavelet_type` and `thresholding_method` + - Enable `use_stationary` for translation-invariant processing + +4. **Grain Analysis Only**: + - Add `Film Grain Analysis (Eric)` node + - Enable `detailed_analysis` for comprehensive metrics + - Review grain type detection and recommendations + +## 🎯 Best Practices for Film Grain Types + +### **Authentic Film Grain** (Film Emulsion) +- **Recommended Settings**: + - Grain Type: `authentic_film` + - Preservation Level: `0.7-0.9` + - Wavelet: `db8` (Daubechies 8) + - Method: `BayesShrink` + - Multi-stage: `True` + - Grain Enhancement: `True` +- **Why**: Film grain has natural structure that adds character. BayesShrink preserves this while removing noise. + +### **Digital Camera Noise** (High ISO) +- **Recommended Settings**: + - Grain Type: `digital_noise` + - Preservation Level: `0.2-0.5` + - Denoising Method: `adaptive` + - Wavelet: `db4` or `bior2.2` + - Method: `SureShrink` + - Edge Preservation: `True` +- **Why**: Digital noise is more uniform and less desirable. Aggressive removal with edge preservation maintains image quality. + +### **Simulated Grain Overlays** (Added in Post) +- **Recommended Settings**: + - Grain Type: `simulated_overlay` + - Preservation Level: `0.0-0.3` + - Denoising Method: `gpu_wavelet` + - Wavelet: `bior2.2` + - Method: `VisuShrink` + - Multi-stage: `True` +- **Why**: Artificial overlays can be completely removed while preserving the underlying image texture. + +### **Mixed Grain** (Multiple Sources) +- **Recommended Settings**: + - Processing Mode: `auto_analyze` + - Preservation Level: `0.5-0.7` + - Denoising Method: `adaptive` + - Multi-stage: `True` +- **Why**: Automatic analysis determines the best approach for complex grain combinations. + +## βš™οΈ Parameter Guide + +### **Wavelet Denoising** +- **Wavelet Types**: + - `db8`: Best all-around choice for natural images + - `db4`: Faster, good for general use + - `bior2.2`: Excellent for preserving edges + - `haar`: Fastest, good for simple images + +- **Thresholding Methods**: + - `BayesShrink`: Adaptive, optimal for most images + - `VisuShrink`: Conservative, preserves more detail + - `SureShrink`: Hybrid approach using statistical estimation + - `manual`: Use custom sigma value + +- **Sigma Parameter (Manual Mode)**: + - `0.1-2.0`: Ultra-light noise for high-quality images + - `2.0-10.0`: Light noise + - `10.0-25.0`: Moderate noise + - `25.0-50.0`: Heavy noise + - `50.0+`: Extreme noise + +### **Non-Local Means** +- **h Parameter**: Filtering strength (auto-estimated if 0) + - `0.1-1.0`: Ultra-light denoising for high-quality images + - `1.0-5.0`: Subtle denoising, preserve fine details + - `5.0-15.0`: Balanced denoising (recommended) + - `15.0-30.0`: Strong denoising + - `30.0+`: Very strong, may blur details +- **Patch Size**: 5-7 for fine textures, 7-11 for coarse textures +- **Search Window**: 11-15 standard, 17-50 for maximum quality + +### **Richardson-Lucy Deconvolution** +- **Blur Size**: + - `0.1-0.5`: Ultra-fine corrections for high-res images + - `0.5-1.5`: Light defocus, subtle sharpening + - `1.5-4.0`: Moderate blur (recommended) + - `4.0+`: Heavy blur +- **Motion Length**: + - `0.5-2.0`: Micro-motion correction for high-res images + - `2.0-10.0`: Light motion blur + - `10.0-30.0`: Moderate motion (recommended) + - `30.0+`: Heavy motion blur +- **Regularization**: + - `0.0005-0.005`: Ultra-light smoothing for high-quality images + - `0.005-0.02`: Light smoothing (recommended) + - `0.02+`: Moderate to heavy smoothing + +### **Wiener Filter** +- **Blur Size**: + - `0.1-0.5`: Ultra-fine sharpening for high-res images + - `0.5-2.0`: Light blur correction + - `2.0-6.0`: Moderate blur (recommended) + - `6.0+`: Heavy blur +- **K Value (Regularization)**: + - `0.0001-0.001`: Ultra-clean images, maximum sharpening + - `0.001-0.01`: Clean images, sharp results + - `0.01-0.1`: Moderate noise (recommended) + - `0.1+`: Noisy images, smooth results + +### **Homomorphic Filtering** +- **d0**: Cutoff frequency (1-200) + - `1.0-10.0`: Very strong illumination correction + - `10.0-30.0`: Strong illumination correction + - `30.0-60.0`: Moderate correction (recommended) + - `60.0+`: Subtle correction +- **gamma_h**: High frequency gain (0.1-10.0) + - `0.1-0.8`: Reduce high frequencies (smoothing) + - `0.8-1.2`: Subtle detail enhancement + - `1.2-2.5`: Enhance details (recommended) + - `2.5+`: Strong to extreme detail enhancement +- **gamma_l**: Low frequency gain (0.01-2.0) + - `0.01-0.3`: Very strong illumination suppression + - `0.3-0.8`: Moderate suppression (recommended) + - `0.8-1.0`: Gentle suppression + - `1.0+`: Boost low frequencies + +### **🎬 Film Grain Processing Parameters** +- **Processing Mode**: + - `auto_analyze`: Automatic grain detection and processing + - `manual_specify`: Manual grain type selection +- **Preservation Level**: How much grain to preserve + - `0.0-0.3`: Aggressive denoising (remove most/all grain) + - `0.3-0.7`: Moderate denoising (balanced approach) + - `0.7-1.0`: Conservative denoising (preserve grain character) +- **Denoising Method**: + - `gpu_wavelet`: GPU-accelerated wavelet (recommended for large images) + - `gpu_stationary_wavelet`: Translation-invariant processing + - `adaptive`: Grain-specific processing pipeline +- **Wavelet Selection for Grain Types**: + - `db8`: Best for authentic film grain + - `db4`: Good all-around choice, faster processing + - `bior2.2`: Excellent for edge preservation (digital noise) + - `coif2`: Good reconstruction properties +- **GPU Settings**: + - `use_gpu`: Enable CUDA acceleration (requires CuPy) + - Auto-enables for images > 512x512 pixels + - 2-5x speedup on compatible hardware + +## πŸ”§ Advanced Features + +### **Memory Management** +- Automatic memory cleanup after processing +- Batch processing with optional memory-efficient mode +- GPU memory management for CUDA-enabled systems + +### **Error Handling** +- Graceful fallback to original image on processing errors +- Comprehensive error messages with troubleshooting hints +- Optional fail-fast mode for batch processing + +### **Performance Optimization** +- Efficient algorithms with O(N log N) complexity for frequency domain operations +- Optimized parameter selection to reduce computational overhead +- Multi-threading support where available + +## πŸ“Š Performance Benchmarks + +### **Typical Processing Times (1920x1080 image)** +- Wavelet Denoising: 0.5-2 seconds +- Non-Local Means: 2-8 seconds +- Homomorphic Filtering: 0.3-1 second +- Richardson-Lucy: 1-10 seconds (depends on iterations) +- Batch Processing: ~1.2x single image time per image + +### **Memory Usage** +- Peak memory: 2-4x input image size +- Batch processing: Configurable memory vs. speed tradeoff +- GPU acceleration: Significant speedup for large images + +## πŸ› Troubleshooting + +### **Common Issues** + +1. **Import Error: "No module named 'pywt'"** + - Solution: Install PyWavelets: `pip install PyWavelets` + +2. **Out of Memory Error** + - Enable memory-efficient mode in batch processing + - Reduce batch size + - Use smaller decomposition levels for wavelets + +3. **Slow Processing** + - Reduce iterations for Richardson-Lucy deconvolution + - Use faster wavelet types (haar, db4) + - Enable fast mode for Non-Local Means + +4. **Poor Results** + - Check image format (should be 0-255 range) + - Adjust parameters based on image content + - Use adaptive methods for automatic parameter selection + +5. **GPU Acceleration Issues** + - **"CuPy not available"**: Install CuPy with `pip install cupy-cuda12x` + - **"GPU transfer failed"**: GPU memory insufficient, reduce image size or use CPU + - **"CUDA out of memory"**: Close other GPU applications or reduce batch size + +6. **Film Grain Processing Issues** + - **Poor grain detection**: Try manual grain type specification + - **Over-denoising**: Increase preservation level (0.7-0.9) + - **Under-denoising**: Decrease preservation level (0.3-0.5) + - **Artifacts**: Enable multi-stage processing and edge preservation + +## πŸ”¬ Algorithm Details + +### **Wavelet Denoising** +- Uses PyWavelets 1.6.0 with advanced thresholding +- Implements BayesShrink: `threshold = σ²/√(max(0, variance - σ²))` +- Supports both regular DWT and stationary SWT transforms + +### **Non-Local Means** +- Based on Buades-Coll-Morel algorithm +- Automatic parameter estimation using noise variance +- Optimized patch comparison with early termination + +### **Homomorphic Filtering** +- Separates illumination and reflectance: `I(x,y) = L(x,y) Γ— R(x,y)` +- Applies frequency domain filtering: `H(u,v) = (Ξ³H - Ξ³L)[1 - G(u,v)] + Ξ³L` +- Supports Gaussian and Butterworth filter shapes + +### **🎬 Film Grain Processing** +- **Multi-Domain Analysis**: Combines noise statistics, frequency analysis, texture features, and grain structure +- **Grain Classification**: Uses decision tree based on high-frequency ratio, grain regularity, and SNR +- **Adaptive Processing**: Tailors denoising strategy based on detected grain type: + - **Authentic Film**: BayesShrink wavelet + selective grain enhancement + - **Digital Noise**: Non-local means + SureShrink wavelet + edge enhancement + - **Simulated Overlay**: Frequency filtering + VisuShrink wavelet + texture preservation +- **GPU Acceleration**: Uses CuPy for wavelet coefficient thresholding and variance calculations +- **Memory Optimization**: Processes coefficients on GPU, reconstructs on CPU to minimize memory usage + +## πŸ“š References + +1. Donoho, D.L., & Johnstone, I.M. (1995). "Adapting to Unknown Smoothness via Wavelet Shrinkage" +2. Buades, A., Coll, B., & Morel, J.M. (2005). "A Non-Local Algorithm for Image Denoising" +3. Gonzalez, R.C., & Woods, R.E. (2017). "Digital Image Processing" +4. Richardson, W.H. (1972). "Bayesian-Based Iterative Method of Image Restoration" +5. Wiener, N. (1949). "Extrapolation, Interpolation, and Smoothing of Stationary Time Series" +6. Chang, S.G., Yu, B., & Vetterli, M. (2000). "Adaptive Wavelet Thresholding for Image Denoising and Compression" +7. Portilla, J., Strela, V., Wainwright, M.J., & Simoncelli, E.P. (2003). "Image Denoising Using Scale Mixtures of Gaussians in the Wavelet Domain" +8. Foi, A., Trimeche, M., Katkovnik, V., & Egiazarian, K. (2008). "Practical Poissonian-Gaussian Noise Modeling and Fitting for Single-Image Raw-Data" + +## πŸ“„ License + +This project is licensed under the MIT License - see the LICENSE file for details. + +## 🀝 Contributing + +Contributions are welcome! Please feel free to submit a Pull Request. + +## πŸ“ž Support + +For support, please open an issue on the GitHub repository with: +- Your ComfyUI version +- Error messages (if any) +- Sample images (if relevant) +- Processing parameters used + +--- + +**Made with ❀️ for the ComfyUI community**