Kolorsを使った驚異の画像生成：初心者ガイド

## はじめに：Kolorsとは？

Kolorsは、Kuaishou Kolorsチームによって開発された最先端のテキスト-画像生成モデルです。数十億のテキストと画像のペアでトレーニングされており、高品質な画像生成能力を持っています。

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[テキスト入力] --> B[Kolorsモデル]
    B --> C[高品質画像出力]
    B --> D[中国語サポート]
    B --> E[英語サポート]
    B --> F[複雑な意味理解]
    B --> G[優れた文字描画]
```

Kolorsの主な特徴：
- 高品質な画像生成
- 中国語と英語の入力サポート
- 複雑な意味の正確な理解
- 優れた文字描画能力

それでは、このすごいモデルを使って画像を生成する方法を、順を追って見ていきましょう！

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">🖼 Kolors: Effective Training of Diffusion Model for Photorealistic Text-to-Image Synthesis 📷使ってみた！ <a href="https://t.co/6ejvv1T3zd">https://t.co/6ejvv1T3zd</a> <a href="https://t.co/2cIcxIZfdd">pic.twitter.com/2cIcxIZfdd</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1814209946818687424?ref_src=twsrc%5Etfw">July 19, 2024</a></blockquote> 

## 環境セットアップ

まず、必要なライブラリをインストールします。以下のコードを実行してください。

```python
# 必要なライブラリのインストール
!apt-get install git-lfs
!pip install -U diffusers fire accelerate xformers transformers
```

このコードは以下の作業を行います：
1. `git-lfs`（大容量ファイルの取り扱いに必要）をインストール
2. 画像生成に必要な Python ライブラリをインストールまたはアップデート


## Kolorsのインストール

次に、KolorsのGitHubリポジトリをクローンし、セットアップします。

```python
# Kolorsリポジトリのクローンとディレクトリ移動
!git clone https://github.com/Kwai-Kolors/Kolors
%cd /content/Kolors

# Kolorsのセットアップ
!python3 setup.py install
```

このステップでは：
1. GitHubからKolorsのソースコードをダウンロード
2. ダウンロードしたKolorsディレクトリに移動
3. Kolorsをインストール


## モデルの重みのダウンロード

Kolorsモデルの重みをダウンロードします。これは画像生成に必須です。

```python
# Kolorsモデルの重みをダウンロード
!huggingface-cli download --resume-download Kwai-Kolors/Kolors --local-dir weights/Kolors
```

このコマンドは：
- Hugging Faceのリポジトリから Kolors の重みをダウンロード
- ダウンロードした重みを`weights/Kolors`ディレクトリに保存


## 基本的な画像生成

さあ、いよいよ画像生成です！以下のコードで、簡単に画像を生成できます。

```python
# 基本的な画像生成の実行
!python3 scripts/sample.py "A photo of a cat, macro, zoom, high quality, film, holding a sign"Sample""
```

このコードは：
- 指定されたプロンプト（ここでは猫の写真）に基づいて画像を生成
- 生成された画像は "scripts/outputs/sample_test.jpg" に保存されます

```mermaid
%%{
  init: {
    'theme': 'base',
    'themeVariables': {
      'primaryColor': '#ffcccc',
      'secondaryColor': '#ccffcc',
      'tertiaryColor': '#ccccff',
      'mainBkg': '#fff0f0',
      'nodeBorder': '#ff9999',
      'clusterBkg': '#fffaf0',
      'clusterBorder': '#ffe4b5',
      'lineColor': '#ff9999',
      'fontFamily': 'arial'
    }
  }
}%%
sequenceDiagram
    participant User
    participant Kolors
    participant FileSystem
    User->>Kolors: テキストプロンプト入力
    Kolors->>Kolors: 画像生成処理
    Kolors->>FileSystem: 生成画像の保存
    FileSystem-->>User: 画像ファイルの確認
```


## カスタム推論関数の作成

より柔軟に画像生成を行うため、カスタム推論関数を作成しましょう。

```python
import os, torch
from kolors.pipelines.pipeline_stable_diffusion_xl_chatglm_256 import StableDiffusionXLPipeline
from kolors.models.modeling_chatglm import ChatGLMModel
from kolors.models.tokenization_chatglm import ChatGLMTokenizer
from diffusers import UNet2DConditionModel, AutoencoderKL
from diffusers import EulerDiscreteScheduler

root_dir = "/content/Kolors"

def infer(prompt):
    # モデルの各コンポーネントを読み込む
    ckpt_dir = f'{root_dir}/weights/Kolors'
    text_encoder = ChatGLMModel.from_pretrained(
        f'{ckpt_dir}/text_encoder',
        torch_dtype=torch.float16).half()
    tokenizer = ChatGLMTokenizer.from_pretrained(f'{ckpt_dir}/text_encoder')
    vae = AutoencoderKL.from_pretrained(f"{ckpt_dir}/vae", revision=None).half()
    scheduler = EulerDiscreteScheduler.from_pretrained(f"{ckpt_dir}/scheduler")
    unet = UNet2DConditionModel.from_pretrained(f"{ckpt_dir}/unet", revision=None).half()
    
    # パイプラインの設定
    pipe = StableDiffusionXLPipeline(
            vae=vae,
            text_encoder=text_encoder,
            tokenizer=tokenizer,
            unet=unet,
            scheduler=scheduler,
            force_zeros_for_empty_prompt=False)
    pipe = pipe.to("cuda")
    pipe.enable_model_cpu_offload()
    
    # 画像生成
    image = pipe(
        prompt=prompt,
        height=1024,
        width=1024,
        num_inference_steps=50,
        guidance_scale=5.0,
        num_images_per_prompt=1,
        generator= torch.Generator(pipe.device)).images[0]
    
    # 生成画像の保存
    image.save(f'{root_dir}/scripts/outputs/sample_test_{prompt}.jpg')

# 関数の実行
infer("A photo of a cat, macro, zoom, high quality, holding a sign"v0.3.0"")
```

この`infer`関数は：
1. 必要なモデルコンポーネントを読み込み
2. 画像生成パイプラインを設定
3. 指定されたプロンプトに基づいて画像を生成
4. 生成された画像をファイルとして保存

関数を実行すると、指定したプロンプトに基づいた画像が生成されます。

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[プロンプト入力] --> B[モデルコンポーネント読み込み]
    B --> C[パイプライン設定]
    C --> D[画像生成]
    D --> E[画像保存]
    E --> F[生成画像の確認]
```


## まとめと次のステップ

おめでとうございます！これであなたもKolorsを使って素晴らしい画像を生成できるようになりました。

次のステップとして以下のことに挑戦してみましょう：
1. さまざまなプロンプトを試して、モデルの能力を探る
2. 生成された画像の品質や正確さを評価する
3. 日本語のプロンプトを使用して、モデルの多言語能力をテストする

Kolorsの世界を楽しんでください。素晴らしい創造の旅が、ここから始まります！

## 📒ノートブック

https://colab.research.google.com/drive/1d1bDboRfyhR8L1zKkGGs670O-kObDK2q?usp=sharing

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>