💻

Stable Diffusion - inpaintingタスクによる服装変更

2022/10/07に公開

はじめに

何この記事

タイトルの通り、inpaintingタスクを利用して既存のイラストの服装を別のものに入れ替える、という操作を試してみたので、その流れを記しておこうというものです。

inpaintingって何よ

ある画像の指定した範囲を別のイメージに置き換える技術です。
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#inpainting
上記の例にあるように、例えば椅子の上にいるワンちゃんを消したり[1]、何もない平原に木を追加描画するなど、自由な編集が可能となります。

主な対象読者

  • Stable Diffusionに触り始めたばかりで、inpaintingの使い方がイマイチ分からないので、どんな感じで使えるのかざっくり知りたい方
  • 可愛い女の子のイラストを眺めたい方
  • 暇つぶしに何か読みてーな、という方

具体的な使い方に関しては、もっと丁寧にまとまっている記事が沢山あるので、ぜひそちらをご参照ください。この記事では大したこと書いてないです。すまんな。

実行環境

  • グラフィックボードが積まれたマシン
    • 本記事ではVRAM: 3GBのヘナヘナPCを使っていますが、何とか動かせます。
  • AUTOMATIC1111版 WebUI
  • GIMP(バージョンは任意)
    • GIMPに限らず、使いやすいペイントソフトがあれば何でもOK

いざ実践

元画像の用意

今回は以前の記事でも掲載した、text2imgで生成したこちらの画像を使います。

うまく生成できてるので気に入ってる

とてもいい絵なんですが、ちょっと過激で職場では安心して見れないですね……
※この記事を職場で開いてしまった方は申し訳ない(最初の警告をちゃんと読みなさい)
なので、この画像がいつでもどこでも安心して開けるよう、服装を変えていきたいと思います。
具体的にはTシャツとジーンズという感じにしていきます。

inpainting用の画像準備

マスク画像作成

まずは元画像をGIMPで開きます。

背景が黒のレイヤーを追加し上に重ね、少し透過させておきます。

このレイヤーに対して、最終形をイメージしつつ、服を重ねて描かせたい範囲を白で塗りつぶします。今回はTシャツ&ジーンズにしたいので、そんなシルエットを描きました。

描いたレイヤーだけを表示するとこんな感じ。

これがinpaintingで使うマスク画像です。
実行時にこれを与えることで、白で示された範囲だけ描画しなおす、ということができるようになります。そのため、今回は首から上や背景などはそのまま、服装だけを描き直す感じになります。

この後に画像ファイルとしてWebUIに投入することになるので、不透明度を100%に戻し、このレイヤーだけの画像をエクスポートしておきましょう。

修正画像作成

inpaintingでは、マスク画像で変更範囲を指定するだけではなく、どんな感じに描き直してほしいか、ざっくりと指定することも可能です。今回の場合だと、例えばTシャツやジーンズの色合いはどうするか、どのあたりからジーンズにするのか、といった細かい内容を伝えることができます。
ということで、まずは先ほどのGIMPの編集画面で、新しいレイヤーを追加。
そのあと、マスク画像用のレイヤーを選択した状態で、「選択」→「色域を選択」 を選びます。

そして、マスク画像レイヤーで白く塗られている箇所をクリックすると、自動的に白く塗った個所に沿って点線が表示され、範囲選択がなされた状態になります。
こうすることで、マスク画像とまったく同じ範囲にだけ色塗りできるようになります。

そんでもって、ざっくりと修正後のイメージを描いてやります。今回はTシャツの色は白なのでそのまま白く塗り、ジーンズの部分だけ青っぽい色で描画しました。

そして、最後にマスク画像用のレイヤーだけ非表示にして画像ファイルとしてエクスポートするとこんな感じになります。

これが修正画像として与えるデータになります。

いざinpainting

投入する画像データが準備できたので、さっそくWebUIを起動して実行していきましょう。
以下のような手順で実行準備を進めていきます。

  • まず「img2img」タブを開き、さらに「Inpaint」タブを選択する
  • 「Mask blur」の下にあるラジオボタンについて「Upload mask」を選択する
  • さらにその下にある「Masked content」の中から「original」を選択する

ここで出てくる「Masked content」を「original」にすることが重要です。 そうしないと、意図した形で描画されなくなるのでご注意を(私はこれがちゃんと理解できてなくて30分くらい無駄な時間を過ごしました……)
※以下ページの「Inpainting機能」の項に書いてある内容が分かりやすいです
https://gigazine.net/news/20220913-automatic1111-stable-diffusion-webui-img2img/

この状態になると、左上側に画像がアップロードできそうなUIが2つ出てきているはず。
上からそれぞれ、修正画像とマスク画像をアップロードします。

あとはtext2imgと同じ要領でプロンプトや各種パラメータの設定を行っていきます。
今回は以下のように設定してみました。

  • Prompt : full body of beautiful anime girl white T-shirt indigo jeans highres highly detailed
  • Negative prompt : (なし)
  • Sampling Steps : 50
  • Sampling Method : Eular a
  • Batch count : 4
    • シードを変えて複数パターン試行し、よさげなものをピック出来るようにしておく
  • CFG Scale : 11
  • Denoising strength : 0.50
    • これはtext2imgにないパラメータですが、調べた限りではこれくらいの値がよく使われていたので……
  • Width / Height : 元画像に同じ (512 x 704)

生成結果は以下の通りでした。

いい感じですね!
ただ、元画像の水着の肩紐の部分が髪の毛として伸長されていたり、Tシャツの首周りが微妙におかしかったり、Tシャツとジーンズの境界面がはっきりしすぎてイマイチだったりと、細かく見ていくともうちょっと何とかしたいところもあります。
この場合は、例えば以下のような方法で直していくことができるかなと。

  • パラメータを振ってより良い画像が出すべくガチャり直す
  • よかった出力の微妙な点をペイントソフトで微修正し、それを修正画像として再度inpainting
  • ペイントソフトで細かいところを描き直して完成させちゃう

今回はめんどくさいデモ的な試行なので、このまま使っちゃいましょう。

元画像とマージ&手直し

今回AIに食わせた画像ですが、冒頭で述べた通り、VRAM不足のエラーを回避するため、少しだけリサイズをかけていました。なので、生成された画像を元画像に重ね合わせます。これでinpaintingによる着せ替えが完了しました!やったぜ。

どうみても健全な画像

この方法のいいところは、元画像に重ねて最終形としているところです。つまり何が言いたいかというと、ちゃんとTシャツの下に水着を着たままになっている、ということですね。
 
 
 
ということは、だ。
 
 
 
Tシャツの部分を強度を抑えた消しゴムで少しずつ消していくと…………
 
 
 

ディ・モールト ディ・モールト (非常に 非常に) 良いぞッ!

こんな感じでAIだけで何とかするのではなく、ペイントツールと組み合わせることで狙った画像を作り出していくことができそうですね。

むすびに

今回は勉強もかねてinpaintingを試してみましたが、これは本当に強力なツールであると実感しました。これを使いこなせれば、望み通りの画像をバンバン生み出すことができそう。

一方で、強力なあまり、悪い方向にも使えてしまう危うさを感じました。
先日、水害のフェイク画像をネットに流して問題となったことがありましたが、こうした悪意のある使い方(あるいは悪意がなく無意識であったとしても)が行われると、社会的に悪印象を持たれ、どんどん締め付けが厳しくなっていったりしないかしらという懸念もあります。
せっかくの素晴らしい技術なので、正しく運用していきたいですね。

脚注
  1. かわいそう(´;ω;`) ↩︎

Discussion