Hướng dẫn toàn diện SD-XL Inpainting 0.1: Khắc phục giới hạn sửa ảnh bằng AI

Việc sửa ảnh bằng AI thường gặp ba vấn đề chính: viền mờ, nội dung không nhất quán và mất chi tiết. Bài viết này phân tích kỹ thuật mô hình SD-XL Inpainting 0.1, đồng thời cung cấp giải pháp từ thiết lập môi trường đến tinh chỉnh cho ứng dụng thực tế.

1. Cải tiến kỹ thuật cốt lõi

Mô hình dựa trên kiến trúc Stable Diffusion XL Base 1.0 với các nâng cấp đáng chú ý:

  • Đầu vào mở rộng: UNet được bổ sung 5 kênh đầu vào mới — bao gồm 4 kênh biểu diễn ảnh gốc đã che và 1 kênh mặt nạ — khởi tạo trọng số bằng 0 để giữ nguyên tri thức từ mô hình gốc.
  • Robustness tăng cường: Áp dụng chiến lược bỏ ngẫu nhiên điều kiện văn bản (5%) trong huấn luyện để cải thiện khả năng hoạt động khi không có prompt.
  • Khả năng xử lý vùng lớn: Huấn luyện với xác suất 25% sử dụng mặt nạ phủ toàn bộ ảnh, giúp mô hình sinh nội dung hợp lý ngay cả khi vùng cần sửa chiếm phần lớn khung hình.

2. Triển khai thực tế

2.1 Thiết lập môi trường

# Clone mã nguồn
git clone https://gitcode.com/mirrors/diffusers/stable-diffusion-xl-1.0-inpainting-0.1
cd stable-diffusion-xl-1.0-inpainting-0.1

# Cài thư viện cần thiết
pip install diffusers==0.21.0.dev0 transformers accelerate torch

# Kiểm tra cài đặt
python -c "from diffusers import AutoPipelineForInpainting; print('Thành công')"

2.2 Gọi API cơ bản

from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image
import torch

# Khởi tạo pipeline
pipeline = AutoPipelineForInpainting.from_pretrained(
    ".",
    torch_dtype=torch.float16,
    variant="fp16"
).to("cuda")

# Tải ảnh và mặt nạ
original_img = load_image("input.jpg").resize((1024, 1024))
mask_img = load_image("mask.png").resize((1024, 1024))

# Sinh kết quả
output = pipeline(
    prompt="a tiger sitting on a park bench, photorealistic, 8k",
    image=original_img,
    mask_image=mask_img,
    guidance_scale=8.0,
    num_inference_steps=25,
    strength=0.95,
    generator=torch.Generator(device="cuda").manual_seed(42)
).images[0]

2.3 Hướng dẫn tinh chỉnh tham số

Tham sốMô tảKhoảng đề xuấtGợi ý
guidance_scaleMức độ tuân thủ prompt7.0–10.0Ảnh thật: 8–9; sáng tạo nghệ thuật: 6–7
num_inference_stepsSố bước suy luận20–30Chân dung: 25–30; phong cảnh: 20–25
strengthMức độ thay đổi vùng che0.8–0.99Vùng nhỏ: 0.8–0.9; vùng lớn: 0.95–0.99

3. Ứng dụng nâng cao

3.1 Sửa ảnh cũ

def restore_old_photo(img_path, mask_path):
    img = load_image(img_path).resize((1024, 1024))
    mask = load_image(mask_path).resize((1024, 1024))
    
    enhanced_prompt = (
        "restored vintage photo, highly detailed, sharp focus, "
        "vibrant colors, professional restoration"
    )
    
    result = pipeline(
        prompt=enhanced_prompt,
        image=img,
        mask_image=mask,
        guidance_scale=8.5,
        num_inference_steps=30,
        strength=0.97,
        generator=torch.Generator(device="cuda").manual_seed(12345)
    ).images[0]
    
    # Làm nét nhẹ
    from PIL import ImageFilter
    return result.filter(ImageFilter.SHARPEN)

3.2 Xử lý hàng loạt

import os
from tqdm import tqdm

def process_batch(input_dir, mask_dir, output_dir, prompt_text):
    os.makedirs(output_dir, exist_ok=True)
    files = [f for f in os.listdir(input_dir) if f.lower().endswith(('png', 'jpg', 'jpeg'))]
    
    for fname in tqdm(files):
        img_p = os.path.join(input_dir, fname)
        mask_p = os.path.join(mask_dir, os.path.splitext(fname)[0] + "_mask.png")
        out_p = os.path.join(output_dir, fname)
        
        if not os.path.exists(mask_p):
            continue
            
        res = pipeline(
            prompt=prompt_text,
            image=load_image(img_p).resize((1024, 1024)),
            mask_image=load_image(mask_p).resize((1024, 1024)),
            guidance_scale=8.0,
            num_inference_steps=25,
            strength=0.95
        ).images[0]
        res.save(out_p)

4. Tối ưu hiệu năng

4.1 Tăng tốc phần cứng

Thiết bịChiến lượcTốc độẢnh hưởng chất lượng
GPU NVIDIA (≥16GB)xFormers + FP168–12 giây/ảnhKhông đáng kể
GPU NVIDIA (8–12GB)FP16 + chia nhỏ mô hình15–20 giâyNhỏ
CPUINT8 + giảm kích thước60–90 giâyRõ rệt
# Kích hoạt xFormers (nếu hỗ trợ)
pipeline.enable_xformers_memory_efficient_attention()

# Tiết kiệm VRAM
pipeline.enable_attention_slicing("max")
pipeline.enable_model_cpu_offload()

5. Tài nguyên tham khảo

  • Tài liệu: API Inpainting của Diffusers, báo cáo kỹ thuật SD-XL
  • Dự án mã nguồn mở: sd-webui-inpaint-anything, lama-cleaner
  • Bộ dữ liệu: LaMa, ImageNet Inpainting

6. Xử lý sự cố thường gặp

Vấn đềNguyên nhânGiải pháp
Viền mờMặt nạ quá sắc nétDùng mặt nạ có viền mềm (5–10px), giảm strength xuống ~0.92
Nội dung lệchPrompt mơ hồMô tả chi tiết: "áo sơ mi xanh, tóc ngắn nâu" thay vì "người"
Tràn bộ nhớẢnh đầu vào lớnGiảm kích thước về 768×768, bật chia nhỏ mô hình

Cấu trúc prompt hiệu quả:
[chủ thể], [phong cách], [chi tiết kỹ thuật], [bổ sung]
Ví dụ: "a vintage car parked on street, oil painting style, brush strokes, highly detailed, 8k resolution"

Prompt loại trừ: "blurry, low quality, text, watermark, deformed"

Mô hình SD-XL Inpainting 0.1 hiện là giải pháp sửa ảnh AI mã nguồn mở hàng đầu, cân bằng giữa chất lượng và khả năng kiểm soát. Các phiên bản tương lai hứa hẹn hỗ trợ nhập đa phương tiện (văn bản + phác thảo) và xử lý thời gian thực trên GPU tầm trung.

Liên kết tải mô hình: stable-diffusion-xl-1.0-inpainting-0.1

Thẻ: Stable Diffusion XL Inpainting Image Restoration Diffusers PyTorch

Đăng vào ngày 3 tháng 8 lúc 21:19