Dream BoothをGoogle Colabで動かしてみる

1.はじめに

 今までテキストから画像生成するモデルは、テキストで指定して特定のオブジェクト(有名なものを除く)を画像生成することが困難でした。

 今回ご紹介するのは、テキストから画像を生成するモデルを、特定のオブジェクトの画像(3〜5枚程度)でファインチューニングすることによって、テキストで指定して特定のオブジェクトを画像生成できる Dream Booth という技術です。

*この論文は、2022.8に提出されました。

2.Dream Boothとは?

 下記がDream Boothのフロー図です。3~5枚の画像(Input Images)を使って、テキストから画像を生成するモデルを2ステップでファインチューニングします。

 第1ステップ(左図)はモデルの低解像度部分が対象です。ユニークな識別子を含むテキスト(”A[V]dog”)を入力したら入力画像(Input Images)を出力するように、かつ入力画像が属するクラス名を含むテキスト(”A dog”)を入力したら今まで通りの画像を出力するようにファインチューニングします。

 言い換えれば、”A[V]dog”を入力したら入力画像を出力するように、しかも今まで登録した内容には影響を与えないように、辞書登録するようなイメージです。

 第2ステップ(右図)はモデルの高解像度部分が対象です。画像とそれを低解像度にしたもののペアを使ってファインチューニングします。

3.コード

 この技術は当初30GBを超えるGPUが必要でしたが、有志の方々の努力によって必要メモリの圧縮が行われ、つい最近Google Colabでも動くようになりました。有志の方々には心より感謝致します。今回はこのコードを改造したものを使用しています。

 コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Open in Colab」ボタンをクリックすると動かせます。

 まず、dream booth をインストールします。

 

 今回使用するテキストから画像を生成するモデル(Stable diffusion)をダウンロードするために 、HuggingFace にログインします。

 なおログイン前に、HuggingFaceにSign UPし、Model cardの使用申請をし、Access Tokenを取得して置く必要があります。まだの場合は、このブログの「2.アクセス・トークンの取得」を参考に事前に行って下さい。

 

 学習の前に、特定のオブジェクト名(INSTANC)と特定のオブジェクトが属するクラス名(CLASS)を設定します。特定のオブジェクト名は、ユニークな名称にし、クラス名は一般的な名称にして下さい。

 ここでは、オブジェクト名は「kasumiarimura」、クラス名は「portrait」とします。はい、もうお分かりですね。オブジェクトは、「有村架純」さんを使います。

 

 オブジェクト画像を自分のPCからアップロードします。このとき使用する画像は正方形のものを使用して下さい。

 sample_picsのチェックボックスにチェックを入れていると、サンプル画像(有村架純5枚)をアップロードします。ここでは、チェックを入れた状態で実行します。

 

 オブジェクト画像とクラス画像(自動的に取得されます)を学習します。20〜30分程度時間がかかるので、しばらくお待ち下さい。

 

 ファインチューニングしたモデルを元に、テキストから画像を生成するパイプラインを作成します。seed で乱数系列を指定できます。

 

 それでは、promupt にモデルに登録したオブジェクト名+クラス名(kasumiarimura portrait)をそのままを入力し画像生成してみましょう。一度の実行で10枚画像を生成し、気に入らなければ何度でも繰り返し実行することが出来ます。

 10枚生成した内の2枚を表示しています。sample_picsには無い、指定したオブジェクト(有村架純)の画像が生成されています。

 次を実行すると表示した画像をダウンロード出来ます(Google Chrome専用)

 

 それでは、色々な呪文を使って、アーティスティックな画像生成をしてみましょう。呪文は6つプリセット(参考Lexica)してあります。スライダーでprompt_bank_No を選択(0〜5)して実行すると10枚の画像を生成します。

 まず、「0」で実行します。気に入らなければ何度でも繰り返し実行することが出来ます。

 「0」です。生成した画像の中から2つ表示しています。

 同様に「1」です。生成した画像の中から2つ表示しています。

 同様に「2」です。生成した画像の中から2つ表示しています。

 同様に「3」です。生成した画像の中から2つ表示しています。

 同様に「4」です。生成した画像の中から2つ表示しています。

 同様に「5」です。生成した画像の中から2つ表示しています。

 先程同様、以下を実行すると表示した画像をダウンロード出来ます(Google Chrome専用)

 

 自分で呪文を作ってやってみたい場合は、prompt とnegative_prompt で指定する方で色々試してみて下さい。

 なお、新しいオブジェクトを学習する場合は、メモリが一杯一杯なので、リセットを掛けて(ランタイム/ランタイムを接続解除して削除)、最初から行って下さい。

 今までお洒落な画像が生成できるものの、自分が狙った通りのオブジェクトが生成できないという悩みを、ある程度解決してくれるソリューションになりそうですね。

 では、また。

(オリジナルgithub)https://github.com/ShivamShrirao/diffusers/tree/main/examples/dreambooth

2022.12.1 コスプレをやってみよう

 Dream Booth を色々いじっている内に、コスプレが簡単に出来てしまうことに気づきました。例えば、「新垣結衣」さんでやってみましょう。下記の6枚の画像を、オブジェクト名は「yuiaragaki」、クラス名は「portrait」で学習させます。

 

 画像生成に使う文は以下で、XXXのところに適当な単語を当てはめます。写真画像を生成しようとするとアラが目立ちますので、あえてリアルなイラスト画像が生成される文にしています。

Portrait of yuiaragaki as XXX, detailed portrait, realism, 4 k, art by greg rutkowski, alphonse mucha, artistic, trending on artstation, beautiful mural

 それでは、画像生成の例をみてみましょう。まず、ビキニのガッキーです。XXX = female swimmer, wearing a bikini swimsuit です。

 次に、スーパーマンのガッキーです。XXX = superman です。

 次に、ナースのガッキーです。XXX = nurse です。手に何か持たせたい時は、with ○○○ in hands を加えます。

 今度は、着物を着たガッキーです。XXX = woman in kimono です。

 次に、競泳水着を着たガッキーです。XXX = olympic swimmer in swimsuit です。

 次に、フランス料理シェフのガッキーです。XXX = French chef です。

 今度は、宇宙飛行士のガッキーです。XXX = NASA astronaut です。

 最後に、ポリスのガッキーです。XXX = female police officer です。ピストルを持たせる場合は、with pistol in hands を追加です。

 いかがだったでしょうか。まだイラストの域を完全に脱してはいませんが、デジタルで自由自在にコスプレが出来る時代が直ぐそこです。

2023.1.23 コスプレのクオリティを上げよう

 学習内容を見直すことでコスプレのクオリティアップを図るコツが分かってきましたので、ご紹介します。

1.学習データを増やします。下記の様に、学習データを部位別(顔、上半身、全身)に一定の比率で収集します。ここでは、合計30枚の画像を顔:上半身:全身=18:9:3の比率にしています(ザックリでいいと思います)。

2.画像は内部で正方形として扱われるため、学習データは正方形に揃えておきます。データを正方形に加工するには、この<サイト>が便利です。

3.学習データ増に伴い、max_train_steps を増やします。1枚当たり100ステップが目安でしょうか。学習データが30枚なら30×100=3,000ステップが目安です。

 学習データ30枚だと約1時間弱で学習が完了します。それでは早速、文から画像を生成してみましょう。

 ビキニ姿です(yuiaragaki as female swimmer, wearing a bikini swimsuit, at Waikiki Beach, ray tracing, 8k)

 ナース姿です(yuiaragaki as nurse wearing a nurse’s white coat, a stethoscope around her neck, ray tracing, 8k)

 競泳水着姿です(yuiaragaki as an Olympic swimmer in a swimsuit next to a competitive swimming pool, ray tracing, 8k)

 フレンチシェフです(yuiaragaki wears French maid costume at a cafe, ray tracing, 8k)

 メイド姿です(yuiaragaki wears French maid costume at a cafe, ray tracing, 8k

 警官姿です(yuiaragaki as female police officer, ray tracing, 8k)

8 件のコメント

  • いつもブログ拝見させてもらってます。
    今回のdream boothの記事ありがとうございます。
    一つ質問なんですが、#@title #**make pipe for generating images**のところを実行するとエラーが出てしまいます。
    どうすればいいでしょうか?
    ご回答いただければ幸いです。

    • まささん
      今ブログのリンクから試したところ正常に動作しました。
      昨日、オリジナルgithubのアップデートに伴いコードをアップデートしていますので、それが影響していると思われます。
      再度、ブログのリンクから飛んでお試し下さい。

  • 最近ブログを拝見させていただき、浅識ながらも手を動かして試させていただき、大変参考になっております。
    質問なのですが、私も#@title #**make pipe for generating images**のところを実行すると、”Error no file named model_index.json found in directory”と表記され、エラーになってしまいます。
    上記のご回答にある「ブログのリンク」とはこのページ冒頭に書かれてある「この「リンク」をクリックし表示されたノートブックの先頭にある「Open in Colab」ボタンをクリックすると動かせます。」の部分の認識でよろしいでしょうか?
    そちらから試しているのですがうまくいかずです泣
    ご回答いただければ幸いです。

    • Sioさん
      ご連絡ありがとうございます。2日前に仕様がアップデートされエラーが発生したようです。コードは見直し済です。ブログのリンクから再度お試しください。

  • cedroさん
    StableDiffusion関連のブログをよく拝見させていただき、とても参考にさせていただいてます。
    今回のdream boothの記事もありがとうございます。
    1つエラーが発生し、解決出来なかったためご教示いただければ幸いです。
    pipe().imageのところで、「OutOfMemoryError: CUDA out of memory.」が発生します。
    どうすればいいでしょうか?
    ご回答いただければ幸いです。

    • hiroさん
      情報ありがとうございます。
      エラーは、xformerがpip installになり、それに伴いpipeの設定が変更になったためです。すでに修正済みですので、新たにリンクから実行してみて下さい。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。