西川和久の不定期コラム

爆速で画像生成するSDXL Turboと、画像1枚で動画を生成するStable Video Diffusionを試した

 少し前に掲載した「LCM LoRA」による生成速度アップで、画像生成におけるスピード合戦はしばらく小休止かと思っていたところ、いきなり「SDXL Turbo」なる技術が登場。早速試用ポートをお届けするとともに、画像1枚から動画生成可能な「Stable Video Diffusion」もご紹介したい。

爆速1Stepで生成、SDXL Turbo / AUTOMATIC1111編

 少し前の本コラムで、通常20~30Stepで画像を生成するところを、LCM(Latent Consistency Model) LoRAを使い2~8(実際は4~8)Stepで画像生成できる爆速技術をご紹介した。普段の約2~3倍速で画像が作れ、「もうこれでOKでは?」と思っていた。

 ところが11月29日、さらに上を行く、SDXL Turboが本家Stability AIから発表。立て続けのスピード合戦的この状況、いったいどうなってるの? 状態だ(笑)。

 同社の説明によると(Google翻訳)、

 “SDXL Turbo は、Adversarial Diffusion Distillation(ADD)と呼ばれる新しい蒸留技術に基づいており、これにより、モデルは単一ステップで画像出力を合成し、高いサンプリング忠実度を維持しながら、リアルタイムのテキストから画像への出力を生成できます。”

とある。つまり1Stepで画像が生成できると言うわけだ。技術的な資料や実際のModelはここにあるので、すぐに試すことができる。

 デモサイトも用意され、英語でプロンプトで入力すると[Enter]キーを押す必要もなく、リアルタイムで反応するという、驚くべき生成速度となっている。

  1. sd_xl_turbo_1.0.safetensors
  2. sd_xl_turbo_1.0_fp16.safetensors

 Modelは2つあり、前者が32bit(13.9GB)、後者が16bit(6.94GB)。結構大きなファイルサイズなので、環境などに応じて、どちらかをダウンロードすれば良い。

 いつも使っているAUTOMATIC1111での生成方法は(Schedulerが違うので暫定だが)、以下の設定でOKだ。

checkpoint: sd_xl_turbo_1.0.safetensors (またはsd_xl_turbo_1.0_fp16.safetensors)
Sampling method: Euler a
SamplingSteps: 1
Width: 512
Height: 512
CFG Scale: 1

 プロンプトに「photo of a cat」と入れ連続で10枚生成したのがこの画面キャプチャとなる。

AUTOMATIC1111でSDXL Turbo
10枚2秒=5fpsの爆速(RTX 4090)

 生成速度は10枚で2秒(RTX 4090)! ということでなんと5fpsだ。GeForce RTX 3060だと推定約5倍かかるが、それでも1枚1秒の計算となる。ちょっと信じれられない速度だ。先のデモサイトでのリアルタイム入力対応にも頷ける。

SDXL Turboギャラリー(1/6)
SDXL Turboギャラリー(2/6)
SDXL Turboギャラリー(3/6)
SDXL Turboギャラリー(4/6)
SDXL Turboギャラリー(5/6)
SDXL Turboギャラリー(6/6)

 なお、SD Turboもあり、同じく512x512だが、SDXL Turboより画質は落ちる。

爆速1Stepで生成、SDXL Turbo / ComfyUI編

 上記で“Schedulerが違うので暫定だが”と書いたのには理由がある。それはAUTOMATIC1111のSampling methodはSampler + Schedulerが1つにまとまっているためだ。つまりSamplerはEuler aでいいのだが、Schedulerは組み合わせ的になにかに設定済で、選ぶことができない。

 ComfyUIというアプリのサンプルページには、

 “The proper way to use it is with the new SDTurboScheduler node but it might also work with the regular schedulers.”

とある。つまりAUTOMATIC1111のSampling method: Euler aで、たまたまうまく行ったものの、本来SchedulerはSDXL Turbo専用のを使う必要があるのだ(ここではSDTurboSchedulerと書かれている)。

 これを試すにはComfyUIをインストールしなければならないが、いつも使っているAUTOMATIC1111、Fooocus、StableSwarmUIの3つの中で、実はStableSwarmUIはバックエンドでComfyUIが動いているので、切り替えれば即使用可能だ。

 新規でインストールする場合、ComfyUI自体はここにあり、Windowsならここからポータブル版をダウンロード、LinuxならInstallingの項目を参考にする。

 起動直後の画面は以下のような感じで、Nodeを接続しWorkflowを作るといった結構マニアックな仕様だ。AUTOAMTIC1111などとはかなり雰囲気が異なる。

 SDXL TurboのWorkflowは、先のサンプルページにある画像をComfyUIへドラッグ&ドロップすれば自動的に開く……という、ちょっと変わった仕掛けになっている。

ComfyUIの起動直後の画面
SDXL Turbo用のWorkflow
同じく10枚生成(動画)。1枚約0.12秒。AUTOMATIC1111の約倍速(0.2秒)

 AUTOMATIC1111と同じく10枚生成すると、1枚約0.12秒=約10fps。AUTOMATIC1111が0.2秒なので、約倍速と言うことになる。普段からStableSwarmUIはAUTOMATIC1111より速いな!っと思っていたが、やはりと言うところ。

 さて、「こんなに速ければもうこれでいいのでは?」と思うだろうが、そうも行かない理由がある。公式サイトから抜粋(のGoogle翻訳)すると、

  1. このモデルは研究目的のみを目的としています(つまり商用利用不可)
  2. 完全なフォトリアリズムを実現しません
  3. 判読可能なテキストをレンダリングできません
  4. 顔や人物全般が正しく生成されない場合があります

 中でも4が痛い(1は用途にもよるだろう)。実際「photo of a woman」などをプロンプトへ入れれば分かるが、猫や犬など動物系や風景などはそれなりに出るが、人全般が苦手。特に東洋(アジア)系は、「いつの時代を学習したのか?」と残念な状態となる。また、解像度が低いので引きの構図にも弱い(顔が崩れる)。

 つまり「用途と出したい内容による」……という少し扱いにくいModelなのだ。朗報としては遅くて我慢できなかったMacBook Pro 14(M1 Pro)でも1秒で生成可能となり、使い方によっては十分役に立ちそうなところか。

 発表から数日後、civitaiにもSDXL Turboをベースとしたモデルがいくつか登場した。見た限りさすがに1Stepは無く、4Step以上のものばかり。だとすと使用制限のあるTurboより、生成速度面では変わらないLCMを使った方が無難かも知れない。この辺りはもう少し様子を見た方が良さそうな感じだ。

 筆者が書いたのと同じような話が(英語だが) stable-diffusion-art.com のここに載っている。Schedulerは1StepならKarrasでも同じ作動になる、CFG 1ではネガティブプロンプトが効かないので画質的に不利、SDXL Turbo / SDXL / Realistic Visionでのクオリティ比較(被写体が女性での比較あり)、SDXL Turbo vs LCM-LoRA……など、興味深い話が満載だ。是非合わせて読んで頂ければと思う。

画像1枚から短い動画を生成できるStable Video Diffusion

 せっかくComfyUIの作動環境があるので、11月22日に発表されたStable Video Diffusionも試してみたい。これは1枚の写真(絵)から短い動画を作るもので、さすがにAUTOMATIC1111では畑違い。Nodeを組み合わせ希望する出力を得られるComfyUIの本領発揮と言ったところ。

 Modelは2種類あり、今回は25フレーム生成可能なsvd_xt.safetensorsを使用する。

  1. svd.safetensors(576x1,024, 14 frames)
  2. svd_xt.safetensors(576x1,024, 25 frames)

 ComfyUIのWorkflowはここにあるので、同じく画像をComfyUIへドラッグ&ドロップ。見るとText to Imageの部分は普通にtext2imageで画像を作っているだけなので、ほかの環境で作った(もしくは撮影した)画像ファイルを読み込めるよう、Load Imageに変更する。

読み込んだ直後のWorkflow。左の深緑の部分は単にテキストから画像を作っているだけだ。解像度は1,024×576(16:9)
Load Imageに置き換え、保存済みの画像ファイルを使えるようにする
動画作成に使用した元画像
Stable Video Diffusionで生成した動画(GIFに変換)。パンしつつ髪の毛が若干揺れている

 作動確認は1,024×576の画像を用意し、先のLoad Imageにセット。GeForce RTX 4090で約40秒と、20Stepで25枚の画像を生成するのだから当然と言えば当然なのだが、結構重い処理となる。出力のSaveAnimatedWEBPの項目を見ると10fps。25フレーム作って10fpsなので2.5秒動画の完成だ。

 できた動画を観て驚くのは、背景や衣服などを含めてた一貫性。Stable Diffusion系の技術で動画を作る時、とにかく一貫性がなく、フレームごとに背景や衣服、ポーズ、顔などが変わってしまい、それを繋ぐと妙な動画になることが多かった(最近はいろいろ固定する方法が出てきたので酷くはならないが)。それがご覧のように繋がって見えるのは見事。

 1,024×576でHD相当、10fpsなのでガタガタしているが、そこは後処理でffmpegや、さらなる改良型のWorkflowを使い、20fpsや30fpsへフレーム補間、UpscaleでフルHDにするなどいろいろ手はある。興味のある方は是非調べて試して欲しい。筆者は改良版のWorkflowでx2/x3フレーム補間+x2 Upscale、全部を一度に作れるものを使用中だ。

 なかなか凄いStable Video Diffusion、尺が短いのは今後の課題として、最大の弱点は「動きを指定できない」こと。元画像の構図、各種パラメータ、そしてSeedで動きは自動的に決まり、動画ができるまでどうなっているか分からないのだ。

 分かっているのはパラメータの

  1. Video Motion Bucket
    デフォルトは127。この値を小さくすると動きが遅くなる
  2. Video Augmentation Level
    デフォルトは0。大きくするとモーション(運動量?)が増える

というところ。これはStableSwarmUIのVideo対応、パラメータのHelpから情報を得ている。実際試すと説明通りなだのが、できるまで何が出るのかは分からないのは変わりない。

 いままで見たパターンだと、ズームイン・アウト、パン/逆パン、被写体が人の場合は歩いたり、目を閉じて開く、風景だと川が流れたり、落ち葉が散ったり……。これらが出たとこ勝負はかなり辛い。今回掲載した動画も大量にガチャって一番それっぽいのを選んでいる。せめてカメラワーク程度は指定したいところか。できたてほやほやのこの技術、今後の進化に期待したい。


 以上、1Stepの爆速で生成できるSDXL Turboと、画像1枚から短い動画を生成できるStable Video Diffusion、そしてNodeを組み合わせて自在にWorkflowを作れるComfyUIをご紹介した。

 去年2022年10月にStable Diffusion 1.5が公開されてから約1年。当時リアルっぽい写真を生成するのも困難だったのに、たった1年でリアルな写真どころか、数秒とは言え動画までもできるようになってしまった。驚くべき進化のペースだ。来年の今頃は一体どうなっているのだろう!?