Article

Qwen Image 2.1の画像編集から動画を作ろうとしてみる

※ この記事にはアフィリエイト広告が含まれることがあります。

Qwen Image 2.1が話題になっていたので、手元のMacで試してみました。 見栄えのよい静止画を作れて、既存の画像も編集できます。 それなら、同じ人物や風景の状態を少しずつ変えて並べれば、動画にもできるのではないでしょうか。

試したのは2026年9月26日から27日です。 使ったのは14インチMacBook Proで、M5 Max(18コアCPU、40コアGPU)、64GBのユニファイドメモリ、macOS 26.6.2という構成です。 私が試したい動きや方法を提案し、Codexに環境の構築と実験用コードの実装、生成を進めてもらいました。 出てきた画像を見ながら、次に何を変えるかを考えていきます。

同じ小屋の朝、昼、夕方

まずはQwen Image 2.1で、湖畔にある赤い小屋を作りました。 この画像を参照させ、小屋や山、画角を保ちながら、空と照明を朝、昼、夕方へ変えてみます。

768×768の画像では、構図をおおむね残しながら時間帯を変えられました。 生成時間は768×768、25ステップで1枚あたり約49秒です。 モデルの読み込み時間は含みません。 掲載した動画はファイル容量を抑えるため、生成後に384×384へ縮小しています(縦横は半分、画素数は4分の1)。

この動画は、生成した3枚を1秒ずつ表示しているだけです。 間の動きを作ったわけではありませんが、同じ場面の状態違いは作れています。 これをもっと細かく変えていけばどうなるか、試してみたくなりました。

生成にはPyTorchとHugging Face Diffusersを使い、GradioやComfyUIは使わずコマンドで実行しています。 モデルは公式配布の Qwen/Qwen-Image-2.1 です。 使ったライブラリのバージョンとモデルのリビジョンは末尾にまとめます。

まず15枚で動きを確かめる

作りたかったのは、静止画をクロスフェードでつないだ動画ではありません。 30fpsで5秒なら、150枚の画像を生成して動かしたい。 ただ、最初から150枚を待つのは長いので、まず3fps相当の15枚を作り、よければ間の135枚を追加することにしました。

各フレームには、同じ初期画像を参照として渡します。 前の画像を次々に編集する方式ではなく、共通の画像から各時点の状態を作れば、人物や風景が変わり過ぎるのを抑えられるのでは、と考えました。

人物が海を向いているところから3秒で振り返り、残り2秒で微笑む。 この動きを文章で指定してみましたが、できたものはほぼ静止画でした。

用意された実装は、文章のテンプレートに時刻や進行率を埋め込むものでした。 動画全体の説明に「何秒」「何%進んだ」と付けても、それを各時点の姿勢に分解する処理はありません。 「ここでは後ろ姿」「ここでは横顔」「最後は正面」と、1枚ごとに何を描いてほしいのかを決める部分が抜けていました。

そこで、別のLLMに動画全体の説明を読ませ、各時刻の編集指示を作らせる案を考えました。 ただ、指示を細かくできたとしても、その画像同士がつながるかはまだ分かりません。 まずは少数の指示を固定して、狙った姿勢の画像を作れるか確かめることにしました。 このあとの中間画像の実験では、LM Studioや別のLLMによる指示の自動生成は使っていません。

始点と終点から中間画像を作れるか

次に私から提案したのは、最初と最後の画像を先に作り、その両方を参照させて中間を埋める方法です。 始点と終点から真ん中を作り、次は始点と真ん中、真ん中と終点を使う。 区間を二分していけば、必要な枚数まで増やせるのではないかと考えました。 会話では「Quick Sortのように真ん中を補完して行く」と表現していましたが、やりたいことは画像の並べ替えではなく、前後の画像を参照した中間画像の生成です。

振り返りと表情の変化を一度に扱う代わりに、無地の背景で人物が右腕を上げる動作に絞ります。 0秒は両腕を下ろした状態、4秒は右腕を頭上に上げた状態です。 その間の2秒なら、右腕を肩の高さで水平に伸ばしていてほしい。 正面から見た写真では本人の右腕が画像の左側に写ることも、指示に含めました。

最初は、開始画像1枚を編集する方法と、開始画像と終了画像の2枚を参照する方法を比べました。 2枚を参照する指示には「0秒と4秒の間の2秒」に加えて、腕を水平に伸ばすことも書いてあります。 それでも、結果は腕が上がり切った姿でした。

そこで、「開始画像を編集の土台にする」「右腕を横へ上げて肩の高さで水平にする」という書き方に変えました。 こちらでは、腕の位置が狙いに近づきました。 開始と終了の役割を文章内で保ちながら、参照画像の入力順を逆にする比較でも、水平に近い腕が得られています。

開始と終了の画像、単一参照、両端参照、指示の書き方と参照順序による結果の比較

参照画像の枚数だけでなく、指示の書き方も変えています。 この比較から「2枚を参照すればよい」「時刻をやめて姿勢を書けばよい」と、どれか一つの変更だけを理由にはできません。 両端を渡しても期待どおりの中間にはならず、編集元の指定を含めた文章の組み立てによって結果が変わる、というところまでです。

得られた2秒の画像を参照に加え、1秒と3秒の画像も作りました。 1秒は水平より45度下、3秒は水平より45度上に腕を伸ばす指示です。

0秒から4秒までの5枚。1秒の腕はすでに水平に近く、中間画像では背景の荒れが目立つ

1秒の腕は、すでに水平に近い位置にあります。 狙った角度ではないものの、5枚を並べると下から上へ腕を上げる大まかな流れは見えました。 そのときの私の感想は、「手の位置的には1秒の時点がちゃんとできていませんが、全体としてはそれっぽい位置にありそうです」でした。

ただ、背景と人物の表面が粒状に荒れています。 開始画像を一度編集した段階でも荒れがあり、その画像を次の参照に使った結果ではさらに目立ちました。 元のきれいな画像を追加で参照させても、荒れは残りました。

腕の位置がそれらしくても、この画質の変化を含めて150枚並べたいわけではありません。 この方法をそのまま増やすのはやめ、動画の作り方を変えることにしました。 単一の被写体とseedで試した結果なので、Qwen Imageの画像編集による動画化が一般に不可能だと判断したわけではありません。

初期画像はQwen Image、動きはWanへ

Qwen Imageで初期状態の画像を作り、動きは動画モデルに任せることにしました。 組み合わせたモデルは次の三つです。

モデル

今回の役割

Qwen Image 2.1

初期静止画を作る

Qwen2.5-VL-7B-Instruct

初期画像と日本語の動作指示から、英語の動画プロンプトを作る

Wan 2.1 I2V 14B

初期画像とプロンプトから動画を生成する

使った動画モデルは、Wan-AI/Wan2.1-I2V-14B-480P-Diffusersです。 I2Vは画像を入力して動画を生成するモデルです。 ここから先はQwen Image単独での動画化ではありません。

初期画像には、Qwen Imageで作った海辺の人物写真を使いました。 今度は大きく振り返らせず、カメラを見たまま自然に一度まばたきし、笑顔を少し深め、髪が風でわずかに揺れる、という小さな変化にします。 Qwen2.5-VL-7B-Instructが画像と日本語の指示を読み、作ったプロンプトがこちらです。

The woman maintains her gaze at the camera, blinks once naturally, and deepens her smile slightly. Her hair gently sways in the breeze. The background and camera remain fixed.

まず約1秒の動画で試すと、人物に動きがあり、まばたきらしい変化も見えました。 フレームが少なく、まばたきと断定はできませんが、それっぽい動きにはなっています。

そのあと、約5秒に延ばしました。 624×624では生成に長くかかる見込みだったため、まず動くところを見るために336×336へ下げています。 三つのモデルは順番に別プロセスで動かし、同時には読み込みません。

Wanは、最初から動画の各画素の色を直接作っているわけではありません。 まず、映像の特徴を小さな数値の配列にまとめた「潜在表現」を作ります。 そのあと、VAEのデコーダーという部分が、この数値の配列を各フレームの画素に変換します。 ここまで処理して初めて、PNGとして保存したり、MP4にまとめて再生したりできる画像になります。DiffusersのWan用VAE

途中、この潜在表現を画像に変換する処理でGPUのメモリ不足が起きました。 CodexはCPUへ切り替えようとしましたが、その前にGPUで何が起きたのか調べてもらいました。 今回の実装では、動画を小区間ずつ画像に変換する際に、torch.mps.synchronize() で区間ごとのGPU処理の完了を待つようにすると、GPUのまま最後まで処理できました。

できた5秒の動画

完成した動画は336×336、81フレーム、16fpsで、長さは約5.06秒です。

人物の顔の向きや髪に変化があり、画像編集を重ねたときのような背景ノイズの増大は見られませんでした。 一方、この5秒版では、1秒版で見えたようなまばたきらしい変化は確認できませんでした。 動画になったことと、文章どおりの動作になったことは分けて見ています。

この40コアGPU、64GBメモリのMacで、336×336の5秒動画にどのくらい時間がかかったかをまとめると、次のようになります。

処理

所要時間

動画の潜在表現を作る40ステップの計算

約21分45秒

潜在表現を81枚の画像に変換し、PNGとMP4を保存

約23秒

生成計算の時間は、途中再開の前後を合計しています。 モデルの読み込みや、初期画像と指示文の準備にかかった時間は含みません。

時間の大半は、動画の内容を生成する計算にかかっています。 最後に画像へ変換してファイルへ保存する処理を速くしても、約22分という待ち時間はほとんど縮まりません。 小さな5秒動画でも、指示を変えて結果を見るたびにこの生成時間がかかるので、動作を何種類も試すには、その待ち時間を見込む必要があります。

当初考えていた30fps、150枚の動画とは異なり、今回はWanによる16fpsの動画です。 Qwen Imageで生成した15枚を残して間を埋めたものでもありません。

同じ場面の朝、昼、夕方を作れたところから、もう少し細かく変えれば動画になるのでは、と試し始めました。 腕の位置を少しずつ変えるところまでは近づけましたが、並べて見られる画質は保てませんでした。 初期画像をQwen Image、動きをWanに任せる構成では、ようやく5秒の動画になりました。 次は、その5秒の中で、まばたきのような指定した動作をどこまで実現できるのか確かめたいところです。

生成に使ったライブラリとモデル

画像と動画の生成を動かした主なライブラリは、次の三つです。

ライブラリ

バージョン

今回の用途

PyTorch(torch)

2.14.0

モデルの計算。MacのGPUを使うMPSバックエンドを利用

Diffusers

0.41.0.dev0

Qwen ImageとWanの画像生成、画像編集、動画生成の処理

Transformers

5.17.0

Qwen2.5-VLによる画像と指示の読み取りや、生成モデルへ渡す文章の処理

DiffusersはGitから取得した開発版です。 0.41.0.dev0 だけでは同じコードを特定できないため、コミット e0abab83b5df05de9e7abd788643c1a7c1e42e28 に固定しています。

モデルも、名前だけでなく次のリビジョンに固定して読み込んでいます。

モデルID

固定リビジョン

Qwen/Qwen-Image-2.1

790c92633540aa0cb11d9abf19eb46d861714758

Qwen/Qwen2.5-VL-7B-Instruct

cc594898137f460bfe9f0759e9844b3ce807cfb5

Wan-AI/Wan2.1-I2V-14B-480P-Diffusers

b184e23a8a16b20f108f727c902e769e873ffc73

比較画像と完成動画の生成条件もまとめておきます。 ステップ数は生成時に計算を繰り返す回数で、動画のフレーム数とは異なります。 seedは生成に使う乱数の初期値です。

実験

画像サイズ

ステップ数

seed

Qwen Imageで腕を上げる中間画像の比較

768×768

25

42

Wanによる81フレームの動画生成

336×336

40

42

Qwen Imageでは、生成の計算はGPUで行いましたが、潜在表現と画像を変換するVAEだけはCPUで動かしています。 事前の検証で、VAEに使われる演算の結果がMPSとCPUで一致しなかったためです。 一方、WanではVAEもGPUで動かしています。 このため、小屋の画像1枚に約49秒という測定と、Wanの動画生成の測定とでは、GPUとCPUに任せた処理の範囲も異なります。

並行で作業していた別件に手がかかるようになったので、今回はここまでです。

Prev Entry