create-image / app.py
sang1231's picture
Update app.py
9715820 verified
import gradio as gr
from PIL import Image
import torch
import warnings
# Tắt cảnh báo về mô hình
warnings.filterwarnings("ignore")
# Cấu hình thiết bị và Mô hình
device = "cuda" if torch.cuda.is_available() else "cpu"
pipe = None
MODEL_ID = "runwayml/stable-diffusion-v1-5"
try:
from diffusers import StableDiffusionImg2ImgPipeline
print(f"Đang tải mô hình Img2Img: {MODEL_ID} trên {device}...")
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
MODEL_ID,
torch_dtype=torch.float16 if device == "cuda" else torch.float32
).to(device)
print("Tải mô hình hoàn tất.")
except ImportError:
# Lỗi khi không cài đặt 'diffusers'
pipe = None
except Exception as e:
# Lỗi khi tải mô hình (ví dụ: lỗi mạng, lỗi bộ nhớ)
print(f"Lỗi khi tải mô hình Stable Diffusion: {e}")
pipe = None
# --- HÀM TẠO ẢNH CHÍNH ---
def generate_image(
reference_image: Image.Image,
prompt: str,
style: str,
guidance_scale: float,
strength: float
):
"""Thực hiện việc tạo ảnh bằng Img2Img Pipeline."""
if pipe is None:
raise gr.Error("Mô hình AI chưa được tải thành công. Vui lòng kiểm tra nhật ký lỗi.")
# Chuẩn bị Prompt (Mô tả)
style_keywords = {
"photorealistic": "photorealistic, 4k, ultra detailed, cinematic lighting",
"anime": "anime style, vibrant colors, trending on pixiv",
"oilpainting": "oil painting, thick impasto, masterpiece on canvas",
"conceptart": "concept art, matte painting, dramatic lighting, highly detailed"
}
full_prompt = f"{prompt}, {style_keywords.get(style, '')}"
# Xử lý Kích thước Ảnh Tham Chiếu
# Resizing ảnh đầu vào (thường là 512x512)
reference_image = reference_image.resize((512, 512))
# Gọi Pipeline Tạo Ảnh
with torch.no_grad():
result = pipe(
prompt=full_prompt,
image=reference_image,
strength=strength,
guidance_scale=guidance_scale,
num_inference_steps=50
).images[0]
return result
# --- THIẾT LẬP GIAO DIỆN GRADIO ---
gr.Interface(
fn=generate_image,
inputs=[
# Đã XÓA 'source="upload"' để khắc phục lỗi TypeError
gr.Image(type="pil", label="🖼️ Ảnh Tham Chiếu"),
gr.Textbox(
label="📝 Mô Tả và Từ Khóa",
placeholder="Nhập mô tả chi tiết về ảnh bạn muốn tạo..."
),
gr.Dropdown(
label="🎨 Phong cách Nghệ thuật",
choices=["photorealistic", "anime", "oilpainting", "conceptart"],
value="photorealistic"
),
gr.Slider(
label="Mức độ Tuân theo Prompt (Guidance Scale)",
minimum=1.0, maximum=15.0, step=0.5, value=7.5
),
gr.Slider(
label="Cường độ Ảnh Tham Chiếu (Strength)",
minimum=0.0, maximum=1.0, step=0.05, value=0.8,
info="Strength cao (0.8-1.0) giữ lại ít chi tiết ảnh gốc, Strength thấp (0.3-0.6) giữ lại nhiều hơn."
)
],
outputs=gr.Image(label="✅ Ảnh Kết Quả", type="pil"),
title="✨ Ứng Dụng Tạo Ảnh Từ Ảnh Tham Chiếu (Stable Diffusion Img2Img)",
description="Sử dụng Stable Diffusion Img2Img để tạo ảnh mới dựa trên ảnh tham chiếu và mô tả văn bản.",
allow_flagging="never",
).launch(debug=True)