メインコンテンツへスキップ
見出し画像

【ComfyUI】Anima Remapで40層・52層AnimaでControlNet(VACE/LLLite)を使えるようにした話

     ComfyUI用に公開している「ComfyUI-Anima-Remap」を更新し、ControlNetに対応させました。LLLiteではすでに対応しているノードがいろいろあるので今さら感がありますがw

     Anima-Remapは、Anima(28層)・Anima-2.9B(40層)・Anima-3.8B(52層)と世代ごとに層の数が違うAnimaで、旧世代向けに作られたLoRAをそのまま使えるようにするためのものです。層を挿入する形でモデルが拡張されてきたため、28層向けのLoRAを40層のモデルに当てると、層の番号がずれて別の層に適用されてしまいます。それを自動で補正するノードです。

    ControlNetに対応した経緯

     AnimaモデルではControlNetを普段ほとんど使っていないので、これまで対応する気はなく見送っていました(基本的には自分が使いやすいものを必要になったら作る、というスタンスなので)。今回はちょっとcontrolnetを試してみようとおもったことがあっての拡張です。

     調べてみると、公開されているAnima用のControlNetはほぼ28層モデルで学習されているようです(そりゃそうでしょう)。40層・52層のモデルではエラーで止まるか、エラーは出ないまま間違った位置に効いてしまうかのどちらかになります。LoRAで使っているのと同じ層の対応表がそのまま使えるので、ControlNetにも拡げてみることにしました。

    VACE方式とLLLite方式

     Anima用のControlNetには、現在主に2つの方式があります。

    VACE方式
     いわゆる従来型のControlNetです。モデルの層をいくつか複製した別のネットワークで条件画像を処理し、その結果をモデル本体に足し込みます。容量が大きいぶん拘束力は強く、実際に使ってみてもLLLiteとはかなり差がありました。ただし公開されているのはまだDepthとCannyだけです。40層・52層のモデルに繋いでもエラーにならず、そのまま本来とは違う位置に足し込まれてしまいます(気づきにくい)。

    LLLite方式
     Anima用で主流の方式で、kohya-ss氏のsd-scriptsで学習できる軽量な方式です。各層に小さな補正を差し込む仕組みで、ファイルが小さく、depth・pose・lineartなど種類も揃っています。その反面、拘束力は控えめで、プロンプトの影響に負けやすい面があります。28層向けの重みを40層以上のモデルに繋ぐと、kohya-ss氏のノードではエラーで停止するようです。

     VACEにはまだlineartなどがなく、Anima用ControlNetのほとんどはLLLite方式です。そういう訳で、LLLite用のノードも一応用意しました。
    (正しくは先にLLLite用を作ってしまったw)


    Anima VACE ControlNet Remap:
     ControlNetの読み込みと適用の間に挟み、足し込む先の層だけを正しい位置に移します。

    画像
    Anima VACE ControlNet Remap


    Apply Anima ControlNet-LLLite (Auto Remap)
    :
     kohya-ss氏のノードを取り込み、重みの層番号を接続先のモデルに合わせて付け替えて読み込みます。28層のモデルでは本家ノードと同じ動作です。
    新規挿入ブロックには0を挿入する(何もしない)タイプが多いみたいですが、extend_to_new_layersの設定ONで新規挿入ブロックにも制御を掛けられるようにしています(直前の元ブロックのモジュールを丸ごとコピー)

    画像
    Apply Anima ControlNet-LLLite (Auto Remap)

    使用上の注意点

    • VACE方式を使うには、ComfyUI-Advanced-ControlNetのフォーク版(PineCookie氏の`fix/anima-vace-hardening`ブランチ)が必要です。VACE方式の読み込みに対応しており、生成の中断後に制御が何重にも掛かって画像がノイズ化する不具合も修正されています。

    • ComfyUI-Advanced-ControlNet(フォーク版を含む)はGPL-3.0です。Anima-RemapはMITのままにしておきたかったので、コードは取り込まず、実行時に同パッケージが生成したオブジェクトを受け取って調整する形にしています。

    • VACE方式では、画像の縦横を16の倍数にしてください 上記のフォーク版は16で割り切れないサイズ(1080など)にも対応しています。古いフォークでは同じサイズでエラーになる報告があるため、16の倍数にしておく方が安全です。

    • LLLite方式で強度を上げすぎると、後半のディテールが崩れやすくなります。`preserve_wrapper`をONのままノードを2段に重ね、序盤は強く・後半は弱く掛けるといった使い方ができます(この仕組み自体は本家のノードと同じです)

    • fp8で保存されたモデルにも対応しています

    導入手順や各項目の詳しい説明は、GitHubのREADMEにまとめています。


    ついでに:LoRA名の入力補完

     LoRA Tag Loaderのテキスト欄でLoRA名とトリガーワードを補完するようにしてみました。

    画像
    LoRA構文の補完入力

    ファイル名の一部を3文字以上入力すると候補が表示され、選んでいる間はプレビュー画像(動画にも対応)とトリガーワードが確認できます。決定するとLoRA構文「<lora:ファイル名:1>, トリガーワード」が入力されます。

    LoRAの確認の手間が多少省けます(自分は普段、LoRA Managerの一覧からトリガーワード込みで「LoRA構文をコピー」してしまうのですが...)
    前段のノードからテキストを接続する使い方もこれまで通り可能です。


    改良・改変について

     コードは基本的にMITライセンスで公開しています(LLLiteまわりの一部はApache 2.0です)。人柱としての試用も含め、改良や改変はご自由にどうぞ。



     
     
    趣味で画像生成をぼちぼちやってます。 自分用に作成したComfyUI用のカスタムノードやツールについてたまに記事にまとめています。

    あなたへのおすすめ