こんばんは、スタジオ真榊です。このところ「ジェネレーティブ塗りつぶし」関連の記事が続いていますが、今回はControlnetに実装された新プリプロセッサ「InpaintOnly」で、疑似的にジェネレーティブ塗りつぶしができるのか?という検証記事です。

そもそもInpaintOnlyはこれまでのControlnet「Inpaint」と何が変わったのか、本当にジェネレーティブ塗りつぶしのように使うことができるのか、photoshopよりもinpaint onlyをあえて使うアドバンテージはあるか…等々を、4つの実験で検証していきたいと思います。

InpaintOnlyとは

InpaintOnlyとは:図版1

「InpaintOnly」は、「Inpaint」モデルと組み合わせることで、マスクされた領域だけをインペイントできるシンプルなプリプロセッサです。

というと「マスクされた部分だけをインペイントするのは当たり前じゃない?」と言われそうですが、これまでCN「Inpaint」モデルと組み合わせられるプリプロセッサは「Inpaint global harmonious」のみで、こちらにはマスクしていない領域も色調や細部が変更されるものだったのですね。公式からは「いずれinpaint_restrict(制限)というプリプロセッサを追加するつもり」とアナウンスされていましたが、それがこの「InpaintOnly」になります。

分かりにくいのですが、もちろんimage2imageのインペイント画面で利用すれば、どちらのプリプロセッサを使おうとマスクされた領域しか変容しません。あくまでt2i画面で、Controlnetで読み込ませた画像の一部をマスクして変更したい場合に、この2つのプリプロセッサを使い分けられるようになったわけです。このあたりの説明はこちらの記事をご参照ください。

Image2imageインペイントとの違い

これもおさらいになりますが、CNインペイントは「細かい設定をしなくても、マスク外に描かれているものと上手につなげてくれる」力があります。これはまさにジェネレーティブ塗りつぶしの特徴そのものなのですが、マスクした部分だけをただi2iするだけの通常インペイントとCNインペイントの最大の違いはここです。

さきほどの記事では、こちらの右側の女の子を花束に変える実験を行いました。

Image2imageインペイントとの違い:図版1

通常インペイントで入れ替えようとするとこのようになってしまうわけですが、

Image2imageインペイントとの違い:図版2

t2i画面でこのようにControlnetを起動し、「inpaint global harmonius+Inpaint」をONにして生成すると、

Image2imageインペイントとの違い:図版3

女の子がいた形跡もなくキレイに差し替えてもらうことができます。ただ、4つの画像のリボン部分をよく見くらべてみると、マスク領域外なのに微妙に色味が変化してしまっていることが見て取れます。

Image2imageインペイントとの違い:図版4

さて、ここからが本番。Inpaint global harmoniusの代わりに今回追加された「InpaintOnly」をプリプロセッサに指定すると…

Image2imageインペイントとの違い:図版5

マスク以外はしっかりそのままに、CNインペイントのアドバンテージを生かすことができるようになりました。快挙!

ジェネレーティブ塗りつぶしには「インサート」「リムーブ」「アウトペイント」の三種の機能があると紹介しましたが、InpaintOnlyの追加によって少なくとも「インサート」についてはほぼ同じことがSDwebUI上でもできるようになったわけですね。

ジェネレーティブ塗りつぶしと何が違うのか

「ジェネレーティブ塗りつぶしがあるなら、わざわざSDwebUIで似たようなことをやる必要なんてないんじゃないの?」と言われそうですが、そんなことはありません。ジェネレーティブ塗りつぶしの画像生成はFirefly依存なので、そもそも我々が普段使っている学習モデルのようなイラストチックな画風で生成することが大の苦手です。

例えば、この表情を「angry face」に書き替えさせようとすると…

ジェネレーティブ塗りつぶしと何が違うのか:図版1

こんなとんでもないことになってしまいます。

ジェネレーティブ塗りつぶしと何が違うのか:図版2

「SDwebUI版ジェネレーティブ塗りつぶし」のようなことができるのであれば、Adobe版と違って「表情の書き換え」や「崩壊した部分の描き直し」などが同じ画風でカジュアルにできるようになります。Adobe版と異なり、キャンバスが大きくなると崩壊してしまう問題はありますが、768x512pxくらいの大きさで生成する分には問題ないでしょう。

せっかくなので、さきほどの「笑顔→怒り顔」の表情変換をInpaintOnlyで試してみます。画像をt2i画面のControlnetで読み込ませ、「inpaint only」を指定。「1girl,angry,red glasses,face,purple eyes,looking at viewer」のプロンプトで4枚生成すると…

ジェネレーティブ塗りつぶしと何が違うのか:図版3

チェリーピックなしでもこの精度で表情差分を作ることができます。

ジェネレーティブ塗りつぶしと何が違うのか:図版4

ただ、メガネあるあるなのですが、グラスの周辺で目が4つに見えてしまう部分がありますね。Controlnetでは、ここからジェネレーティブ塗りつぶしでは絶対にできない「ヒット率を上げる方法」があります。そう、Referenceプリプロセッサです!