DCAI
Loading Light/Dark Toggl

ComfyUI コントロールネットの詳しい使い方 SD1.5 / SDXL

⏱️22min read
📅 2024年10月7日
カテゴリー:📂 生成AI中級
ComfyUI コントロールネットの詳しい使い方 SD1.5 / SDXLのメイン画像
Supported by

今回はComfyUIのコントロールネットについて解説します。ComfyUIでコントロールネットを使う場合は構成は複雑ですが、基本的なことは標準インストールで使用できます。

PR
落合陽一責任編集 生成AIが変える未来 ー加速するデジタルネイチャー革命ー (扶桑社ムック)の商品画像
落合陽一責任編集 生成AIが変える未来 ー加速するデジタルネイチャー革命ー (扶桑社ムック)
🔗Amazonリンク
Stable Diffusion AI画像生成ガイドブックの商品画像
Stable Diffusion AI画像生成ガイドブック
🔗Amazonリンク

ComfyUIでコントロールネットの基本的な使い方

まずは標準のコントロールネットの使い方を見ていきましょう。コントロールネットに必要なノードはAdd Node > conditioning > controlnetにあるノードとAdd Node > loadersにある「Load ControlNet Model」を使っていきます。

コントロールネットモデルのダウンロード

コントロールネットを使うにはそれぞれのモードに対応したモデルが必要です。ここではコントロールネットの開発者が公開しているV1.1用モデルを紹介します。

一度にすべてのモデルをダウンロードする必要はないので、まずは後ほど使用するcontrol_v11p_sd15_scribble.pthcontrol_v11p_sd15_scribble.yamlをダウンロードしてComfyUIのディレクトリ内のComfyUI/models/controlnetに置きましょう。

今回紹介したモデルの他にもSD1.5/SDXL用モデルがあります。前回の記事にて詳しく紹介しているので興味のある方はそちらを参照ください。

コントロールネットグラフの基本

コントロールネットグラフは基本的にはポジティブ・ネガティブプロンプトとサンプラーの間に入りコンディショニングを変更しています。

コントロールネットを適応させるノードとして「Apply ControlNet」と「Apply ControlNet (OLD)」がありますが、「Apply ControlNet (OLD)」はdeprecationになっているので「Apply ControlNet」を使いましょう。

あとはモデルを読み込む為の「Load ControlNet Model」が必要となります。

プリプロセッサーについて

ComfyUIのプリプロセッサーは標準インストールに含めるとデータが巨大になるため、カスタムノードとして別途インストールする必要があります。

インストール方法はComfyUI ManagerのCustom Nodes ManagerでComfyUI's ControlNet Auxiliary Preprocessorsを検索してインストールしてください。

カスタムノードについては下記のページで詳しく解説しているので参照ください。

A1111 WebUIのControl Typeの様なテンプレートはないので、マニュアルで組み合わせる必要があります。各プリプロセッサーの機能は前回の記事「Control Typeについて」にて紹介しているのでそちらを参照してください。

ノードの使い方はすべてを解説はしていませんが、後ほど紹介する使用例を参考にしてください。

公式のワークフローの解説

それでは公式のワークフロー例をダウンロードしてラフ画からイラストを生成してみましょう。

リンク先のページの「Scribble ControlNet」にあるワークフローの画像をダウンロードしてComfyUIにドラッグ アンド ドロップするか、Loadボタンより読み込んでください。また、インプット画像も後ほど使いますのでダウンロードしておきましょう。

読み込みが完了したら「Load Checkpoint」ノードのckpt_nameより、お好きなモデルを読み込んでください。

続いて「Load ControlNet Model」ノードにコントロールネットモデルを読み込みます。今回はScribbleを使うのでcontrol_v11p_sd15_scribble.pthを選択してください。

「Load Image」に先ほどダウンロードしたサンプル画像を読み込みます。

以上で設定は完了です。「Queue Prompt」をクリックして生成をしてみましょう。

公式のScribble ControlNet Examplesを改良してみる

ここからは公式のScribble ControlNet Examplesをもう少し実用的なControlNetワークフローに改良してみようと思います。以下に組み込みたいリストを纏めました。

  • SDXLモデルで生成。
  • 生成画像を横長にしたいのでインプット画像を調整する。
  • Clip skipを適応させる。
  • LoRAを導入して「Zoot Detailer XL」を適応させる。
  • 品質向上のためネガティブ エンベディングの「negativeXL_D」を実装。
  • 生成品質が良くないのでセカンドパスを実装。

それでは順を追って説明します。

インプット画像の調整:

今回のカスタムで生成画像をSDXLサイズにするために512×512サイズのインプット画像を1216×832サイズの真ん中に配置しようと思います。

「Load Image」の後に「ImageCompositeMasked」を追加してsourceに繋ぎましょう。続いて「EmptyImage」を配置してIMAGEアウトをdestinationに繋ぎます。

「Empty Latent Image」と「EmptyImage」の大きさを揃えたいのでそれぞれのwidth/heightをノードの右クリック メニューよりConvert width/height to inputでwidth/height値を外部化しましょう。「Primitive」を2つ配置してそれぞれwidth/heightに接続します。また、コントロールネットに送る画像の確認のために「ImageCompositeMasked」のIMAGEアウトを「Preview Image」に繋ぎます。

Nodeの場所
  • ImageCompositeMasked:image > ImageCompositeMasked
  • EmptyImage:image > EmptyImage
  • Primitive:utils > Primitive
  • Preview Image:image > Preview Image

Clip skip / LoRAの適応:

「Load Checkpoint」のCLIPアウトに「CLIP Set Last Layer」を繋ぎ、「CLIP Set Last Layer」のCLIPアウトに「Load LoRA」も繋ぎます。「Load LoRA」のCLIPアウトは2つの「CLIP Text Encode (Prompt)」に繋いでください。そして、「Load Checkpoint」のMODELアウトは「Load LoRA」に繋ぎそこから「KSampler」に繋ぎます。

Nodeの場所
  • CLIP Set Last Layer:conditioning > CLIP Set Last Layer
  • Load LoRA:loaders > Load LoRA

Seedの共有化:

KSamplerノードの右クリック メニューよりConvert seed to inputでSeed値を外部化します。seedインプットの●をドラッグすると選択できるノード一覧が出てくるので「Primitive」を選択してください。

Nodeの場所
  • Primitive:utils > Primitive

Apply ControlNetのアップデート:

サンプルに使っている「Apply ControlNet (OLD)」はdeprecationになっているので新しい「Apply ControlNet」に差し替えます。

「Apply ControlNet」を配置したらposivive/negativeにそれぞれの「CLIP Text Encode (Prompt)」を繋ぎ、control_netに「Load ControlNet Model」を繋ぎましょう。最後に「ImageCompositeMasked」のIMAGEアウトをimageに繋ぎます。vaeは繋がなくても問題ありません。

Nodeの場所
  • Apply ControlNet:conditioning > controlnet > Apply ControlNet

セカンドパスの実装:

セカンドパスの為に画像を拡大します。「VAE Decode」の後に「Upscale Image By」を繋ぎましょう。

サイズ調整した画像をlatent imageに変換する為に「VAE Encode」で変換します。

1回目のKSamplerを選択状態にしてCtrl + cでコピーします。そして、Ctrl + Shift + vでインプットを引き継いだままコピーできるので、繋がったまま希望する位置へ持っていきましょう。

位置が決まれば先ほどの「VAE Encode」で変換したLATENTを2回目のKSamplerのlatent_imageインプットに繋ぎます。

ポジティブプロンプトの「CLIP Text Encode (Prompt)」をCtrl + Shift + vでコピーして2回目のKSamplerのpositiveに繋ぎ下記のアップスケール用プロンプトに書き換えましょう。

very detailed, intricate details, ultra detailed, masterpiece, best quality
Nodeの場所
  • Upscale Image By:image > upscaling > Upscale Image By
  • VAE Encode:latent > VAE Encode
  • KSampler:sampling > KSampler
  • CLIP Text Encode (Prompt):conditioning > CLIP Text Encode (Prompt)

以上でScribble ControlNet Examplesの改良版が完成しました。完成後のワークフローはPatreonで無料公開していますので参考にしてください。

改良したScribble ControlNet Examplesを使ってみる

チェックポイント モデルの選択:

「Load Checkpoint」のckpt_nameでモデルを指定しましょう。今回はSDXLモデルAnythingXL_xlを使用します。モデルに関してはお好きなモデルを使用しても問題ありませんが、パラメーターをモデルに対して少し調整する必要があります。

Clip skipの設定:

A1111 WebUIでいうところのClip skip: 2にしたいので「CLIP Set Last Layer」のstop_at_clip_layerを-2に設定します。

LoRAの読み込み:

「Load LoRA」のlora_nameでLoRAモデルを選択しましょう。ディテールを出したかったのでZoot Detailer XLを読み込んでいます。パラメーターはデフォルトのまま使用します。

VAEの読み込み:

「Load VAE」のvae_nameでVAEモデルのsdxl.vae.safetensors選択しましょう。

オフィシャルのVAEより軽い「madebyollin/sdxl-vae-fp16-fix」を使っています。下記のリンクより「sdxl.vae.safetensors」ダウンロードしてください。

インプット画像の設定:

「Load Image」にインプット画像を読み込ませましょう。公式のワークフローにあるサンプル画像を読み込みます。

「Empty Latent Image」と「EmptyImage」につながっている「Primitive」のwidthを1216heightを832に設定します。

「ImageCompositeMasked」でSDXLモデルに対応する大きさに変更しましょう。xを354yを160に設定してインプット画像を中央に配置します。

プロンプトの変更:

今回使用するモデルに合わせてプロンプトを追加します。下記のプロンプトをポジティブ・ネガティブそれぞれに上書きしましょう。

ポジティブプロンプト
masterpiece, best quality, white dress, (solo) girl (flat chest:0.9), (fennec ears:1.1) (fox ears:1.1), (blonde hair:1.0), messy hair, sky clouds, standing in a grass field, (chibi), blue eyes
ネガティブプロンプト
nude, (hands), text, error, cropped, (worst quality:1.2), (low quality:1.2), normal quality, (jpeg artifacts:1.3), signature, watermark, username, blurry, artist name, monochrome, sketch, censorship, censor, (copyright:1.2), extra legs, (forehead mark) (depth of field) (emotionless) (penis)

今回使用している「Anything XL」の品質修飾タグとしてmasterpiece, best qualityを追加しています。また、テストで生成しているところ裸の画像が生成されていたので、ポジティブプロンプトにwhite dressネガティブプロンプトにnudeを追加しています。

ネガティブ エンベディングの適応:

ネガティブ エンベディングの「negativeXL – D」を適応したいのでネガティブプロンプトの先頭に下記のプロンプトを追加します。

embedding:negativeXL_D, 

negativeXLをお持ちでない方は、下記のリンクよりダウンロードして\ComfyUI\models\embeddingsに置きましょう。

コントロールネットの設定:

コントロールネットモデルはxinsir氏が公開しているSDXL用のScribbleモデルcontrolnet-scribble-sdxl-1.0を使用します。(※公式が紹介している「kohya_controllllite_xl_scribble_anime」はエラーで使えませんでした。)下記のリンクよりdiffusion_pytorch_model.safetensorsをダウンロードしてxinsir-controlnet-scribble-sdxl-1.0.safetensorsの様にに分かりやすいファイル名に変更して\ComfyUI\models\controlnetディレクトリに置きましょう。

「Apply ControlNet」のstrengthは影響力が強かったので0.50に設定します。start_percentとend_percentはデフォルトのまま使用します。

1stパスの設定:

stepsを標準的な20に設定します。

cfgはデフォルトではコントラストが高かったので、少し下げて5.0に変更しましょう。

samplerはお好みで問題ありませんがdpmpp_2mを選択して、schedulerはkarrasを使います。

アップスケールの設定:

「Upscale Image By」でアップスケールの設定をしましょう。今回の例ではSDXLなのであまり大きくしなくて良いのでupscale_methodをlanczosに設定してscale_byを1.50にします。

2ndパスの設定:

ステップ数を上げて仕上がりを良くしたいところでしたが上げてもあまり変わらなかったので20のまま使います。

プロンプトをあまり強調させない為にCFGを3.0に設定しましょう。

サンプラーは好みで選んでも問題ありませんが、今回は1st Passと同じdpmpp_2mkarrasの組み合わせにしています。

書き込み量を増やしたいのでDenoising strengthを0.60に設定しましょう。

生成:

以上で設定は完了なので、「Queue Promt」ボタンで生成しましょう。

生成結果
生成結果
Seed:678787856375407
画像を開く
Supported by

コントロールネットの使用例

ここかからはA1111 WebUIに近いワークフローを紹介します。インプット画像からコントロールネットに適した画像に変換する為にカスタムノードの「ComfyUI’s ControlNet Auxiliary Preprocessors」は必須になりますので、インストールしましょう。また、2ndパスに送る画像を任意にするために「Image Chooser」も使っています。

ポーズの参照

ポーズの参照はDensePose Estimatorを使って人物を解析してSDXLモデルを使って生成しています。複数のコントロールネットの適応例も使っています。まずはPatreonからダウンロードしてみましょう。

ワークフローの解説

Basic Info

  • Load Checkpoint:Checkpointモデルを読み込みましょう。例ではanimagineXLV31_v31を使います。
  • CLIP Set Last Layer:A1111 WebUIでいうところのClip skip: 2にしたいのでstop_at_clip_layerを-2に設定しましょう。
  • Load LoRA:LoRAを読み込みます。今回はディテールを出すadd-detail-xlをつかいます。strength_modelを2.00にしてさらにディテールを出しましょう。
  • Primitive-Seeds:KSamplerに使うSeedを外部化してこのノードで共有しています。
  • CLIP Text Encode (Prompt)-Positive:ポジティブプロンプトはスケーターと背景のプロンプトを入力しています。
  • CLIP Text Encode (Prompt)-Negative:ネガティブプロンプトはあまり入れ過ぎずシンプルにしましょう。
  • Empty Latent Image:今回の生成はSDXLモデルを使うので適したサイズの1344x768に設定しています。

Load Image

まずはUnsplashからお借りした🔗昼間にスケートボードのトリックを披露する男性を読み込みましょう。

インプット画像
中間サイズを使用します
画像を開く

読み込みが完了したらスケーターをマスクしたいのでノードの右クリックメニューからOpen in MaskEditorを選択してスケーターをマスクします。

MaskEditor
MaskEditorのマスク例
画像を開く

Mask

マスクを今回生成する大きさに変更する為のグラフになります。

  • Convert Mask to Image:マスクを編集するには一度Imageに変更する必要があるのでこのノードで変換しましょう。
  • Enchance And Resize Hint Images:生成サイズに変換します。大きさはImage Compositionグループにある「Generation Resolution From Latent」で摘出したサイズを適応させています。
  • Invert Image:スケーターを抜き出したいのでマスクイメージの白黒を反転させましょう。
  • ImageBlur:マスクの境界線をスムーズにしたいのでブラーをかけます。
  • Convert Image to Mask:最後にイメージからマスクに変換します。

Image Composition

インプット画像は縦長なのですが、生成したいサイズは横長にしたいと思います。このグラフでサイズ変更して、さらにマスクを使ってスケーターを貼り付けましょう。

  • Enchance And Resize Hint Images:生成サイズに変換します。「Generation Resolution From Latent」で摘出したサイズを適応させましょう。
  • Generation Resolution From Latent:LatentImageの大きさを摘出しています。
  • Join Image with Alpha:リサイズしたインプット画像からマスクを使って抜き出します。
  • Preview Image:抜き出した画像の確認のために設置しています。

Preprocess

コントロールネットに適応した画像にするために変換しています。

  • DensePose Estimator:インプット画像からDensePoseを生成します。
  • AnyLine Lineart:インプット画像からLineartを生成します。今回はlineart_realsticを使用しています。
  • Preview Image:各プリプロセッサーの確認のために設置しています。

ControlNet

コントロールネットを複数適応する場合はこのグラフの様に設置します。

  • Load ControlNet Model-Densepose:DensePoseをSDXLで使うためにjschoormans-controlnet-densepose-sdxl.safetensorsを使います。以下のリンクよりdiffusion_pytorch_model.safetensorsをダウンロードしてjschoormans-controlnet-densepose-sdxl.safetensorsの様に分かりやすい名前に変更します。
  • Apply ControlNet-Densepose:DensePoseを適応します。strengthを0.70に設定して少しウェイトを弱めます。背景を彩画するためにstart_percentを0.050にしています。
  • Load ControlNet Model-Lineart:スケーターのラインアートを参照する為にxinsir-controlnet-scribble-sdxl-1-0.safetensorsを使います。以下のリンクよりdiffusion_pytorch_model.safetensors(V2でも問題ありません)をダウンロードしてxinsir-controlnet-scribble-sdxl-1-0.safetensorsの様に分かりやすい名前に変更します。
  • Apply ControlNet-Lineart:スケーターをアーティスティックに彩画したいのでウェイト少し下げた0.90にします。ココでも背景を彩画するためにstart_percentを0.100にしています。そして、全体にもプロンプトを反映させたいのでend_percentを0.900にしています。

1stPass

ほとんどデフォルトですが、cfgを5.0サンプラーをdpmpp_2mスケジューラーはkarrasにしています。

Preview Chooser

1stPassで生成された画像確認のために導入しています。結果に満足すれば「Progress selected image as restart」ボタンで先に進めます。

Upscale

今回は「ImageScaleToTotalPixels」を使ってアップスケールしています。大きさは3.00メガピクセルにしています。

2ndPass

1stPassとほとんど同じにしています。denoiseを0.40にして新たな書き込み量を調整しています。

ポーズの参照の解説は以上になります。

生成結果
ポーズの参照の生成結果
Seed:242305135254817
画像を開く

生成画像の細密化

SDXLモデルでTileを使って細密化をします。このワークフローではカスタムノードの「Tiled Diffusion & VAE for ComfyUI」を使いますのでインストールしておきましょう。まずはPatreonからダウンロードしてみましょう。

ワークフローの解説

Basic Info

ワークフローの基本情報がまとめられています。

  • Marge Checkpoints:チェックポイントモデルをマージします。詳しくは次の項目で解説します。
  • CLIP Set Last Layer:A1111 WebUIでいうところのClip skip: 2にしたいのでstop_at_clip_layerを-2に設定します。
  • Load LoRA:LoRAを読み込みます。今回はディテールを出すadd-detail-xlをつかいます。strength_modelを3.00に設定し、さらに書き込み量を増やしています。
  • Empty Latent Image:今回の生成はSDXLモデルを使うので適したサイズの1344x768に設定しています。
  • Primitive-Seed:KSamplerに使うSeedを外部化してこのノードで共有しています。
  • CLIP Text Encode (Prompt)-Positive:特別なことはしていませんが、中世の城下町の市場に立つ少女のプロンプトです。
  • CLIP Text Encode (Prompt)-Negative:ネガティブプロンプトの「negativeXL_D」を使っています。あとは目の瞳孔がピンクのイラストが生成されていたのでheart pupilsを使っています。

Marge Checkpoints

チェックポイントモデルをマージしたい時のグラフになります。「ModelMergeSimple」を使ってマージしています。CLIPはベース・サブの好きな方を使いましょう。

  • Load Checkpoint-base:ベースになるチェックポイントモデルになります。fiamixXL_v40.safetensersを使います。
  • Load Checkpoint-sub:サブになるチェックポイントモデルになります。少しだけアニメ調に近づけたかったのでAnythingXL_xl.safetensersを使います。今回はコチラのClipを使います。
  • ModelMergeSimple:チェックポイントモデルをマージします。retioは1.00でmodel1(base)が100%になるので0.85に設定して少しだけサブの要素を追加しています。
  • Save Checkpoint:マージしたチェックポイントモデルを保存したい場合はコチラのノードを使います。

1stPass

ほとんどデフォルトですが、cfgが4.0、サンプラーをeulerスケジューラーはbetaにしています。

Preview Chooser

1stPassで生成された画像確認のために導入しています。結果に満足すれば「Progress selected image as restart」ボタンで先に進めます。

Upscale

  • Load Upscale Model:アップスケーラーモデルを読み込みます。今回は4x-foolhardy_Remacri.pthを使用します。
  • Upscale Image (using Model):アップスケーラーモデルを使ってアップスケールします。
  • ImageScaleToTotalPixels:指定したピクセルで画像で拡大/縮小します。縦横比は維持されます。

Preprocess

「TTPlanet Tile GuidedFilter」を使ってコントロールネット用に変換します。resolutionを1024にしています。VRAMが少ない方はデフォルトの512または768で使用します。

ControlNet

  • Load ControlNet Model:SDXL用のTileモデル「ttplanetSDXLControlnet_v20Fp16.safetensors」を使っています。
  • Apply ControlNet:あまり影響力はありませんが、end_percentで仕上がりを調節できます。今回は平均的な0.500で使用します。この値が高すぎると書き込み量が減り、コントラストの高いイラストが生成されます。2ndPassのdenoiseとのバランスで書き込み量を調整します。

Tiled Diffusion

  • Tiled Diffusion:Tiled Diffusionのタイルサイズを設定します。今回は1024で使用します。VRAMが少ない方はデフォルトの768または512で使用します。
  • Tiled VAE Encode:TileのLatentを作成します。こちらも1024で使用します。この値もVRAMが少ない方は下げましょう。

2ndPass

コチラもほとんどデフォルトですが、cfgを7.0サンプラーをeulerスケジューラーはbetaにしています。denoiseで書き込み量を調整します。今回は0.40に設定します。

Tiled VAE Decode

Tiled VAE Decodeを使ってデコードします。コチラもVRAMが少ない方はtile_sizeを下げましょう。

生成画像の細密化の解説は以上になります。

生成結果
生成画像の細密化の生成結果
Seed:313039866590761
画像を開く

ハイスペックマシンをお持ちの方はUpscaleグループの「ImageScaleToTotalPixels」にあるmegapixelsを6.008.00で試してみるのも良いでしょう。

生成画像の細密化の生成結果8メガピクセル
この画像は2Kサイズに縮小されています
画像を開く

生成された8.00メガピクセル(3824 x 2184ピクセル)を見てみたい方は下記のGooleDriveからダウンロードしてみましょう。

まとめ

今回はComfyUIでのControlNetの使用方法をご紹介しました。A1111 WebUIと比較すると、ControlNetにはコントロールタイプのようなテンプレートがないため、少し複雑に感じるかもしれません。しかし、使いこなせば生成プロセスを細かくコントロールできます。

また、今回は紹介しませんでしたが、公式が紹介しているT2I-Adapterを使用することで、さらに高速に生成することが可能です。さらに、AI動画にControlNetを使用したい場合は、カスタムノードの「ComfyUI-Advanced-ControlNet」を利用することをオススメします。

PR
GIGABYTE NVIDIA RTX4080 SUPER 搭載 グラフィックボード GDDR6X 16GB【国内正規代理店品】 GV-N408SWF3V2-16GDの商品画像
GIGABYTE NVIDIA RTX4080 SUPER 搭載 グラフィックボード GDDR6X 16GB【国内正規代理店品】 GV-N408SWF3V2-16GD
🔗Amazonリンク
FSP エフエスピー 80 PLUS GOLD 認証 ATX3.0 PCIe Gen.5 対応 フルモジュラー ATX 電源 Hydro G PRO ATX3.0(PCIe5.0) 1000W [ HG2-1000.GEN5 ]の商品画像
FSP エフエスピー 80 PLUS GOLD 認証 ATX3.0 PCIe Gen.5 対応 フルモジュラー ATX 電源 Hydro G PRO ATX3.0(PCIe5.0) 1000W [ HG2-1000.GEN5 ]
🔗Amazonリンク
Supported by