見出し画像

それなりにいい感じの画像がでるtxt2imgのpipelineを整えたのでまとめておく

お気持ち

最近、個人的に画像生成AI(diffusionベース)を用いて画像生成をしている。
はじめの頃はwebuiを用いて一つ一つimg2imgなり、inpaintingなりを繰り返して頑張っていたのだが、画像生成技術の優位性はなんと言ってもその試行回数であると思っている。

故に、なるべくautoで好みの画像が生成されてくれれば好ましい。しかしながら闇雲に生成しつづけるだけでは大量に生成された画像に良質な画像が埋もれ、結局好みの画像に出会えない、という悲しい現象に遭遇してしまう。これは誰にとっても避けて通りたいシナリオであろう。

そこで、色々試行錯誤した上で「まぁこんなもんでいいか」くらいのレベルでたどり着いた画像生成pipelineをここにまとめておく。参考になれば嬉しいし、「もっといいもんがあるぜ」というならぜひ教えてほしい。

Pipeline全像

pipeline全像: generate, filter, pickupの3フェーズからなる

1. generate phase

まずはじめに断っておきたいのは、promptを人間の頭で練ることは極力避けたい、という思想のもとパイプラインを作っている点である。
理由としては個人的にstablediffuisonなどをベースとした好みの絵柄や雰囲気を生成するように調整したモデルをよく使うため、promptにそこまでこだわらない、ということやクオリティの低いpromptであっても試行回数を上げればどこかでほしいイメージに近いものが得られるだろうという思想が大きい。

1.1. random generator

この最初のフェーズでは、例えばアニメ絵を生成するとして"color randomizer"や"background randomizer", "pose randomizer"などのいくつかのrandomizerの出力を結合したものを用いている。特に難しいことをシているわけではなく、それぞれのrandomizerはリスト選択式の簡単な生成装置である。これらの出力結合で得られるpromptは例えば、"a girl, white hair, forest background, standing." 程度のカンマ区切りの簡単なpromptである。

1.2. magic prompt

モデルによっては1のままの出力でも良い出力をもたらしてくれるものもあるが、そうでないものもある。1のシンプルな出力をブラッシュアップして、いい感じのプロンプトにする必要がある。(prompt engineering?)

人手で頑張るのも良いが、ここでも画像生成の得意とする試行回数の多さを利用するべく、magic promptを利用している。

例えば上記はGPT-2ベースのprompt生成装置で、先程のpromptをいい感じにブラッシュアップしてくれる。シンプルなpromptからは似たようなものしか生まれないが、これを通すことでいろいろなバリエーションが生まれてくれる。

"a girl, white hair, forest background, standing." 
-> "a girl, white hair, forest background, standing. low shot, wideshot, highly detailed, face, by wlop, artgerm, greg rutkowski, alphonse mucha, epic, beautiful dynamic dramatic dark"

1,2の工程を、コンピューティングリソースが許す限り多く繰り返す。個人的にはこの後の人力pickupの過程で追えるくらいのペースにしているし、rtx3060を積んだローカルマシンでも十分な速度が出るため満足している。

また、ここでは生成画像の解像度を小さめ (512x512くらい)にしている。生成されたものが良い画像かどうかわからないこの段階では小さめの画像でとにかく大量に作っておくのがよさそうと思ったからである。

2. filter phase

filterに関して思っていることは、「荒くていいから人間が直接判断する画像の数を減らしてほしい」である。とにかくたくさんの画像を生成することができるので、recallは小さくてよいというわけである。

2.1. aesthetics filter

CLIPの画像特徴ベクトルに対し審美スコアを付けたものをMLPで学習したもの。意外といい感じに分類される。

2.2. my filter

オレオレfilter。
今後の工程も含め捨てられた画像で定期的にTrainingされている。

2.3. photo storage filter

ここまでくるとそこそこ画像数も落ち着いてくるので、photo storageに上げることとなる。中身はブラックボックスだが利用しているphoto storageについている物体検知Algorithmに人やアートとして検出されなかったものはクオリティが低いだろうということで切り捨てている。

ここまででこのくらいのクオリティの画像が列挙されるようになる。
個人的趣向もあり手書きっぽいイラストが多い。

3. pickup phase

1日に一度とか、3日に一度とか頻度を決めて良質な画像をpickupする。現代の地獄、アノテーション地獄である。前世でアノテーションタスクを気軽に人に投げたものが落ちるとされている。
良い画像はよいものとして何かに使うなり、コレクションに加えるなりする。たまに惜しい画像なんかがあるが、こういった類の画像はinpaintingで修正してもいいが時間を惜しむならimg2imgとしてpipelineの頭に再投入する。(randomizerは、画像が入力されている状態だとimg2imgとして機能するように実装されている。)

4. Highres.fix & Super Resolution

やりたければ、だが小さめの画像(512x512くらい)で生成した画像を大きくしたい。webui を参考に実装している。高解像度の画像を生成すると、人物が複数出現したり、人物が融合したりする問題をいい感じに緩和してくれるらしい。その後超解像を通して解像度の高い画像に変換してもよい

終わりに

好きな絵柄に囲まれるっていいね
とはいえ、現状は画像を手動でpickupして安全性を担保している状態。
for workな用途で使えるようなものか否かをいい感じに判別してくれるモデルがないものか。。。


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