StreamDiffusionで超美麗3DVtuberになり"たかった"
2024-01-30
azblob://2024/01/30/eyecatch/2024-01-29-streamdiffusion-demo-000.jpg

あけましておめでとうございます。今年1本目のブログです。

なんてことを思っていたらもう1月も下旬とは速いですね。

今回は、去年の年末にちょっと話題になってた?StreamDiffusionのリポジトリが公開されていたのでちょっと遊んでみた内容について書いていきます。

そうです、みんな大好き?GPU有効活用シリーズの第4弾です。

環境構築

  • CPU: Ryzen5 3600
  • メモリ: DDR4 32GB
  • GPU: Geforce RTX 4070(VRAM 12GB)
  • OS: Windows 11 
  • Docker Desktop(Docker compose)

もちろん、相も変わらずDockerで環境を用意していきます。

まずはリポジトリをクローンしてきます。

Dockerfileもすでに用意されており、READMEに実行方法も書いてくれてるのですが、個人的にDockerコンテナの操作はすべてdocker composeで行いたいので、compose.ymlを用意します。

version: '3'
x-base_service: &base_service
  tty: true
  deploy:
    resources:
      reservations:
        devices:
          - driver: nvidia
            capabilities: [ gpu ]
name: streamdiffusion
services:
  examples:
    <<: *base_service
    profiles: [ "examples" ]
    container_name: streamdiffusion_examples
    build: ./
    working_dir: /app/examples
    volumes:
      - ./:/app
      - ./.cache:/root/.cache
  t2i_demo:
    <<: *base_service
    profiles: [ "t2i_demo" ]
    build: ./demo/realtime-txt2img
    container_name: streamdiffusion_t2i_demo
    environment:
      - PYTHONPATH=/app
    ports:
      - 9090:9090
    volumes:
      - ./:/app
      - ./.cache:/home/user/.cache
  i2i_demo:
    <<: *base_service
    profiles: [ "i2i_demo" ]
    build: ./demo/realtime-img2img
    container_name: streamdiffusion_i2i_demo
    environment:
      - ENGINE_DIR=/data
      - HF_HOME=/data
    volumes:
      - ./demo/realtime-img2img/.cache:/data
    ports:
      - 7860:7860

Demo1

まずはexamplesディレクトリにあるコードを動かしてみます。

docker compose --profile examples up -d

でコンテナを起動したら、コンテナに入りexamplesにあるREADMEに従って実行します。

今回は以下のコマンドでtxt2imgの複数枚同時生成を実行してみました。

python txt2img/multi.py --output ./output --prompt "A cat with a hat"

結果

生成はされるのですが、毎回pipeline componentsとやらをロードするらしくこれに数分かかり1度に生成されるのは3枚でした。

それならモデルの指定とかも楽にできるStableDiffusionで生成した方が速いような気がしちゃいます。

Loading pipeline components

Demo2

demoディレクトリに別の、txt2imgを行えるコードがあるのでこれを試してみます。

ただそのままでは動かなかったり、最速ではなかったりするので以下の部分を書き換えます。

demo/realtime-txt2img/config.pyの

  • accelerationをtensorrtに変更
  • hostを0.0.0.0に変更

demo/realtime-txt2img/requirements.txtに

  • torchvisionを追記

Dockerfileも別のものを使うのでコンテナを起動するコマンドも別のものになります。

docker compose --profile t2i_demo up -d

webサーバが立ち上がったらブラウザでlocalhost:9090にアクセスするとページが開きます。

結果

プロンプト自体は以前のVtuberになるブログで使ったもののうち品質向上系のプロンプトを除いたものを使ったのですが、入力する度にリアルタイムで新しく生成されていくのが分かります。

強いて難点を上げるとすれば

  1. モデルやLoraなどの変更はリアルタイムで行えないので都度再起動する必要がある。
  2. 生成した画像はどこかに保存されるわけではないので、手動で保存する必要がある。

ぐらいです。

Demo3

Demo2でリアルタイムに生成できることは確認できました。

それと以前のVtuberになるブログを組み合わせて1つ思いついたことがあります。

生成したイラストを動かす手法では可動域に限界があり、少し傾くぐらいが限界でしたが

リアルタイム生成できれば真横とかも向ける完璧なVtuberになれるのでは!?

正直これがやりたくてStreamDiffusionを触りました。

というわけでやってみましょう。

入力にWebカメラを使えるデモが用意されてるのでそれを使ってみます。

これはまた別のDockerfileが用意されているので、そちらを使ってコンテナを起動します。

docker compose --profile i2i_demo up -d

webサーバが立ち上がったらブラウザでlocalhost:7860にアクセスするとページが開きます。

左下のstartを押してカメラを許可すると生成が始まります。

Demo2と同様にプロンプトを書き換えるとリアルタイムで生成内容も変わります。

結果

がっつり顔や部屋が映るので動画はありませんが、デフォルトでプロンプトに入っているジョーカー(白塗りの顔)にはなれました。

ただ、あまりに激しく動くと生成が追いつかないし、派手な改変はできないようです。

イメージとしては、映っている物体の上から新しく塗るという感じなのか、髪を伸ばしたり服を派手にするのは現状では難しそうです。

また、ちゃんと原因はわからないのですがOBSを起動した状態だとカメラが映りませんでした。

なのでStreamDiffusionでお手軽超美麗3DVtuber!っていうのはなかなか厳しそうですね。

最後に

今年は月1本目標にするぞー とか思ってたら1月も終わりかけでしたがギリギリ間に合ってよかったです。

来月はもうちょっと早めに出せるといいですね。