Views
No views yet

/ComfyUI/custom_nodes and comfyui_controlnet_aux has write permissions./ComfyUI/custom_nodes/ foldergit clone https://github.com/Fannovel16/comfyui_controlnet_aux/comfyui_controlnet_aux folder
path/to/ComfUI/python_embeded/python.exe -s -m pip install -r requirements.txtpip install -r requirements.txtAIO Aux Preprocessor node.
This node allow you to quickly get the preprocessor but a preprocessor's own threshold parameters won't be able to set.
You need to use its node directly to set thresholds.| Preprocessor Node | sd-webui-controlnet/other | ControlNet/T2I-Adapter |
|---|---|---|
| Binary Lines | binary | control_scribble |
| Canny Edge | canny | control_v11p_sd15_canny control_canny t2iadapter_canny |
| HED Soft-Edge Lines | hed | control_v11p_sd15_softedge control_hed |
| Standard Lineart | standard_lineart | control_v11p_sd15_lineart |
| Realistic Lineart | lineart (or lineart_coarse if coarse is enabled) | control_v11p_sd15_lineart |
| Anime Lineart | lineart_anime | control_v11p_sd15s2_lineart_anime |
| Manga Lineart | lineart_anime_denoise | control_v11p_sd15s2_lineart_anime |
| M-LSD Lines | mlsd | control_v11p_sd15_mlsd control_mlsd |
| PiDiNet Soft-Edge Lines | pidinet | control_v11p_sd15_softedge control_scribble |
| Scribble Lines | scribble | control_v11p_sd15_scribble control_scribble |
| Scribble XDoG Lines | scribble_xdog | control_v11p_sd15_scribble control_scribble |
| Fake Scribble Lines | scribble_hed | control_v11p_sd15_scribble control_scribble |
| TEED Soft-Edge Lines | teed | controlnet-sd-xl-1.0-softedge-dexined control_v11p_sd15_softedge (Theoretically) |
| Scribble PiDiNet Lines | scribble_pidinet | control_v11p_sd15_scribble control_scribble |
| AnyLine Lineart | mistoLine_fp16.safetensors mistoLine_rank256 control_v11p_sd15s2_lineart_anime control_v11p_sd15_lineart |
| Preprocessor Node | sd-webui-controlnet/other | ControlNet/T2I-Adapter |
|---|---|---|
| MiDaS Depth Map | (normal) depth | control_v11f1p_sd15_depth control_depth t2iadapter_depth |
| LeReS Depth Map | depth_leres | control_v11f1p_sd15_depth control_depth t2iadapter_depth |
| Zoe Depth Map | depth_zoe | control_v11f1p_sd15_depth control_depth t2iadapter_depth |
| MiDaS Normal Map | normal_map | control_normal |
| BAE Normal Map | normal_bae | control_v11p_sd15_normalbae |
| MeshGraphormer Hand Refiner (HandRefinder) | depth_hand_refiner | control_sd15_inpaint_depth_hand_fp16 |
| Depth Anything | depth_anything | Depth-Anything |
| Zoe Depth Anything (Basically Zoe but the encoder is replaced with DepthAnything) | depth_anything | Depth-Anything |
| Normal DSINE | control_normal/control_v11p_sd15_normalbae | |
| Metric3D Depth | control_v11f1p_sd15_depth control_depth t2iadapter_depth | |
| Metric3D Normal | control_v11p_sd15_normalbae | |
| Depth Anything V2 | Depth-Anything |
| Preprocessor Node | sd-webui-controlnet/other | ControlNet/T2I-Adapter |
|---|---|---|
| DWPose Estimator | dw_openpose_full | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
| OpenPose Estimator | openpose (detect_body) openpose_hand (detect_body + detect_hand) openpose_faceonly (detect_face) openpose_full (detect_hand + detect_body + detect_face) | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
| MediaPipe Face Mesh | mediapipe_face | controlnet_sd21_laion_face_v2 |
| Animal Estimator | animal_openpose | control_sd15_animal_openpose_fp16 |
| Preprocessor Node | sd-webui-controlnet/other | ControlNet/T2I-Adapter |
|---|---|---|
| Unimatch Optical Flow | DragNUWA |
Save Pose Keypoints node, update this extension

app.nodeOutputs on the UI or /history API endpoint. JSON output from AnimalPose uses a kinda similar format to OpenPose JSON:[
{
"version": "ap10k",
"animals": [
[[x1, y1, 1], [x2, y2, 1],..., [x17, y17, 1]],
[[x1, y1, 1], [x2, y2, 1],..., [x17, y17, 1]],
...
],
"canvas_height": 512,
"canvas_width": 768
},
...
]1const poseNodes = app.graph._nodes.filter(node => ["OpenposePreprocessor", "DWPreprocessor", "AnimalPosePreprocessor"].includes(node.type))
2for (const poseNode of poseNodes) {
3 const openposeResults = JSON.parse(app.nodeOutputs[poseNode.id].openpose_json[0])
4 console.log(openposeResults) //An array containing Openpose JSON for each frame
5}1import fetch from "node-fetch" //Remember to add "type": "module" to "package.json"
2async function main() {
3 const promptId = '792c1905-ecfe-41f4-8114-83e6a4a09a9f' //Too lazy to POST /queue
4 let history = await fetch(`http://127.0.0.1:8188/history/${promptId}`).then(re => re.json())
5 history = history[promptId]
6 const nodeOutputs = Object.values(history.outputs).filter(output => output.openpose_json)
7 for (const nodeOutput of nodeOutputs) {
8 const openposeResults = JSON.parse(nodeOutput.openpose_json[0])
9 console.log(openposeResults) //An array containing Openpose JSON for each frame
10 }
11}
12main()1import json, urllib.request
2
3server_address = "127.0.0.1:8188"
4prompt_id = '' #Too lazy to POST /queue
5
6def get_history(prompt_id):
7 with urllib.request.urlopen("http://{}/history/{}".format(server_address, prompt_id)) as response:
8 return json.loads(response.read())
9
10history = get_history(prompt_id)[prompt_id]
11for o in history['outputs']:
12 for node_id in history['outputs']:
13 node_output = history['outputs'][node_id]
14 if 'openpose_json' in node_output:
15 print(json.loads(node_output['openpose_json'][0])) #An list containing Openpose JSON for each frame| Preprocessor Node | sd-webui-controlnet/other | ControlNet/T2I-Adapter |
|---|---|---|
| OneFormer ADE20K Segmentor | oneformer_ade20k | control_v11p_sd15_seg |
| OneFormer COCO Segmentor | oneformer_coco | control_v11p_sd15_seg |
| UniFormer Segmentor | segmentation | control_sd15_seg control_v11p_sd15_seg |
| Preprocessor Node | sd-webui-controlnet/other | ControlNet/T2I-Adapter |
|---|---|---|
| Color Pallete | color | t2iadapter_color |
| Content Shuffle | shuffle | t2iadapter_style |
| Preprocessor Node | sd-webui-controlnet/other | ControlNet/T2I-Adapter |
|---|---|---|
| Image Luminance | recolor_luminance | ioclab_sd15_recolor sai_xl_recolor_256lora bdsqlsz_controlllite_xl_recolor_luminance |
| Image Intensity | recolor_intensity | Idk. Maybe same as above? |
A picture is worth a thousand words


bbox_detector and pose_estimator according to this picture. You can try other bbox detector endings with .torchscript.pt to reduce bbox detection time if input images are ideal.

.onnx, it will replace default cv2 backend to take advantage of GPU. Note that if you are using NVidia card, this method currently can only works on CUDA 11.8 (ComfyUI_windows_portable_nvidia_cu118_or_cpu.7z) unless you compile onnxruntime yourself.onnxruntime-gpuonnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/onnxruntime-directmlonnxruntime-openvinorequirements.txtinstall.bat or pip command mentioned in Installation