メインコンテンツへスキップ
プロジェクトリサーチ 18分で読める

【実践編】ComfyUIのControlNetで構図を狙う! Canny・Depth・OpenPoseを比較してみた

PlusWeb3 編集部
PlusWeb3 編集部 Web3・AI専門メディア

ComfyUIで構図を安定させるには、プロンプトに加えて『ControlNet』で輪郭や奥行きなどの構造情報を渡します。

Cannyではseedを変えても人物・椅子・ランプの位置関係が維持され、Depthでも空間構成を保てました。一方、OpenPose系では人物の姿勢情報は維持されたものの、椅子やランプの配置は維持されませんでした。

ControlNetは種類ごとに固定できる情報が異なり、導入時にはManagerが使えず、モデルを手動で配置する必要もありました。


ノードベースの画像生成AIツール「ComfyUI」を実際に使い、業務に利用できるのかを検証する本企画。

第1回ではComfyUI Desktopを導入し、画像生成からワークフローの保存・復元までを試しました。第2回では記事のアイキャッチ制作に挑戦し、横長構図やタイトル用の余白をプロンプトから制御しています。

【入門編】高品質AI画像生成の定番ComfyUI入門! 最初の1枚とワークフローの再現まで試してみた

【実践編】ComfyUIで記事のアイキャッチを制作! 横長構図とタイトル余白を狙ってみた

ただし、第2回で課題になったのが構図の再現性です。

「左側をタイトル用に空ける」「主題を右へ寄せる」といった指示はある程度反映されましたが、seedを変えると余白の位置や物体配置まで変化しました。プロンプトだけで大まかな方向は指定できても、構図を安定して再現できるとは限りませんでした。

そこで第3回では、画像の輪郭や奥行き、人物の姿勢といった構造情報を生成条件へ追加する「ControlNet」を試します。

ControlNetは、文章とは別に「参照画像から取り出した構造」を生成の条件として渡す仕組みです。渡す構造の種類によって、下書きの線をなぞらせる(Canny)、手前・奥の配置だけを渡す(Depth)、人物の骨格だけを渡す(OpenPose)といった使い分けがあります。

今回は、この3種類を使い、何をどこまで固定できるのか、seedを変えても構図が維持されるのかを比較しました。

今回の環境と検証条件

今回の環境はComfyUI Desktop v0.34.2です。

比較用の参照画像として、人物、椅子、フロアランプを配置したシンプルな画像を用意しました。輪郭、前後関係、人物の姿勢がそれぞれ分かりやすいため、Canny、Depth、OpenPoseの違いを比較しやすい構成です。

参照画像は、前回まで使用していたFLUX.1 Schnell FP8で自分で生成したものです。本連載では、他人の画像や既存作品を入力素材として使わない方針のため、参照画像も自作の生成画像に限定しています。

今回のControlNetの検証では、対応する周辺モデルが豊富なStable Diffusion v1.5を使用します。

今回使用したモデルファイルは以下の通りです。

役割ファイル名
画像生成用Checkpointv1-5-pruned-emaonly.safetensors(https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/v1-5-pruned-emaonly.safetensors)
ControlNet(Canny)control_v11p_sd15_canny_fp16.safetensors(https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/blob/main/control_v11p_sd15_canny_fp16.safetensors)
ControlNet(Depth)control_v11f1p_sd15_depth.pth(https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11f1p_sd15_depth.pth)
ControlNet(OpenPose)diffusion_pytorch_model.fp16.safetensors(https://huggingface.co/lllyasviel/control_v11p_sd15_openpose/blob/main/diffusion_pytorch_model.fp16.safetensors)
Depth推定モデルdepth_anything_3_mono_large.safetensors(https://huggingface.co/Comfy-Org/Depth-Anything-3/blob/0012b86d130f20c48cc8b3a592fd5f56d9de8c66/depth_anything_3_mono_large.safetensors)
Pose推定モデルsdpose_wholebody_fp16.safetensors(https://huggingface.co/Comfy-Org/SDPose/blob/main/checkpoints/sdpose_wholebody_fp16.safetensors)

テンプレート一覧からSD1.5のText to Imageが見つからなかったため、第1回と同じように基本ワークフローを白紙から組み直しました。

主な設定は以下の通りです。

  • 画像サイズ:768×432
  • steps:20
  • CFG:7.0
  • sampler:euler
  • scheduler:normal
  • seed:3000/3001

なお、今回の再現性の比較はseed 2種類で行っています。第2回の4案比較よりは少ない条件ですが、ControlNetの有無による差が十分に大きかったため、記事ではこの2seedを中心に紹介します。

まずはControlNetなしで比較用の画像を生成

まずControlNetを使用せず、同じプロンプトでseedだけを変えて生成します。プロンプトは以下の通りです。

Positive:

An editorial illustration of a person standing in side view in a minimal studio space, raising the right arm straight upward, left arm relaxed near the body, one foot slightly forward. A chair is placed in the left foreground, and a floor lamp is placed in the right background. Clear silhouette, clean composition, wide horizontal layout, simplified modern visual style, subtle blue-gray tones, professional business article illustration, no text, no logo, no watermark.

翻訳すると以下のような感じです。

ミニマルなスタジオ空間、横向きに立つ人物、右腕を真っ直ぐ上に伸ばす、左腕は体の近くでリラックス、片足を少し前に出す。左前景に椅子、右背景にフロアランプ。明瞭なシルエット、クリーンな構図、横長レイアウト、シンプルなモダンスタイル、控えめな青灰色トーン、プロフェッショナルなビジネス記事イラスト、テキストなし、ロゴなし、ウォーターマークなし。 

ネガティブプロンプトには、余計な文字列や体の崩れを避けるものを記入しました。

Negative:

text, letters, words, logo, watermark, extra arms, extra legs, extra fingers, deformed hands, cropped body, duplicate objects, cluttered background

こちらで生成した結果が、以下の通りになります。

seed 3000では人物や椅子を含む室内が生成されましたが、人物は指定したように右腕を真上へ上げておらず、家具や背景にも参照画像にはない要素が追加されています。

seedを3001へ変更すると、人物の外見や配置、室内の構成まで大きく変わりました。

プロンプトには「左側に椅子」「右側にランプ」「人物が右腕を上げる」と書いていても、位置関係までは安定していません。

第2回と同様、文章だけでは画像に含めたい要素は指定できても、その配置を固定するのは難しいことが分かります。

Cannyでは輪郭と配置がかなり安定

まず試したのがCannyです。

Cannyは入力画像から物体の境界となるエッジを抽出し、その輪郭情報をControlNetへ渡します。

今回のComfyUIでは「キャニー(canny)」ノードを使用し、低い閾値を0.40、高い閾値を0.80としました。

処理の流れを単純化すると、

参照画像

Cannyで輪郭を抽出

ControlNetへ入力

SD1.5で画像を生成

となります。

ControlNetの強度は1.0、開始0.0、終了1.0としました。

生成結果では、中央の人物、左の椅子、右のランプという配置がかなり明確に維持されました。

人物の右腕を上げたシルエットも残っています。

seedを3001へ変更すると、背景の表現や椅子の色などは変化しました。

一方、人物・椅子・ランプの位置関係は大きく崩れていません

ControlNetなしではseedによって室内全体の構成まで変化していたため、差は分かりやすい結果になりました。

ただし、Cannyが固定するのはあくまで輪郭です。背景の質感や色、細部まで同じ画像になるわけではありません。

強度を下げると、どこまで緩むのか

ControlNetには、参照した構造をどの程度強く反映させるかを決める「強度」があります。強度1.0のまま使えば構図は安定しますが、参照画像の輪郭に縛られすぎて表現の幅が狭くなる可能性もあります。

そこで、seed 3000のまま強度だけを0.5に下げて比較しました。

結果として、椅子と人物シルエットは残ったものの、手は描写されず、長方形の物体になってしまっています。ランプも二本の物体に分かれてしまい、きちんと再現はされませんでした。こうして見ると、「1.0」という強度がよく効いていたことがわかります。

ただ、強度の上げすぎは、プロンプトの影響が弱まったり、画像の崩れが生まれたりするため、出力を見つつ調整するのが効果的です。

全体的に、Cannyは今回の条件では、参照画像のシルエットや物体配置を残したい場合に特に使いやすい方法だと感じました。


Depthでは「空間の構造」を参照できる

次に試したのがDepthです。

Depthでは画像内の各部分がカメラからどの程度離れているかを推定し、奥行きを表すDepth Mapを生成します。

今回のComfyUIでは「Depth Anything 3」のノードが標準で表示されました。

ただし、ノード自体は利用できても推論モデルは入っていなかったため、「depth_anything_3_mono_large.safetensors」を追加して使用しました。

参照画像をDepth Anything 3へ渡すと、人物、椅子、ランプと床面の距離関係を白黒で表した画像が生成されました。

これをSD1.5向けのDepth ControlNetへ入力します。

生成結果では、Cannyと同じく左に椅子、中央に人物、右にランプという構成が維持されました。

ただ、Cannyが輪郭をなぞるように配置を固定するのに対し、Depthでは人物や物体が存在する位置と空間全体のバランスを参照しているような違いがあります。

seedを3001へ変更しても、大きな配置は維持されました。

背景表現は変化していますが、ControlNetなしの結果ほど構図は崩れていません。

今回のようなシンプルな画像ではCannyとの違いは小さく見えますが、Depthは輪郭そのものより、手前・中央・奥といった空間構造を残したい場面に向いていそうです。

OpenPose系では人物の姿勢だけを利用

最後は人物のポーズ制御です。

今回のComfyUIでは従来のOpenPose Preprocessorではなく、「Image to Pose Map(SDPose-OOD)」というBlueprintが利用できました。

SDPose専用のチェックポイントから人物のキーポイントを検出し、その結果をSD1.5向けOpenPose ControlNetへ渡します。

しかし、ここでは少し導入につまずきました。

Pose Map用ノードのチェックポイント一覧には通常のSD1.5モデルも表示されますが、それを選んでも動作しません。人物のキーポイント抽出には専用の「sdpose_wholebody_fp16.safetensors」が必要でした。

さらに、Pose Mapを画像生成へ反映するOpenPose ControlNetは別モデルです。

つまり、

  • SD1.5:完成画像を生成
  • SDPose:参照画像から人物の姿勢を抽出
  • OpenPose ControlNet:抽出した姿勢を生成条件として反映

という3つの役割に分かれます。

生成結果では人物自体は配置され、腕を上げる表現も確認できました。

一方、CannyやDepthほど参照画像全体の構図は維持されません。椅子や照明の位置、背景構成などは大きく変化しました。

seedを変えた場合も、人物の存在は維持されましたが、腕の位置など具体的なポーズや背景にはばらつきがあります。

さらに人物骨格だけを使用し、ControlNetの強度を0.75まで下げた条件も試しました。

人物は自然になったものの、今回狙った「右腕を真上へ上げる」というポーズの再現性はCannyほど高くありませんでした。

少なくとも今回の画像では、OpenPose系はレイアウト全体を固定する手段ではなく、人物の姿勢情報だけを利用したい場合の選択肢と考えた方がよさそうです。

ただ留保として、今回の不安定さが手法固有のものか、前処理の組み合わせによるものかは切り分けていません。大本のチェックポイントモデルが違ったり、前後の条件が違う場合は、やはり実際に出力して試すのがよいでしょう。

モデルを入れればすぐ使える、とは限らなかった

ControlNet自体の考え方は分かりやすいものの、導入ではいくつかつまずく点もありました。

モデル導入時には、ComfyUI Managerから操作してUI上からモデルをダウンロードする予定でしたが、仕様の変更により、右上の「拡張機能を追加」が「カスタムノードマネージャ」になっていました。

そのため、狙ったモデルが入手できず、ファイルを直接ダウンロードして配置しました。

またその際、Desktop版のモデル保存先がAppData配下にあり、Windowsで隠しファイルを表示していなかったため一度場所を見失っています。今回扱ったControlNet周りのモデルは、Comfy-Desktop直下に置かなければなりません。人によって仕様は違いますが、筆者の場合は、

(ユーザー名)\AppData\Local\Comfy-Desktop\ComfyUI-Shared\models\controlnet

に配置することで機能しました。また、同じ.safetensors形式でも、

  • 画像生成用Checkpoint
  • ControlNetモデル
  • Depth推定モデル
  • Pose推定モデル

では配置先や読み込むノードが異なります。

プルダウンにファイル名が表示されても、そのノードと互換性があるとは限りません。

実際、SDPoseへ通常のSD1.5チェックポイントを読み込んだ際にはエラーとなりました。

すべての内部構造を理解してから使う必要はありませんが、「どのノードが、どの種類のモデルを読み込んでいるのか」までは意識した方がトラブルを切り分けやすいと感じました。

ControlNetは「何を固定したいか」で選ぶ

今回、同じ参照画像から3種類のControlNetを試しました。

結果を単純化すると、次のようになります。

方法今回特に維持しやすかった情報
プロンプトのみ指定した要素や雰囲気
Canny輪郭、シルエット、物体配置
Depth奥行き、位置関係、空間構造
OpenPose系人物の姿勢情報

最も分かりやすく効果が出たのはCannyでした。

プロンプトだけではseedによって大きく変わっていた人物・椅子・ランプの配置が、Cannyを追加するとかなり安定しています。

Depthでも空間全体の構成は維持されました。

一方、OpenPose系は今回の条件ではCannyほど安定せず、人物の姿勢情報以外は、ほとんど固定されませんでした。

つまり、ControlNetは「参照画像と同じものを作る機能」ではありません

輪郭を残したいのか、奥行きを残したいのか、人物の姿勢情報だけ使いたいのかによって、入力する構造情報を選ぶ仕組みと考える方が分かりやすそうです。

業務用途に置き換えると、たとえば次のような使い分けになりそうです。

  • 連載記事のアイキャッチを、同じレイアウトで色や質感だけ変えて量産したい→Canny
  • 手前・奥の配置だけ揃えて、描かれる物は変えたい→Depth
  • 人物の姿勢だけ揃えて、服装や背景は変えたい→OpenPose系

第2回ではプロンプトを具体化することで構図を近づけましたが、今回ControlNetを加えると、文章では指定しにくい位置関係を生成工程そのものへ組み込めることが分かりました。

一方で、追加モデルの導入や前処理ノードが増えるため、ワークフローは確実に複雑になります。

現時点では、

プロンプトで内容を指定し、ControlNetで必要な構造だけを固定する

という使い分けが、ComfyUIらしい実務利用に近そうです。


追加したモデルのライセンスも確認

今回は画像生成用のCheckpointに加え、ControlNetモデル、Depth推定モデル、Pose推定モデルを新たに導入しました。第1・2回と同様に、それぞれの配布元とライセンス表示を確認しています。

モデル配布元ライセンス表示
Stable Diffusion v1.5(v1-5-pruned-emaonly)Hugging Face(stable-diffusion-v1-5)CreativeML OpenRAIL-M
ControlNet v1.1 Canny/Depth/OpenPoseHugging Face(lllyasviel/ControlNet-v1-1)openrail
Depth Anything 3(mono_large)Hugging Face(Depth Anything 3: DA3MONO-LARGE)Apache license 2.0
SDPose(sdpose_wholebody_fp16)Hugging Face(SDPose)MIT

今回使用したものの中には同名のシリーズもありますが、シリーズ内でもバリアントごとにライセンスが異なるので、モデルを差し替える際は個別に確認をしたほうがいいでしょう。

また、参照画像は連載内で自分が生成したものを使い、実在人物や既存作品は入力していません。生成結果についても、公開前に既存作品や企業ロゴなどとの類似性が高くないかを確認しました。 


次回はイラスト表現と「同じ世界観」を作れるか検証

今回はControlNetを使い、画像の輪郭、奥行き、人物の姿勢を生成条件として追加しました。

プロンプトだけの場合より構図の再現性を高められる一方、ControlNetごとに保持できる情報は異なり、万能に画像を固定できるわけではありませんでした。

次回は構図だけでなく、複数の画像でイラスト表現や世界観をそろえられるかを試します。

特定の作家や既存キャラクターを再現するのではなく、モデル選定や生成条件を管理しながら、連作として成立する一貫性をどこまで作れるのか検証します。

Share this article コピーしました
WRITTEN BY

PlusWeb3 編集部

Web3・AI専門メディア

PlusWeb3 編集部は、ブロックチェーン・Web3・AIの最新動向をわかりやすくお届けする専門メディアチームです。業界経験豊富な編集者とリサーチャーが、信頼性の高い情報を厳選してお届けします。

コピーしました

Web3・AI・ディープテック領域のキャリアに興味がありますか?

業界特化メディアを運営する専門エージェントが、企業のカルチャー・技術スタック・選考ポイントまで踏まえてキャリアをご提案します。相談は完全無料です。