Qwen-Image-2.1とは?

Qwen-Image-2.1 は、画像生成と画像編集を 1 つにまとめた open weight の画像生成モデルです。

クローズドでは Qwen-Image 2.0 が先に公開されていましたが、open weight の Qwen-Image 系としては、Qwen-Image-2512 / Qwen-Image-Edit-2511 の後継ですね。

従来の Qwen-Image は生成用と編集用でモデルが分かれていましたが、2.x では MiniMax H3 と同じように、テキストも参照画像も一本の DiT にまとめて放り込むので、画像生成、編集、Ref2Image まで同じモデルで扱えます。

さらに RGBA、つまり透過画像の生成にもネイティブで対応しています。

画像生成部は 7B と小型ながら、生成、編集、参照、透過まで一通りできる。なかなか器用なモデルです。


推奨設定値

  • 解像度
    • 2K(約 4 MP 推奨)
      • 1:1 なら 2048 × 2048 px です
    • 幅と高さは 32 の倍数にします

モデルのダウンロード

📂ComfyUI/
└── 📂models/
    ├── 📂diffusion_models/
    │   ├── qwen_image_2.1_int8_convrot.safetensors
    │   └── qwen_image_2.1_turbo_int8_convrot.safetensors
    ├── 📂loras/
    │   └── qwen_image_2.1_turbo_lora_avg_rank_178_bf16.safetensors
    ├── 📂text_encoders/
    │   └── qwen3vl_8b_int8_convrot.safetensors
    └── 📂vae/
        └── qwen_image_2.1_vae_bf16.safetensors

text2image

qwen_image_2_1_text2image.json
  • CFG: 1.0
    • 公式の workflow は CFG なしになっていますが、少し上げて Negative Prompt を使ってみる価値はあるかもしれませんね

良くも悪くも、Seed による差が非常に大きいです。解像度を変えても絵が大きく変わるので、いろいろな解像度と Seed で試してみてください。

Turbo

Qwen 公式から、8 ステップで生成できる Turbo 版も公開されています。

Turbo 専用モデルもありますが、追加でダウンロードする量が減るので、ここでは LoRA を使っていきます。

qwen_image_2_1_turbo_text2image.json
  • Load LoRA

    • qwen_image_2.1_turbo_lora_avg_rank_178_bf16.safetensors を strength 1.0 で適用します

    Turbo モデル(qwen_image_2.1_turbo_int8_convrot.safetensors)を使う場合は、LoRA は使わないので Load LoRA を消してください。

  • SamplerCustomAdvanced + ManualSigmas

    • Euler / Simple では上手く生成できないため、公式が推奨している sigma を使います
    • 1.0, 0.978453, 0.95418, 0.926626, 0.89508, 0.845148, 0.704534, 0.414568, 0.0
Outputs
通常
通常
Turbo
Turbo

ほかの workflow にも、それぞれのすぐ下に Turbo 版を置いています。


Ref2Image

参照画像を組み合わせて、新しい画像を描いてもらいます。

qwen_image_2_1_ref2image.json
qwen_image_2_1_turbo_ref2image.json
  • 参照画像は最大 10 枚まで入力可
  • プロンプトで「<image1> の女性が <image2> の場所に座っている」のように、どの画像を使うのか指定します。
Deep diveRef2Image

Text Encode Qwen Image 2.1

ここに参照画像とプロンプトを入力します。

  • resolution
    • 参照画像は、アスペクト比を保ったまま約 1 MP にリサイズされてからモデルに渡ります
  • latent 出力
    • この latent は 1 枚目のサイズに合わせた空 latent ですが、内部で丸められたサイズになります。入力した画像とぴったり同じサイズで出したいので、私の workflow では使いません
Outputs

画像編集

workflow は Ref2Image とほとんど同じです。違うのは、生成する画像のサイズを 1 枚目に合わせているところだけ。

編集なので、元の絵が同じサイズで返ってこないと困ります。そこで Get Image Size で 1 枚目のサイズを読み取り、Empty Latent Image に渡しています。

2 枚目以降は Ref2Image と同じで、参照画像として使えますよ。

基本的な画像編集

qwen_image_2_1_image_edit.json
qwen_image_2_1_turbo_image_edit.json

これまでの画像編集と同様に、「男性を消して」「服を赤くして」「水彩画に変えて」のように指示してください。

Deep dive基本的な画像編集

Text Encode Qwen Image 2.1

  • resolution
    • Ref2Image のときと違い、ここは 0 にします。拡大縮小されず、32 の倍数に丸められるだけです(事前にリサイズしてあるので、実際は何も起きませんが)
    • モデルが見る画像のサイズと出力するサイズは、一応合わせておきましょう。
Outputs
input
input
output
output

赤丸で位置指定して編集

編集したい場所を色ペンで囲って指示します。

qwen_image_2_1_image_edit_local.json
qwen_image_2_1_turbo_image_edit_local.json

編集したい画像に直接、編集させたいオブジェクトを囲みます。

  • Load Image ノードに付いている Mask Editor でも可能です。

「赤丸で囲った腕時計を消して」のように指示するだけです。

複数の色を使って別々の指示を出せたりするので言葉で上手く指示しにくいときには便利ですね。

Outputs
input
input
output
output

マスクで位置指定して編集

qwen_image_2_1_image_edit_local_mask.json
qwen_image_2_1_turbo_image_edit_local_mask.json

赤丸と考え方は同じですが、こちらは位置を示す白黒画像を、元画像とは別に 入力します。

元画像へ直接書き込まないので、画像を汚さずに済むのがいいところですね。

Deep diveマスクで位置指定して編集

マスクを画像に変換

Load Image の MASK 出力を Convert Mask to Image で白黒画像に変換し、image_2 へ入力します。

実のところ、モデルが受け取るのはただの白黒画像です。マスクから変換せず、黒い背景に白でヌリヌリした画像を直接用意しても構いませんよ。

いわゆる inpainting とはまったく異なる仕組みです。
inpainting にはマスクの外を編集させない仕組みがありますが、こちらはあくまで位置を示すガイドです。
そのため、指定した範囲から編集がはみ出すこともあります。

Outputs
input
input
mask
mask
output
output

Outpainting

こちらも、Padding を足してそこを inpainting させる……という一般的な Outpainting とは、まったく仕組みが違います。

qwen_image_2_1_outpainting.json
qwen_image_2_1_turbo_outpainting.json

参照画像として横長の画像を入れる。でも、生成させる画像サイズを縦長にしたらどうでしょう?

そう、上下の空間を埋めた画像を Qwen-Image-2.1 が生成してくれるんですね。

こちらも余白のみならず画像全体を描き直しているので、元の部分も多少変わります。

きっちり元画像を固定する方法ではありませんが、簡単でいいですね。

Outputs
input
input
output
output

ガイド画像から生成

ControlNet そのものではありませんが、ポーズ画像や深度マップなどを画像編集の参照として渡し、それをもとに画像を生成できます。

モデルのダウンロード

📂ComfyUI/
└── 📂models/
    └── 📂checkpoints/
        └── sdpose_wholebody_fp16.safetensors
qwen_image_2_1_image_edit_sdpose.json
qwen_image_2_1_turbo_image_edit_sdpose.json

参照画像も一緒に入力し、その人物を指定したポーズにしてみましょう。

わざわざ棒人間に直す必要があるのか?という気もしますが、「ポーズだけ見てほしい」といっていても、服装や背景など余計な情報まで引っ張ってしまうことがあります。

ControlNet だから Pose を使うというより、参照画像から余計な情報を削ぎ落とし、ポーズや形だけを取り出して渡す、という意味合いのほうが強いですね。

Outputs
reference
reference
pose
pose
output
output

Upscale

せっかく 4 MP まで生成できるので、画質の荒い画像をきれいにしてもらいましょう。

qwen_image_2_1_image_edit_upscale.json
qwen_image_2_1_turbo_image_edit_upscale.json

あらかじめ 4 MP まで拡大した画像を参照として入力し、それを元にリファインしてもらいます。

このモデルは参照画像を保持する力が非常に高いので、Upscale は、おそらく非常に得意なタスクの一つです。

その一方で、いわゆるエンハンスのように大きく描き直すには、少し工夫がいるかもしれませんね。

Outputs
input
input
output
output

透過画像

Qwen-Image-2.1 は、プロンプトを少し変えるだけで透過画像も生成できます。

特殊なノードを挟む必要もなく、最初から Alpha Channel を持った RGBA 画像が出てきます。

透過画像を生成

qwen_image_2_1_text2image_rgba.json
qwen_image_2_1_turbo_text2image_rgba.json

以下の形でプロンプトを書きます。

This is an RGBA image with transparency. <ここに生成したいもののプロンプト>. The image has alpha channel and the background is transparent.

前後は決まり文句なので、そのままコピーして真ん中だけ差し替えれば大丈夫です。

透過情報を残すため、出力は PNG で保存してください。JPEG にすると、せっかくの Alpha Channel が消えてしまいます。

Outputs

切り抜き

透過生成を画像編集に組み合わせると……そうです、切り抜きもできちゃうんですね。

qwen_image_2_1_subject_extraction.json
qwen_image_2_1_turbo_subject_extraction.json

先ほどのフォーマットで、切り抜きたいものを Extract 〇〇 と指示するだけです。

Outputs
input
input
output
output

応用

パノラマ生成

好きな画像を参照に、2:1 の解像度で ERP として生成して、といえば、それだけで 360 度パノラマ画像ができてしまいます。お手軽すぎる…

カスタムノード

  • nomadoor/ComfyUI-Panorama-Stickers
    • 私が作っているものでちょっと宣伝になりますが、パノラマのプレビューや、パノラマ空間での撮影ができるノードがあります。よかったら導入してみてください。
qwen_image_2_1_panorama.json
qwen_image_2_1_turbo_panorama.json

元画像を参照しながら、横長 (2:1) の画像を生成します。

左右をキッチリ Outpainting するというよりは、パノラマ空間に自然に収まるように ERP 全体を描き直してもらうイメージです。

レイヤー分割

先ほどの 切り抜きでは、画像から好きなものだけを透過画像にできました。

なら、切り抜いたオブジェクトを画像から消し、次に手前にあるものをまた切り抜く。これを繰り返せば、1 枚の画像を手前から順番にレイヤー分けできるはずです。

qwen_image_2_1_layer_decomposition.json
qwen_image_2_1_turbo_layer_decomposition.json

ループ処理を使い、以下の処理を繰り返します。

  1. MLLM で、いま一番手前にありそうなものを選ぶ
  2. 選んだものだけを透過画像として切り抜く
  3. 逆に現在の画像から選んだものを消す
  4. 消したあとの画像を、次の iteration へ戻す
Deep diveレイヤー分割

分割数を設定する

最初に、画像と分割したいレイヤー数を入力します。

ここを 5 にすると、手前から順に 4 枚を切り抜き、最後に残った背景と合わせて 5 枚になります。

次に切り抜くものを決める

Generate Text に現在の画像を見せ、次に切り抜くものを短いテキストで答えてもらいます。

残りのレイヤー数によって、どこまでを 1 枚として切り抜くべきかが変わるので、レイヤー数 - iteration_index もプロンプトに入れ、あと何枚に分ける予定なのかも MLLM に知らせます。

返ってきたオブジェクト名は、Format Text で Qwen-Image-2.1 への指示に組み込みます。

Generate Text ノードに RGBA 画像を渡すとエラーになるため、Split Image with Alpha で Alpha 情報を取り除きます。

最前面オブジェクトの切り抜き

MLLM が選んだオブジェクトだけを、透過画像として切り抜きます。

やっていることは、上の 切り抜きと同じですね。

この画像を 1 枚のレイヤーとして End Loop へ渡します。

最前面オブジェクトの除去

レイヤー分けには、オブジェクトの切り抜きだけでなく、そのオブジェクトを取り除いた画像も必要です。

元画像と切り抜き画像をそのまま渡し、「これを消して」で済めばよかったんですが、うまくいかなかったため、切り抜いた領域を緑色で塗り、「緑の部分を自然に埋めてくれ」と指示しています。

こうしてオブジェクトを消した画像が、次に切り抜くための元画像になります。

最後は背景をそのまま出力する

この処理を繰り返していくと、最後には背景だけが残ります。

背景から何かを切り抜いたり、消したりする必要はありません。

そこで is_last と If/Else Switch を使い、最後の iteration だけ切り抜きと除去を通らず、現在の画像をそのまま出力します。

seed 値を固定にせず、わざわざ iteration_index にしているのはなんで?と思うかもしれません。
バグか仕様かはわかりませんが、一度編集した画像を同じ seed 値で再び編集すると、出力がガビガビになってしまうんですねぇ…。
seed 値さえ変われば大丈夫なので、ループごとに変わる値として、とりあえずの処置として iteration_index を入力しています。

Outputs
input
input
output 1
output 1
output 2
output 2
output 3
output 3
output 4
output 4
output 5
output 5