メインコンテンツへ移動
AIチュートリアル

MOSS-Imageで文字量の多い画像と自在なレイアウトを生成する

このチュートリアルでは、MOSS-Imageのセットアップ方法、BaseモデルとSFTモデルの選び方、PythonまたはGradioによる画像生成、構造化レイアウトプロンプトを使ったテキストやオブジェクトの配置方法を解説します。推奨サンプリング設定、メモリモード、ComfyUIのサポート、プロンプト強化ツールについても説明します。

MOSS-Imageで文字量の多い画像と自在なレイアウトを生成する

MOSS-Imageとは?

MOSS-Imageは、OpenMOSS Teamによるオープンな画像生成プロジェクトです。ベースとなるテキスト・画像生成モデルと教師ありファインチューニング済みモデルに加え、カスタムDiffusersパイプライン、Gradioインターフェース、ネイティブComfyUIプラグイン、詳細なプロンプトを準備するためのツールを提供します。

MOSS-Image BaseとSFTの例

このプロジェクトは、視覚要素と読みやすいテキストを組み合わせた構図向けに設計されています。最大4Kトークンのプロンプトに対応し、アニメからフォトリアリスティックな画像まで、さまざまなスタイルを生成できます。5Bバックボーンにより、比較的コンパクトで効率的な画像生成を実現します。

主な機能

  • レイアウト制御: 構造化JSON入力とバウンディングボックスを使って、テキストや視覚要素を配置できます。
  • テキスト描画: ポスター、メモ、ホワイトボードなどの画像構成内に、明瞭なテキストを生成できます。
  • 長いプロンプト: 最大4Kトークンを含むテキストプロンプトを送信できます。
  • 複数のスタイル: アニメ風およびフォトリアリスティックな画像を作成できます。
  • ファインチューニング対応: ベースモデルをカスタムタスクや分野に適応できます。
  • 効率的なアーキテクチャ: 5Bバックボーンで画像を生成します。
  • 複数のインターフェース: Python、Gradio、ComfyUI、または独立したプロンプト強化スキルを利用できます。

モデルを選択する

MOSS-Imageには2つのバリエーションがあります。

  • MOSS-Image-Base: ベースとなるテキスト・画像生成モデルです。重みはHugging FaceとModelScopeから入手できます。
  • MOSS-Image-SFT: 厳選されたデータでベースモデルからファインチューニングしたモデルです。重みはHugging FaceとModelScopeから入手できます。

プロジェクトが提供する比較では、SFTモデルのほうがテキストのまとまりが明瞭で、ホワイトボードのレイアウトも整理されています。元の汎用チェックポイントが必要な場合や、ファインチューニングを予定している場合は、Baseモデルから始めてください。構造化されたテキスト表現が特に重要な場合は、SFTを検討してください。

MOSS-Image Baseの出力 MOSS-Image SFTの出力

MOSS-Imageをインストールする

リポジトリをクローンし、そのディレクトリに移動して仮想環境を作成・有効化した後、必要なパッケージをインストールします。

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

サンプルではCUDAを使用し、pipe.to("cuda")でパイプラインをGPUに移します。推論を実行するGPUプラットフォーム向けに、PyTorch環境が設定されていることを確認してください。

Pythonで画像を生成する

MOSS-Imageは、カスタムパイプラインを使用してDiffusersから読み込みます。次の例では、手書きの中国語のメモがあるキッチンのシーンを生成します。

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")

重要な引数を理解する

  • custom_pipeline="pipeline_moss_image"はMOSS-Imageパイプラインを選択します。
  • trust_remote_code=Trueは、Diffusersがモデルのカスタムパイプライン実装を読み込むことを許可します。
  • torch_dtypeはデフォルトでbfloat16を使用し、VAEにはfloat32を保持します。
  • heightとwidthは出力サイズを決定します。
  • num_inference_steps=50は、プロジェクトが推奨するデフォルトのサンプリング設定に従います。
  • guidance_scale=3.0は、推奨されるclassifier-free guidanceの値を適用します。
  • uncond_skip_layers=[22]は、22層目でネガティブブランチのレイヤースキップを有効にします。
  • manual_seed(42)は、同じ設定で実行を繰り返した際の再現性を高めます。

Gradioインターフェースを実行する

オプションのユーザーインターフェース用依存関係をインストールし、付属のアプリケーションを起動します。

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

Gradioが表示するローカルアドレスを開き、ポジティブプロンプトを入力して画像サイズを選択し、生成を開始します。代わりにファインチューニング済みチェックポイントを試すには、モデル引数をOpenMOSS-Team/MOSS-Image-SFTに置き換えてください。

推奨サンプリング設定

  • サンプラー: Flow-matching Euler
  • ステップ数: 50
  • CFG: 3
  • シフト: 5
  • レイヤースキップ: 22層目でネガティブブランチをスキップ
  • Python APIのネガティブプロンプト: 空

これはプロジェクトで文書化されているデフォルト設定で、実用的な出発点となります。追加のプロンプトやサンプリングに関する推奨事項については、リポジトリの英語ユーザーガイドを参照してください。

JSONレイアウトで構図を制御する

通常のプロンプトでは画像に何を含めるかを説明できますが、各要素をどこに配置するかを正確に定義することはできません。MOSS-Imageでは、シーン全体、個々のテキストまたはオブジェクト要素、それらのバウンディングボックスを記述したJSONレイアウトを使用できます。

配置された画像要素のレイアウトバウンディングボックス

次のレイアウトは、1024×1024のミニマルな旅行ポスターを記述したものです。Pythonから読み込む場合はlayout.jsonとして保存するか、GradioのPromptフィールドに直接貼り付けてください。

{
  "summary": {
    "meta": ["poster"],
    "canvas": "single",
    "caption": "A minimalist travel poster with a cream background, a blue mountain illustration, and the title EXPLORE at the top."
  },
  "items": [
    {
      "label": "text",
      "caption": "Large dark-blue uppercase title centered at the top.",
      "text": "EXPLORE",
      "bbox": [-416, -384, -288, 384]
    },
    {
      "label": "object",
      "caption": "A flat blue mountain illustration in the lower center.",
      "bbox": [-192, -288, 384, 288]
    }
  ],
  "bbox_coord_space": "abs_centralized",
  "bbox_format": "yxyx"
}

レイアウト形式の仕組み

  • summary.captionはシーン全体とそのビジュアルスタイルを説明します。
  • itemsには、個別に配置するテキスト要素とオブジェクト要素が含まれます。
  • labelは、項目がテキストかオブジェクトかを識別します。
  • captionは、項目の外観と役割を説明します。
  • textには、テキスト項目に表示する正確な語句を指定します。
  • bboxは、要素の位置と範囲を定義します。
  • bbox_format: "yxyx"は、各ボックスが[y_min, x_min, y_max, x_max]の順序で指定されることを意味します。
  • bbox_coord_space: "abs_centralized"は、座標がキャンバスの中心を基準に測定されることを意味します。

1024×1024のキャンバスでは、両軸の範囲は-512から+512です。x座標は右方向に増加し、y座標は下方向に増加します。通常のキャンバス座標を変換するには、x値からキャンバス幅の半分を、y値からキャンバス高さの半分を引きます。

レイアウトを準備したときと同じ生成サイズを必ず使用してください。サイズが一致しないと座標系が変わり、要素が意図した位置から移動する可能性があります。

Pythonからレイアウトを送信する

JSONファイルを読み込み、文字列としてシリアライズして、その文字列をパイプラインのプロンプトとして渡します。

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")

プロンプト全体を書き直さずに構図を修正できます。項目のテキスト、キャプション、またはバウンディングボックスを編集して、画像を再生成してください。READMEでは、この構造化されたアプローチによって、制御された編集や使いやすいレイアウトツールにも対応できると説明されています。

GPUメモリを管理する

GradioインターフェースのAdvanced設定には、3つのメモリモードがあります。

  • GPU resident: 完全なモデルをGPU上に保持し、直接アクセスできるようにします。
  • Component: 必要に応じてモデルのコンポーネントをCPUとGPUの間で移動します。
  • Sequential fallback: 推論速度を犠牲にしてメモリ使用量を削減します。

モデルが利用可能なGPUメモリに収まらない場合は、Sequentialモードを選択するか、出力画像のサイズを小さくしてください。DiTコンパイルはデフォルトで無効になっており、Sequentialモードでは利用できません。

ComfyUIでMOSS-Imageを使用する

リポジトリには、ComfyUI用のネイティブMOSS-Imageプラグインが含まれています。インストールするには、ComfyUI ManagerでMOSS-Imageを検索してください。プロジェクトには、出発点としてインポートできるサンプルワークフローも用意されています。

プロジェクトでは、公式ComfyUIリポジトリへの統合に向けて作業が進められています。それまでは、リポジトリのComfyUIのインストールおよび使用手順に従ってください。

Prompt Enhancerによる高度なプロンプト作成

付属のMOSS-Image Prompt Enhancerは、基本的な画像のアイデアを詳細なキャプションまたは空間レイアウトプロンプトに変換します。ローカルファイルツールとPythonツールを備えたGPT-6ファミリーのエージェント向けに設計されています。

  1. skills/moss-image-prompt-enhancerフォルダーをエージェントのスキルディレクトリにインストールします。
  2. 画像のアイデアを指定して$moss-image-prompt-enhancerを呼び出します。
  3. 詳細なキャプションとLayout出力のどちらが必要かを指定します。
  4. レイアウトを作成する場合は、対象のキャンバスサイズを指定します。
  5. コンパイルされた出力をMOSS-Imageのpositive promptに貼り付けます。
  6. Layout出力の場合は、コンパイル時に使用したものと同じキャンバスサイズで画像を生成します。

付属のスクリプトは、ピクセル座標で作成した下書きを、整数の中心座標を用いたコンパクトなJSONに変換します。プロンプトの準備のみを行い、画像生成サービスは呼び出しません。

実用的なヒント

  • 文書化されたデフォルト値から始める: 試行錯誤する前に、ステップ数50、CFG 3、シフト5、レイヤー22でのネガティブブランチのスキップを使用します。
  • 指定するテキストを明確にする: 正確な文言をプロンプト、またはアイテムのtextフィールドに記載します。
  • 複雑なデザインには構造化レイアウトを使う: ポスター、図、テキストの多いシーンでは、要素とバウンディングボックスを個別に記述すると効果的です。
  • 寸法を慎重に合わせる: レイアウトの座標は、選択したキャンバスの幅と高さに紐づいています。
  • 反復中はシードを固定する: 同じシードを維持すると、プロンプト、モデル、レイアウトの変更を比較しやすくなります。
  • メモリが限られている場合は画像サイズを下げる: これはプロジェクトが明示的に推奨している対策の一つです。
  • BaseとSFTを比較する: より明確なグループ化と整理されたテキストレイアウトを優先する場合は、SFTチェックポイントが適している可能性があります。

まとめ

MOSS-Imageは、汎用的なテキストから画像への生成に加え、高度なテキストレンダリングと構造化された構図制御を実現します。PythonパイプラインまたはGradioインターフェースから始め、正確な配置が重要になったらJSONレイアウトに移行できます。ComfyUI統合、メモリモード、プロンプト強化スキルにより、モデルをビジュアルワークフローに組み込む方法がさらに広がります。スタンドアロンのパイプラインコードはApache License 2.0の下で利用できます。