見出し画像

「推しカプGenerator」をLayeredDiffusionPipelineでやってみる

「推しカプGenerator」という記事を昨日見て、LayeredDiffusionPipelineでもできるなと思ったので、ちょっとやってみた、という記事です。

実験に使ったGoogle Colabのノートブックはこちら。

スクリプト

Colabノートブックにも書かれていますが、スクリプトはこうなりました。プロンプトはそのままコピーしたので、強調構文の文法が違いますが、そのままでも動くのでそのままです。

def run(mix=0.5):
  images = pipe(
      num_steps=30,
      size=(512, 768), # 縦長サイズ
      iterate=[
        # 1. 背景レイヤー
        Layer(
            prompt="((ultra-detailed)), ((illustration)), 2girls",
            negative_prompt="(low quality, worst quality:1.4) ",
        ),
        # 2. 前景分割左レイヤー
        Layer(
            prompt="((ultra-detailed)), ((illustration)), 2girls, black hair",
            negative_prompt="(low quality, worst quality:1.4) ",
            strength=using(mix),
            mask_by="sym_left.png",
        ),
        # 3. 前景分割右レイヤー
        Layer(
            prompt="((ultra-detailed)), ((illustration)), 2girls, blonde hair",
            negative_prompt="(low quality, worst quality:1.4) ",
            strength=using(mix),
            mask_by="sym_right.png",
        ),
      ],
  )
  display(images[0])

レイヤーが3つで、1つ目が背景レイヤー、2つ目と3つ目が左と右の前景分割レイヤーです。分割部分はマスク画像で範囲指定していますが、マスク画像は自動生成がないので、ペイントソフトで描いたものをアップロードしています。

関数run()を呼ぶと実行されます。引数のmixは、背景と前景の混合割合です。mixが大きいほど、前景分割レイヤーの影響が強くなります。

生成画像

mixの値ごとに、よさそうなものをピックアップしてみます。

mix=0.3
mix=0.5
mix=0.8
mix=1.0

失敗例

mix=0.8
mix=1.0

感想

"2girls"のように、複数のマスク部分で同じ同種の対象を描くのは難度が高いのですが、このケースでは割とうまくいっているのが興味深いです。一般的には、"1girl, 1boy"とかの方が安定するはずです。

うまくいっている理由の1つに、背景レイヤーを用意して、前景と背景の全てに"2girls"を入れているという点だと思います。mixの値が大きく(mix=0.8, 1.0)なって、背景レイヤーの影響が小さくなるにつれ、"2girls"という構図が崩れた画像が出力されやすくなったようでした。

逆に、mixの値が小さく(mix=0.3)なると、前景のプロンプトの影響が弱くなり、髪の色が指示通りでなくなる例が目立つようになります。

追記

実験中、ライブラリにバグを見つけたので、可及的速やかに直そうと思います。 直しました。

LayeredDiffusionPipelineがAnything V3でうまく動かないという報告がコメントにあったのですが、Anything V3のリポジトリの方のコンフィグの間違いがあるか、あるいはファイルが足りないという問題があるようで、配布側で修正が必要なようです。
ですので、他のモデルに変えるか、問題のないミラーリポジトリを使うか、あるいはローカルから読み込むかのどれかで対応してください。

この記事が気に入ったらサポートをしてみませんか?