Pixiv Fanbox
プロンプトが理解る!danbooru語からLLM活用まで徹底解説
Published 12/24/2024, 12:46:36 PM · Edited 12/26/2024, 02:17:44 AM

こんにちは、スタジオ真榊です。こちらの記事は、画像生成の基本であるプロンプトの記述方法について、必要な知識を網羅的に解説する特集記事です。プロンプトから画像が生成される仕組みやネガティブプロンプトの使い方といった基礎から、LLMに依頼してプロンプトを作ってもらったり、ランダムにプロンプトを組み合わせたりする応用編まで、分かりやすく詳細に解説しています。
入門記事「AIイラストが理解る!」を読んだら、まずこちらの記事から読んでいただくとスムーズに知識が頭に入ると思います。具体的なタグの一覧については、こちらの「プロンプト超辞典」をご参照ください。
目次
はじめに プロンプトはなぜ「効く」のか
danbooru語とは?
【ちょっと脱線】danbooruは違法サイトか?
プロンプト記法の基本
<①ポジティブプロンプトとネガティブプロンプト>
<②ポジティブプロンプトの記述法>
<③非常によく使うポジティブプロンプト>
<④ネガティブプロンプトの記述法>
<⑤スペルミスするとどうなる?>
<⑥タグ内はスペース?アンダーバー?>
よくあるつまづきポイント
つまづき①「AIが指示を誤解する」
つまづき②「複数人のプロンプトが混ざる」
つまづき③「男女が出ない」
つまづき④「構図指示が効かない」
つまづき⑤「正しいタグが分からない」
タグのオートコンプリート機能
ボタンでプロンプトを入力してみよう
よく分かる「特殊記法」
タグを簡易にランダム化「Dynamic prompt」
タグを本格的にランダム化「Wild card」
よく使うタググループを記録しよう
【コラム】ネガティブプロンプトの仕組み
<潜在空間の地図>
<CFGスケールがやっていること>
Negative Embeddingsとは
「Negpip」を使ってみるじゃんよ
「75トークンの壁」とBREAK構文
困ったらLLMに聞いてみよう
終わりに プロンプト上達への道
はじめに プロンプトはなぜ「効く」のか
画像生成を始めたばかりのときは「このタグはよく効くけど、このタグはなんで効かないんだろう」と感じる場面が多いのではないでしょうか。例えば、「looking at viewer」はだいたい効くのに「looking away」としてもときどきこっちを見てしまうとか、「hatsune miku」は出るのにこのキャラは出ないとか。ユーザーがプロンプト指示を工夫すれば改善できることもありますが、これは基本的に使用しているモデルが学習したデータセット(画像とテキストのペア)の中身が強く影響しています。
例えば学習データの構成上、カメラ目線の女性キャラクターイラストの方が目線を外しているイラストよりも圧倒的に多かった場合、そのモデルは何も指示されなくても女の子をカメラ目線で生成しがちです。
▲視線に関するタグなし
「1girl」とタグ付けされた教師画像の多くに「looking at viewer」というタグがついてくるため、「ははあ、女の子というやつは超こっちを見てくるものなんだな」とAIが思い込んでいるようなイメージです。AIは被写体がどういう存在か、生き物なのかすら理解しておらず、潜在空間という謎空間上のベクトルによって「概念」だけを学習している宇宙人のような存在なのです。
画像生成モデルは画像だけを学習しているのではなく、どんなときでも「画像とその説明文(テキスト)の組み合わせ」によって学習しています。何億枚ものデータセットの中には、例えば腕組みをしている人間の写真やイラストもたくさんあったでしょう。それらに「crossed arms」というタグ付けがしてあれば、そのデータセットで学んだモデルは「crossed arms」という概念を生成できるようになりますし、このタグを使えば1girlや1boyだけでなく、データセットにないクマやアリの腕組み姿も生成できるようになります。
もし、そのタグが「crossed arms」じゃなくて、勝手に「udegumi」とかで学習されていたら困りませんか?「crossing arms」で学習されていた場合も、「あれ?なかなかcrossed armsが効かないな?」となってしまいますよね。つまり、ある概念に何のタグをつけるかは、ユーザー間で広く統一したルールがないと、正しく概念を呼び出すことができず混乱してしまうわけです。
そこで、画像生成プロンプトの「共通語」として非常によく使われているのが「danbooru語」です。
danbooru語とは?
danbooru語(danbooruタグ)は、英語圏のイラスト転載サイト「danbooru」で使われている詳細なイラスト用タグです。Pixivでも各イラストにキャラクター名やシチュエーションなどのタグが10個までつけられますが、danbooruではそれよりも遥かに細かなタグ付けが有志のコミュニティによってなされています。
danbooruにはPixivやXに日々投稿されている大量のイラストが転載され、作者情報を含めた詳細なタグと転載元へのリンクが付けられてデータベースとして管理されています。どんな概念に何のタグを使うかもコミュニティのルールで厳格に決められているため、画像とテキストの正確なペアを必要とする画像生成データセットの供給源としてうってつけだったわけです。
その結果、NovelAIや、現在流通しているローカル生成用のモデルの大半が、このdanbooruタグの羅列によってコントロールできるようになっています。普通の書き下し英語や日本語でコントロールできる「自然言語プロンプト」が使えるモデルも流通してきてはいますが、画像生成の基本はdanbooru語と言っても過言ではないでしょう。danbooru語には「特殊記法」が使えるという自然言語にない利点もあるのですが、それについては後述します。
<danbooru語の他に"e621語"も>
ちなみに、さまざまなHシチュエーションの再現が得意なpony diffusion系モデルは、ケモノ作品に特化した海外の画像投稿サイト「e621」のタグ形式(いわばe621語)で行われています。基本的にはdanbooru語で通じるのですが、たまに思ったような効果が出ないタグがあります。詳しくは個別の入門記事を参照ください。
<【ちょっと脱線】danbooruは違法サイトか?>
danbooruは海外ユーザーが日本のイラストを見つけ、イラストレーターとつながる導線になっているそうですが、日本のユーザーから見れば普通に無断転載の著作権侵害サイトです。無断転載を禁じているPixivの規約違反でもあり、多くの当事者から批判が寄せられています。
一方で、掲載されているのはウェブ上に無償公開されたイラストのみで、引用元のURLも具備しているため、こうしたデータベース化は現地の法律における「フェアユース」に当たるーというのがdanbooru側の主張のようです。
フェアユースというのは、一定の条件を満たした公正な使い方であれば、著作権者から許可を得なくても著作物を利用できるルールのこと。例えば、Xには投稿にgifスタンプを張り付けられる機能がありますが、中には著作物であるアニメや映画のワンシーンも大量に含まれています。あれも米国ではフェアユースとされています。(▼Xよりスクリーンショット引用)
日本の著作権法や法感覚は外国に通用しないことが多く、実務的にも追及のしようがないことが多くある点は覚えておきましょう。また、海外ユーザーがフェアユースを根拠にバンバン著作権侵害しているからといって、自分も同じようにしていると、日本では普通に提訴・刑事告訴されるということもありますので、重々注意しておくことが必要です。日本人が日本で日本の著作物の権利を侵害するのと、外国人が自国で現地法に従って日本の著作物を無断転載するのでは、法的扱いもリスクも違うというところは押さえておきたいところです。
プロンプト記法の基本
プロンプトの基本が「danbooru」というサイトで使われているタグであるということが分かったところで、その具体的記述法について見ていきましょう。
<①ポジティブプロンプトとネガティブプロンプト>
プロンプトには「ポジティブプロンプト(PP)」と「ネガティブプロンプト(NP)」があり、基本的にはPPに入力したものが生成されます。逆に、NPに入れたテキストはできるだけ生成結果に反映されないような力が働きます。この二つの組み合わせによって生成画像をコントロールするのがプロンプトの基本です。
▲プロンプト(PP)と除外したい要素(NP)欄の例
上図のように、「1girl」や「looking at viewer」といったdanbooruタグをカンマ「,」で区切って、どんどん箇条書きで並べていけばOK。その際の語順が重要で、基本的には前に書いたものほど強くモデルに干渉します。そのモデルを学習させた方法によっても適切な語順は変わってくるので、モデル配布者の説明をよく読んでおきましょう。
ちなみに、Niji journeyのように自然言語で学習しているモデルであれば、danbooru語だけでなく、下図のように長い一連の文章でもちゃんと認識してくれます。mid journeyやniji journeyなどはこのタイプで、日本語で入力しても内部的に自動翻訳されて通じる場合が多いです。
<②ポジティブプロンプトの記述法>
ポジティブプロンプトの基本は「大事なものは前に、抜け落ちてもよいものは後ろに」書くことです。そのモデルを学習させた方法によっても適切な語順は変わってくるので、モデル配布者の説明をよく読んでおきましょう。
例えば、人気モデル「AnimagineXL3.1」のCivitai配布サイトでは、最初に1girl/1boyを入れ、「キャラ名、作品名、その他」の順でタグを並べるよう推奨されています。
このように、モデルによって適切な語順は多少変わりますが、以下のような順で書いていれば大きな間違いはありません。それぞれの具体的タグはプロンプト超辞典を参考に。
・1girl/1boy:まずはこれから。複数人の描写をするなら2boysや4girlsと書くが、いまだに安定しない。
・キャラ名/作品名:既存キャラを呼び出す場合はここに入れる。スペルの基本はdanbooru語。キャラ名だけだと髪型や服装などの容姿が、作品名も入れると画風やシチュエーションまで公式に似ることが多いので、出したい画像によって調整しよう。
・メイン要素:どんな構図・フォーカス・カメラワークか、被写体はどんな容姿・服装・表情で、どこで何をしているか、背景は何か等。抜け落ちてはまずいものほど前に入れる。
・画風要素:上記のメイン要素を、どんな画風で描いてほしいかを指定する。anime colored、flat color、monochromeなど。
・サブ要素:メイン要素を補強したり、装飾したりするもの。例えば、キスシーンなら「eye contact」「hug」「arms around neck」などを入れて細かな描写を盛り付けていく。抜け落ちても成立するものがこの位置。
・クォリティタグ:イラストの品質に関するもの(例:masterpiece)。モデル配布者が推奨している文字列を使うのが基本だが、ユーザー全員似た画風(マスピ顔)になってしまうことがあるため、自分で探求するのも大切。 最初に配置するよう求めるモデルもある。
<③非常によく使うポジティブプロンプト>
こちらは非常によく使う基本タグ群です。これらはすぐに思い出せるようにしておきましょう。
構図:upper body/cowboy shot/full body/portrait/close-up
カメラ:straight-on/from side/from above/from below/foreshortening
視線:looking at viewer/looking away/looking up/looking down/looking to the side/looking at another/looking forward
背景:outdoor/indoor/white background+simple background
画風:monochrome/greyscale/anime colored/flat color/realistic
ポーズ:standing/sitting/lying/holding〇〇/hand on ○○
表情:open eyes/closed eyes/open mouth/closed mouth/smile/sad/angry/embarrassed...
<④ネガティブプロンプトの記述法>
プロンプト欄のすぐ下にあるネガティブプロンプト欄には、生成されてほしくない要素を入力します。クォリティタグと同じように、品質アップのために「low quality,worst quality」などと入れるのがまずは定番。モデル配布者がオススメのクォリティタグ・ネガティブプロンプトを書いていることが多いので、必ず確認しましょう。
▲AnimagineXL3.1の推奨ネガティブタグとクォリティタグ
また、各タグに余計な要素がくっついて学習されている場合に、それをそぎ落とすのにも使います。例えば、スーツ(suit)というタグにはシャツやネクタイが強く印象付けられているので、それらがセットで出てくることが多いですが、ネクタイなしのスーツにする必要がある場合、necktieをNPに入れると出しやすくなります。
また、髪の毛をもう少し短くしてほしいときにlong hairをNPに入れるような調整用の使い方もできます。カラフルなイラストにしたいときに「monochrome」をNPに入れたり、目を綺麗に描写してほしいときに、ぐるぐる目「@_@」をNPに入れるようなイメージです。低劣なものが出るときは、AIがそうしてほしいと誤認していると考え、必然的に高品質なものが出るようなプロンプトに調整してあげましょう。
<⑤スペルミスするとどうなる?>
ちなみに、プロンプトは常に完璧なdanbooru語でないと全く通じないわけではなく、DeepL翻訳でざっくり英文化して放り込んでも結構理解してくれます。ミスで二重カンマ(,,)にしてしまうこともよくありますが、そこまで重大な結果にはなりません。
よくないのは、タグ間に「,」や半角スペースを入れ忘れてしまった場合。生成結果を見て、「何かおかしいな」と思ったら、UI右側の生成結果から該当部分のタグを確認するようにしましょう。
▲「こちらに手を振る」が効いていないケース。間の半角スペースが抜けていた
スペルが間違っていても意外と通じますが、「やんわり効く」ような現象が起こります。下の図は「初音ミケ(1girl,hatsune mike)」さん。
ピンク髪や金の目になったのは、「mike」に近い名前のピンク髪のキャラクターを学習している影響と思われます。(アイドルマスターの城ヶ崎美嘉など?)
この現象を利用して、作品名をわざとスペルミスすることで、キャラ容姿は再現しつつ、画風が公式に酷似しすぎないよう調整するテクニックもあります。
注意したいのは、モデルが学習していない要素は生成できないということ。たとえば「初音ミク」は教師データに豊富に含まれているので生成できますが、モデルが学習していない最新アニメのキャラクターは再現することができません。どうしても生成したい場合は最新のデータセットで学習したモデルを探すか、LoRAなどの「追加学習」をする必要があります(こちらの記事参照)
<⑥タグ内は半角スペース?アンダーバー?>
タグ内の半角スペースは、半角アンダーバーで記述しても効果はさほど変わりません(例 black hairをblack_hairとしても問題ない)。ただ、モデルによっては反応が悪くなったり、効かなくなったりすることもあるようなので、なぜか特定のプロンプトの効きが悪いときは半角スペースを使用したほうが無難かもしれません。
ちなみに、danbooruタグの中には「close-up」など、半角ハイフンで間をつなぐものもあります。こちらも、アンダーバーやスペースにしてもたいてい同じような効果が出ますが、うまく働かないモデルがあった場合はハイフンで運用することをオススメします。
よくあるつまづきポイント
PPとNPの組み合わせでプロンプトができていることがわかりましたが、実際にやってみると思ったようにいかないことも多いでしょう。この項目では、初心者がつまづきがちなポイントを5つ紹介します。
<つまづき①「AIが指示を誤解する」>
プロンプトの書き方によっては、AIが「誤解」してしまうことがあります。
こちらの画像では「white hair ribbon」というタグが「white hair + ribbon」と誤解されたために、髪が一部白髪化したり、胸のタイが蝶結びの白リボンに化けたりしています。学習データセットにタグ付けをした際、胸の白リボンも髪の白リボンも同じく「white ribbon」としていたために、このような現象が起こります。
特にプロンプト忠実度を示す「CFGスケール」の値が高めだと、プロンプトの抜けが減る代わりに、このような誤解が起こりやすくなります。
そういうときは、誤解されがちな「〇〇 hair ribbon」というタグを避け、「red neckerchief」「blue sailor collar」「white bow」というタグで生成すれば、このようにそれぞれを正しい色・形状にすることができます。CFGスケールを少し下げてみるのも有効です。
<つまづき②「複数人のプロンプトが混ざる」>
複数キャラクターを出したときに、服装や表情のプロンプト指示が両方に効いてしまって困ることがあります。たとえばこちらの2人を並べて生成しようとしても…
髪型や服装のタグをただ並べると、このようにまぜこぜの状態になってしまいます。
これは画像生成の大きな課題の一つで、これまでさまざまな手法で解決が試みられてきました。記事執筆時点で優れているのは、NovelAIv4の「マルチキャラクタープロンプト」や「アクションタグ」機能。キャラクターごとに特徴を描き分けられる(適用するタグを分割する)だけでなく、位置関係や行動の主体と客体まで指定できるようになっています。
StableDiffusionでこれに近いことが行える方法としては、「Latent Couple」や「Forge couple」、「regional prompter」といった拡張機能があります。キャンバスを区切って、「このプロンプトはここだけに効かせる」と指示できる機能です。
または、さきほどの2人の容姿をそれぞれLoRAとして学習してしまうという手法もあります。キャラクター名をタグ化して「zaraki_mina」や「shinomiya_ayaka」だけでこの容姿が出せるようになれば、「grey sweater」や「serafuku」といった容姿タグが混じらずに済みます。
▲こういうデータセットを用意して、キャラクターとして学習する手法もアリ
ただ、正直最も簡単なのは、このように画像編集ソフト上で別々に生成した画像を合成してしまうことです。白背景で1人ずつ生成すれば容姿は混ざりませんから、抱き合ったり手をつないだりと身体的な絡みがなければこちらの方が簡単だったりします。
背景をあとから合成することもできますし、Controlnetやインペイントといった機能で背景部分だけをAIで生成することもできます。その代わり、自然に整えるのにはそこそこの画像編集技術や加筆力が必要にはなります。
<つまづき③「男女が出ない」>
そんなわけで複数人の生成は難しいのですが、男女は特にうまく出ませんよね。「1girl,1boy」と指示して生成しても、このように男の子だけ見切れてしまうことがよくあります。
これはデータセットの偏りが原因。これまで公開されてきた日本のアニメ調イラストは、女の子が主体に描かれたものが多く、男性が映り込む場合も見切れていることが多かった(特にHイラストの"竿役"などが典型的)ために、そうした傾向が学習されてしまっているのです。ともかく「1girl」がプロンプト内に入っていたら、1girlを主体に描こう!という強い力が働きます。
ある意味市場の需要と噛み合った動作をしているわけですが、改善する方法としては、「focus」系や関係性のタグを使うこと。「couple focus」をPPに、「solo」「solo focus」をNPに入れたり、「hetero(男女)」「husband and wife」などと指示することで、男女均等に描かれていることを強調できます。男性を主体に描きたい場合は「male focus」を入れるとよいです。
顔が詳細に描かれない男性を示すタグは「faceless male」、顔が見切れている状況を示すタグは「head out of frame」です。これをNPに入れることでも、顔を描いてくれやすくなります。
PP:1girl,1boy,cowboy shot,couple
NP:faceless male,head out of frame, solo,solo focus
<つまづき④「構図指示が効かない」>
最近のモデルではあまりなくなりましたが、キャラの全身像を出したくて「full body」と指示しているのに、うまく全身が描かれないことがあります。こちらの例では、左上の画像が足など見切れてしまっていますね。
そのモデルが学習した画像データセットを想像してみると、おそらく完全につま先まで描いた絵だけに「full body」とタグ付けしたのではなく、多少見切れている画像でもだいたい全身が収まっていれば「full body」タグがついていたはず。そのため、「full body」という概念は「多少見切れていてもよいもの」と理解されているわけです。
そういうときは、考えを逆転させてみましょう。描いてほしいのは、全身(full body)だったのでしょうか。本当は「つま先まで詳細に」描いてほしかったのではないでしょうか。それならば、「black shoes」というタグを追加してしまえばよいのです。「no shoes」でもOK。
このように、ちゃんと靴まではっきりと描かれる構図になりました。
他にも、背景があまり描き込まれないようなら「detailed background(詳細な背景)」と強調するだけでなく、「beautiful blue sky」「detailed cloud」「summer」「road」「sun flower」などと、思い浮かんだイメージを基に、具体的なワードをどんどん並べてみるのがよいでしょう。「指示された被写体を忠実に描いたら、結果的に望んだ構図にならざるを得ない」ような指示が理想です。
upper bodyと指示しておいて、pantyhose(ストッキング)とも指示することで、カメラワークは主に上半身を捉えているけれど、パースを効かせて一部ストッキングも映り込む…というような応用もできます。
<つまづき⑤「正しいタグが分からない」>
プロンプトに慣れないうちはもちろん、ある程度慣れてきても「あの概念、なんてタグを使えばいいんだ?」と悩んでしまうことはよくあります。例えば両手でハートマークを作るポーズは、何と指示したら良いでしょうか。「make heart with fingers」?「heart shape hands」?
困ったときは、該当するdanbooru語を探してみましょう。
こちらのリンク先から、danbooruタグを一括検索することができます。
さきほどの「手でハートマーク」を調べたいので、heartと打ち込んでみると、「ハートの形の瞳孔」や「ハート型の髪飾り」などに混じって「heart hands」があることがわかります。
横に「21k」とあるのは、danbooruに登録されている画像のうち約21000枚もの画像にこのタグが付けられているということですので、相当メジャーなタグと言えるでしょう。学習モデルによってどんな画像を教師データにしているか、ペアになっているテキストデータがどんな表記かは異なるものの、多くの画像につけられているようなメジャーなタグほど、AIは再現しやすくなります。逆に、滅多に使われないようなマニアックなタグを入れても、期待通りの画像はなかなか生成できないはずです。
<📦ボタンも活用しよう>
また、img2img画面にある段ボールのボタン(📦:DeepBooru解析)を使うことで、ある画像から予測されるdanbooruタグを検出することができます。やり方は簡単で、タグ検出したい画像をimg2img画面で読み込んで「📦」ボタンをクリックするだけ。少し待つと、ポジティブプロンプト欄に予測されるタグが自動で表示されます。
さきほどの画像をimg2img画面に入れて「📦」を押すと、しばらくしてこのように大量のタグが列挙されました。
ただ、よく見てみると肝心の「heart hands」が抜けてしまっています。📦ボタンからのタグ解析は手軽な割に、抽出の正確性は少しテキトーなことがあります。
1girl, :d, bangs, black hair, black sailor collar, black skirt, blue eyes, blush, bow, eyebrows visible through hair, glasses, hair bow, looking at viewer, medium hair, neckerchief, open mouth, pleated skirt, ponytail, red-framed eyewear, red neckerchief, red neckwear, sailor collar, school uniform, semi-rimless eyewear, serafuku, shirt, short sleeves, simple background, skirt, smile, solo, under-rim eyewear, upper body, white background, white pupils, white shirt
より正確性の高いタグ抽出をしたい場合は、拡張機能「WD1.4 Tagger」を使って、高性能なタガーにかけます。詳しくはLoRAの解説記事に導入法が書いていますので、そちらをご参照ください。
<Hシチュエーションが再現できない!>
「danbooruの該当タグをちゃんと使っているのに、このHシチュエーションが出ない」という質問もよく頂きます。プレイやシチュエーションを示すタグは画像の見た目が千差万別になりやすいため、色や構図のタグと比べて学習結果が収束しにくいようです。そういう場合は、そもそもH系に強いモデル(pony系など)を見つけるか、そのシチュエーションを学習したLoRAを探すか、またはLoRAを自分で作るかということになります。
しかし、どうしてもプロンプトの工夫だけで何とかしたい場合、一つのタグだけで再現しようとするのではなく、そのプレイやシチュエーションを構成するサブタグをタガーで抽出したり、danbooruで探したりするのが有効です。
例えば、催眠シチュエーションに該当するのは「mind control」や「hypnosis」ですが、催眠系のイラストによくつくdanbooruタグを考えてみると、「expressionless」や「empty eyes」、「glowing eyes」「ringed eyes」「spoken question mark」といったものが見つかります。「催眠シチュエーションなら描かれるであろう要素」を細かくタグとして盛っていくことで、それらが互いにシチュエーションタグを補強し合って、想定したものに近いイラストを出しやすくなります。
PP:1girl,mind control,hypnosis,expressionless,glowing eyes,constricted pupils,spoken question mark,solo focus,empty eyes,upper body,open mouth, ai-generated,speech bubble,dark room,pink theme,head tilt
タグのオートコンプリート機能
danbooruタグの検索も有効ですが、もっと便利なのがプロンプト欄上でdanbooruタグを自動推測して補ってくれる拡張機能「a1111-sd-webui-tagcomplete」。これは初心者も熟練者も入れておきたい便利機能です。
【インストール方法】
・拡張機能(Extensions)タブを開く
①「URLからインストール」タブで「https://github.com/DominikDoom/a1111-sd-webui-tagcomplete」を入力してインストールボタンを押す。
②もしくは、拡張機能リスト(Available)タブを開く→"Load from:" をクリック→リストの中から「Booru tag autocompletion」を探して、右端のインストールをクリック
・「インストール済」タグからWebUIをリロード(Apply and quit)すれば有効化します
インストールに成功していれば、プロンプトを打ち込むとこのように関連するタグの候補が自動表示されます。しかもdanbooru上でタグ登録数の多いメジャータグ順になっているので、非常に便利です。
上下キーで選んでENTERキーを押すか、クリックすることでプロンプト欄に反映されます。うろ覚えのタグがあった場合はとにかくそれらしい単語を打ち込んでみましょう。
ちなみに、ショートカットキーを使うことでLoRAの呼び出しやwildcardの呼び出しも一瞬でできるようになります。詳しくは、こちらの小ワザ記事(⑥意外と知らないショートカットキー)を参照ください。
ボタンでプロンプトを入力してみよう
「Easy Prompt Selector」は、生成画面にプロンプト入力用のボタンを表示してくれる便利な拡張機能。いちいち呪文を手で打ち込まなくても、マウスでボタンをぽちぽち押していくだけでプロンプトが簡単に作れてしまいます。
ボタンの選択肢は自分でカスタムすることができ、オレンジ色のボタンを押すことで、そのカテゴリ内のタグをランダムで選択してくれる機能も。生成のたびにいちいちタグを打ち込むのが面倒な方は、この拡張を使って自分用のボタンを整備してしまうのがオススメです。
よく分かる「特殊記法」
さて、プロンプトの基本と便利な拡張機能について抑えられたので、次にStableDiffusionモデルにおける「特殊なプロンプト記法」について解説していきます。冒頭で「danbooru語には、自然言語プロンプトにはない強みがある」と紹介したのは、この特殊記法ができる点です。
①タグの影響度を強調してみよう
特殊記法のうち、誰もが最初に触れるのがプロンプトの「影響度」を強めるもの。Stable diffusionの各webUIでは、次のようなルールでプロンプトをくくることで、そのタグを強調することができます。
・(word) 半角丸カッコでくくると、単語の影響度が1.1倍になる
・((word)) 二重にすると、単語の影響が1.21倍になる(1.1の2乗)
・[word] こちらのカッコでくくると、単語の影響度が0.91倍に(1.1分の1)
・[[word]] 単語の影響度を0.83倍にする(1.1分の1の2乗)
※3つ以上重ねても同じ倍率で強弱が付きます
・(word:1.5) 単語の影響度を数値で指定する。この場合は1.5倍に強まる
・(word:0.25) 単語の影響度を数値で指定する。この場合は4分の1に弱まる
下の図は、「angry」というタグを上のルールによって強めたり、弱めたりしたものです。「angry」が0.8あたりから怒りの感情が見え始め、1より強まるごとに表情が強くなっています。
怒りの感情がグラデーションであることをモデルがきちんと学習しており、強まるごとにどんな風に変化するかも覚えていることが分かります。赤い十字の怒りマークが出てくることも学んでいますね。しかし、その法則に従ってどんどん怒り表現を強めていくと、人間の常識からは外れてしまいます(強度5)。
プロンプトは一定の限度を超えて強調すると表現や画面全体を破壊してしまうことがあるので、せいぜい1.5くらいまでを目安にしましょう。こちらはSD1.5系モデルで「smile」を強調した例。3あたりから完全に崩壊してしまっています。
そのタグの学習度合いによって、このように画面全体に悪影響を及ぼすことも多いので、なぜか画面全体が低劣になってしまったときは強調しすぎを疑うようにしましょう。
強調したいタグをドラッグで選択し、Ctrlキーと上/下キーを押すことで強調度を変更することもできます。いちいち数字をぽちぽち打ち込むのは面倒なので、このやり方を早めに身に着けておくとプロンプト表記が早くなります。
<NovelAIでは別ルール>
ちなみに、NovelAIでは()の代わりに{}を使い、(smile:1.2)式の数値指定もできないのでご注意ください。詳しくは個別記事を参照のこと。
<そのほかの特殊記法>
このほかにも「オルタネイトプロンプト」や「プロンプトエディティング」といった特殊記法はいろいろとあります。[A word:B word:X.X]とすることで、生成ステップの途中でプロンプトを切り替えたり、1ステップごとにプロンプトを交互に切り替えたりすることが可能です。当初は犬として生成したものを途中からカエルに変えたりできるわけですが、正直滅多に使わないので、ここでは存在だけ覚えておけばOKかと思います。(こちらのアーカイブ記事で紹介しています)
タグを簡易にランダム化「Dynamic prompt」
拡張機能「Dynamic prompt」をインストールすることで使えるようになる特殊記法もあります。非常に使い勝手が良いので、入れておくことを強くオススメします。
これは、プロンプト内で{Aword|Bword|Cword}のように記述すると、{}内で区切られたプロンプトが生成のたびにランダムで一つ選択されるというものです。詳しくはこちらの記事で紹介しています。(R-15程度のnsfw表現があります。注意)
<何のためにランダム化するのか?>
この機能を使いこなすと、例えばキャラクターだけを固定しておいて、シチュエーションやポーズだけをいくつかのパターンに変えたり(下図)、逆にシチュエーションだけを固定しておいて、服装を「メイド・バニー・スクール水着・ビキニ」からランダムに選ぶとか、好きなキャラクター数人の中からランダムに選ぶようなことが可能になります。
▲ちびキャラの召還プロンプトだけは固定しておき、ポーズに関するタグをランダム化した例。思わぬかわいいポーズに出会って、イメージが膨らむことがよくあります。
また、「このタグは、"あるバージョン"と"ないバージョン"のどちらも作ってほしい」ときって結構ありますよね。例えば眼鏡のある/なし、笑顔のある/なしといったオンオフについても、「|」で区切った片方を空欄にして{eyewear|}や{smile|}とすることでランダム化が可能。2分の1の確率で、ON/OFF両方のバージョンが生成されます。{smile||}とすれば、3分の1の確率で笑顔になる、という応用もできます。
LINEスタンプのようなものを作りたいときや、オリジナルキャラクターのデザインをいろいろ迷っているとき、シチュエーションは決まっているけどカメラワークをいろいろ試したいとき、そのキャラの色んな種類のHシーンが見たいときなど、さまざまな場面でランダム化は非常に役立ちますので、早めに習得しておきましょう。
タグを本格的にランダム化「Wild card」
「wild card」は、タグのランダム化をもっと本格的に行うことができる拡張機能です。「wildcard」という拡張機能も個別にありますが、さきほど紹介したDynamic promptの拡張機能を入れておけば、それだけで使えるようになっています。詳しくはこちらの記事で詳しく紹介しています。
例えば、表情に関するプロンプトは非常に多岐にわたるわけですが、それをすべて1行ごとに書き出したテキスト(wildcard)をemotion.txtと命名して該当フォルダに入れておくと、「__emotion__」というタグを入れるだけで一つランダムに選択してくれる機能です。Dynamic promptの場合は一つ一つプロンプト内に手打ちする必要がありましたが、これを使うことでいつでも表情やポーズ、背景などを一発でランダム化できます。
Tag Autocomplete機能と組み合わせると、このように「__」と打ち込んだだけで候補が出てくるので、非常に便利です。
ジャンル別のwildcardは「プロンプト超辞典」で配布しているので、良かったらご活用ください。
よく使うタググループを記録しよう
生成ボタンの下にある空欄から、よく使うプロンプトを保存していつでも呼び出すことができます。例えば、白背景にしたいときに「white background,simple background」といちいち手で打ち込むのは面倒ですから、ここに「白背景」という名前で保存しておけば、いつでも2クリックで呼び出すことができます。
やり方は簡単。赤枠で囲った鉛筆ボタンをクリックすると、このような画面が開きます。
あとはこのように、「スタイル」に分かりやすいタイトルを付け、そのタイトルをクリックしたら自動で呼び出したいPPとNPをこのように記入します。PP+NPを作った場合は、「PPのみ」「NPのみ」のバージョンも一緒に登録しておくと便利です。
できたら「保存」を押せばOK。よく使うモデルの定番クォリティタグ、ネガティブタグ、白背景、よく生成するキャラの容姿、よく使うLoRAの組み合わせなどを登録しておくと、作業が各段にラクになります。
「保存」したタグ群は、このような感じでプルダウンメニューからいつでも呼び出せます。プロンプト欄には何も表示されませんが、内部的にプロンプトが記入された状態になっています(プロンプト欄に0/75ではなく17/75と表示されているのが見えます)
赤で囲ったメモ帳ボタンを押すと、今選んでいるタググループをプロンプト欄の末尾に書き込むこともできます。タグ順序を整理したり、一部のタグを足し引きしたいときなどに使いましょう。
【コラム】ネガティブプロンプトの仕組み
さて、プロンプトと同等、もしかするとそれ以上に重要なのがネガティブプロンプトです。ざっくり「描いて欲しくないものを注文する欄」と理解されることが多いのですが、実際の仕組みはもうちょっと複雑です。(この項目は小難しいので読み飛ばしてOKですが、ここを理解しておくとプロンプト指示が上手にできるようになります)
<潜在空間の地図>
「AIイラストが理解る!」で少し触れた通り、拡散モデルの画像生成AIはノイズ除去の繰り返しによって、人間には見えない超空間(潜在空間)で絵を描きます。人間が「こういう絵を描いて」とAIに手渡すプロンプトには、タグごとにそれぞれ異なる「ベクトル」の概念があり、AIはこれを参考に正解の絵を導き出します。
AIは学習に基づいて形作られた広大な「テキストの地図」の上で、人間の指示(プロンプト)のベクトルを頼りに目的地(人間がイメージしている正解の絵)へと向かっていくようなイメージです。一緒に描かれることが多い概念は、地図上の近いところにいることを想像してみてください。「suit」のそばには「necktie」や「shirt」があるため、suitと指示しただけでネクタイやシャツも一緒に描かれることが多いわけです。
<CFGスケールがやっていること>
このとき実は、AIは「①ポジティブプロンプトで生成した画像と、②プロンプトなし(空白)で生成した画像の差異を計算して、CFGスケールの値に従ってその違いを倍増させる」という工程を行っています。CFGスケールが増えるとプロンプトに忠実になるのは、こういう仕組みだからですね。
一方ネガティブプロンプトは、空白プロンプトで生成するのではなく、ユーザーの指定した文字列で生成した画像との差異を計算するものです。例えば「low quality,worst quality」で生成した低劣な画像と、ポジティブプロンプトで生成した目的の画像のベクトルの差を計算して、その差をCFGスケールに従って増幅する・・・ということが行われます。
このような仕組みによって、広大なテキストの地図の中で低劣な画像(と誰かがみなしたもの)が位置するエリアをネガティブ指定すると、結果的にイラストの品質がアップするという現象が起きるわけです。単に低劣な概念を除去するだけなら、ネガティブプロンプトを入れなかったのと同じような画像が出るはずですが、逆向きの力が掛かっている(低劣化をなくすだけではなく、高品質化を連れてくる)のはこういう仕組みなのですね。
タグの効果は学習モデル(checkpoint)によって異なりますが、例えばlow qualityやworst quality(低クオリティ)、lowres(低解像度)、blurry,bokeh(ぼけた画像)といったものを入れることで、クォリティが高くはっきりした画像が生成されるようになります。こうした仕組みを理解しておくと、モデルの学習傾向によって出にくい画像があったとき、「逆向きの力」を意識的に掛けることで望ましい結果を導くことができるようになります。
例えば、「1girl and 1boy」を生成したいのに1boyが弱すぎてうまく生成されない場合、「1girl,solo」をネガティブ指定してやれば、男女が均等に描かれやすくなるということです。見た目上ポジティブにもネガティブにも1girlが存在して変に思うかもしれませんが、こうした考え方をすることでよりAIとのコミュニケーションがスムーズになるはず。AIは「現実世界エアプの宇宙人」なので、分かるように説明してあげましょう。
Negative Embeddingsとは
手足や指が崩壊していたり、低劣だったりする画像ばかりを学習させた軽量なファイルをネガティブプロンプトに「埋め込む(embedding)」ことで、一つのタグでイラストを高品質化させる「Negative Embeddings」という試みがあります。(LoRAよりも手軽なため、SD1.5時代に一時期爆発的に広まりましたが、ネガティブプロンプトがシンプルになった今はそこまで主流ではないかもしれません)
Civitaiではモデルタイプ「embedding」で検索すると、このようなファイルが並びます。LoRAと同様、SDXL用やSD1.5用など、ベースモデルごとに異なるEmbeddingが流通しています。
たとえばこちらは、指が誤って生成されるのを防ぐためのSDXL用Negative Embedding。効果としては、「three fingers, four fingers, six fingers, seven fingers, extra fingers, missing fingers, fused fingers, deformed fingers, ugly fingers,deformed hands, bad hands, worst time, worst hands, wrong hands, twisted hands, ugly hands,deformed toes, fused toes, missing toes, wrong feet, deformed feet, ugly feet」といったネガティブタグを1ワードで呼び出せるというものです。
各webUIのフォルダ直下にある「embeddings」フォルダにファイルを放り込み、ネガティブプロンプトに拡張子を除いたファイル名を書き込むだけで動作します。例えば、「NEGATIVE_HANDS.safetensors」をフォルダに入れたなら、ネガティブ欄に「NEGATIVE_HANDS」と入れるだけでOK。
フォルダに入れたEmbedddingsは、こちらの「Textual Inversion」タブから呼び出すことができ、カードをクリックすると呼出し語がネガティブプロンプト欄に自動記入されます。
たとえばこちらは、左が「unarstheticXL」という品質向上用のNegative Embeddingを適用したもの、右が適用していないものです。指の本数などがわずかに品質向上しているように見えますが、追加学習結果を適用するLoRAとは違って、そこまで劇的な効果はありません。
ただ、毎回同じベクトルを強調するわけですから、場合によっては顔立ちやタッチが似てしまうことがあります。かつて人気だった「easy negative」というembeddingを常用していると、「easy negative顔」のような顔立ちになることもありました。
現在はモデル自体の性能がかなり向上しているため、ネガティブプロンプトをたくさん詰め込まないほうがむしろきれいな画像が生成できることも多いです。闇雲にEmbeddingを詰め込むのではなく、XYZ plotなどで比較実験を行い、確かに効果があると確信できたときに使うようにしましょう。
「Negpip」を使ってみるじゃんよ
さきほど「潜在空間の地図」の話が出ましたが、プロンプトには強いものと弱いものがあり、強いものの周りにはたくさんの似通ったプロンプトが点在しています。例えば、「princess」というプロンプトだけで生成すると、指定していないのに「tiara」や「long hair」「blonde hair」の要素がついてきます。
タガーに掛けてみると、このようなタグが検出されました。ふくらんだ袖や金髪碧眼、ジュエリーやドレス、イヤリングをはめているのが「princess」とこのモデルは学習していることが伺えます。米国でめちゃくちゃ怒られそうですね。
金髪碧眼プリンセスのようなステレオタイプな生成物を求めているときはよいのですが、黒人和装プリンセスのような多様性のある存在を生成したいとき、潜在空間の地図が邪魔をします。そういうときのための拡張機能がNeg pipです。
「negpip」は、負の効果を持つポジティブプロンプトと、正の効果を持つネガティブプロンプトを使えるようにしてくれる拡張機能。「URLからインストール」画面の「拡張機能のリポジトリのURL」にhttps://github.com/hako-mikan/sd-webui-negpip/と入力してインストールすればOKです。
インストールに成功していれば、Controlnetなどと同じ場所にこのようなシンプルなタブが形成され、「active」にすれば効果が発揮されます。
使い方は簡単。プロンプト欄で(looking at viewer:-1.5)などとマイナスの強度で指示すると、その要素を強力に弱めることができます。逆に、ネガティブプロンプト欄で(looking at viewer:-1.5)と入れると、「マイナスのマイナスは正」ということで、強力にこちらを見る働きが加わります。詳しいことは公式に秀逸なReadmeがあるので、ぜひ見てほしいじゃんよ。
https://github.com/hako-mikan/sd-webui-negpip/blob/main/README_jp.md
左の画像は同シードで「1girl and 1boy」を4枚生成した例。男の子がいるにはいるのですが、ほぼ見切れてしまっています。右はnegpipをオンにして、ポジティブに(solo:-1),(1girl:-1)を加えたもの。さきほどのベクトルの考え方を応用して、女の子が1人で描かれている画像のベクトルから離れるように工夫したところ、男の子がより主体的に描かれるようになりました。
他にも、さまざまな実験を行ってみました。
▼「smile」を弱めた例
▼「large breasts」が連れてくる「cleavage(胸の谷間)」を弱めた例
▼「looking at viewer」を弱めた例
余計な要素を一緒に学習してしまっているLoRAを使うときや、なかなか効果が出ない弱いタグをしっかり強調したりする場面で有用だと感じています。また、要素の「スライダー」のように使う方法もあり、アイデア次第でLoRAのように使うこともできそうです。
こちらは「curvy」(むっちり)をマイナス調整して、体型調整タグのように使った例です。マイナス適用するほどにskinny(痩せ)な体型になっていることがよくわかります。
「75トークンの壁」とBREAK構文
Stable Diffusionには、プロンプトが「75トークン」という単位ごとに区切られる仕様があります。これは、人間から指示されたプロンプトをAIが分かる形に翻訳してくれる「テキストエンコーダー」というモジュールが、一度に処理できる量が75トークンまでと決まっているためです。75トークンを超えるプロンプトが入力されると、いったんそこでプロンプトが分割され、まず75トークンまでの固まりを処理したあとに、新たに76トークン以降の固まりが送られる…という流れで画像生成が行われます。
すると何が起きるか。最初に説明した「前の方のタグほど重視され、後ろにいくほど無視されやすくなる」現象が再び起き、2つ目の塊の最初のタグが強く重視されたり、ちょうど75トークン目に来たタグが途中でぶった切られて意味をなさなくなる(例:red【断絶】hair)といった不具合がまれに起きます。
プロンプト入力欄の右上に表示されているのが、現在入力中のトークン数です。文字数とはリンクしないので、ここを見ながらどこで「壁」を迎えるかを調整する必要があります。
こうした現象を防ぐためにあるのが「BREAK」というワード。プロンプトの途中に「BREAK」(すべて大文字)と入れると、そこで現在のプロンプト群が区切られ、すぐに次の75トークンの固まりを始めることができます。意図と異なる位置でプロンプトが分割されることがないので、予想外の生成結果になることを防ぐことができるわけですね。
そこまで厳密に行う必要はありませんが、「長いプロンプトで生成するときは、75トークンに近づいたところでBREAKを挟むと安心」くらいに覚えておきましょう。また、BREAK直後のタグは強めに影響することも意識してプロンプトを組むと良いでしょう。
困ったらLLMに聞いてみよう
自分でプロンプトを組むのがなかなか大変という人は、思い切ってChatGPTやPerplexityといったLLM(大規模言語モデル)に聞いてみるのも良いでしょう。特に、ログインしなくてもぱっと使えるPerplexityは、分からないタグをサクッと見つけるのに有用です。
例えばこのように質問すれば、何となく回答してくれます。もちろん存在しないタグをもっともらしく答えてしまったり、danbooruタグとしては存在してもうまく効かないということはあります。
実際にいま提案された二つのタグを使ってみました。親指と人差し指で小さいハートを作る「finger heart」は一つしか成功しませんでしたが、一応効くようですね。
ちなみに、PerplexityはけっこうNSFW系のタグ質問にも答えてくれます。
Niji journeyのように自然言語プロンプトを組む必要がある場合も、LLMは大活躍します。こちらの記事でNiji journey用のプロンプトが簡単に作れる自然言語プロンプト生成GPTを配布していますので、ぜひご活用ください。
日本語で簡単に「こういうのがほしい」と指示したあとに「自由に詳しくして」と言うと詳細なプロンプトを組んでくれますし、下図のように画像を与えると、的確な英語プロンプトとその簡易翻訳を答えてくれます。
おわりに プロンプト上達への道
2022年10月にNovelAIが登場してからしばらく、AIイラストというものは「呪文」(長大で複雑なプロンプト)とイコールでした。プロンプトさえ分かれば誰でも同じような画像を生成できるわけで、AIイラストが上手ということは、ほとんど「AIがうまく生成できるようなテキストを打つのが上手」ということを意味していたわけです。その後、2023年2月にControlnetが登場すると、さまざまな拡張機能や追加学習技術が華開き、ユーザーが使うモデルも多様化。今ではLLMにプロンプトを書いてもらえるようになり、学習不足のタグがあれば自分でLoRAを作れるようになったため、プロンプト知識の存在感は黎明期に比べるとやや薄れてきた感があります。
しかし、特に画質やタッチ、ライティング、色彩などのクォリティ部分については、やはりどれだけプロンプトを知っているかどうかで引き出しの数、表現の多彩さが変わってきますし、難しい要素を上手に再現するには、やはりプロンプトの仕組みをよく理解しておくことが今でも重要です。私はLoRAやControlnetの検証や応用が好きなので、プロンプトは比較的簡素なもので済ませてしまうことが多いのですが、緻密なイラストを生成されている方ほど、複雑なプロンプトを絶妙なバランスで成立させている印象があります。
実践的なプロンプト用法は、やはり上級者から勉強させていただくのが最も上達が早いです。特に、Civitaiで配布されているモデルにはプロンプト付の生成サンプルが掲示されていることが多く、モデル配布者や上手なユーザーさんがどんなプロンプトを使っているかを読み取る格好の教材となっています。もちろん、プロンプトの「効き」は学習モデルの出自によって大きく異なるため、同じプロンプトを使えばどんな学習モデルでも高品質なイラストが生成できるわけではないのが難しいところではありますが、「chichi-pui」さんなどプロンプト公開されているAIイラスト投稿サイトなども併せて回遊することで、いろいろな発見があると思います。
プロンプトの基礎知識が頭に入った状態で、あらためてこちらのプロンプト超辞典を眺めてみたり、使ったことがなかった特殊記法や拡張機能を試してみたりすることでも、生成イラストのクオリティアップにつながるかもしれません。
ながなが書いてきましたが、今回の記事がこれからAIイラストを楽しむ方にとって、何かの役に立つことを願っています。
スタジオ真榊でした。
Attachments (57)

1nSgMdEIu7rS2V3ygJAp9Fgz.png

Od0Nbtdp3v1qwJvE8diZ14k3.jpeg

YiVFysV3bR3KCRwrCZtkoYkI.png

26jI2LHERGwCrWE2ZfcbYvf4.png

KJT8TQEIcSeyEFHV1vquc5SM.png

etDBTQKhZNRlLlIMJ3eKhaWw.png

mUnKbf52SP4DMgucIEzdjk2J.png

MDTiLGxL5asJ6S23pcjmVMIH.png

YY7HeTOHLrOuOfxbfsJS485q.png

R3aTeXKdsOcdH16RwmMHmkYe.png

rKZMTCgAeuJiQsjTYx7pFr0z.png

ME5N1kQfpKYK2EG5RcoMMeZ5.png

B1c7pPoSCgaRqkikupnYyJfr.png

LlR7U66HrTZbnMGjJSQsH4pg.png

VsThQVWNyfHYGgmX86Ed9VPK.png

Y0gQGFWOHtNjzcdsYuh6nCf4.png

R7BEO36998oWXJUdcPP1jyzO.png

SomdF1jwwkP0T3ZvPbW0xV3m.jpeg

el3bF9nsMx7rPayugKQO7RFn.png

mWc7t3CmyHx0hWiX9NJCEQzR.png

HzRkPkq8qH4RMUGzzjMAtydg.png

T35G4zOVwOt8e2huneoIEETD.png

DehEq3iR1MpQt0kJTBo9v7pv.png

miBCBWrXZrzeaoyyAzGnziLI.png

F3cPwShIuB5NXiTSMMJXJmlz.png

t1ot5QWqy3WD0GcketrCK2xY.png

EM74sVkUn1e009FZ2Sv9JDfR.png

3WpAStdJrArtlLWCvql8Z7xx.png

10PBGp3yHNKITMdxVpIMKolc.png

EqFjDMSnMkz1UJUEQWTnvTAg.png

PwGXL3LXourbpOLr75i0RPxT.png

AlGAPLNLXHAt9eRQDMWaZofz.png

iwNb3iJzNWwfA4ZACmLBjzqF.png

4F554r9hHFtNKR4eY56NQk7G.png

ZWGot286FeM258mlhLXyOKer.png

GlCqhAkWonGChdOhsimwLYeE.png

5pcgG4deU6UjGCmErrx7YDtI.png

CYXRhZRyvEq0NdDuyfqwiFEZ.png

8Oe5RcvUBTVBe5OTP5yEDOJu.png

X5FHH4fJvl1IvqdoC7ASFim0.jpeg

0BKRATn28CkIeEBsluJqbSAS.png

6exc2OOxi8uE1PnO0y4NidNU.png

WpQQpf7ZTAvvSPZBSvZJxZw1.png

FTwGhqzPUHYYEEm7TPxBC5yh.png

uxkijoExHo11Ztf7uRecKHXo.png

zotMLvbR4DJPOSh1m4tjCQ3M.png

OeLzouNsf2vz9Et1pCHI8QIA.png

DG1HLdReu5TknDXkQNR0sesM.png

dxm32xnmYpA9tu3qsDdOVsMR.png

FZFaSoOC0fKKw1L8VvPqkAv2.png

jkR1obYLFZ9F28HmVSxRla4b.png

0qlvmGMt1TuLDlLGjPkzHlG9.png

EkHwlTghpSsWm330CqxLpdZ9.png

69U3EYkDToCXpDtrWYtQNZkt.png

G8Ito0OBspF0vjJxuC7BbmYR.png

kbDPzRormNvYVQhMruDs5qoH.png

s7VoaoPJIwwQoX6fq9T1zQ0H.png
