Diffusion】AIは非常に美しい風景を出すことができるが、小さな人をそこに混ぜるのが苦手。手間だがこのお題をクリアしてみた。2023/05/21:Photoshopで行う場合のtipsを追加。外部の画像編集ソフト(無料のGimpでも出来るはず)Tileについては次で詳しく解説しているので読んでいただければと思う。画力は無くてOK実はこれを作る前にScribbleで自分でちょっとキャラを書く方法をやったのだが、下手すぎてキャラが描画できなかった。絵心がある人はこちらのほうが早いだろう。この記事では自分で書き足さなくてもキャラが出てくる方法を紹介する。今回作る作例(人力タイル法)今回は1枚の大きな風景の中に、小さいキャラクターを入れる方法を考える。風景の左下で女の子が足を湖につけている絵を作った。このように全体に対してキャラクターの比率が小さい絵の作り方を考えていく。やり方はこれから解説するが、私はこれを「人力タイル法」と名付けた。今回は比較的キャラが大きい構図になったが、更に遠くにいる(小さい)キャラクターも作れると思う。今回の記事は次の元絵にキャラを合成していく作業だ。Latentこの時既に完成とするサイズまでアップスケールしておこう。え、小さいキャラいれるの難しいの?こうやって大きな風景に小さなキャラを入れる、これが結構難しい。多くのユーザーがまず最初に考える方法が次inpaintに任せる(うまくいかないことが多い)次の方法だとなかなかうまくいかない。https://www.fashion-press.net/news/103344promptを変更。1girl等キャラが出るものにする。するとなにぃこれー!おおよそこういった良くわからない画像が出てくる。運良くソレっぽいキャラを引けても顔が壊れているケースが殆ど(上の画像も顔がいまいち)ガチャなので、この方法でも目的のものが出ることがある。人力タイル法そこで私は上の画像の一部を切り抜いてもう一度AIにかけていく手法を取っている。名付けて「人力タイル法」キャラを入れたい部分だけ切り抜くまずは外部の画像処理ソフトでキャラを入れたい部分だけピンポイントで切り抜く。今回はPhotoshopを使用したがGimpなどの無料ソフトでも十分できるはずだ。後ほどここに画像をはめ込むので、選択範囲の位置とサイズはメモしておく。私はわかりやすく正方形にすることが多い。今回元絵に対してかなり大きい範囲を切り抜いたが、場合によっては「表情だけ/手だけ」といった非常に小さい枠で切り抜いても上手くいく。Web用...機能によってスライスした部分を取り出せる。このスライス自体が吸着のガイドとして機能するので、選択範囲をおぼえておかなくても画像をドラッグドロップし、そのまま自由変形でピタっとハマる。良いやり方があるかもしれないので参考程度に。上で切り抜いた画像をもう一度AIに投げてInpaintする。lakeというプロンプトに変えて足を水につけているキャラクターを生成した。AIで生成する画像サイズは切り抜いたときと同じサイズ。この時何度も繰り返して好みのキャラがでるようにする。目的のものが出力された。顔が微妙かも?よく見ると、顔の形が微妙によろしくない。顔などが綺麗に描画できないのはそもそも生成する画像サイズが小さいのが原因これは意外に知られていない。いうわけで、ある程度キャラが決まったらこれをさらに「大きくアップスケール」することで顔が良くなる。このときもinpaintのマスクは同じものを利用してアップスケールする。inpaintをそのまま引き継げば、四隅は維持されるのでサイズが大きくなっても元の絵にはめ込むことができる。元のイメージを壊さないようにするにはControlNetのtileを使ってアップスケールすること。ControlNet側にも上の絵を放り込んでやることを忘れずに大きく変わった訳では無いが、いくらかよくなった。ディティールも増した。戻したら完成あとは出来上がった画像を元の画像の位置に戻してやれば完成だ。inpaintのマスク塗りに失敗していなければ、アップスケールしてサイズが変わってしまった切り抜きパーツも縮小してはめればピタっといく。記事の最後に更に一歩進んだ作り方も研究そもそもなんで切り抜いた?なぜわざわざ切り抜く必要があったのか。画像の中にキャラは大きく描かれるAIは1枚の画像の中にキャラクターを大きく描こうとする傾向がある。風景の中に小さいキャラクターを描かせようとしても大きなキャラクターが出てきてしまう。これをあえて人力で画像を切り抜くことで「この中に大きくキャラを大きく書いてくれたら良いよ」というのを明示する意味がある。顔(キャラ)を綺麗に描画したい上で切り抜かずにinpaintだけで再描画すると、キャラの顔が壊れやすいと書いた。これはあまり知られていないが、顔を良く描画しようと思うとバストアップだけでも500x500ピクセルぐらいのサイズが必要(これでも細部が足らない顔になる)1発で風景の中に小さな人を入れようと思ったら風景自体を4kぐらいのサイズで作らないと、そもそも人を美しく描くためのピクセル数が足りない。これがキャラクターが綺麗に描かれない原因だ。いって最初から4kにしてしまうと処理時間が膨大になるデメリットだけでなく、背景の書き込みが細かすぎてカオスになるというデメリットすらある。切り抜いて一部だけAIに再描画させるほうが色々と都合が良い。アップスケールしてもサイズ戻すなら意味ないんじゃ?このワークフローでは「切り抜き>アップスケールして再生成>画像サイズを小さくして戻す」という手順を踏んでいる。そもそも大きくしたものを小さく戻すのなら始めから小さいサイズでいいんじゃ?という疑問があるが、試してみるとそうはならない。始めから小さいサイズで生成したものと、大きいサイズで作った画像を縮小したものを比べると明らかに後者のほうが書き込みが多くなる。絵を良くしたい完成絵を見てなにか違和感があった人はツワモノ。背景とキャラクターを別々で描画したので筆のタッチが合っておらず、別の画家がコラボして1つのイラストを作ったような絵になっている。なじませる方法が欲しいここからは私も研究段階。全体の絵を馴染ませる方法が二種類あるのでテストも兼ねて掲載する。ControlNetのInpaintを何も入れずに使うControlNetにもInpaint機能があるが、実はこれはマスクが何も入力されていなくても全体をなじませる効果がある。上で完成となっている画像を更に放り込んで再生成する。この時、元絵と同じ生成サイズでInpaintを通しただけだと結局顔が壊れてしまうので、少しサイズを大きくする。VAEを使ってVRAMの限界を突破する。この時Weight=1だと線が壊れる印象があったので0.5に設定キャラクターを含め塗りが一新され、全体的に統一感が出た。画風が変わって、少し荒いタッチになったのでこれをヨシとするかどうかが分かれそうだ。Resampleを使っても全体をなじませる効果がある。今度はさらに約4kまでのサイズにして実験。Weight=0.8で生成。これはこれで馴染んだが、大きくしたことにより細部が細かすぎる現象が起きてしまった。一部の雲が樹木になったり、水の反射が鮮明になりすぎたりという不具合も。AIにしかできない細かすぎる書き込みの絵と考えれば、好みによってはこちらの方が良いと感じる人もいるだろう。Diffusion内で完結できそうなLLuLというエクステンションがある。upscaLerが、現時点でバグ?があるようでマスクの設定ができない。更新もされていない模様。Diffusion側の更新でUIが描画できてないように思う。したら今後この記事の内容が上でできるかもしれないのでメモとして残しておく。さいごにひとまず目的の小さいキャラクターを入れることはできたと思う。これはこれで非常に面倒で、他にも答えがあるかもしれない。引き続き研究していきたい。何を見せたいかを考えたい目的は達成したが、今回の作例はキャラを見せたいのか背景を見せたいのか良くわからない構図になってしまった。キャラを端に寄せすぎた。この例なら真ん中にボートを浮かべてキャラを入れるなどのほうが良かったかもしれない。いうことで、この絵ならいっそ上はクロップしてしまって次のようにしたほうがまだマシかもしれない。クロップ+夕日の明かりを手塗り+さくらの不自然な映り込み消し等を手で補正して別のバージョン完成。不自然なところはあるが、このへんで。DiffusionAIControlNet作例この記事をシェア著者Ultra-Noob謎の技術研究部部長。3DCG以外にもDTMやプログラミング等も研究する。謎の技術研究部とはプライバシーポリシーホーム(自動スクロールなし)ご意見、お問い合わせ。