Chuyển đến nội dung chính
Hướng dẫn AI

Tạo hình ảnh giàu văn bản và bố cục có kiểm soát với MOSS-Image

Hướng dẫn này giải thích cách thiết lập MOSS-Image, lựa chọn giữa các mô hình Base và SFT, tạo hình ảnh bằng Python hoặc Gradio, đồng thời định vị văn bản và đối tượng bằng các prompt bố cục có cấu trúc. Nội dung cũng trình bày các thiết lập lấy mẫu được khuyến nghị, chế độ bộ nhớ, hỗ trợ ComfyUI và các công cụ nâng cao prompt.

Tạo hình ảnh giàu văn bản và bố cục có kiểm soát với MOSS-Image

MOSS-Image là gì?

MOSS-Image là một dự án tạo ảnh mã nguồn mở từ OpenMOSS Team. Dự án cung cấp một mô hình văn bản thành hình ảnh cơ sở và một mô hình được tinh chỉnh có giám sát, cùng với pipeline Diffusers tùy chỉnh, giao diện Gradio, plugin ComfyUI gốc và các công cụ chuẩn bị prompt chi tiết.

Ví dụ MOSS-Image Base và SFT

Dự án được thiết kế cho các bố cục kết hợp các yếu tố hình ảnh với văn bản dễ đọc. Dự án hỗ trợ prompt dài tối đa 4K token và có thể tạo ra nhiều phong cách, từ anime đến hình ảnh chân thực. Backbone 5B được kỳ vọng mang lại khả năng tạo ảnh tương đối gọn nhẹ và hiệu quả.

Tính năng chính

  • Kiểm soát bố cục: Đặt văn bản và các yếu tố hình ảnh bằng dữ liệu đầu vào JSON có cấu trúc và các hộp giới hạn.
  • Kết xuất văn bản: Tạo văn bản rõ ràng bên trong áp phích, ghi chú, bảng trắng và các bố cục hình ảnh khác.
  • Prompt dài: Gửi prompt văn bản chứa tối đa 4K token.
  • Nhiều phong cách: Tạo hình ảnh phong cách anime và hình ảnh chân thực.
  • Hỗ trợ tinh chỉnh: Điều chỉnh mô hình cơ sở cho các tác vụ và lĩnh vực tùy chỉnh.
  • Kiến trúc hiệu quả: Tạo ảnh với backbone 5B.
  • Nhiều giao diện: Sử dụng Python, Gradio, ComfyUI hoặc skill nâng cao prompt riêng biệt.

Chọn mô hình

MOSS-Image có hai biến thể:

  • MOSS-Image-Base: Mô hình văn bản thành hình ảnh cơ sở. Trọng số có sẵn trên Hugging Face và ModelScope.
  • MOSS-Image-SFT: Phiên bản được tinh chỉnh từ mô hình cơ sở trên dữ liệu đã tuyển chọn. Trọng số có sẵn trên Hugging Face và ModelScope.

Trong phần so sánh do dự án cung cấp, mô hình SFT tạo ra các nhóm văn bản rõ ràng hơn và bố cục bảng trắng có tổ chức hơn. Hãy bắt đầu với mô hình Base khi bạn cần checkpoint đa dụng ban đầu hoặc dự định tinh chỉnh mô hình. Hãy cân nhắc SFT khi việc trình bày văn bản có cấu trúc đặc biệt quan trọng.

Đầu ra MOSS-Image Base Đầu ra MOSS-Image SFT

Cài đặt MOSS-Image

Sao chép repository, truy cập thư mục, tạo môi trường ảo, kích hoạt môi trường rồi cài đặt các gói yêu cầu:

git clone https://github.com/OpenMOSS/MOSS-Image.git
cd MOSS-Image
python -m venv .venv
source .venv/bin/activate

pip install -r requirements.txt

Các ví dụ sử dụng CUDA và chuyển pipeline sang GPU bằng pipe.to("cuda"). Hãy đảm bảo môi trường PyTorch được cấu hình cho nền tảng GPU mà bạn dự định sử dụng để suy luận.

Tạo ảnh bằng Python

MOSS-Image được tải thông qua Diffusers bằng pipeline tùy chỉnh. Ví dụ sau yêu cầu mô hình tạo một cảnh bếp có chứa lời nhắc viết tay bằng tiếng Trung:

import torch
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(
    "OpenMOSS-Team/MOSS-Image-Base",
    custom_pipeline="pipeline_moss_image",
    trust_remote_code=True,
    torch_dtype={"default": torch.bfloat16, "vae": torch.float32},
)
pipe.scheduler = type(pipe.scheduler).from_config(pipe.scheduler.config)
pipe.to("cuda")

prompt = (
    "A wide view of a refrigerator beside a kitchen counter with a fruit bowl. "
    "A small sticky note on the refrigerator door is handwritten in Chinese:“\n"
    "记得买牛奶和鸡蛋!\n牛奶两盒,鸡蛋一打。\n顺便带一袋面包。”"
)

image = pipe(
    prompt,
    height=1456,
    width=1456,
    num_inference_steps=50,
    guidance_scale=3.0,
    uncond_skip_layers=[22],
    generator=torch.Generator("cpu").manual_seed(42),
).images[0]

image.save("refrigerator_note.png")

Tìm hiểu các tham số quan trọng

  • custom_pipeline="pipeline_moss_image" chọn pipeline MOSS-Image.
  • trust_remote_code=True cho phép Diffusers tải phần triển khai pipeline tùy chỉnh của mô hình.
  • torch_dtype mặc định sử dụng bfloat16, đồng thời giữ float32 cho VAE.
  • height và width xác định kích thước đầu ra.
  • num_inference_steps=50 tuân theo khuyến nghị lấy mẫu mặc định của dự án.
  • guidance_scale=3.0 áp dụng giá trị guidance không cần classifier được khuyến nghị.
  • uncond_skip_layers=[22] bật tính năng bỏ qua lớp ở nhánh âm tại lớp 22.
  • manual_seed(42) giúp các lần chạy lặp lại với cùng cấu hình có tính tái lập cao hơn.

Chạy giao diện Gradio

Cài đặt các dependency tùy chọn cho giao diện người dùng và khởi chạy ứng dụng đi kèm:

pip install -e '.[ui]'
python gradio_app.py --model OpenMOSS-Team/MOSS-Image-Base

Mở địa chỉ cục bộ do Gradio hiển thị, nhập prompt mong muốn, chọn kích thước ảnh rồi bắt đầu tạo ảnh. Để thử checkpoint đã tinh chỉnh, hãy thay tham số mô hình bằng OpenMOSS-Team/MOSS-Image-SFT.

Cài đặt lấy mẫu được khuyến nghị

  • Bộ lấy mẫu: Flow-matching Euler
  • Số bước: 50
  • CFG: 3
  • Shift: 5
  • Bỏ qua lớp: Bỏ qua nhánh âm tại lớp 22
  • Negative prompt trong Python API: Để trống

Đây là các thiết lập mặc định được ghi lại trong dự án và cung cấp một điểm khởi đầu thực tế. Hãy tham khảo hướng dẫn sử dụng bằng tiếng Anh của kho mã để biết thêm các đề xuất về prompt và lấy mẫu.

Kiểm soát bố cục bằng layout JSON

Prompt thông thường mô tả những gì một hình ảnh nên chứa, nhưng không xác định chính xác vị trí của từng thành phần. Thay vào đó, MOSS-Image có thể nhận layout JSON mô tả toàn bộ khung cảnh, từng thành phần văn bản hoặc đối tượng, cùng các hộp giới hạn của chúng.

Các hộp giới hạn bố cục cho những thành phần hình ảnh được định vị

Layout sau mô tả một áp phích du lịch tối giản có kích thước 1024 x 1024. Hãy lưu dưới dạng layout.json nếu muốn tải từ Python, hoặc dán trực tiếp vào trường Prompt của Gradio.

{
  "summary": {
    "meta": ["poster"],
    "canvas": "single",
    "caption": "Một áp phích du lịch tối giản với nền màu kem, hình minh họa núi màu xanh lam và tiêu đề EXPLORE ở phía trên."
  },
  "items": [
    {
      "label": "text",
      "caption": "Tiêu đề in hoa màu xanh lam đậm, kích thước lớn, căn giữa ở phía trên.",
      "text": "EXPLORE",
      "bbox": [-416, -384, -288, 384]
    },
    {
      "label": "object",
      "caption": "Hình minh họa núi màu xanh lam phẳng ở khu vực trung tâm phía dưới.",
      "bbox": [-192, -288, 384, 288]
    }
  ],
  "bbox_coord_space": "abs_centralized",
  "bbox_format": "yxyx"
}

Cách thức hoạt động của định dạng layout

  • summary.caption mô tả toàn bộ khung cảnh và phong cách hình ảnh.
  • items chứa các thành phần văn bản và đối tượng được định vị độc lập.
  • label xác định một mục là văn bản hay đối tượng.
  • caption mô tả diện mạo và vai trò của mục đó.
  • text chứa chính xác các từ mà một mục văn bản cần hiển thị.
  • bbox xác định vị trí và phạm vi của thành phần.
  • bbox_format: "yxyx" nghĩa là mỗi hộp được sắp xếp theo dạng [y_min, x_min, y_max, x_max].
  • bbox_coord_space: "abs_centralized" nghĩa là tọa độ được đo từ tâm của canvas.

Trên canvas 1024 x 1024, cả hai trục đều trải dài từ -512 đến +512. Tọa độ x tăng về phía bên phải, còn tọa độ y tăng dần xuống dưới. Để chuyển đổi tọa độ canvas thông thường, hãy lấy giá trị x trừ đi một nửa chiều rộng canvas và lấy giá trị y trừ đi một nửa chiều cao canvas.

Luôn sử dụng kích thước tạo ảnh khớp với kích thước mà layout đã được chuẩn bị. Việc không khớp sẽ thay đổi hệ tọa độ và có thể khiến các thành phần lệch khỏi vị trí dự kiến.

Gửi layout qua Python

Tải tệp JSON, tuần tự hóa thành chuỗi rồi truyền chuỗi đó làm prompt cho pipeline:

import json
import torch

with open("layout.json", "r", encoding="utf-8") as file:
    layout = json.load(file)

layout_prompt = json.dumps(layout, ensure_ascii=False)

image = pipe(
    layout_prompt,
    height=1024,
    width=1024,
    num_inference_steps=50,
    guidance_scale=3.0,
    uncond_skip_layers=[22],
    generator=torch.Generator("cpu").manual_seed(42),
).images[0]

image.save("travel_poster.png")

Bạn có thể chỉnh sửa bố cục mà không cần viết lại toàn bộ prompt. Hãy chỉnh sửa văn bản, chú thích hoặc hộp giới hạn của một mục rồi tạo lại hình ảnh. README cũng lưu ý rằng cách tiếp cận có cấu trúc này có thể hỗ trợ chỉnh sửa có kiểm soát và các công cụ bố cục thân thiện với người dùng.

Quản lý bộ nhớ GPU

Giao diện Gradio cung cấp ba chế độ bộ nhớ trong phần cài đặt Nâng cao:

  • GPU resident: Giữ toàn bộ mô hình trên GPU để truy cập trực tiếp.
  • Component: Di chuyển các thành phần mô hình giữa CPU và GPU khi cần.
  • Sequential fallback: Giảm mức sử dụng bộ nhớ nhưng khiến quá trình suy luận chậm hơn.

Nếu mô hình không vừa với bộ nhớ GPU khả dụng, hãy chọn chế độ Sequential hoặc giảm kích thước ảnh đầu ra. Biên dịch DiT bị tắt theo mặc định và không khả dụng ở chế độ Sequential.

Sử dụng MOSS-Image với ComfyUI

Kho mã bao gồm một plugin MOSS-Image gốc cho ComfyUI. Hãy tìm MOSS-Image trong ComfyUI Manager để cài đặt. Dự án cũng cung cấp quy trình mẫu có thể được nhập làm điểm khởi đầu.

Dự án đang hướng tới việc tích hợp vào kho ComfyUI chính thức. Trong thời gian chờ đợi, hãy làm theo hướng dẫn cài đặt và sử dụng ComfyUI của kho mã.

Prompt nâng cao với Prompt Enhancer

Prompt Enhancer đi kèm MOSS-Image chuyển một ý tưởng hình ảnh cơ bản thành chú thích chi tiết hoặc prompt bố cục không gian. Công cụ này được thiết kế cho các tác tử thuộc dòng GPT-6 có công cụ tệp cục bộ và Python.

  1. Cài đặt thư mục skills/moss-image-prompt-enhancer vào thư mục kỹ năng của tác tử.
  2. Gọi $moss-image-prompt-enhancer kèm theo ý tưởng hình ảnh.
  3. Chỉ định bạn muốn chú thích chi tiết hay đầu ra Layout.
  4. Cung cấp kích thước canvas dự kiến khi tạo layout.
  5. Dán đầu ra đã biên dịch vào positive prompt của MOSS-Image.
  6. Đối với đầu ra Layout, hãy tạo hình ảnh với cùng kích thước canvas được sử dụng trong quá trình biên dịch.

Script đi kèm chuyển đổi các bản phác thảo bằng tọa độ pixel thành JSON nhỏ gọn bằng cách sử dụng tọa độ nguyên có tâm. Script chỉ chuẩn bị prompt và không gọi dịch vụ tạo ảnh.

Mẹo thực tế

  • Bắt đầu với các giá trị mặc định đã được ghi nhận: Sử dụng 50 bước, CFG 3, shift 5 và bỏ qua nhánh âm ở lớp 22 trước khi thử nghiệm.
  • Nêu rõ văn bản cần tạo: Đặt nguyên văn nội dung trong prompt hoặc trong trường text của một mục.
  • Sử dụng bố cục có cấu trúc cho các thiết kế phức tạp: Áp phích, sơ đồ và các cảnh nhiều văn bản sẽ hiệu quả hơn khi các thành phần và hộp giới hạn được mô tả riêng.
  • Đảm bảo kích thước khớp chính xác: Tọa độ bố cục gắn với chiều rộng và chiều cao canvas đã chọn.
  • Giữ cố định seed trong quá trình lặp: Dùng cùng một seed giúp bạn so sánh các thay đổi về prompt, mô hình và bố cục.
  • Giảm kích thước ảnh khi bộ nhớ bị giới hạn: Đây là một trong những biện pháp được dự án khuyến nghị rõ ràng.
  • So sánh Base và SFT: Checkpoint SFT có thể phù hợp hơn khi ưu tiên việc phân nhóm rõ ràng và bố cục văn bản có tổ chức hơn.

Kết luận

MOSS-Image kết hợp khả năng tạo ảnh từ văn bản tổng quát với khả năng kết xuất văn bản mạnh mẽ và kiểm soát bố cục có cấu trúc. Bạn có thể bắt đầu với pipeline Python hoặc giao diện Gradio, sau đó chuyển sang bố cục JSON khi vị trí chính xác là yếu tố quan trọng. Tích hợp ComfyUI, các chế độ bộ nhớ và kỹ năng nâng cao prompt cung cấp thêm nhiều cách để tích hợp mô hình vào quy trình làm việc trực quan. Mã pipeline độc lập được cung cấp theo Giấy phép Apache 2.0.