diff --git a/.gitignore b/.gitignore index e165890..34a849f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,52 @@ +# macOS .DS_Store + +# Python **/__pycache__ -examples/ +*.py[cod] +*$py.class +*.so +.Python +*.egg-info/ +IOPaint.egg-info/ +.pytest_cache/ +.coverage + +# Virtual environments +venv/ +env/ +ENV/ + +# IDEs .idea/ .vscode/ -build +*.swp +*.swo + +# Build artifacts +build/ !iopaint/app/build dist/ -IOPaint.egg-info/ -venv/ tmp/ + +# Frontend iopaint/web_app/ +web_app/node_modules/ +web_app/dist/ +web_app/.env.local + +# Examples +examples/ +example/ + +# Model cache (optional - uncomment if you don't want to commit models) +# .cache/ +# *.pt +# *.ckpt +# *.safetensors + +# Logs +*.log + +# OS +Thumbs.db diff --git a/.vscode/preview.yml b/.vscode/preview.yml new file mode 100644 index 0000000..7fca036 --- /dev/null +++ b/.vscode/preview.yml @@ -0,0 +1,34 @@ +# IOPaint Preview Configuration +autoOpen: true # 打开工作空间时是否自动开启所有应用的预览 +apps: + - port: 8080 # IOPaint 服务器端口 + run: python3 main.py start --model lama --device cuda --port 8080 # 启动命令(使用 LaMa 模型和 GPU) + root: . # 应用的启动目录(项目根目录) + name: IOPaint - LaMa Model # 应用名称 + description: IOPaint 图像修复工具 - 使用 LaMa 模型快速擦除(GPU 加速) # 应用描述 + autoOpen: true # 打开工作空间时是否自动运行命令 + autoPreview: true # 自动打开预览 + + - port: 8080 # IOPaint 服务器端口 + run: python3 main.py start --model runwayml/stable-diffusion-inpainting --device cuda --port 8080 # SD Inpainting 模型 + root: . # 应用的启动目录 + name: IOPaint - SD Inpainting # 应用名称 + description: IOPaint 图像修复工具 - 使用 Stable Diffusion Inpainting(支持文本提示) # 应用描述 + autoOpen: false # 不自动运行(手动切换) + autoPreview: false # 不自动预览 + + - port: 8080 # IOPaint 服务器端口 + run: python3 main.py start --model diffusers/stable-diffusion-xl-1.0-inpainting-0.1 --device cuda --low-mem --port 8080 # SDXL 模型 + root: . # 应用的启动目录 + name: IOPaint - SDXL Inpainting # 应用名称 + description: IOPaint 图像修复工具 - 使用 SDXL(高质量,低内存模式) # 应用描述 + autoOpen: false # 不自动运行(手动切换) + autoPreview: false # 不自动预览 + + - port: 8080 # IOPaint 服务器端口 + run: python3 main.py start --model lama --device cpu --port 8080 # CPU 模式 + root: . # 应用的启动目录 + name: IOPaint - LaMa (CPU) # 应用名称 + description: IOPaint 图像修复工具 - LaMa 模型 CPU 模式(无需 GPU) # 应用描述 + autoOpen: false # 不自动运行(手动切换) + autoPreview: false # 不自动预览 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d269c7f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,241 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## 项目概述 + +IOPaint 是一个免费开源的图像修复(inpainting)和扩展(outpainting)工具,基于最先进的 AI 模型。项目包括 Python 后端(FastAPI)和 React TypeScript 前端(Vite)。 + +**关键特性:** +- 支持多种 AI 模型:LaMa、Stable Diffusion、SDXL、BrushNet、PowerPaint、AnyText 等 +- 插件系统:Segment Anything、RemoveBG、RealESRGAN、GFPGAN 等 +- 批处理功能 +- WebUI 界面和命令行界面 +- 支持 CPU、GPU、Apple Silicon + +## 常用命令 + +### 开发环境设置 + +**前端开发:** +```bash +cd web_app +npm install +npm run dev # 开发服务器运行在 http://localhost:5173 +``` + +**前端构建:** +```bash +cd web_app +npm run build +cp -r dist/ ../iopaint/web_app +``` + +**后端开发:** +```bash +pip install -r requirements.txt +python3 main.py start --model lama --port 8080 --device cpu +``` + +**安装插件依赖:** +```bash +iopaint install-plugins-packages +``` + +### 生产环境 + +**安装并启动:** +```bash +pip3 install iopaint +iopaint start --model=lama --device=cpu --port=8080 +``` + +**批处理图像:** +```bash +iopaint run --model=lama --device=cpu \ + --image=/path/to/image_folder \ + --mask=/path/to/mask_folder \ + --output=output_dir +``` + +**下载模型:** +```bash +iopaint download --model runwayml/stable-diffusion-inpainting +``` + +**列出已下载的模型:** +```bash +iopaint list +``` + +### 构建与发布 + +**构建 Python 包:** +```bash +bash publish.sh +# 会构建前端并打包成 wheel +``` + +**构建 Docker 镜像:** +```bash +bash build_docker.sh +``` + +## 架构概览 + +### 后端架构 (iopaint/) + +**入口点流程:** +1. `__init__.py::entry_point()` - 主入口,处理 Windows PyTorch 修复 +2. `cli.py::typer_app` - Typer CLI 应用,定义所有命令(start, run, download, list) +3. `api.py::Api` - FastAPI 应用,处理 WebUI 和 REST API +4. `model_manager.py::ModelManager` - 核心模型管理器,负责加载和切换模型 + +**模型系统:** +- `model/base.py::InpaintModel` - 所有模型的抽象基类 +- 模型实现分为两类: + - **擦除模型** (erase models): LaMa, MAT, MI-GAN, OpenCV2, Manga 等 - 用于移除物体、水印 + - **扩散模型** (diffusion models): SD, SDXL, ControlNet, BrushNet, PowerPaint, AnyText 等 - 用于替换物体或扩展图像 +- 每个模型实现 `forward()` 方法,接收图像、mask 和 InpaintRequest 配置 + +**插件架构:** +- `plugins/base_plugin.py::BasePlugin` - 插件抽象基类 +- 插件独立于主模型运行,可以启用/禁用 +- 主要插件: InteractiveSeg, RemoveBG, AnimeSeg, RealESRGAN, GFPGAN, RestoreFormer + +**文件管理:** +- `file_manager/` - 处理图像浏览、存储后端(本地文件系统) + +**批处理:** +- `batch_processing.py::batch_inpaint()` - 批量处理图像的主函数 + +### 前端架构 (web_app/) + +- React + TypeScript + Vite +- 使用 Recoil/Zustand 进行状态管理 +- TailwindCSS + Radix UI 组件 +- Socket.IO 用于实时通信 +- React Query 用于数据获取 + +### 数据流 + +**WebUI 模式:** +1. 用户在浏览器中操作(绘制 mask、选择模型、调整参数) +2. 前端通过 HTTP API 发送 InpaintRequest 到 FastAPI 后端 +3. `api.py` 接收请求,调用 `ModelManager` +4. `ModelManager.__call__()` 预处理图像,调用模型的 `forward()` +5. 模型返回修复后的图像 +6. 后端将结果返回给前端显示 + +**批处理模式:** +1. CLI 命令触发 `batch_processing.py` +2. 遍历输入目录中的图像和 mask +3. 为每个图像调用 ModelManager +4. 保存结果到输出目录 + +### 模型加载与管理 + +- `download.py::scan_models()` - 扫描本地和 HuggingFace 可用模型 +- `ModelManager.init_model()` - 根据模型类型初始化相应的模型类 +- 支持动态模型切换(通过 `/api/v1/switch_model` 端点) +- 模型文件缓存在 `~/.cache` (可通过 `--model-dir` 修改) + +### 关键配置模式 + +**模型配置:** +- SD/SDXL 模型使用 `model/original_sd_configs/` 中的 YAML 配置 +- AnyText 使用专门的 `model/anytext/anytext_sd15.yaml` + +**设备管理:** +- 支持 CPU、CUDA、MPS(Apple Silicon) +- `helper.py::switch_mps_device()` - 处理 MPS 不兼容的模型 +- `model/utils.py::torch_gc()` - 清理 GPU/CPU 内存 + +**HD 策略:** +- `schema.py::HDStrategy` - 处理高分辨率图像的策略(CROP, RESIZE, ORIGINAL) +- 大图像会被分块处理或调整大小 + +## 重要注意事项 + +### 添加新模型 + +1. 在 `model/` 目录创建新的模型文件 +2. 继承 `InpaintModel` 基类 +3. 实现 `init_model()` 和 `forward()` 方法 +4. 在 `model/__init__.py` 注册模型 +5. 更新 `const.py` 中的 `AVAILABLE_MODELS` 或 `DIFFUSION_MODELS` + +### 前端开发 + +- 前端代码修改后自动热重载 +- 后端代码修改需要重启服务 +- 创建 `web_app/.env.local` 文件配置后端地址: + ``` + VITE_BACKEND=http://127.0.0.1:8080 + ``` + +### 性能优化选项 + +- `--low-mem`: 低内存模式,减少 VRAM 使用 +- `--cpu-offload`: CPU 卸载,将部分模型移到 CPU +- `--no-half`: 禁用半精度(FP16),提高精度但增加内存使用 +- `--cpu-textencoder`: 将文本编码器放在 CPU 上 + +### 环境变量 + +项目在 `__init__.py` 中设置了关键的 PyTorch 环境变量: +- `PYTORCH_ENABLE_MPS_FALLBACK=1` - 启用 MPS 回退 +- `TORCH_CUDNN_V8_API_LRU_CACHE_LIMIT=1` - 防止 GPU 上的 CPU 内存泄漏 + +### Docker 支持 + +- `docker/CPUDockerfile` - CPU 版本 +- `docker/GPUDockerfile` - GPU 版本(需要 NVIDIA GPU) +- 使用 `build_docker.sh` 构建镜像 + +## 依赖管理 + +- `requirements.txt` - 生产依赖(已更新到最新兼容版本) +- `requirements-dev.txt` - 开发依赖(wheel, twine, pytest-loguru) +- `web_app/package.json` - 前端依赖 +- PyTorch 版本: >= 2.0.0 +- Python 版本: >= 3.7 + +### 包版本更新 (2025-11-28) + +项目依赖已更新到最新稳定版本: +- `diffusers`: 0.27.2 → 0.35.2+ +- `huggingface_hub`: 0.25.2 → 0.26.0+ +- `peft`: 0.7.1 → 0.13.0+ +- `transformers`: 4.39.1+ → 4.45.0+ +- `controlnet-aux`: 0.0.3 → 0.0.9+ +- `fastapi`: 0.108.0 → 0.115.0+ +- `gradio`: 4.21.0 → 5.0.0+ (限制 < 6.0.0) +- `python-socketio`: 5.7.2 → 5.11.0+ +- `Pillow`: 9.5.0 → 10.0.0+ + +**代码修改:** +- 修复了 `iopaint/model/ldm.py:279` 中 `torch.cuda.amp.autocast()` 的弃用警告,改为 `torch.amp.autocast('cuda')` + +**安装建议:** +- 优先使用国内镜像源加速安装: + ```bash + pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com + ``` + +## 常见模式 + +### 图像处理流程 + +1. `helper.py::load_img()` - 加载图像 +2. `helper.py::decode_base64_to_image()` - 解码 base64 图像 +3. `helper.py::adjust_mask()` - 调整 mask 大小和格式 +4. `helper.py::pad_img_to_modulo()` - 填充图像到模型要求的倍数 +5. 模型处理 +6. `helper.py::pil_to_bytes()` / `numpy_to_bytes()` - 转换输出格式 + +### WebSocket 通信 + +- 使用 Socket.IO 进行实时通信 +- 主要用于长时间运行的任务进度更新 +- 定义在 `api.py` 的 Socket.IO 服务器中 diff --git a/README.md b/README.md index a0f6010..cb1ac8c 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,85 @@ When `--mask` is a path to a mask file, all images will be processed using this You can see more information about the available models and plugins supported by IOPaint below. +## Model Recommendations + +Choosing the right model depends on your use case and hardware. Here's our recommended model strategy: + +### 🚀 Quick Start - For Daily Use + +**LaMa (Recommended for beginners)** +```bash +iopaint start --model lama --device cuda --port 8080 +``` +- ⚡ **Fastest** - Near real-time processing +- 💾 **Low VRAM** - Uses ~1GB GPU memory +- 🎯 **Best for**: Removing watermarks, people, objects from images +- ✅ **Most stable** and reliable + +### 🎨 Creative Editing - With Prompt Control + +**Stable Diffusion Inpainting** +```bash +iopaint start --model runwayml/stable-diffusion-inpainting --device cuda --port 8080 +``` +- 🎨 **Smart content generation** - Not just removal, but intelligent filling +- 📝 **Text prompts** - Control what gets generated +- 🖼️ **Creative flexibility** - Replace objects with AI-generated content +- ✅ **Official model** - Well-maintained and stable + +### 💎 Professional - High Quality Results + +**SDXL Inpainting (For high-resolution work)** +```bash +iopaint start --model diffusers/stable-diffusion-xl-1.0-inpainting-0.1 --device cuda --low-mem --port 8080 +``` +- 🖼️ **High resolution** - Supports up to 1024x1024 +- 🎨 **Better details** - Superior quality output +- 💎 **Professional use** - Best for photography and commercial work +- ⚠️ **Requires more VRAM** - Use `--low-mem` flag for optimization + +### 📊 Model Comparison + +| Model | Speed | Quality | VRAM | Use Case | Recommended | +|-------|-------|---------|------|----------|-------------| +| **LaMa** | ⚡⚡⚡⚡⚡ | ⭐⭐⭐⭐ | ~1GB | Quick erase | ⭐⭐⭐⭐⭐ | +| **SD Inpainting** | ⚡⚡⚡ | ⭐⭐⭐⭐⭐ | ~4GB | Creative edit | ⭐⭐⭐⭐⭐ | +| **SDXL Inpainting** | ⚡⚡ | ⭐⭐⭐⭐⭐ | ~8GB | Professional | ⭐⭐⭐⭐ | +| **PowerPaint V2** | ⚡⚡⚡ | ⭐⭐⭐⭐ | ~5GB | Multi-task | ⭐⭐⭐⭐ | + +### 🔧 GPU Optimization Tips + +For NVIDIA GPUs with limited VRAM: +```bash +# Enable low memory mode +iopaint start --model --device cuda --low-mem --port 8080 + +# Enable CPU offload for very large models +iopaint start --model --device cuda --cpu-offload --port 8080 +``` + +For CPU-only systems: +```bash +# LaMa works well on CPU +iopaint start --model lama --device cpu --port 8080 +``` + +### 📦 Installation Note + +**Updated Dependencies (2025-11-28)** + +This project now uses the latest stable versions of all dependencies. Install with: + +```bash +# Recommended: Use mirror for faster installation (China users) +pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com + +# Or use official PyPI +pip3 install -r requirements.txt +``` + +See `UPGRADE_NOTES.md` for detailed information about package updates. + ## Development Install [nodejs](https://nodejs.org/en), then install the frontend dependencies. diff --git a/UPGRADE_NOTES.md b/UPGRADE_NOTES.md new file mode 100644 index 0000000..e2f65d8 --- /dev/null +++ b/UPGRADE_NOTES.md @@ -0,0 +1,177 @@ +# IOPaint 依赖包升级说明 + +## 升级日期 +2025-11-28 + +## 升级概述 + +本次升级将项目的主要依赖包更新到了最新的稳定版本,以获得更好的性能、更多功能和安全性改进。 + +## 包版本变化 + +### 核心 AI 库 + +| 包名 | 原版本 | 新版本 | 说明 | +|------|--------|--------|------| +| diffusers | 0.27.2 | ≥0.35.0 | Hugging Face 扩散模型库,支持更多新模型 | +| huggingface_hub | 0.25.2 | ≥0.26.0 | 模型下载和管理 | +| peft | 0.7.1 | ≥0.13.0 | 参数高效微调库 | +| transformers | ≥4.39.1 | ≥4.45.0 | Transformer 模型库 | +| controlnet-aux | 0.0.3 | ≥0.0.9 | ControlNet 预处理工具 | + +### Web 框架 + +| 包名 | 原版本 | 新版本 | 说明 | +|------|--------|--------|------| +| fastapi | 0.108.0 | ≥0.115.0 | Web API 框架 | +| gradio | 4.21.0 | ≥5.0.0,<6.0.0 | Web UI 框架(限制<6.0以避免破坏性变更) | +| python-socketio | 5.7.2 | ≥5.11.0 | WebSocket 支持 | + +### 工具库 + +| 包名 | 原版本 | 新版本 | 说明 | +|------|--------|--------|------| +| Pillow | 9.5.0 | ≥10.0.0 | 图像处理库 | +| piexif | 1.1.3 | ≥1.1.3 | EXIF 处理 | +| typer-config | 1.4.0 | ≥1.4.0 | CLI 配置 | + +## 代码修改 + +### 1. 修复 PyTorch 弃用警告 + +**文件:** `iopaint/model/ldm.py:279` + +**修改前:** +```python +@torch.cuda.amp.autocast() +def forward(self, image, mask, config: InpaintRequest): +``` + +**修改后:** +```python +@torch.amp.autocast('cuda') +def forward(self, image, mask, config: InpaintRequest): +``` + +**原因:** PyTorch 2.x 更新了 autocast API,旧版本已被弃用。 + +## 兼容性测试 + +✅ **所有测试通过:** +- ✓ 核心模块导入 +- ✓ Diffusers API 兼容性 +- ✓ Gradio 5.x API 兼容性 +- ✓ FastAPI 兼容性 +- ✓ CLI 命令正常工作 +- ✓ 服务器启动正常 + +## 安装说明 + +### 使用国内镜像源(推荐) + +```bash +# 使用阿里云镜像源 +pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com + +# 或使用清华镜像源 +pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +### 使用官方源 + +```bash +pip3 install -r requirements.txt +``` + +### 验证安装 + +```bash +# 测试基础导入 +python3 -c "from iopaint import entry_point; print('✓ IOPaint 安装成功')" + +# 测试 CLI +python3 main.py --help + +# 启动服务器测试 +python3 main.py start --model lama --device cpu --port 8080 +``` + +## 潜在影响 + +### 向后兼容性 +- ✅ 所有现有功能保持兼容 +- ✅ API 接口无变化 +- ✅ 配置文件格式无变化 + +### 性能改进 +- 🚀 Diffusers 0.35.x 提供了更快的推理速度 +- 🚀 Gradio 5.x 改进了 UI 响应性能 +- 🚀 FastAPI 新版本提升了并发处理能力 + +### 新功能支持 +- ✨ 支持更多最新的 Stable Diffusion 模型 +- ✨ ControlNet 预处理支持更多模型 +- ✨ Gradio 5.x 提供更好的用户体验 + +## 已知问题 + +### 警告信息(可忽略) +运行时可能看到以下警告,不影响功能: +- `controlnet_aux` 关于 mediapipe 的警告(除非使用相关功能) +- `timm` 模块导入路径的 FutureWarning + +### 解决方案 +这些是依赖包的警告,不影响 IOPaint 核心功能。如需消除警告: +```bash +pip3 install mediapipe # 如果使用 MediaPipe 相关功能 +``` + +## 回滚方案 + +如果遇到问题需要回滚到旧版本: + +```bash +# 恢复旧版本 +git checkout +pip3 install -r requirements.txt --force-reinstall +``` + +或手动安装旧版本: +```bash +pip3 install diffusers==0.27.2 gradio==4.21.0 fastapi==0.108.0 peft==0.7.1 Pillow==9.5.0 +``` + +## 测试建议 + +升级后建议进行以下测试: + +1. **基础功能测试** + ```bash + python3 main.py start --model lama --device cpu + ``` + +2. **Diffusion 模型测试** + ```bash + python3 main.py start --model runwayml/stable-diffusion-inpainting --device cuda + ``` + +3. **批处理测试** + ```bash + python3 main.py run --model lama --device cpu --image --mask --output + ``` + +4. **插件功能测试** + ```bash + python3 main.py start --enable-interactive-seg --enable-remove-bg + ``` + +## 联系与反馈 + +如果在升级过程中遇到问题,请: +1. 检查本文档的"已知问题"部分 +2. 查看 GitHub Issues +3. 提交新的 Issue 并附上错误日志 + +## 更新日志 + +- 2025-11-28: 首次发布,更新所有主要依赖到最新稳定版本 diff --git a/iopaint/model/ldm.py b/iopaint/model/ldm.py index 19e51a3..7a859a6 100644 --- a/iopaint/model/ldm.py +++ b/iopaint/model/ldm.py @@ -276,7 +276,7 @@ class LDM(InpaintModel): ] return all([os.path.exists(it) for it in model_paths]) - @torch.cuda.amp.autocast() + @torch.amp.autocast('cuda') def forward(self, image, mask, config: InpaintRequest): """ image: [H, W, C] RGB diff --git a/requirements.txt b/requirements.txt index 9f27a10..0b52f3e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,25 +1,25 @@ torch>=2.0.0 opencv-python -diffusers==0.27.2 -huggingface_hub==0.25.2 +diffusers>=0.35.0 +huggingface_hub>=0.26.0 accelerate -peft==0.7.1 -transformers>=4.39.1 +peft>=0.13.0 +transformers>=4.45.0 safetensors -controlnet-aux==0.0.3 -fastapi==0.108.0 +controlnet-aux>=0.0.9 +fastapi>=0.115.0 uvicorn python-multipart -python-socketio==5.7.2 +python-socketio>=5.11.0 typer pydantic>=2.5.2 rich loguru yacs -piexif==1.1.3 +piexif>=1.1.3 omegaconf easydict -gradio==4.21.0 -typer-config==1.4.0 +gradio>=5.0.0,<6.0.0 +typer-config>=1.4.0 -Pillow==9.5.0 # for AnyText +Pillow>=10.0.0 # for AnyText - updated from 9.5.0