こんばんは、スタジオ真榊です。今回は、最新ローカル画像生成モデル「Anima」とADetailerを使って、破綻した手や画風が変わってしまった顔を自動で描き直したり、自然言語指示で「演技」を付けたりする手法についての検証記事です。

例えば、破綻した指の画像を入力して「彼女はこちらに手を振っている(She's waving at me)」と指示すると自動でこうなり、

Anima×ADetailerで自動検出&描き直し!カスタムADetailerで「自然言語インペイント」:図版1

「彼女は人差し指と小指を立てた狐のハンドサインをしている(She's making the fox hand sign at me. She's holding up her index finger and little finger.)」と指示するとこうなる仕組みです。

Anima×ADetailerで自動検出&描き直し!カスタムADetailerで「自然言語インペイント」:図版2

これは機械的な処理なので、数百枚の画像に同じ処理を一気に掛けることもできます。(フォルダ内の画像のすべての目の色を青にする、といったことが可能)

ForgeNeo上では通常のADetailerがそのままでは動かせなかったので、Animaを便利に活用できるようさまざまな新機能を備えた「カスタム版ADetailer」を作りました。ForgeNeo、reForgeどちらでも使えます。Githubから適用できるようにしてあるので、ぜひご利用ください。【約13,000字】

(※今回の内容は、ForgeNeo上でAnimaによる生成や、Controlnet「anima-lllite-inpainting-v2」を使ったインペイントが既にできるようになったユーザー向けです。ForgeNeoやAnimaの利用が初めての方は、先にこちらの記事をご参照ください)

1.はじめに 破綻修正の現在地

検証の前提として、記事執筆時点の一般的な破綻修正のやり方を確認させてください。AIイラストのおかしなところを直す方法といえば、おおむね以下の三つに大別できるかと思います。

①おかしなところを自分でマスクして、再生成(i2i、インペイント)する

②ChatGPTやNanoBananaProなどの画像編集モデルにお任せして直してもらう

③ADetailerなどを使い、生成時に手を自動検出して高精細にアップスケールする

主な違いは、「修正箇所を決めるのは誰か?」ということですね。①はマスク範囲を塗るユーザー自身。②はお任せした画像編集モデルが画像解析して判定します。③はADetailerに適用する検出モデルが学習内容に従って自動検出します。この違いがそれぞれメリット・デメリットを生むので、簡単にまとめます。

①ユーザーによるインペイント

一番思った通りの結果が得られるのは、やはりインペイントによる手動修正です。SDXLでNoobaiインペイントするのでもよいですし、NovelAIのインペイントでももちろんOK。NovelAI v3は既に前回のアップデートから1年が経過していますが、直したい画像を放り込んで適当にマスクして再生成すれば、こんな感じでそれなりに再生成してくれます。

①ユーザーによるインペイント:図版1

手動インペイントは、書き換えたい場所、書き換えたくない場所をユーザーが細かく指示できるのが最大のメリット。ユーザーが塗りつぶした範囲の外は基本的にそのままになります。

①ユーザーによるインペイント:図版2

ただし、自然な仕上がりにするにはある程度の「慣れ」が必要で、画風が周囲と違ってしまったり、境目のぼかしが適切でないとうまく繋がらなかったりすることもあります。また、一つ一つ手動でマスクするやり方なので、数百枚の画像をいっぺんに処理するのには向いていません。

②画像編集モデルに丸投げ

GPT Image2やNanoBananaPro、QwenImageEditといった画像編集モデルに修正を「丸投げ」する方法もすっかり浸透した印象です。たまに失敗することもありますが、プロンプトや範囲指定など細かな設定をしなくてもいいですし、仕上がりも自然。例えばChatGPT上でこんな感じで指示すると、ちゃんと手の周辺をきれいに再生成してくれます。(Thinkingモードを選んでn=10と書き加えれば、10パターン同時に生成してくれます)

②画像編集モデルに丸投げ:図版1

一方で、こうした画像編集モデルは局所修正を指示しても画像全体を再解釈することが多く、SDXLやNovelAIによるインペイントと違ってほかの場所も微妙に変化しがちなのがネック。こちらの例では、修正したい手はきちんと直っているものの、手以外の線画や塗りがわずかに変容してしまっているのが分かります。

②画像編集モデルに丸投げ:図版2

修正前の画像とCLIP STUDIO PAINTなどで重ね合わせて馴染ませたいところですが、元画像と微妙に線画がずれる「ピクセルズレ」も起きているので、正直①のインペイントより扱いづらく感じることがあります。わずかな変容を許せる作業であれば、一番お手軽なんですけどね。

③ADetailerで「上書きimg2img」

最後の一つがADetailerです。SDXLを使っている方にはもはやおなじみですが、生成した画像のうち顔や手といった局部を自動で検出して切り出し、img2imgをかけたあと、再びもとの場所に「縫い合わせる」動きをする拡張機能です。完全自動処理なので、修正したい画像がたとえ何百枚あっても機械的に同じ処理を行えるのがメリット。

③ADetailerで「上書きimg2img」:図版1

ただし、ADetailerがやっているのはただの「部分的な薄めimg2img」に過ぎません。修正前の手の形に強く引っ張られてしまうので、修正前の手が4本指や6本指だった場合、相当強くimg2imgしないと5本指に描き直すことはできませんし、img2imgの強度を強め過ぎるとマスク内外の矛盾がはっきりしてしまいます。

ADetailerはその名の通り「ぼやけた部分を詳細化する」ための技術なので、強めの破綻修正に使うには一定の限界があります。

<簡単まとめ>

まとめると、「指が100%破綻しないように生成する」のはAnimaでもまだ不可能ですが、「破綻してしまった部分をあとからAI修正する」のであれば既存技術で簡単にできるようになっており、SDXLでもNovelAIでもGPTでもやり方もさまざまある、というのが破綻修正の現状です。

簡単まとめ:図版1

手動インペイントは高品質にできますが大量処理には向いておらず、ADetailerは手や顔といった位置を自動検出して機械的にimg2imgすることができる代わりに、指の本数を描き直すほど強く掛けると破綻してしまいます。ここをうまく解決して、①~③の「いいとこどり」ができないでしょうか。

2.機能追加版「ADetailer Custom」

こうした前提を踏まえて、ForgeNeo&AnimaでADetailerをまず使えるようにし、薄めのimg2imgではなく、マスク範囲内をゼロから「描き直し」できるようにすれば、これまでできなかった修正法が可能になるのではないか?と考えました。それには、マスク内外を矛盾なく繋げられるよう、Controlnetを併用できるようにする必要があります。

色々と試行錯誤してできたのが、こちらの「カスタムADetailer」です。

純正のADetailerは記事執筆時点でForgeNeoでは適用できない状態でしたので、このカスタムADetailerはまずそこを修正し、reForgeとForgeNeo両方で動かせるようにしました。また、使いやすいように日本語化も施し、各パラメータにマウスを重ねると説明文が表示されるようにしました。

2.機能追加版「ADetailer Custom」:図版1

新規に追加した機能は以下の通りです。

①Controlnet欄でAnima向けモデルやSDXL用Anytestなどのモデルを選択可能に

純正ADetailerはモデル名をもとに機械的に検出しているので、一部読み込みリストに出てこないモデルがありました。このカスタム版では、もう少し検出条件を緩和して、必要なCNモデルが表示されるよう改善しています。これで、SDXL用AnytestやNoobaiInpaint、Anima用のlllite-inpaintingやany-test-likeがADetailer上で使えるようになりました。

①Controlnet欄でAnima向けモデルやSDXL用Anytestなどのモデルを選択可能に:図版1

②Controlnet併用機能を充実

純正ADetailerは入力画像のキャンバス全体をそのままControlnetに送る仕組みなので、例えばLineartを手だけに掛けようとしても、そのままだと検出部分に「入れ子」のようにキャンバス全体が描かれてしまいます。(下図参照)

②Controlnet併用機能を充実:図版1

そこで、ADetailerによって切り出された右手・左手部分の画像をControlnetに送信できるよう、ADetailer画面の最下部に「ADetailerの切り出しをControlnet入力に使う」という欄を実装。ここにチェックを入れることで、キャンバス全体ではなくADetailerが切り抜いた部分だけをControlnetに送れるようにしました。

②Controlnet併用機能を充実:図版2

また、さまざまなControlnetモデルをADetailerと併用できるように、プリプロセッサ欄も搭載しています。例えばSDXLのNoobaiインペイントを選ぶと、対応するプリプロセッサ「inpaint noobai」が自動選択されます。これによって、普段Controlnetを使うときの感覚で、LineartやInpaint、Anytestなどさまざまな効果を持つADetailerを掛けられるようになりました。

③Prompt Append欄を実装

ご存じのように、ADetailerは切り抜いた範囲にだけ掛けられるプロンプト・ネガティブプロンプトを指定でき、空欄にしておくとメインのプロンプトがそのまま流用される仕様です。ただ、「全部は変えなくていいからちょっとだけプロンプトをいじりたい」「一つだけタグを加えたい」ということがたまにあります。

そこで、ADetailer用のプロンプト・ネガティブプロンプト欄の下に、「追加プロンプト」「追加ネガティブプロンプト」欄を実装しました。ここに記入したタグは、メイン生成のプロンプトの末尾に足される動作になります。ADetailerのときだけ別のLoRAを発動させたい場合は、追加プロンプト欄に<lora:charalora:0.8>のように入力すればOKです。

③Prompt Append欄を実装:図版1

④マスク範囲の扱いを選択可能に

純正ADetailerは、切り出した範囲をインペイント画面でいう「元の画像」として常に扱う仕組みです。完全なノイズ画像や「無」から生成をやり直すことができないため、下図のようになんとなく加工前と同じ形が継承されてしまいます。(img2img強度:0.5)

④マスク範囲の扱いを選択可能に:図版1

では強度をさらに高めるとどうなるかというと、こんな感じでマスク内外がなじまず、おかしくなってしまいますよね。

④マスク範囲の扱いを選択可能に:図版2

そこで、インペイント前の画像に縛られない「描き直し」ができるようにするため、Inpainting欄に「マスクされたコンテンツ」欄を実装しました。img2img画面と同様に「元の画像」「埋める」「潜在空間でのノイズ」「潜在空間における無」の4つからマスク内の処理を選べます。

④マスク範囲の扱いを選択可能に:図版3

<"マスクされたコンテンツ"の意味>

「埋める」:マスク部分を、周囲の色や画像情報からテキトーにそれっぽく埋めた状態からimg2imgを開始する。

「元の画像」:普段のADetailerはこれ。元の画像にノイズを足した状態からimg2imgを開始する。強度1ならほぼノイズ、0.5なら半分くらいの濃度のノイズを載せる。元の画像に引っ張られる。