ComfyUIで人物の画像を作っていると、黒い背景に、色の付いた点と線で描かれた「棒人間」を見かけます。肩、肘、手首、膝の位置が分かり、手の先には細い指の線まであります。「この骨組みを動かせば、人物のポーズを指定できるのでは」と思ったら、その理解はかなり近いです。
ComfyUIでは、OpenPose形式のポーズ画像をControlNetに渡すことで、人物を描くときの姿勢を指定できます。写真から姿勢を取り出したり、関節の位置をエディターで調整したりする方法もあります。ただし、生成後の人物を動かすアニメーション用のボーンとは役割が違います。この記事では、長袖の服と長ズボンを着た人物の立ち姿・手を振る姿を例に、導入からノードの配線、手指の調整まで順に説明します。仕組みの基本はComfyUI公式のControlNet解説でも確認できます。
確認・撮影日:2026年11月3日。WindowsのComfyUI 0.28.0/フロントエンド1.45.21で、DWPoseによる抽出、ControlNetあり・なしの人物生成、ブラウザー版エディターの関節操作とPNG・JSONのダウンロードを実施しました。操作画面は実機のキャプチャです。検索・選択・配線・数値入力の途中も掲載し、細部は実画面から切り出しています。参照用の人物画像とアイキャッチは別途作成したAI生成画像です。ComfyUI拡張エディターとの連携手順は、公式READMEと実装を確認した補足です。
今回の実機で確かめた比較:長袖の人物画像から姿勢を取り出し、同じ文章・同じseedでControlNetの強度だけを0と0.8に変えました。0では両手をポケットへ入れ、0.8では入力したポーズに沿って片手を上げる結果になりました。比較画像は設定の節に掲載しています。
黒い背景の棒人間は「ポーズマップ」
色付きの点は関節などの目印、線はそれらのつながりを表します。画像生成では、このような姿勢の情報を画像にしたものを、ポーズマップ、ポーズ画像、ヒント画像などと呼びます。この記事では「ポーズ画像」で統一します。
OpenPoseは、もともと画像から人物の身体・顔・手などのキーポイントを推定する技術です。キーポイントとは、肩や手首のような特徴点のことです。生成AIの説明で「OpenPoseを使う」と言う場合には、その検出器自体に加えて、対応する形式で描かれたポーズ画像を使うことまで含めて呼んでいる場合があります。OpenPoseの公式リポジトリには、身体・顔・手などの推定機能が説明されています。
一方、DWPoseは姿勢を取り出す別の推定器です。ComfyUIではDWPoseで関節を検出し、OpenPose系のControlNetが受け取れるポーズ画像を作る構成も使えます。OpenPoseとDWPoseは、画面に似た棒人間が出ていても、同じプログラムという意味ではありません。DWPoseについては開発元の資料を参照してください。
| 名前 | 担当すること |
|---|---|
| ポーズ画像 | 人物の姿勢を点と線で示した入力画像 |
| DWPoseなどの推定器 | 写真やイラストから関節の位置を読み取る |
| ポーズエディター | 検出した関節を動かし、指定する姿勢を調整する |
| ControlNet | ポーズ画像を、人物を生成する際の条件として反映する |
| アニメーション用のボーン | 用意済みの絵や3Dモデルを、関節に従って変形・移動させる |
入力画像一覧に棒人間が表示されているだけなら、それは読み込んだ画像かもしれません。その表示だけでは、ComfyUI内で検出したのか、外部のエディターで描いたのかまでは分かりません。ノードをたどって、どこから画像が来ているかを見ると区別できます。
最初に用意するもの:生成モデルとControlNetの系列を揃える
まずはComfyUIで通常のテキストから画像生成ができる状態を用意します。モデルを読み込み、短いプロンプトから1枚保存できれば、そこへポーズ制御を追加できます。
必要なのは、人物を描くチェックポイント、姿勢を反映するOpenPose用ControlNetモデル、そしてポーズ画像です。写真からポーズ画像を作る場合には、追加でプリプロセッサーを使います。プリプロセッサーは、生成前の入力を加工するノードです。
ここで最も間違えやすいのが、生成モデルとControlNetの組み合わせです。この記事の基本手順では、配線を追いやすいSD 1.5系チェックポイント+SD 1.5用OpenPose ControlNetを使います。最新の画質を比較してSD 1.5を推奨する、という意味ではありません。
| 人物を描くモデル | 合わせるControlNetの例 | 確認する点 |
|---|---|---|
| SD 1.5系 | control_v11p_sd15_openpose.pth | ファイル名だけでなく、配布元でSD 1.5向けと確認する |
| SDXL系 | xinsir/controlnet-openpose-sdxl-1.0 | SDXL向けモデルと、その配布元の入力条件を使う |
| FLUXなど別系列 | その系列に対応したモデル・ワークフロー | この記事のSD 1.5用モデルをそのまま流用しない |
SD 1.5本体の情報はモデルカード、SD 1.5用OpenPoseモデルはControlNet 1.1の配布ファイル一覧で確認できます。通常のチェックポイントファイルはComfyUI/models/checkpoints/、ControlNetモデルはComfyUI/models/controlnet/へ置きます。外部のモデル保存先を設定している環境では、その設定先を使ってください。
SDXL用の例として挙げたxinsirのモデルカードには、ポーズ画像の線の太さで結果が変わる説明もあります。DWPose側にscale_stick_for_xinsr_cnという設定がある場合も、SD 1.5の説明を機械的に流用せず、対象モデルの案内に合わせてください。
DWPoseとポーズエディターを導入する
ポーズ画像がすでにあるなら、検出ノードは省略できる
黒い背景に関節が描かれたポーズ画像を持っているなら、まずはそれをLoad Imageで読み込み、後述のControlNetへ渡す方法から始められます。完成したポーズ画像を、もう一度DWPoseに読み取らせる必要はありません。
人物写真から姿勢を取り出したい場合は、comfyui_controlnet_auxを追加します。この拡張が提供するのは入力画像を作るためのノードで、人物を生成するチェックポイントやControlNetモデルそのものとは別です。
Managerで追加する手順
- ComfyUIのノード管理画面を開きます。画面の名称や配置は、Desktop版・Portable版・Managerの版によって異なります。
comfyui_controlnet_auxを検索し、Fannovel16のリポジトリに対応する拡張であることを確認してインストールします。- ComfyUIのノードから編集画面を開きたい場合は、
huchenlei/ComfyUI-openpose-editorも追加します。この記事で撮影したブラウザー版を単独で使う場合には、この拡張の追加は不要です。似た名前のエディターと混同しないよう、開発元とURLを照合します。 - 依存ライブラリの導入が終わったらComfyUIを再起動し、ブラウザーの画面も再読み込みします。
- ノード検索で
DWPose Estimator、内部名ではDWPreprocessorが見つかることを確認します。
Managerに拡張が出ない場合は、その拡張のREADMEを確認してください。現行の公式案内ではDesktop版にはManagerが用意され、Portable版では有効化の手順が示されています。古い導入記事の手順を重ねて実行する前に、Managerの公式導入ページで自分の環境に対応する説明を確認すると混乱を減らせます。
Windows Portable版で手動導入する場合
以下は、Gitを導入済みのWindowsで、Portable版のルートフォルダーを開いた場合の例です。そのフォルダー内にpython_embededとComfyUIがあることを確認してください。既に同じ拡張を入れている場合は、重ねてcloneしません。
git -C .\ComfyUI\custom_nodes clone https://github.com/Fannovel16/comfyui_controlnet_aux.git
.\python_embeded\python.exe -s -m pip install -r .\ComfyUI\custom_nodes\comfyui_controlnet_aux\requirements.txt
git -C .\ComfyUI\custom_nodes clone https://github.com/huchenlei/ComfyUI-openpose-editor.git
Pythonの追加ライブラリはComfyUIが使っているPython環境へ入れます。Windowsに別途入れたPythonへインストールしても、Portable版からは見えない場合があります。エディター側の依存関係や導入手順も、その時点のREADMEを優先してください。詳しくはComfyUI公式のカスタムノード導入手順を参照できます。
写真からポーズ画像を取り出す
1.最初は一人・全身・手足が見える画像を選ぶ
練習用には、自分で撮影した写真や、使用許諾を確認した人物画像を使います。長袖シャツと長ズボンを着た一人の人物が正面を向き、両手と両足が画面内に入っている画像なら、検出結果を確認しやすくなります。
最初から腕組み、手を背中へ回す姿、複数人が重なる写真を選ぶと、どの関節が誰のものか分かりにくくなります。ポーズ制御の配線を確かめる段階では、手足が体に隠れない画像を選ぶのが実用的です。
2.空の画面から、9つの操作でポーズ画像を作る
ここでは日本語表示のComfyUIで、画像を読み込む → DWPose Estimator → 画像を保存の3ノードを実際に組み立てます。先に人物を生成するノードを並べる必要はありません。各画像は操作した実画面で、小さな文字や端子が見えるよう一部を拡大して掲載しています。画像をクリックすると元の掲載サイズで開けます。
操作1:空のワークフローを作り、Load Imageを追加する
- 上端のワークフロータブの右にある+を押します。空のワークフローが開きます。
- 背景の何もない場所をダブルクリックします。
- 検索欄に
Load Imageと入力し、日本語表示の画像を読み込むを選びます。 - ノードがカーソルについてくる場合は、置きたい位置で1回クリックして配置を確定します。配置後は、ノード上端のタイトル部分をドラッグすると移動できます。左側へ置いてください。

操作2:参照画像を選び、プレビューを確認する
初めて使う画像は、ノード内のアップロードするファイルを選択を押して選びます。既にComfyUIへ読み込んだ画像なら、その上のファイル名欄をクリックして選び直せます。今回の撮影では、用意済みのarticle-reference-person.pngをリストから選択しました。
画像が多い場合は、開いたリストの検索欄へファイル名の一部を入力します。候補をクリックしたあと、下のプレビューが人物画像に変わることを確認します。ここで選ぶのは色付きの棒人間ではなく、姿勢を読み取りたい人物の画像です。
操作3:DWPose Estimatorを追加する
空いている背景をもう一度ダブルクリックし、DWPoseで検索します。DWPose Estimatorを選んで、画像読み込みノードの右へ置きます。検索結果に別の推定器も出る場合があるので、comfyui_controlnet_auxが付いた候補を確認してください。

操作4:右のIMAGE出力から、左のimage入力へつなぐ
- 画像読み込みノードの右端にある青い丸にマウスを合わせます。画像/IMAGEと書かれた出力です。
- 左ボタンを押したまま、DWPoseの左端の青い丸(image)までドラッグします。
- 入力の丸の上でボタンを離します。

確認:ノード同士を近づけるだけでは接続されません。空白の場所でドラッグを終えると、追加できるノードの検索が開く場合があります。そのときはEscで閉じ、入力の丸を狙ってつなぎ直します。
操作5:検出する部位とモデルを設定する
DWPoseの項目名の右側にある値をクリックします。選択肢が開く項目は候補をクリックして確定し、数値の項目は数値部分をダブルクリックして入力後にEnterで確定します。今回の設定は次のとおりです。
detect_hand:enable。手指を検出します。detect_body:enable。身体の関節を検出します。detect_face:disable。今回は顔の細かな特徴点を描きません。resolution:512。検出側の解像度で、最終生成画像の幅・高さとは別です。bbox_detector:yolox_l.torchscript.pt。pose_estimator:dw-ll_ucoco_384_bs5.torchscript.pt。scale_stick_for_xinsr_cn:disable。今回のSD 1.5用の設定です。


項目名と出力型はDWPoseノードの実装でも確認できます。初回には検出モデルのダウンロードが入る場合があります。画面が進まないときは、実行待ち・モデル取得中・処理中を起動ログで区別してください。
操作6:標準のSave Imageを追加する
背景をダブルクリックしてSave Imageを検索し、標準の画像を保存を選びます。撮影時の検索結果ではSave Image (Advanced)も先頭に出ましたが、ここで使うのは「画像を保存」です。DWPoseの右へ配置します。

操作7:DWPoseの画像出力を保存ノードへつなぐ
DWPoseの右端の青い画像/IMAGE出力から、画像保存ノードの左端の青い画像/images入力へドラッグします。すぐ下のPOSE_KEYPOINTは座標データなので、画像保存用の入力には使いません。

操作8:実行し、保存されたポーズを見る
画面右上の青い実行するを押します。実行が終わると、画像保存ノードに黒背景のポーズ画像が出ます。今回の出力は512×768でした。右上のアクティブジョブが0件になり、肩・肘・手首・膝の位置が入力人物に沿っていることを確認します。

この例ではファイル名プレフィックスを既定のComfyUIにしたため、通常の設定ならComfyUI/output/へComfyUI_連番_.pngとして保存されます。出力先を変更している環境では、その設定先を確認してください。次のControlNetでは、このPNGをLoad Imageで読み込んで使えます。
操作9:組んだワークフローも保存する
画面左上のグラフの右にある下向き矢印を押し、保存を選びます。初回は名前を入力して確認します。撮影ではArticle_05_HandsOn_Poseという名前を付けました。

再開するときは左側のワークフローを開き、保存した名前を選択します。練習用ZIPには、この操作で作った3ノード版を00-hands-on-pose.jsonとして収録しています。
3.人物の絵を作る前に、棒人間を確認する
プレビューで、左右の肩から肘・手首へ線がつながっているか、膝が意図した方向に曲がっているか、手の線が手首付近に収まっているかを見ます。違う位置に手の点が飛んでいる、腕が欠けている、二人分の関節が混ざっている場合は、その入力を直すのが先です。
生成画像が崩れてからプロンプトを足し続けても、入力の関節がずれていれば原因は残ります。ポーズ画像を確認してから人物を生成する順番を守るだけで、調整する場所が分かりやすくなります。
ControlNetへつなぐ:入力画像だけでは姿勢は反映されない
次に、普段の画像生成ワークフローへLoad ControlNet ModelとApply ControlNetを追加します。表示名が異なる場合は、内部名ControlNetLoader、ControlNetApplyAdvancedで探します。ここで使うApplyノードは、positiveとnegativeの両方を入出力できるものです。

検索から2種類のControlNetノードを追加する
背景をダブルクリックしてControlNetで検索します。必要なのはControlNetモデルを読み込むとControlNetを適用の2つです。1個ずつ選択してキャンバスへ置きます。「適用」側はpositiveとnegativeの両方を入力・出力できるノードを使ってください。

まず通常の生成経路を確認する
Load Checkpoint の MODEL → KSampler の model
Load Checkpoint の CLIP → 2個の CLIP Text Encode の clip
Empty Latent Image の LATENT → KSampler の latent_image
KSampler の LATENT → VAE Decode の samples
Load Checkpoint の VAE → VAE Decode の vae
VAE Decode の IMAGE → Save Image の images
2個のCLIP Text Encodeには、描きたい内容を指定するpositiveと、避けたい崩れなどを指定するnegativeをそれぞれ入力します。次に、その出力をControlNet経由にします。
文章の条件とポーズ画像をApply ControlNetへ集める
positive用 CLIP Text Encode → Apply ControlNet の positive
negative用 CLIP Text Encode → Apply ControlNet の negative
Load ControlNet Model → Apply ControlNet の control_net
ポーズ画像の IMAGE → Apply ControlNet の image
Apply ControlNet の positive → KSampler の positive
Apply ControlNet の negative → KSampler の negative

確認:CLIP Text EncodeからKSamplerへ直接入れていた条件は、Apply ControlNetを通るようにつなぎ直します。positiveだけを通してnegativeを元の配線のままにせず、2本とも確認してください。ポーズ画像は青いIMAGE、ControlNetモデルはCONTROL_NETという型の入力へつなぎます。
ポーズ画像の入力元は、DWPose EstimatorのIMAGE出力か、ポーズPNGを読んだLoad ImageのIMAGE出力です。関節の座標データであるPOSE_KEYPOINTを、IMAGE入力へ直接つなぐことはできません。座標データを編集した場合の画像への戻し方は、後のエディターの節で説明します。
Load ControlNet Modelでは、今回の基本例ならcontrol_v11p_sd15_openpose.pthを選びます。CannyやDepthなど、別種のControlNetを選ばないようにしてください。また、CLIP Text EncodeからKSamplerへ直接つながった線が残っていると、意図したControlNetの経路を通らない場合があります。KSamplerのpositive・negativeの入力元を最後に確認します。入出力とパラメーターの説明はApply ControlNetの公式リファレンスにあります。
モデルのファイル名を選ぶ
ControlNetモデルを読み込むノード内のファイル名欄をクリックし、SD 1.5用のOpenPoseモデルを選びます。今回の撮影ではcontrol_v11p_sd15_openpose_fp16.safetensorsを選択しました。リストに出ない場合は、モデルの配置先とComfyUIの再読み込みを確認します。

掲載した画面では、Load CheckpointのVAEをVAE DecodeとApply ControlNetの両方へ分岐しています。このSD 1.5用ApplyノードのVAEは任意入力ですが、使用するControlNetモデルやノードの版によっては接続が必要です。その場合は、同じ生成経路で使うVAEを接続し、モデル作者が示す構成を優先してください。SD 1.5向けの配線図を、異なるモデル系列にそのまま当てはめないことが大切です。
最初の設定値と、結果を見ながら変える順番
以下は、今回のSD 1.5系の比較で実際に使った設定です。人物や画風、モデルによって適切な値は変わるため、固定の正解ではありません。
チェックポイントはrealisticVisionV51_v51VAE.safetensors、ControlNetはcontrol_v11p_sd15_openpose_fp16.safetensorsです。元のモデルについてはRealistic Vision作者のモデルカードとOpenPose用ControlNetのモデルカードを参照できます。検証機ではVAE込みのチェックポイントを使っており、配布版・VAE構成・計算環境が変われば同じseedでも完全一致は保証されません。
| 設定する場所 | 開始例 | 役割 |
|---|---|---|
| Empty Latent Image | 幅512・高さ768・batch_size 1 | 生成サイズ。ポーズ画像も同じ縦横比に揃える |
| Apply ControlNet:strength | 0.8 | 姿勢の条件を反映する強さ |
| Apply ControlNet:start_percent | 0.0 | 制御を始める生成過程の位置 |
| Apply ControlNet:end_percent | 1.0 | 制御を終える生成過程の位置 |
| KSampler:steps / cfg | 24 / 7 | 生成ステップ数と文章の条件の効かせ方 |
| KSampler:sampler / scheduler | euler / normal | 基本動作を比較するための開始例 |
| KSampler:denoise | 1.0 | 空のlatentから新規生成する今回の構成 |
| KSampler:seed | 123456、生成後の制御はfixed | 設定変更の影響を比べやすくする |
start_percentとend_percentの0〜1は、アニメーションの再生時刻ではありません。画像を生成する過程の、どこからどこまで制御を適用するかを指定します。今回の新規生成例では、0.0〜1.0で全体に適用するところから始めます。
数値はダブルクリックして入力し、Enterで確定する
Apply ControlNetの強度の数値部分をダブルクリックすると入力欄が開きます。0.8と入力してEnterで確定します。同じ操作で開始を0、終了を1にします。ノードに表示される数値へ戻ったら、入力した値が反映されたか確認してください。

比較前にシードを固定する
KSamplerのシードを123456に入力したら、その下の生成後の制御をクリックしてfixedを選びます。ここがrandomizeやincrementのままだと、次の実行でシードも変わるため、ControlNetの強度だけを比べにくくなります。

服装と場面は文章で指定する
ポーズ画像に服の種類や背景は入っていません。今回の比較で使ったpositiveは次の文章です。姿勢への影響を見分けるため、手を振る、片手を上げる、といった指定は文章に入れていません。服装と背景は文章、肩・肘・手首の位置はポーズ画像で指定しています。
full body studio photograph of an adult man, 35 years old, wearing an opaque teal long sleeve shirt, dark full length trousers and sneakers, entire body in frame, plain light gray background, natural proportions, professional soft lighting
比較で使ったnegativeも同じ条件で固定しました。前半は肌の露出や下着、子どもの描写を避けるための除外語です。単語を増やせば必ず直るわけではなく、入力ポーズやモデルとの相性も確認します。
nude, naked, shirtless, underwear, child, cropped, out of frame, extra limbs, extra fingers, deformed hands, text, watermark, low quality
椅子に座る人物なら、文章はsitting on a chair, feet resting on the floor, hands resting on the kneesなどへ変え、ポーズ画像も座り姿に合わせます。棒人間が立っているのに文章だけを座り姿へ変更すると、条件が競合します。
比較するときは、同時に何項目も変えない
- seedとプロンプトを固定し、まずstrength 0.8で1枚生成します。
- 同じ条件でstrengthを0にして1枚生成し、姿勢への影響を比較します。
- 制御が弱い場合は、モデル・配線・ポーズ画像が正しいことを確認してからstrength 1.0を試します。
- 拘束が強く見える場合は、strengthを0.6へ下げる、またはend_percentを0.8へ短くする、のどちらか一方を試します。
- 姿勢が決まってから、画風や背景、細部の調整に進みます。
実測:強度0と0.8で比べる


この1組では、ポーズ制御の有無による腕の位置の違いを確認できます。同時に、ズボンの色や服の質感も変わっています。参照画像と顔が一致していないことからも、ポーズ画像だけで人物の同一性や衣装を固定しているわけではないと分かります。手指などの細部は別途目視で確認します。これは1条件の実測例で、すべてのポーズやモデルで同じ成功率を示す比較ではありません。
手を振る位置だけを少し変えたいなら、プロンプトを長くするより、次のエディターで肩・肘・手首の関係を直した方が、変更の意図を伝えやすくなります。
関節を動かす:OpenPose Editorの具体的な使い方
まず、実際に操作・撮影したhuchenleiのブラウザー版OpenPose Editorで、関節を動かす手順を紹介します。続いて、ComfyUIのノードから編集する拡張連携を補足します。元の人物画像、座標を編集できるJSON、ControlNetへ渡すPNGは、役割が異なるため別々に保存しておくと便利です。
編集1:画像と同じ縦横比にする
ブラウザー版を開き、左側のWidthへ512、Heightへ768を入力します。値を確定し、キャンバスのサイズを調整を押します。今回の生成サイズと縦横比を揃える操作です。人物を追加する必要がある場合は、下の人物を追加を使います。

編集2:手首と肘の点を順にドラッグする
- 最初は、画面右側へ下がっている腕の先端の点(手首)を探します。
- その点を左ボタンでつかみ、頭の横へドラッグします。
- 続いて肩と手首の間にある肘の点を、外側へドラッグします。
- 肩→肘→手首の線がつながり、上腕と前腕の長さが極端になっていないか確認します。


小さくて選びにくいときはマウスホイールで拡大します。SpaceまたはFを押しながらドラッグすると表示範囲を移動できます。右クリックはキーポイントを隠す操作なので、通常のドラッグとは使い分けてください。
編集3:PNGとJSONを保存し、ComfyUIへ戻す
- 画像をダウンロードを押し、黒背景のポーズPNGを保存します。
- JSONをダウンロードも押して、後から関節を直すための座標を保存します。撮影時は
pose.pngとpose.jsonがダウンロードフォルダーへ保存されました。同名ファイルがある場合は連番が付きます。 - ComfyUIへ戻り、ControlNetへつながっているLoad Imageのアップロードするファイルを選択から、編集したPNGを選びます。
- Load Imageのプレビューが新しい骨組みに変わり、そのIMAGE出力がApply ControlNetのimageへつながっていることを確認して実行します。
このPNGは既にポーズ画像なので、DWPoseをもう一度通す必要はありません。今回実際にダウンロードしたPNGとJSONは、練習用ZIPへeditor-wave.pngとeditor-wave.jsonとして収録しています。PNGは生成用の入力、JSONは関節を再編集するためのデータ、と使い分けます。
手・顔への対応や操作の詳細は開発元リポジトリで確認できます。以下のComfyUI拡張から開く場合とは、戻すためのボタンやデータの受け渡し方が異なります。
補足:ComfyUI拡張からJSONを編集する経路
次の手順はhuchenlei/ComfyUI-openpose-editorのREADMEと実装に基づく説明です。今回の撮影環境では、この拡張との往復操作は実行していません。
1.DWPoseの関節データをJSONへ保存する
DWPose EstimatorのPOSE_KEYPOINT出力を、Save Pose Keypointsのpose_kps入力へつなぎます。内部名はSavePoseKpsAsJsonFileです。実行すると、ComfyUIのoutputフォルダーに、指定した接頭辞と連番を持つJSONが保存されます。

2.Load Openpose JSONへ読み込んで編集する
- 保存されたJSONをテキストエディターで開き、内容をコピーします。
Load Openpose JSONノードを追加し、json_strの複数行テキスト欄へ内容を貼ります。この実装ではファイル名を入れるのではなく、JSON本文を入れます。- ノードを右クリックして
Open in Openpose Editorを選びます。 - 肩・肘・手首などの点を動かして姿勢を調整します。腕を変えるときは、手首だけを遠くへ引っ張らず、肘の位置と腕の長さのつり合いも見ます。
- 編集を終えたら
Send pose to ControlNetを押し、編集内容をComfyUI側へ戻します。
ここまでの操作はエディターのREADME、JSONの入力欄はノード実装で確認できます。右クリック項目と編集画面を開く処理はフロントエンドの実装にあります。この版は外部の編集ページを読み込む構成なので、オフラインで画面が開かない場合は、その点も確認してください。
3.編集したJSONを画像へ戻してからControlNetへ渡す
Send pose to ControlNetを押しただけで、KSamplerまでの配線が自動完成するわけではありません。Load Openpose JSONの出力は座標データなので、Render Pose JSON (Human)で画像へ変換します。内部名はRenderPeopleKpsです。
Load Openpose JSON の POSE_KEYPOINT
→ Render Pose JSON (Human) の kps
Render Pose JSON (Human) の IMAGE
→ Apply ControlNet の image
→ 分岐して Preview Image の images
Render Pose JSON (Human)にはrender_body、render_hand、render_faceの切り替えがあります。使いたい点が描画されているか、プレビューで確かめてください。編集したJSONは再びSave Pose Keypointsへ、描画した画像はSave Imageへ分岐すると、後から修正するデータと、そのまま入力できる画像を両方残せます。保存・描画ノードの仕様はpose_keypoint_postprocess.pyに記載されています。
手指の点があっても、きれいな手が保証されるわけではない
指の点は、手の位置や曲がり方を伝える助けになります。しかし、画面内で手が小さければ、生成画像の中で表現できる細部も限られます。手が崩れる場合は、まず検出された指の線自体を見て、手首から指先へ不自然な交差がないか確認してください。
練習では、軽く開いた手など、形が読み取りやすい姿から始めます。それでも手だけ崩れる場合は、ポーズの指定と、生成後の手の部分修正を分けて考えます。detect_handを有効にすることと、すべての指が正しく描かれることは同じではありません。
練習用の入力とワークフロー
参照画像・ポーズPNG/JSON・ComfyUIワークフローをまとめてダウンロードできます。モデル本体は含みません。展開後のREADMEに従い、手元のモデル名と入力画像を選び直してください。
ポーズが効かない・形が崩れるときの確認表
| 症状 | 最初に確認すること |
|---|---|
| strengthを変えても姿勢が変わらない | KSamplerのpositive・negativeがApply ControlNetの出力につながっているか。途中のノードが無効化・バイパスされていないか |
| モデルの読み込みや生成時にエラーが出る | SD 1.5、SDXLなどの系列が一致しているか。ログに出た不足ファイルや形状不一致を確認する |
| 棒人間がほとんど出ない | 検出前の人物画像を確認する。既に作ったポーズ画像を推定器へ再入力していないか、人物が小さすぎないか |
| 体が伸びる・頭や足が切れる | ポーズ画像と生成サイズの縦横比を揃える。画像の端に頭や足を寄せすぎず、余白を確保する |
| 座り姿なのに立つ、腕の向きが競合する | ポーズ画像とプロンプトが同じ姿勢を指示しているか。左右反転した素材を混ぜていないか |
| JSONの線をつなげない | POSE_KEYPOINTとIMAGEを混同していないか。Render Pose JSON (Human)を間に入れる |
| 追加した画像が一覧にない・Load Imageが赤くなる | 画像をLoad Imageで選び直す。外部からinputフォルダーへ置いた場合は、ワークフローを保存してブラウザーを再読み込みし、画像一覧を更新する |
| DWPoseが見つからない | 拡張の導入先、ComfyUI用Pythonへの依存関係の導入、起動ログのimportエラー、再起動を順に確認する |
| 動作が重い・メモリー不足になる | batch_sizeを1にし、生成サイズを下げ、使わない追加モデルを外して切り分ける。CPUでの姿勢推定かどうかも確認する |
「効かないからstrengthを上げ続ける」より、モデルの組み合わせ → 配線 → ポーズ画像 → 数値の順で確かめる方が、原因を絞りやすくなります。変更前のワークフローを保存し、一度に一つの条件だけ変えて比較してください。
ポーズ指定と、動かせる人物素材の制作は別の工程
OpenPoseとControlNetで指定できるのは、生成する画像の姿勢です。通常の静止画生成ワークフローからは、人物の絵が1枚出てきます。腕・胴体・脚が編集可能なパーツに分かれたり、3Dのボーンが付いたりするわけではありません。
たとえば、長袖の人物が腕を胴体の前に置いている絵を切り分け、腕だけを横へ動かすとします。元の画像では腕に隠れていた服の部分が描かれていなければ、移動した跡に穴が残ります。これはポーズの指定が弱いからではなく、動かすために必要な面が素材に用意されていないためです。
ゲームや2Dアニメーション用に使う場合は、先に動かす範囲と分割する部位を決め、隠れる面と接合部を備えたパーツを用意します。そのうえでパーツを組み立て、関節を設定して動作を確認します。OpenPoseは、その元になる人物の姿勢を揃える段階で役立つ道具です。
また、ポーズ画像だけでは、同じ人物の顔や服の柄まで固定できません。別の姿勢を生成したときの同一人物らしさや、連続した動画の一貫性は、姿勢の指定とは別に調整する項目です。まずは一人の人物の静止画で、入力した肩・肘・手首・膝の位置がどう反映されるかを確かめるところから始めてみてください。
公開する人物画像を用意するときに
参照用の写真は、自分で撮影したものや、利用条件を確認できるものを使います。チェックポイント、ControlNet、追加ノードの利用条件も、それぞれの配布元で確認してください。完成画像は、服装、手指、意図しない文字などを実物で確認してから掲載します。
この記事の練習例なら、「長袖シャツと長ズボンで立つ人物」のポーズ画像を一つ保存し、seedを固定してControlNetの有無を比べるところまでできれば、仕組みをつかめます。その次に肘や手首を少し動かして、姿勢の変化を自分で指定してみると、文章だけで指示していたときとの違いが分かります。



