タグ: lllyasviel

  • Omostで画像生成を細かく制御しよう(2) GPT-4o でCanvasを Stable Diffusion 向けに最適化する

    Omost」は大規模言語モデル(LLM)のコーディング能力を画像生成に変換するオープンソースプロジェクトです。ControlNetやStable Diffusion WebUI Forge、Foocusの開発者として著名なlllyasviel氏が中心に開発しています。
    そもそも「Omostって何」という方は前回の記事をご参照ください。

    ✨️本記事は Nobuyuki Kobayashi @nyaa_toraneko さんにご寄稿いただいた記事をベースに編集部でリライトしております。

    Omostが生成するCanvasとは

    Canvasは生成される画像に描かれるべき要素やモチーフを定義したオブジェクトです。
    その構造は、大きく分けて2つのブロックから構成されています。

    1.グローバル描写

    まずは、シーン全体のテーマや雰囲気を設定するブロックです。これをグローバル描写と呼びます。グローバル描写では、以下の情報を設定します

    • description: シーン全体の簡単な説明です。例えば、「魔法の生き物が住む鮮やかなファンタジーの世界」などです。
    • detailed_descriptions: シーンに関するもう少し詳細な説明をリストで提供します。例えば、「明るくカラフルな環境」、「空気中に漂う神秘的な輝き」などです。
    • tags: シーンに関連するキーワードを指定します。例えば、「ファンタジー」、「魔法」、「自然」などです。
    • HTML_web_color_name: シーンの主な色をHTMLカラー名で指定します。例えば、「スカイブルー」などです。

    2.ローカル描写

    次に、キャンバス上の特定の部分について詳細を設定するブロックです。これをローカル描写と呼びます。ローカル描写では、以下の情報を設定します

    • location: 描写される部分の位置です。例えば、「中央」などです。
    • offset: オフセットの有無です。例えば、「オフセットなし」などです。
    • area: 描写される部分の面積です。例えば、「大きな四角いエリア」などです。
    • distance_to_viewer: 視聴者からの距離です。例えば、「1.0ユニット」などです。
    • description: 描写される部分の簡単な説明です。例えば、「流れるようなローブをまとった威厳のある魔法使い」などです。
    • detailed_descriptions: 描写される部分に関するもう少し詳細な説明をリストで提供します。例えば、「星柄のマントを着ている」、「光る杖を持っている」、「長い白髭」などです。
    • tags: 描写される部分に関連するキーワードを指定します。例えば、「魔法使い」、「魔法」、「キャラクター」などです。
    • atmosphere: 描写される部分の雰囲気です。例えば、「神秘的」などです。
    • style: 描写される部分のスタイルです。例えば、「ファンタジー」などです。
    • quality_meta: 描写の品質に関するメタデータです。例えば、「高詳細」などです。
    • HTML_web_color_name: 描写される部分の主な色をHTMLカラー名で指定します。例えば、「紫」などです。

    例えば、実際にCanvasを用いてStable Diffusionで生成したあるイラストでは、以下のようにCanvasにローカル描写が指定がされています。

    画像

    このように、イラスト全体の相対的な位置におおよそどんなモチーフが配置されるか指定することによって、イラスト全体のレイアウトができあがるということです。

    ただ生成されたCanvasですが、読みやすく詳細な指定なのはいいのですが、とにかく長い。これをそのまま Stable Diffusion のポジティブプロンプトにコピペして、絵を出すこともできますが、ちょっとこのままでは扱いにくいのも事実です。

    そこでCanvasの要素をなるべく残しながら、指定を最適化していきましょう。
    筆者の場合、ここからはOpenAI社の GPT-4o上 でMy GPTsを設計し、「Omost Converter」というチャットボットを作りました。

    画像

    Stable Diffusion向けにCanvasの最適化をChatGPT 4oで行う

    ここでは、Canvasの最適化の手順を紹介します。
    興味がある方は、自分自身でもOmost Converterを作ってみるといいでしょう。

    1. Canvasの記述よりフルプロンプトを作成する

    まず、Canvasの情報を元に、グローバル描写と各ローカル描写を収集したフルプロンプトを作成します。以下のようなフォーマットで作成します。

    # グローバル描写
    “{description} with elements of {detailed_descriptions}. The scene has a {tags} feel, colored primarily in {HTML_web_color_name}.”

    # 各ローカル描写
    “In the {location}, there is a {description}. It is {offset} and occupies {area}. It is {distance_to_viewer} units away from the viewer. Detailed features include {detailed_descriptions}. The atmosphere is {atmosphere}, and the style is {style}, colored in {HTML_web_color_name}.”

    この段階でCanvasの情報は相当圧縮されますので、ChatGPT 4oでしたら、DALL-E 3で絵を生成することも可能ですが、まだまだ無駄が多いようですのでさらに最適化を進めましょう。

    2. フルプロンプトを最適化する

    続いてフルプロンプトを最適化します。最適化の目的は、プロンプトを短く、わかりやすくすることで、Stable Diffusionが生成する画像の品質を向上させることです。以下のステップに従って、プロンプトを最適化しましょう。

    手順 1: 不要な情報を削除

    プロンプトから冗長な情報や重複した情報を削除します。例えば、同じ意味の説明が繰り返されている場合、それを一度だけ記述するようにします。

    手順 2: 簡潔な言葉を選ぶ

    長いフレーズや文を、同じ意味を持つより短い言葉やフレーズに置き換えます。たとえば、「長い白髭を持つ魔法使い」ではなく、「白髭の魔法使い」といった具合です。

    手順 3: 主要なキーワードを強調

    プロンプトの主要なキーワードやフレーズを強調し、重要でない詳細を省略します。これにより、AIが重要な要素に焦点を合わせやすくなります。

    手順 4: 一貫したスタイルとトーンを維持

    プロンプト全体で一貫したスタイルとトーンを維持します。これは、読者がプロンプトを理解しやすくし、AIが意図を正確に把握するのに役立ちます。

    手順 5: 最適化されたプロンプトの例

    ここで、具体的な例を使って、最適化されたプロンプトを作成します。

    元のフルプロンプト

    # Global Description
    “魔法の生き物が住む鮮やかなファンタジーの世界 with elements of 明るくカラフルな環境, 空気中に漂う神秘的な輝き, 幻想的な雰囲気. The scene has a ファンタジー, 魔法, 自然 feel, colored primarily in skyblue.”

    # Local Descriptions
    “In the 中央, there is a 流れるようなローブをまとった威厳のある魔法使い. It is オフセットなし and occupies 大きな四角いエリア. It is 1.0 units away from the viewer. Detailed features include 星柄のマントを着ている, 光る杖を持っている, 長い白髭. The atmosphere is 神秘的, and the style is ファンタジー, colored in purple.”

    最適化されたプロンプト

    # Global Description
    “カラフルな魔法の世界, 明るい環境, 空気中に神秘的な輝き, 幻想的な雰囲気. ファンタジー, 魔法, 自然, スカイブルー.”

    # Local Descriptions
    “中央に星柄のマントと光る杖を持つ白髭の魔法使い. オフセットなし, 大きなエリア, 1.0ユニット距離. 神秘的な雰囲気, ファンタジースタイル, 紫色.”

    手順 6: トークンの数を確認

    最適化された各プロンプトが約75トークン以内であることを確認します。これは、AIがプロンプトを効果的に処理できるようにするためです。

    最適化されたプロンプトは、元のプロンプトに比べて短く、明確で、重要な情報に焦点を当てています。これにより、Stable Diffusionがより正確で魅力的な画像を生成できるようになります。

    またこの段階で、DALL-E 3に最適化されたプロンプトを試しに描かせてみてもよいでしょう。先にOmostで生成した画像と同様のモチーフの画像が生成されていれば成功です。

    これらの最適化を実行することで、生成したいイラストのプロンプトは以下のようになりました。

    A curious yet anxious girl with white hair floats in a dark, surreal alternate dimension, reaching out to a glowing orb through an open door. She is dressed as a bunny girl, with her white hair flowing around her, adding motion and wonder. Her expression mixes curiosity and anxiety, reflecting uncertainty about the future. The central focus is on her dynamic posture. The dimension features a tilted horizon and floating doors, creating a chaotic and disordered feel. The open door, made of otherworldly material, emits light that contrasts sharply with the dark space, enhancing the mystery. The glowing orb, symbolizing a wonderful future, emits radiant light, creating hope and anticipation. The scene is designed in a 16:9 aspect ratio, with detailed textures and light effects. The atmosphere is a mix of curiosity, anxiety, wonder, and trepidation, rendered in high-quality with a focus on detailed expressions and flowing hair.

    好奇心旺盛でありながら不安げな白い髪の少女が、暗く超現実的な異次元に浮かび、開いたドアから光り輝くオーブに手を伸ばしています。彼女はバニーガールの格好をしており、白い髪が周りに流れ、動きと驚きを加えています。彼女の表情は好奇心と不安が入り混じり、未来への不安を反映しています。中心は彼女のダイナミックな姿勢。次元は、傾いた地平線と浮遊するドアが特徴で、混沌とした無秩序な雰囲気を醸し出しています。別世界のような素材でできた開いた扉は光を放ち、暗い空間とのコントラストを際立たせ、神秘性を高めています。素晴らしい未来を象徴する光り輝くオーブは、希望と期待を生み出します。このシーンは16:9のアスペクト比でデザインされ、詳細なテクスチャと光のエフェクトが施されています。好奇心、不安、驚き、怯えが入り混じった雰囲気を、細かい表情や流れる髪を中心にハイクオリティで表現しています。

    このプロンプトをDALL-E 3で出力させてやると、以下のようになりました。なかなかいいですね。

    画像
    画像

    スタイルは違いますが、Omostで生成した画像と要素も一致しています。
    加えて今回は、空間に浮いているドアもバッチリです。ただドアを沢山画面内に配置すると、当然キャラも小さくなってしまうのが難しいところですね。こういうところは検討材料にしておきましょう。

    Stable Diffusionで最適化されたプロンプトを実行する

    最適化されたプロンプトからどんな絵が出るか、DALL-E 3で確認できたので、次はStable Diffusionでテストしてみましょう。

    Stable Diffusionでは、様々なCheckpoint(モデル)が選べますが、どちらかと言えば文章で構成されているプロンプトから画像を生成するには、SDXL系のモデルを使うことをお薦めします。今回は、AnimagineXL v3.1を使用しました。

    まずポジティブプロンプトに最適化されたプロンプトをペーストし、ネガティブプロンプトには、皆さんがよく使うようなものを入れて、生成しましょう。

    画像

    今回は1回目から、かなり近いテーマの絵が生成されました。これでOmostのプロンプトがStable Diffusionでも使えることがわかったと思います。

    何回か試してみると、キャラが大きく表示されるシードが見つかりました。
    これでシード次第で、キャラを大きく表現できることがわかります。

    画像

    ここからは、プロンプトに自由に魔改造を施していきましょう。


    この記事の続きはこちらから https://note.com/aicu/n/naee344ef0c53

    Originally published at https://note.com on July 20, 2024.

  • 描画工程を推論する「Paints-Undo」、Google Colabで実際に動作させてみた

    日本時間で2024年7月10日、スタンフォード大学の博士課程の学生である「Fooocus」や「Omost」「Style2Paint」の開発者Lvmin Zhang さん(GitHubアカウント: lllyasviel)らの研究グループが、興味深い研究成果を発表しました。Google Colabで試せる実験コードも紹介します。

    https://note.com/aicu/n/n8990c841e373

    圧巻のデモ

    ぜひこちらのデモサイトで結果を観てください

    https://lllyasviel.github.io/pages/paints_undo

    この Web ページのすべての入力画像は AI によって生成されたものであることに注意してください。それらの「グラウンド・トゥルース」つまり「正解の描画プロセス」は存在しません。画像生成によって生成された1枚の画像をベースに「それが描かれたであろう工程」を、まるでイラストレーターの作業配信動画(タイムラプス)のように生成しています。

    画像

    美少女イラスト以外の分野での実験。

    画像
    画像

    ラフスケッチの生成

    画像

    異なる描画工程の再現

    画像
    画像
    画像

    失敗例

    画像

    以下、公式READMEの翻訳を中心に、解説を補完しながらお送りします。
    https://github.com/lllyasviel/Paints-UNDO
    実際に動作させた例は最後に紹介します。

    画像

    Paints-Undo:デジタルペイントにおける描画動作のベースモデル

    Paints-Undoは、将来のAIモデルが人間のアーティストの真のニーズに沿うことができるように、人間の描画動作のベースモデルを提供することを目的としたプロジェクトです。

    「Paints-Undo」という名前は、モデルの出力がデジタルペイントソフトで「元に戻す」ボタン(通常はCtrl+Z)を何度も押したときのように見えることに由来しています。

    Paints-Undoは、画像を入力として受け取り、その画像の描画シーケンスを出力するモデル群です。このモデルは、スケッチ、インク入れ、着色、シェーディング、変形、左右反転、カラーカーブ調整、レイヤーの表示・非表示の変更、さらには描画プロセス中の全体的なアイデアの変更など、人間のあらゆる行動を表現します。

    利用方法

    PaintsUndoは、以下の方法でローカルにデプロイできます。
    condaのインストールと10GB以上のVRAMが必要です。

    git clone https://github.com/lllyasviel/Paints-UNDO.git
    cd Paints-UNDO
    conda create -n paints_undo python=3.10
    conda activate paints_undo
    pip install xformers
    pip install -r requirements.txt
    python gradio_app.py    

    推論は、Nvidia 4090および3090TIの24GB VRAMでテストされています。16GB VRAMでも動作する可能性がありますが、8GBでは動作しません。私の推定では、極度の最適化(重みのオフロードやスライスアテンションを含む)を行った場合、理論上の最小VRAM要件は約10〜12.5GBです。

    設定にもよりますが、1つの画像を処理するのに約5〜10分かかります。一般的な結果として、解像度320×512、512×320、384×448、または448×384で、FPS 4、25秒のビデオが得られます。

    処理時間は、ほとんどの場合、HuggingFace Spaceのほとんどのタスク/クォータよりも大幅に長いため、HuggingFaceサーバーに不要な負担をかけないように、HuggingFace Spaceにデプロイすることはお勧めしません。

    必要な計算デバイスがなく、それでもオンラインソリューションが必要な場合は、Colabノートブックがリリースされるのを待つという選択肢があります(ただし、Colabの無料枠で動作するかどうかはわかりません)。

    モデルに関する注意事項

    現在、 paints_undo_single_frame と paints_undo_multi_frame の2つのモデルをリリースしています。それぞれをシングルフレームモデル、マルチフレームモデルと呼ぶことにします。

    シングルフレームモデルは、1つの画像と操作ステップを入力として受け取り、1つの画像を出力します。1つのアートワークは常に1000の人間の操作で作成できると仮定し(たとえば、1つのブラシストロークが1つの操作、操作ステップは0から999までの整数)。第0番は完成した最終アートワーク、第999番は真っ白なキャンバスに最初に描かれたブラシストロークとします。このモデルは、「元に戻す(Undo/Ctrl+Z)」モデルと理解することができます。最終的な画像を入力し、「Ctrl+Z」を何回押したいかを示すと、モデルはそれらの「Ctrl+Z」が押された後の「シミュレートされた」スクリーンショットを表示します。操作ステップが100の場合、この画像に対して100回「Ctrl+Z」をシミュレートして、100回目の「Ctrl+Z」後の外観を取得することを意味します。

    マルチフレームモデルは、2つの画像を入力として受け取り、2つの入力画像間の16の中間フレームを出力します。結果はシングルフレームモデルよりもはるかに一貫性がありますが、はるかに遅く、「創造性」が低く、16フレームに制限されています。

    このリポジトリでは、デフォルトの方法ではこれらを一緒に使用します。最初にシングルフレームモデルを5〜7回推論して5〜7つの「キーフレーム」を取得し、次にマルチフレームモデルを使用してそれらのキーフレームを「補間」して、実際に比較的長いビデオを生成します。

    理論的には、このシステムはさまざまな方法で使用でき、無限に長いビデオを作成することもできますが、実際には最終フレーム数が約100〜500の場合に良好な結果が得られます。

    モデルアーキテクチャ (paints_undo_single_frame)

    このモデルは、異なるベータスケジューラ、クリップスキップ、および前述の操作ステップ条件でトレーニングされたSD1.5の変更されたアーキテクチャです。具体的には、このモデルは、次のベータを使用してトレーニングされています。

          betas = torch.linspace(0.00085, 0.020, 1000, dtype=torch.float64)
        

    比較のために、元のSD1.5は、次のベータを使用してトレーニングされています。

          betas = torch.linspace(0.00085 ** 0.5, 0.012 ** 0.5, 1000, dtype=torch.float64) ** 2
        

    終わりのベータと削除された正方形の違いに気付くでしょう。このスケジューラの選択は、内部ユーザー調査に基づいています。

    テキストエンコーダCLIP ViT-L / 14の最後のレイヤーは完全に削除されます。 操作ステップ条件は、SDXLの追加の埋め込みと同様の方法でレイヤーの埋め込みに追加されます。

    また、このモデルの唯一の目的は既存の画像を処理することであるため、このモデルは、他の拡張なしでWD14 Taggerと厳密に整合性が取れています。入力画像を処理してプロンプトを取得するには、常にWD14 Tagger(このリポジトリにあるもの)を使用する必要があります。そうしないと、結果に欠陥が生じる可能性があります。人間が書いたプロンプトはテストされていません。

    画像

    モデルアーキテクチャ (paints_undo_multi_frame)

    このモデルは、VideoCrafterファミリーから再開することでトレーニングされますが、元のCrafterのlvdmは使用されず、すべてのトレーニング/推論コードは完全にゼロから実装されています。(ちなみに、コードは最新のDiffusersに基づいています。)初期の重みはVideoCrafterから再開されますが、ニューラルネットワークのトポロジーは大幅に変更されており、ネットワークの動作は広範なトレーニングの後、元のCrafterとは大きく異なります。

    全体的なアーキテクチャは、3D-UNet、VAE、CLIP、CLIP-Vision、Image Projectionの5つのコンポーネントを持つCrafterのようなものです。

    • VAE:VAEは、ToonCrafterから抽出されたのと同じアニメVAEです。Craftersに優れたアニメの時間的VAEを提供してくれたToonCrafterに感謝します。
    • 3D-UNet:3D-UNetは、アテンションモジュールのリビジョンを含むCraftersのlvdmから変更されています。コードのいくつかのマイナーな変更以外に、主な変更点は、UNetがトレーニングされ、空間的自己注意レイヤーで時間ウィンドウをサポートするようになったことです。 diffusers_vdm.attention.CrossAttention.temporal_window_for_spatial_self_attentionおよびtemporal_window_typeのコードを変更して、3つのタイプのアテンションウィンドウをアクティブ化できます。
      • “prv”モード:各フレームの空間的自己注意は、前のフレームの空間的コンテキスト全体にも注意を払います。最初のフレームは自分自身だけに注意を払います。
      • “first”モード:各フレームの空間的自己注意は、シーケンス全体の最初のフレームの空間的コンテキスト全体にも注意を払います。最初のフレームは自分自身だけに注意を払います。
      • “roll”モード:各フレームの空間的自己注意は、torch.rollの順序に基づいて、前後のフレームの空間的コンテキスト全体にも注意を払います。
    • CLIP:SD2.1のCLIP。
    • CLIP-Vision:位置埋め込みを補間することで、任意のアスペクト比をサポートするClip Vision(ViT / H)の実装。線形補間、ニアレストネイバー、および回転位置エンコーディング(RoPE)を試した後、最終的な選択はニアレストネイバーです。これは、画像を224×224にサイズ変更または中央トリミングするCrafterメソッドとは異なることに注意してください。
    • Image Projection:2つのフレームを入力として受け取り、各フレームに16の画像埋め込みを出力する小さなトランスフォーマーの実装。これは、1つの画像のみを使用するCrafterメソッドとは異なることに注意してください。

    免責事項

    このプロジェクトは、人間の描画動作のベースモデルを開発し、将来のAIシステムが人間のアーティストの真のニーズをより適切に満たせるようにすることを目的としています。ユーザーはこのツールを使用してコンテンツを自由に作成できますが、地域の法律を遵守し、責任を持って使用する必要があります。ユーザーは、虚偽の情報を生成したり、対立を扇動したりするためにツールを使用してはなりません。開発者は、ユーザーによる misuseの可能性について、いかなる責任も負いません。

    実際に動作させてみた

    ✨️Google Colabで動作するコードは社会的影響を鑑みて、当面は文末にてメンバーシップのみの公開とさせていただきます✨️

    gradio_app.pyの最終行を以下のように変更してください
    #block.queue().launch(server_name=’0.0.0.0′)

    block.queue().launch(server_name=’0.0.0.0′, share=True)

    チュートリアル

    Gradioインターフェースに入ったら:

    ステップ0:画像をアップロードするか、ページの下部にある[作例画像]をクリックします。

    画像

    ステップ1:「ステップ1」というタイトルのUIで、[プロンプトの生成]をクリックして、グローバルプロンプトを取得します。

    画像

    ステップ2:「ステップ2」というタイトルのUIで、[キーフレームの生成]をクリックします。左側でシードやその他のパラメータを変更できます。

    画像

    ステップ3:「ステップ3」というタイトルのUIで、[ビデオの生成]をクリックします。左側でシードやその他のパラメータを変更できます。

    オリジナル画像でやってみた

    AICU所属のイラストレーター・犬沢某さんに素材をご提供いただきました。

    画像
    画像
    画像
    画像
    画像
    画像

    動画はこちらです

    犬沢某さん「なんだか最初のほう、悩みながら描いてるのがそれらしくていいですね・・・」

    描画工程を推論する技術は、様々なクリエイティブ工程に役立つツールが生み出せる可能性があります。
    オープンな技術として公開していただいた lllyasvielさん、Paints-Undo Teamに感謝です。

    https://github.com/lllyasviel/Paints-UNDO

    Google Colabで condaをインストールし、Paints-UNDOを利用するnotebook

    社会的影響を鑑み、当面はメンバーシップのみの提供とさせていただきます
    くれぐれも悪用禁止でお願いいたします。
    フェイク動画や、素手で描かれるイラストレーターさんのお気持ちを害するような使い方は誰にとっても利がありません。

    原作の免責事項(disclaimer)を再掲しておきます

    このプロジェクトは、人間の描画動作のベースモデルを開発し、将来のAIシステムが人間のアーティストの真のニーズをより適切に満たせるようにすることを目的としています。ユーザーはこのツールを使用してコンテンツを自由に作成できますが、地域の法律を遵守し、責任を持って使用する必要があります。ユーザーは、虚偽の情報を生成したり、対立を扇動したりするためにツールを使用してはなりません。開発者は、ユーザーによる misuseの可能性について、いかなる責任も負いません。

    この記事の続きはこちらから https://note.com/aicu/n/n7e654dcf405c

    Originally published at https://note.com on July 9, 2024.