🦊image2image
参考
https://gyazo.com/bbb1bca709f4a0b20735da8222d6e3f9
しかし、完璧にトレスしては複製してるだけで、なんのオリジナリティもないですね
そこで、元の絵が分かる程度にノイズを追加してから、デノイズしてもらうことで元の絵をいい感じに使いつつ新たな絵を書いてもらいます
ちょっとしかノイズを追加しなければ元絵の微調整に使えますし、たくさんノイズを追加すれば元絵の雰囲気を継承しつつオリジナリティが増した絵が作れます
🤔ComfyUIではどうやっているのか?
KSamplerでは、まずノイズを追加してからサンプリングをしてノイズを除去していきます
https://gyazo.com/545eac35f1535fe1811440dbfe4b4784
start_at_stepが0、end_at_stepが20の場合、最初にノイズが満量追加されていますね
では、start_at_stepを1にしてみましょう
https://gyazo.com/b5478e9367b63377917481fa0f72a8cd
追加されるノイズが減って、元の画像が少し見えるようになりました
もう少し増やして、start_at_stepを5にしてみましょう
https://gyazo.com/15245da7a22231a020515c5cd8819647
追加されるノイズが減って、元の画像が大分残っていますね
では、start_at_stepを20にしたらどうなるでしょう?
https://gyazo.com/2ff6562379b1dafc7d8c115cc9255b2d
そうです、まったくノイズが追加されずサンプリングもされません
これが完璧にトレスした(入れた画像がそのまま出てくる)状態です
ということで、start_at_stepが1 ~ (step数 - 1)までが元の絵を残しつつサンプリングしている状態 = image2imageとなります
🦊ComfyUIでやってみる
説明のためにKSamplerAdvancedノードを使いますが、後述しますが無印KSamplerを使うのをおススメします
https://gyazo.com/c18016de239a5f0e420944e06f860828
読み込んだ画像をVAEEncodeで潜在空間に変換してKSamplerAdvancedに送り込みます
読み込んだ画像の大きさでそのままサンプリングするので、うっかり4Kの画像を使っていたりすると大変なことになります
start_at_stepと生成画像の関係
https://gyazo.com/f1cd51efcb2416eeb15b3d12283d60c3
上のグラフで見た通り、start_at_stepが0とき元の絵を完全に無視(text2imageと同じ)し、steps数と同じ時は読み込んだ画像がそのまま出てきます
step数20ならstart_at_stepを10にすればノイズと元絵のバランスが1:1になる感じがしますが、そうじゃないんですね
特に後半はどこのstepでスタートしても大して絵が変わりません
https://gyazo.com/e896c6577e772a69349537623746462d
text2imageで使うEmptyLatentImageノードをそのままVAEDecodeにつなげてピクセル画像にしてみると土色の画像がでてきます
text2imageは、この土色の画像をstart_at_step 0でimage2imageしたもの、と言い換えることもできるわけです
💫無印KSamplerノードへの変換
ただし大きな変更が2箇所あり、そしてとてもわかりにくいです
https://gyazo.com/4d0e9081b9e2516fe7582a62faee61a1
denoise
https://gyazo.com/6f12a584833996a7a4800a13bb59cc23
ここにあった説明間違ってました、もし見てたら忘れてくださいnomadoor.icon
denoiseはどのタイミングでサンプリングを始めるかを設定します
1.00だとtext2image、0.00が元の画像がそのまま出てきてしまう値です
stepsの扱い
これが無印とAdvancedで大きく違います
KSampleAdvancedでstep数 20 / start_at_step 4の設定のとき、サンプリングされるのは黒い部分です
https://gyazo.com/8a85edb99feb37c3e492d60562b87d29
step数 - start_at_step回、この例では16回サンプリングします
では無印KSamplerで同じ結果になりそうな、step数 20 / denoise 0.8で生成するとどうなるでしょう?
https://gyazo.com/2d9ad8d2db536e8cf90ccfe057c3a768
なんと黒い部分のみで20stepあります
denoiseが0.5であっても0.1であっても20回サンプリングします
もしKSamplerAdvancedと同じ結果を出したいならばstep数を毎度計算しないといけません
$ 設定するstep数 = 全体のstep数 * denoise
🤔無印とAdvancedどちらを使うべきか?
step数 20でdenoising strengthが0.5だった場合、サンプリングは10回です
step数は固定にする場合
denoiseが0.9とか0.8のときはどちらを使ってもそんなに違いはありません
問題はdenoiseが小さいときです
step数20でdenoiseを0.1にするとKSamplerAdvancedは2stepしかサンプリングしません
大して無印は関係なく20回サンプリングするのでコントロール性能が高いといえば高いです
が、denoise 0.1にもなるとほとんど絵が変わらないのでstep数20は無駄です
タイミングを固定にする場合
無印はstep数を変更しようとタイミングには影響しない
KSampleAdvacedはstep数を変えてしまった場合、start_at_stepの値を計算する必要がでてきます
そして、計算してもちょうど当てはまるstep数がない(丸める必要がある)こともある
image2imageで大事なパラメータはなにか?
と聞かれたらそれは確実にタイミングの方が大事nomadoor.icon
step数が増えたり減ったりしたところで、多少生成される画像の品質が変わるだけ
タイミングはちょっとずれると元絵との差が大きくなってしまう
と、いうことでimage2imageのときは無印KSamplerを使うのをおすすめしようと思うんですが皆さんどう思いますか?nomadoor.icon
startとendの扱いにまだなれてない人&&image2imageであれば同感ですjaguyama.icon
KSamplerAdvancedに慣れてても無印を使った方がいいような気がするんですよねnomadoor.icon
微調整のしやすさが段違いで、denoise 0.76とかをKSamplerAdvancedでやろうとすると、step数100でstart 34…? step数20ならstartどこ…ここ…?みたいになっちゃう