生成AIおじさんをおじさん好きが作るとどうなる?(第1回) ありふれたモチーフ「おじさん」を生成するための手法

テクノロジー AI
kogu

ゲームとWebのフリーランス開発者。3DCGからゲーム開発の世界に入り20年。今は生成AIの変化を追いかけて日々実験しています。

特集

写真でも絵画でも3Dでも、人物を表現するモチーフとして圧倒的に人気なのは「若い女性」です。テクノエッジにも西川和久氏の「生成AIグラビアをグラビアカメラマンが作るとどうなる?」という大人気連載があります。やはり人物の見目の良さを象徴するのは女性的な美であり、信仰など特別な要因が無い限り、時代を問わず普遍的な価値なのでしょう。

一方でこの記事が対象とする「おじさん」は、不人気なモチーフの代表です。かっこいいとか強いとか、男性性に付加されやすい魅力を添えればともかく、漠然とありふれたおじさんを表現したいと思う人は少ないようです。

私はゲームとWebのエンジニアで、2022年8月頃立て続けに画像生成AIが公開されてからずっと、ゲーム開発に応用できないか色々試してきました。同時に子育てやもっと個人的なことにも画像の生成を試していて、そのひとつが「ありふれたおじさん」です。

少し前には生成したおじさんの画像を使った実験にたくさんの反響があり、テクノエッジに解説記事も掲載しました。


相変わらずおじさんは生成しつづけており、環境も日々アップデートしています。今回はおじさんを生成しているそうしたツールや生成のコツのようなものをご紹介します。

最新のおじさんたち

まずは生まれたてのおじさんたちをご覧ください。すべて今回生成したもので、後加工の無いものです。

生成の環境

この記事に掲載しているおじさんは、全て手元のWindows PCのローカル環境で生成しました。使用したのは画像生成で最も知られているStable DiffusionのXLというバージョンの派生品で、「SDXL DPO Turbo」というモデルデータです。

これはStable Diffusionの最新版であるXLに、生成を圧倒的に高速化するSDXL Turboという技術と、画質を向上させるDPOという技術の両方を適用したものです。おじさんに特化したものではなく、汎用のいわゆるベースモデルに近い状態です。

ComfyUIのWorkflow

このモデルデータそのものは生成の核となる学習結果のデータですが、処理やUIを持ちません。そのため利用するには他のツールが必要です。以前は用途に合わせて自分のツールを作っていましたが、最近は専ら「ComfyUI」という画像生成用のノードベースのツールを使っています。

これは今回のおじさんたちを生成するのに使った実際のComfyUIのスクリーンショットです。ComfyUIではこのような「Workflow」と呼ばれる構造を使って画像の生成を行います。機能や値を持ったノードと呼ばれる単位と、それを結ぶエッジによって生成に必要な処理を構築できる柔軟性の高さが魅力で、自作のプログラムで行っていた処理に近いことも可能です。一見複雑に見えても触る箇所は限られていて、大半は一度設定すればそのまま使えるため、試行錯誤もしやすいツールです。

このWorkflow、ComfyUIに慣れた方にはかなりシンプルに見えるはずです。実際ほとんど公式のサンプルそのままで、異なるのは「Deep Shrink」というツールを利用している程度。

Deep Shrinkは高解像度の生成を補助するもので、開発したKhoyaさんはLoRAやモデルのコンバータなど画像生成の様々なツールを公開していて、特にLoRA用のツールは世界中で利用されています。Stable Diffusion XLはより高解像度で生成した方が緻密な表現が可能なのですが、学習が縦横1024ピクセルで行われているため、大きく外れた指定を行うと構図などが破綻しやすくなります。これをうまく補正してくれるのがDeep Shrinkで、今回1920x1080のフルHDサイズで生成したおじさんたちもその恩恵を受けています。

プロンプト

シンプルなのは画像を生成する指示となる「プロンプト」も同様です。今の画像生成AIは通常英単語や熟語の羅列で描きたい内容を指示し、これをプロンプトと呼びます。たとえば次の画像は"scene of comedy drama. a 40 years old man. in japan."という短いプロンプトから、先のWorkflowを使って生成したものです。

プロンプトをシンプルにしている理由は、今の画像生成AIに対する理解を広げるためというのもありますが、長いプロンプトが良い結果に繋がらない実用上の問題が大きいです。複雑で長いプロンプトや、表現を上手く導出できない語を指定すると、DPO Turboの場合、指定を無視して真正面を向いた真顔のおじさんになったり、他に引きずられておじさんがロボット化してしまったりします。

Workflowやプロンプトは短くとも、生成の手間はそう変わりません。現在の画像生成AIは万能の道具でもなんでもなく、表現できる対象もその精度や効率もかなり低いです。ノイズをもとにした仕組み上避けられないブレの幅があり、まともな出力を得る背景には大量の生成と取捨選択が必要なのです。

そうした問題がおじさんの場合さらに悪化します。画像生成AIの品質は今の所学習するデータの質と量に強く左右され、相対的に量の少ないおじさんは不利です。そのためこの記事でもテストを含めて1000枚以上生成した中から抜粋しています。

プロンプトの他にもパラメータは色々あり、それらはわずかな変化で結果大きく変動する場合もあります。おじさんを生成するのは、そうした確認と微調整の繰り返し作業です。

ありふれたおじさんが生まれるまで

SDXL DPO TurboとComfyUI、Deep Shrinkを使って、ありふれたおじさんが生成される流れをご紹介します。Workflowは先ほど掲載したものを使い、動かすのはRTX 4060 Ti 16GBのWindowsマシンですが、VRAMさえ十分にあれば他の環境でも全く同じ結果が得られます。生成もフルHDで5秒強と早く、以前SDXLで1分半かかっていたのに比べ圧倒的効率です。

さて、まず「おじさん」の英訳として"middle-aged man"とプロンプトに入力して生成してみましょう。実際には明らかに崩れた出力を除外し、複数回実行した傾向を元に画像を選んだ結果ですが、こんな画像が生成されました。

おじさんはおじさんですが、日本でありふれた容姿とは言えません。国によってはこれで適うのかもしれません。それにやたらと男前。残念ながら日本では日本にありふれた容姿を指定するプロンプトが必要です。では「Japanese」を付け足してみましょう。

確かにおじさんですが、絵画風になってしまいました。プロンプトに表現手法の指定がなかったため、こうした出力になる場合もあります。写真的に表現してもらえるよう"photo of japanese middle-aged man"に変えてみましょう。

良い感じになってきました。しかしまだちょっと顔が長く不自然さが気になります。このままランダムに頼ってもいいですが、効率を上げられるかキーワードを足してみましょう。


「普通の」とか「ありふれた」という意味で"ordinary"を追加し、"photo of ordinary japanese middle-aged man."で生成すると次の出力が得られました。

かなり良いです。たったこれだけでここまで改善できるのは、DPOというより好ましい画像の生成に調整する技術のお陰で、通常のSDXLではもう少し手間がかかります。とはいえまだ気になる所もあります。

まず年齢。おじさんはおじさんでも、この出力はやや年齢が上のおじさんです。もう少し幅広く、40代から60代ぐらいまでを自由に出せるといいでしょう。"middle-aged"の代わりに"40 aged"で試してみます。

若返るどころか悪化したようです。これは"aged"が「老いた」と解釈されてしまったと考えられます。"years old"に変えましょう。

ちょっとシワは強いですが悪くないです。今の40代は若い印象の方も多いので、数字の調整で対応できるのも便利でしょう。このように、一語の表現ひとつで結果が大きく変わるため、シンプルなプロンプトでないと扱いきれなくなっていきます。

次は服を変えてみましょう。ここまで一貫して地味なジャケット系だったので、派手にアロハシャツを着せてみましょう。単に後ろに追加して"photo of ordinary japanese 40 years old man. aloha shirt."とします。

自然にアロハシャツを着てくれました。先程までと構図が変わったのは、アロハシャツをプロンプトに含めたことで、それが写り込む出力が行われやすくなったためです。

ずっと正面からカメラ目線で真顔か微笑んでばかりなので、構図と表情を変えましょう。「斜め上からの撮影」と「悲しい表情」を追加して、"photo of ordinary japanese 40 years old man. aloha shirt. sad expression. shoot from below oblique."としました。

追加した指示が効いていません。モチーフに比べ構図やカメラに関する指示はこうしたことがままあります。これにはプロンプトの中に強弱を付けるプロンプトウェイトという仕組みで対処しましょう。

ComfyUIでは標準でプロンプトウェイトに対応していて丸かっこで囲むか、囲んだ上でコロンで区切って強度を指定するだけで手軽に使えます。構図や感情が反映されるよう"photo of ordinary japanese 40 years old man. aloha shirt. (sad expression). (shoot from side:2)."としました。

悲しげに横を向いてくれました。でももっとありふれたおじさんを目指しましょう。アロハシャツというファッション系の表現を導出しやすいキーワードを含むためか、モデル的な容姿になりやすい感じがします。肌や容姿のおじさん化を狙って「醜い」「太った」「荒れた肌」の3つを弱めに追加しましょう。"photo of ordinary japanese 40 years old man. aloha shirt. (sad expression). (shoot from side:2). (ugly:0.5), (fat:0.5), (rough skin:0.5)."とした結果がこちらです。

肌の質感がまだまだファンデーションで固めたようですがひとまず置いて、次はシーンを変えましょう。劇的に分かりやすいよう、雨の公園はどうでしょう。まずは単純に"photo of ordinary japanese 40 years old man. aloha shirt. rain, park. (sad expression). (shoot from side:2). (ugly:0.5), (fat:0.5), (rough skin:0.5)."としました。

確かに雨の公園風になりました。リアリティのある環境を指定したおかげで、肌の質感も改善されました。でも背景が雨なだけで濡れた様子がありません。もう少し改良して"photo of ordinary japanese 40 years old man. (wet:1.5) (aloha shirt:1.5). (hard rain:1.5). in park. (sad expression). (shoot from side:2). (ugly:0.5), (fat:0.5), (rough skin:0.5)."とします。

いい具合に濡れ、アロハシャツを着て横を向き、滑らかすぎない肌と整いすぎない容姿のおじさんが生成されました。

かなり端折りましたが、このような段階を経ておじさんは生成されていきます。実際にはプロンプトの単語を差し替えたりウェイトのバランスに振り回されたり、パラメータをいじったり、かなり地味な繰り返しが頻繁に発生します。データセットに無いためか全く描けないモチーフもあるし、思うように動いてくれないことだらけです。それでも1年前より圧倒的な高品質で、速く、おじさんが量産できるようになっています。

次回はなぜおじさんを生成するのか、その目的やおじさんを通して見たいものについてご紹介します。

さまざまなおじさん

いろんなスタイルのおじさんをもう少し。

《kogu》

kogu

ゲームとWebのフリーランス開発者。3DCGからゲーム開発の世界に入り20年。今は生成AIの変化を追いかけて日々実験しています。

特集

BECOME A MEMBER

『テクノエッジ アルファ』会員募集中

最新テック・ガジェット情報コミュニティ『テクノエッジ アルファ』を開設しました。会員専用Discrodサーバ参加権やイベント招待、会員限定コンテンツなど特典多数です。