Conjuntos de nodos ComfyUI plug-and-play para crear imágenes de sugerencias de ControlNet
"estilo anime, una protesta en la calle, ciudad cyberpunk, una mujer con cabello rosado y ojos dorados (mirando al espectador) sostiene un cartel con el texto "ComfyUI ControlNet Aux" en negrita, rosa neón" en Flux.1 Dev
El código se copia y pega desde las carpetas respectivas en https://github.com/lllyasviel/ControlNet/tree/main/annotator y se conecta al ? Centro.
Todo el crédito y los derechos de autor van a https://github.com/lllyasviel.
Vaya a la página de actualización para seguir las actualizaciones
Instale ComfyUI Manager y siga los pasos que se indican allí para instalar este repositorio.
Si está ejecutando Linux o una cuenta que no es de administrador en Windows, querrá asegurarse de que /ComfyUI/custom_nodes
y comfyui_controlnet_aux
tengan permisos de escritura.
Ahora hay un install.bat que puede ejecutar para instalarlo en un dispositivo portátil si lo detecta. De lo contrario, se configurará de forma predeterminada como sistema y asumirá que siguió los pasos de instalación manual de ConfyUI.
Si no puede ejecutar install.bat (por ejemplo, es un usuario de Linux). Abra CMD/Shell y haga lo siguiente:
Navegue a su carpeta /ComfyUI/custom_nodes/
Ejecute git clone https://github.com/Fannovel16/comfyui_controlnet_aux/
Navega a tu carpeta comfyui_controlnet_aux
Ejecute pip install -r requirements.txt
Ejecute path/to/ComfUI/python_embeded/python.exe -s -m pip install -r requirements.txt
Portátil/venv:
Con sistema Python
Iniciar cómoda UI
Tenga en cuenta que este repositorio solo admite preprocesadores que crean imágenes de sugerencias (por ejemplo, Stickman, Canny Edge, etc.). Todos los preprocesadores, excepto Inpaint, están integrados en el nodo AIO Aux Preprocessor
. Este nodo le permite obtener rápidamente el preprocesador, pero no se podrán establecer los parámetros de umbral propios del preprocesador. Debe utilizar su nodo directamente para establecer umbrales.
Nodo preprocesador | sd-webui-controlnet/otro | Adaptador ControlNet/T2I |
---|---|---|
Líneas binarias | binario | control_scribble |
Borde astuto | astuto | control_v11p_sd15_canny control_canny t2iadapter_canny |
Líneas de borde suave HED | cabeza | control_v11p_sd15_softedge control_hed |
Lineales estándar | estándar_lineal | control_v11p_sd15_lineart |
Lineales realistas | lineart (o lineart_coarse si está habilitado coarse ) | control_v11p_sd15_lineart |
anime lineal | lineal_anime | control_v11p_sd15s2_lineart_anime |
Manga Lineal | lineart_anime_denoise | control_v11p_sd15s2_lineart_anime |
Líneas M-LSD | mlsd | control_v11p_sd15_mlsd control_mlsd |
Líneas de borde suave PiDiNet | pidinet | control_v11p_sd15_softedge control_scribble |
Líneas de garabato | garabato | control_v11p_sd15_scribble control_scribble |
Garabatear líneas XDoG | garabato_xdog | control_v11p_sd15_scribble control_scribble |
Líneas de garabatos falsas | garabateado | control_v11p_sd15_scribble control_scribble |
Líneas TEED de borde suave | tee | controlnet-sd-xl-1.0-softedge-dexined control_v11p_sd15_softedge (Teóricamente) |
Garabatear líneas PiDiNet | garabato_pidinet | control_v11p_sd15_scribble control_scribble |
Cualquier línea lineal | mistoLine_fp16.safetensores mistoLine_rank256 control_v11p_sd15s2_lineart_anime control_v11p_sd15_lineart |
Nodo preprocesador | sd-webui-controlnet/otro | Adaptador ControlNet/T2I |
---|---|---|
Mapa de profundidad MiDaS | profundidad (normal) | control_v11f1p_sd15_profundidad control_profundidad t2iadapter_profundidad |
Mapa de profundidad LeReS | profundidad_leres | control_v11f1p_sd15_profundidad control_profundidad t2iadapter_profundidad |
Mapa de profundidad de Zoe | profundidad_zoe | control_v11f1p_sd15_profundidad control_profundidad t2iadapter_profundidad |
Mapa Normal MiDaS | mapa_normal | control_normal |
Mapa normal de BAE | normal_bae | control_v11p_sd15_normalbae |
Refinador manual MeshGraphormer (HandRefinder) | profundidad_mano_refinador | control_sd15_inpaint_profundidad_hand_fp16 |
Profundidad Cualquier cosa | profundidad_cualquier cosa | Profundidad-cualquier cosa |
Zoe Profundidad Cualquier cosa (Básicamente Zoe pero el codificador se reemplaza con DepthAnything) | profundidad_cualquier cosa | Profundidad-cualquier cosa |
DSINE normal | control_normal/control_v11p_sd15_normalbae | |
Profundidad métrica 3D | control_v11f1p_sd15_profundidad control_profundidad t2iadapter_profundidad | |
Métrica 3D Normal | control_v11p_sd15_normalbae | |
Profundidad Cualquier cosa V2 | Profundidad-cualquier cosa |
Nodo preprocesador | sd-webui-controlnet/otro | Adaptador ControlNet/T2I |
---|---|---|
Estimador DWPose | dw_openpose_full | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
Estimador OpenPose | openpose (detectar_cuerpo) openpose_hand (detectar_cuerpo + detectar_mano) openpose_faceonly (detectar_cara) openpose_full (detectar_mano + detectar_cuerpo + detectar_cara) | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
Malla frontal MediaPipe | mediapipe_face | controlnet_sd21_laion_face_v2 |
Estimador de animales | animal_openpose | control_sd15_animal_openpose_fp16 |
Nodo preprocesador | sd-webui-controlnet/otro | Adaptador ControlNet/T2I |
---|---|---|
Flujo óptico Unimatch | ArrastrarNUWA |
Este flujo de trabajo guardará las imágenes en la carpeta de salida de ComfyUI (la misma ubicación que las imágenes de salida). Si no ha encontrado el nodo Save Pose Keypoints
, actualice esta extensión
Se puede obtener una matriz de JSON en formato OpenPose correspondiente a cada fotograma en un lote de IMAGEN de DWPose y OpenPose usando app.nodeOutputs
en la interfaz de usuario o en el punto final de la API /history
. La salida JSON de AnimalPose usa un formato similar al de 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 }, ... ]
Para desarrolladores de extensiones (por ejemplo, editor Openpose):
const poseNodes = app.graph._nodes.filter(nodo => ["OpenposePreprocessor", "DWPreprocessor", "AnimalPosePreprocessor"].includes(node.type))for (const poseNode de poseNodes) { const openposeResults = JSON.parse( app.nodeOutputs[poseNode.id].openpose_json[0]) console.log(openposeResults) //Una matriz que contiene Openpose JSON para cada cuadro}
Para usuarios de API: Javascript
importar buscar desde "node-fetch" //Recuerde agregar "type": "module" a "package.json"async function main() { const PromptId = '792c1905-ecfe-41f4-8114-83e6a4a09a9f' //Demasiado vago para POST /cola dejar historial = esperar fetch(`http://127.0.0.1:8188/history/${promptId}`).luego(re => re.json()) historial = historial[promptId] const nodeOutputs = Object.values(history.outputs) .filter(salida => salida.openpose_json) para (const nodeOutput de nodeOutputs) { const openposeResults = JSON.parse(nodeOutput.openpose_json[0]) console.log(openposeResults) //Una matriz que contiene Openpose JSON para cada fotograma }}main()
Pitón
import json, urllib.requestserver_address = "127.0.0.1:8188"prompt_id = '' #Demasiado vago para POST /queuedef get_history(prompt_id): con urllib.request.urlopen("http://{}/history/{}" .format(server_address, Prompt_id)) como respuesta: devolver json.loads(response.read())history = get_history(prompt_id)[prompt_id]for o en el historial['outputs']: para node_id en el historial['outputs']: node_output = historial['outputs'][node_id] si 'openpose_json' en node_output: print(json.loads(node_output['openpose_json'][0])) #Una lista que contiene Openpose JSON para cada cuadro
Nodo preprocesador | sd-webui-controlnet/otro | Adaptador ControlNet/T2I |
---|---|---|
OneFormer ADE20K Segmentador | oneformer_ade20k | control_v11p_sd15_seg |
OneEx Segmentador de COCO | oneformer_coco | control_v11p_sd15_seg |
Segmentador UniFormer | segmentación | control_sd15_seg control_v11p_sd15_seg |
Nodo preprocesador | sd-webui-controlnet/otro | Adaptador ControlNet/T2I |
---|---|---|
Paleta de colores | color | t2iadapter_color |
Mezcla de contenido | barajar | t2iadapter_style |
Nodo preprocesador | sd-webui-controlnet/otro | Adaptador ControlNet/T2I |
---|---|---|
Luminancia de la imagen | recolor_luminancia | ioclab_sd15_recolor sai_xl_recolor_256lora bdsqlsz_controlllite_xl_recolor_luminance |
Intensidad de la imagen | recolor_intensidad | No sé. ¿Quizás lo mismo que el anterior? |
Una imagen vale más que mil palabras.
https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/ExecuteAll.png Imagen de entrada: https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/comfyui-controlnet-aux-logo. png
Este repositorio tiene un nuevo mecanismo que omitirá cualquier nodo personalizado que no se pueda importar. Si se encuentra con este caso, cree un problema en la pestaña Problemas con el registro desde la línea de comando.
Hay dos formas de acelerar DWPose: utilizando puntos de control de TorchScript (.torchscript.pt) u ONNXRuntime (.onnx). La forma TorchScript es un poco más lenta que ONNXRuntime pero no requiere ninguna biblioteca adicional y aún así es mucho más rápida que la CPU.
Un detector torchscript bbox es compatible con un estimador de pose onnx y viceversa.
Configure bbox_detector
y pose_estimator
de acuerdo con esta imagen. Puede probar otras terminaciones del detector de bbox con .torchscript.pt
para reducir el tiempo de detección de bbox si las imágenes de entrada son ideales.
Si onnxruntime se instala correctamente y el punto de control utilizado termina en .onnx
, reemplazará el backend cv2 predeterminado para aprovechar la GPU. Tenga en cuenta que si está utilizando una tarjeta NVidia, este método actualmente solo puede funcionar en CUDA 11.8 (ComfyUI_windows_portable_nvidia_cu118_or_cpu.7z) a menos que compile onnxruntime usted mismo.
Conozca su compilación onnxruntime:
NVidia CUDA 11.x o inferior/GPU AMD: onnxruntime-gpu
NVidia CUDA 12.x: onnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/
DirectML: onnxruntime-directml
OpenVINO: onnxruntime-openvino
Tenga en cuenta que si es la primera vez que usa ComfyUI, pruebe si puede ejecutarse en su dispositivo antes de realizar los siguientes pasos.
Agréguelo a requirements.txt
Ejecute el comando install.bat
o pip mencionado en Instalación
anime_face_segment: bdsqlsz/qinglong_controlnet-lllite/Annotators/UNet.pth, anime-seg/isnetis.ckpt
denso: LayerNorm/DensePose-TorchScript-con-imagen-pista/densepose_r50_fpn_dl.torchscript
desechar:
bbox_detector: Ya sea yzd-v/DWPose/yolox_l.onnx, hr16/yolox-onnx/yolox_l.torchscript.pt, hr16/yolo-nas-fp16/yolo_nas_l_fp16.onnx, hr16/yolo-nas-fp16/yolo_nas_m_fp16.onnx, hr16/yolo-nas-fp16/yolo_nas_s_fp16.onnx
pose_estimator: Ya sea hr16/DWPose-TorchScript-BatchSize5/dw-ll_ucoco_384_bs5.torchscript.pt, yzd-v/DWPose/dw-ll_ucoco_384.onnx
pose_animal (ap10k):
bbox_detector: Ya sea yzd-v/DWPose/yolox_l.onnx, hr16/yolox-onnx/yolox_l.torchscript.pt, hr16/yolo-nas-fp16/yolo_nas_l_fp16.onnx, hr16/yolo-nas-fp16/yolo_nas_m_fp16.onnx, hr16/yolo-nas-fp16/yolo_nas_s_fp16.onnx
pose_estimator: Ya sea hr16/DWPose-TorchScript-BatchSize5/rtmpose-m_ap10k_256_bs5.torchscript.pt, hr16/UnJIT-DWPose/rtmpose-m_ap10k_256.onnx
hed: lllyasviel/Annotators/ControlNetHED.pth
archivos: lllyasviel/Annotators/res101.pth, lllyasviel/Annotators/latest_net_G.pth
arte lineal: lllyasviel/Annotators/sk_model.pth, lllyasviel/Annotators/sk_model2.pth
lineart_anime: lllyasviel/Annotators/netG.pth
manga_line: lllyasviel/Annotators/erika.pth
mesh_graphormer: hr16/ControlNet-HandRefiner-pruned/graphormer_hand_state_dict.bin, hr16/ControlNet-HandRefiner-pruned/hrnetv2_w64_imagenet_pretrained.pth
midas: lllyasviel/Annotators/dpt_hybrid-midas-501f0c75.pt
mlsd: lllyasviel/Annotators/mlsd_large_512_fp32.pth
normalbae: lllyasviel/Annotators/scannet.pt
oneformer: lllyasviel/Annotators/250_16_swin_l_oneformer_ade20k_160k.pth
open_pose: lllyasviel/Annotators/body_pose_model.pth, lllyasviel/Annotators/hand_pose_model.pth, lllyasviel/Annotators/facenet.pth
pidi: lllyasviel/Annotators/table5_pidinet.pth
Sam: dhkim2810/MobileSAM/mobile_sam.pt
uniformador: lllyasviel/Annotators/upernet_global_small.pth
zoe: lllyasviel/Annotators/ZoeD_M12_N.pt
teed: bdsqlsz/qinglong_controlnet-lllite/7_model.pth
profundidad_cualquier cosa: Ya sea LiheYoung/Depth-Anything/checkpoints/profundidad_cualquier cosa_vitl14.pth, LiheYoung/Depth-Anything/checkpoints/profundidad_cualquier cosa_vitb14.pth o LiheYoung/Depth-Anything/checkpoints/profundidad_cualquier cosa_vits14.pth
diffusion_edge: Ya sea hr16/Diffusion-Edge/diffusion_edge_indoor.pt, hr16/Diffusion-Edge/diffusion_edge_urban.pt o hr16/Diffusion-Edge/diffusion_edge_natrual.pt
unimatch: Ya sea hr16/Unimatch/gmflow-scale2-regrefine6-mixdata.pth, hr16/Unimatch/gmflow-scale2-mixdata.pth o hr16/Unimatch/gmflow-scale1-mixdata.pth
zoe_profundidad_cualquier cosa: LiheYoung/Depth-Anything/checkpoints_metric_profundidad/profundidad_cualquier cosa_métrica_profundidad_indoor.pt o LiheYoung/Depth-Anything/checkpoints_metric_profundidad/profundidad_cualquier cosa_metric_profundidad_outdoor.pt
Gracias por su apoyo. Nunca pensé que la gráfica de las estrellas sería lineal jajaja.