
ComfyUI の OpenPose Editor を使って、リアルタイムなポーズの変更を、ウェブブラウザで実行します。[※1][※2]
- ※1
- 生成画像は、次のモデルを使用しています:
- ・
- https://civitai.com/models/4468/counterfeit-v30
- ※2
- この動画は、4倍速です。
関連
- ◯
- ComfyUI で画像生成 〜 なぜそこにつなぐのか:ComfyUI, Stable Diffusion
- ◯
- ComfyUI を、クラウドのコンテナに設置する:ComfyUI, Docker, GCP
検証
- ◯
- サーバ
- ・
- クラウド:GCP
- ・
- コンテナ:Docker
- ・
- ホスト:Ubuntu 22.04
- ・
- ゲスト:Ubuntu 22.04
- ◯
- クライアント
- ・
- コンテナ:Docker Desktop
- ・
- ホスト:macOS
- ・
- ゲスト:Ubuntu 22.04
概要
高速生成の LCM LoRA モデルが提供され、画像生成でも、ほぼリアルタイムな描写ができるようになりました。
これを ComfyUI で実行する場合、Krita と連携させることが多いかもしれませんがーーそれだと、Krita の利用が前提になります。
ここでは、ComfyUI の通常の編集画面で使える OpenPose Editor から、リアルタイムなポーズ変更を、ウェブブラウザ上でやってみます。
利用
とはいえ OpenPose Editor には、(ControlNet などが認識した)ポーズ情報を取り込むポートがありませんーーなので、最初に生成画像のポーズ情報を OpenPose Editor に反映させるところは、手動で行います。
まず、次のリポジトリから、ControlNet 向けの画像認識ライブラリ群を取得します:
- ・
- https://github.com/Fannovel16/comfyui_controlnet_aux
$ cd ${directory_project}
$ git clone --depth=1 https://github.com/Fannovel16/comfyui_controlnet_aux
$ mv comfyui_controlnet_aux comfyui_controlnet_aux_ver_${yyyy_mm_dd_nnn}
$ cd ${directory_project}/ComfyUI/custom_nodes
$ ln -s ${directory_project}/comfyui_controlnet_aux_ver_${yyyy_mm_dd_nnn} comfyui_controlnet_aux
生成画像からポーズ情報を得る、ワークフローを作りますーーここで使うポーズ認識のノード(DWPose Estimation)は、認識した情報をワークフロー上に出力します(ブラウザの画面には表示されません):

ポーズ情報の出力を得るため、ComfyUI のヒストリ機能を使いますーーヒストリにアクセスし:
http://<address_server>:<port_target>/history
目的のワークフローのハッシュ化された ID を確かめます(すぐに見つけられるようにするには、画像認識の実行前に、ヒストリをクリアしておきます):
...
{"<hash_workflow>": ...
...
じっさいにアクセスできるかどうか、そのワークフローの ID をヒストリの引数にし、出力してみます:
http://<address_server>:<port_target>/history/<hash_workflow>
このワークフローから、 ポーズ情報(OpenPose の標準形式/JSON形式)を得るためのスクリプトは、次になります(これは、上記のリポジトリのコードを参考にしていますが、すこし修正しています):
- ・
- ${directory_application}/getopp.py
import sys
import json, urllib.request
server_address = sys.argv[1]
prompt_id = sys.argv[2]
def get_history(prompt_id):
with urllib.request.urlopen("http://{}/history/{}".format(server_address, prompt_id)) as response:
return json.loads(response.read())
history = get_history(prompt_id)[prompt_id]
for node_id in history['outputs']:
node_output = history['outputs'][node_id]
if 'openpose_json' in node_output:
sys.stdout.write(node_output['openpose_json'][0])
また OpenPose Editor は独自の形式でポーズ情報を保持するので、OpenPose の標準形式のままでは適用できませんーーなので、標準形式から独自形式に変換します:
- ・
- ${directory_application}/cnvopp.py
import sys
import json
stropp = sys.stdin.read()
dctopp = json.loads(stropp)
wdhcvs = dctopp['canvas_width']
hghcvs = dctopp['canvas_height']
lstopp = dctopp['people'][0]['pose_keypoints_2d']
lstope = []
while lstopp != []:
x = lstopp.pop(0)
y = lstopp.pop(0)
c = lstopp.pop(0)
lstope.append([x,y])
dctope = {'width': wdhcvs, 'height': hghcvs, 'keypoints': [lstope]}
jsnope = json.dumps(dctope)
sys.stdout.write(jsnope)
これらのスクリプトを使い、画像認識のワークフローから、OpenPose Editor のためのポーズ情報を取得します:
$ python ${directory_application}/getopp.py ${address_server}:<port_target> <hash_workflow> | python ${directory_application}/cnvopp.py > /tmp/a.json
取得したポーズ情報を OpenPose Editor に適用することで(出力された JSON ファイルの読み込み)、エディタの OpenPose のボーンが、生成画像のポーズと同じになります:

ここから、リアルタイムに画像を生成します。
オートキューをオンにし、生成を始めますーーOpenPose Editor でポーズを変えていくと、画像の人物のポーズも、連動して変わっていきます:
> extra options: <yes> > batch count: 1 > auto queue: <yes> # 連続生成を開始: > [queue prompt] # 連続生成を停止: > auto queue: <nil>
