Ensembles de nœuds ComfyUI plug-and-play pour créer des images d'indices ControlNet
"style anime, une manifestation dans la rue, ville cyberpunk, une femme aux cheveux roses et aux yeux dorés (regardant le spectateur) tient une pancarte avec le texte "ComfyUI ControlNet Aux" en gras, rose fluo" sur Flux.1 Dev
Le code est copié-collé à partir des dossiers respectifs sur https://github.com/lllyasviel/ControlNet/tree/main/annotator et connecté au ? Moyeu.
Tous les crédits et droits d'auteur vont à https://github.com/lllyasviel.
Accédez à la page Mise à jour pour suivre les mises à jour
Installez ComfyUI Manager et suivez les étapes qui y sont présentées pour installer ce dépôt.
Si vous utilisez Linux ou un compte non-administrateur sous Windows, vous devez vous assurer que /ComfyUI/custom_nodes
et comfyui_controlnet_aux
disposent des autorisations d'écriture.
Il existe maintenant un install.bat que vous pouvez exécuter pour l'installer sur un ordinateur portable s'il est détecté. Sinon, il sera par défaut système et supposera que vous avez suivi les étapes d'installation manuelle de ConfyUI.
Si vous ne pouvez pas exécuter install.bat (par exemple, vous êtes un utilisateur Linux). Ouvrez le CMD/Shell et procédez comme suit :
Accédez à votre dossier /ComfyUI/custom_nodes/
Exécutez git clone https://github.com/Fannovel16/comfyui_controlnet_aux/
Accédez à votre dossier comfyui_controlnet_aux
Exécutez pip install -r requirements.txt
Exécutez path/to/ComfUI/python_embeded/python.exe -s -m pip install -r requirements.txt
Portable/venv :
Avec le système python
Démarrer ComfyUI
Veuillez noter que ce référentiel ne prend en charge que les préprocesseurs créant des images d'indices (par exemple Stickman, Canny Edge, etc.). Tous les préprocesseurs, à l'exception d'Inpaint, sont intégrés dans le nœud AIO Aux Preprocessor
. Ce nœud vous permet d'obtenir rapidement le préprocesseur, mais les paramètres de seuil d'un préprocesseur ne pourront pas être définis. Vous devez utiliser son nœud directement pour définir des seuils.
Nœud de préprocesseur | sd-webui-controlnet/autre | Adaptateur ControlNet/T2I |
---|---|---|
Lignes binaires | binaire | contrôle_scribble |
Bord astucieux | prudent | control_v11p_sd15_canny contrôle_canny t2iadapter_canny |
Lignes HED Soft-Edge | il avait | control_v11p_sd15_softedge contrôle_hed |
Linéaire standard | standard_linéaire | control_v11p_sd15_lineart |
Linéaire réaliste | Lineart (ou lineart_coarse si coarse est activé) | control_v11p_sd15_lineart |
Anime Linéaire | linéaire_anime | control_v11p_sd15s2_lineart_anime |
Manga Linéaire | Lineart_anime_denoise | control_v11p_sd15s2_lineart_anime |
Lignes M-LSD | mlsd | control_v11p_sd15_mlsd contrôle_mlsd |
Lignes PiDiNet Soft-Edge | pidinet | control_v11p_sd15_softedge contrôle_scribble |
Lignes de gribouillage | griffonner | control_v11p_sd15_scribble contrôle_scribble |
Griffonner des lignes XDoG | scribble_xdog | control_v11p_sd15_scribble contrôle_scribble |
Fausses lignes de gribouillage | gribouillis_hed | control_v11p_sd15_scribble contrôle_scribble |
Lignes TEED à bords souples | tee-shirt | controlnet-sd-xl-1.0-softedge-dexined control_v11p_sd15_softedge (Théoriquement) |
Gribouillez les lignes PiDiNet | scribble_pidinet | control_v11p_sd15_scribble contrôle_scribble |
AnyLine Linéaire | mistoLine_fp16.safetensors mistoLine_rank256 control_v11p_sd15s2_lineart_anime control_v11p_sd15_lineart |
Nœud de préprocesseur | sd-webui-controlnet/autre | Adaptateur ControlNet/T2I |
---|---|---|
Carte de profondeur MiDaS | profondeur (normale) | control_v11f1p_sd15_profondeur contrôle_profondeur t2iadaptateur_profondeur |
Carte de profondeur LeReS | profondeur_leres | control_v11f1p_sd15_profondeur contrôle_profondeur t2iadaptateur_profondeur |
Carte de profondeur de Zoé | profondeur_zoé | control_v11f1p_sd15_profondeur contrôle_profondeur t2iadaptateur_profondeur |
Carte normale MiDaS | carte_normale | contrôle_normal |
Carte normale BAE | normal_bae | control_v11p_sd15_normalbae |
Affineur manuel MeshGraphormer (HandRefinder) | profondeur_hand_refiner | control_sd15_inpaint_profondeur_hand_fp16 |
Profondeur n'importe quoi | profondeur_n'importe quoi | Profondeur-Tout |
Zoé Profondeur N'importe Quoi (En gros Zoe mais l'encodeur est remplacé par DepthAnything) | profondeur_n'importe quoi | Profondeur-Tout |
DSINE normal | control_normal/control_v11p_sd15_normalbae | |
Profondeur Metric3D | control_v11f1p_sd15_profondeur contrôle_profondeur t2iadaptateur_profondeur | |
Métrique3D Normal | control_v11p_sd15_normalbae | |
Profondeur n'importe quoi V2 | Profondeur-n'importe quoi |
Nœud de préprocesseur | sd-webui-controlnet/autre | Adaptateur ControlNet/T2I |
---|---|---|
Estimateur DWPose | dw_openpose_full | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
Estimateur OpenPose | openpose (détect_body) openpose_hand (detect_body + detect_hand) openpose_faceonly (détect_face) openpose_full (detect_hand + detect_body + detect_face) | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
Maille faciale MediaPipe | mediapipe_face | controlnet_sd21_laion_face_v2 |
Estimateur d'animaux | animal_openpose | control_sd15_animal_openpose_fp16 |
Nœud de préprocesseur | sd-webui-controlnet/autre | Adaptateur ControlNet/T2I |
---|---|---|
Flux optique Unimatch | Faites glisserNUWA |
Ce flux de travail enregistrera les images dans le dossier de sortie de ComfyUI (le même emplacement que les images de sortie). Si vous n'avez pas trouvé le nœud Save Pose Keypoints
, mettez à jour cette extension
Un tableau de JSON au format OpenPose correspondant à chaque image d'un lot IMAGE peut être obtenu à partir de DWPose et OpenPose à l'aide de app.nodeOutputs
sur le point de terminaison de l'interface utilisateur ou de l'API /history
. La sortie JSON d'AnimalPose utilise un format un peu similaire à 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 }, ... ]
Pour les développeurs d'extensions (par exemple l'éditeur Openpose) :
const poseNodes = app.graph._nodes.filter(node => ["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) //Un tableau contenant Openpose JSON pour chaque image}
Pour les utilisateurs d'API : Javascript
import fetch from "node-fetch" //N'oubliez pas d'ajouter "type": "module" à "package.json"async function main() { const promptId = '792c1905-ecfe-41f4-8114-83e6a4a09a9f' //Trop paresseux pour POST/file d'attente, laissez l'historique = attendre fetch(`http://127.0.0.1:8188/history/${promptId}`).then(re => re.json()) history = history[promptId] const nodeOutputs = Object.values(history.outputs) .filter(output => output.openpose_json) pour (const nodeOutput de nodeOutputs) { const openposeResults = JSON.parse(nodeOutput.openpose_json[0]) console.log(openposeResults) //Un tableau contenant Openpose JSON pour chaque image }}main()
Python
import json, urllib.requestserver_address = "127.0.0.1:8188"prompt_id = '' #Trop paresseux pour POST /queuedef get_history(prompt_id) : avec urllib.request.urlopen("http://{}/history/{}" .format(server_address, prompt_id)) comme réponse : return json.loads(response.read())history = get_history(prompt_id)[prompt_id]pour o dans l'historique['outputs'] : pour node_id dans l'historique['outputs'] : node_output = history['outputs'][node_id] si 'openpose_json' dans node_output : print(json.loads(node_output['openpose_json'][0])) #Une liste contenant Openpose JSON pour chaque image
Nœud de préprocesseur | sd-webui-controlnet/autre | Adaptateur ControlNet/T2I |
---|---|---|
Segmenteur OneFormer ADE20K | oneformer_ade20k | control_v11p_sd15_seg |
Segmenteur OneFormer COCO | oneformer_coco | control_v11p_sd15_seg |
Segmenteur UniFormer | segmentation | control_sd15_seg control_v11p_sd15_seg |
Nœud de préprocesseur | sd-webui-controlnet/autre | Adaptateur ControlNet/T2I |
---|---|---|
Palette de couleurs | couleur | t2iadapter_color |
Mélange de contenu | mélanger | t2iadapter_style |
Nœud de préprocesseur | sd-webui-controlnet/autre | Adaptateur ControlNet/T2I |
---|---|---|
Luminance des images | recolor_luminance | ioclab_sd15_recolor sai_xl_recolor_256lora bdsqlsz_controlllite_xl_recolor_luminance |
Intensité de l'image | recolor_intensité | Je ne sais pas. Peut-être comme ci-dessus ? |
Une image vaut mille mots
https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/ExecuteAll.png Image d'entrée : https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/comfyui-controlnet-aux-logo. png
Ce référentiel dispose d'un nouveau mécanisme qui ignorera tout nœud personnalisé ne pouvant être importé. Si vous rencontrez ce cas, veuillez créer un problème dans l'onglet Problèmes avec le journal de la ligne de commande.
Il existe deux façons d'accélérer DWPose : en utilisant les points de contrôle TorchScript (.torchscript.pt) ou ONNXRuntime (.onnx). La méthode TorchScript est un peu plus lente que ONNXRuntime mais ne nécessite aucune bibliothèque supplémentaire et reste bien plus rapide que le CPU.
Un détecteur bbox torchscript est compatible avec un estimateur de pose onnx et vice versa.
Définissez bbox_detector
et pose_estimator
en fonction de cette image. Vous pouvez essayer d'autres terminaisons de détecteur de bbox avec .torchscript.pt
pour réduire le temps de détection de bbox si les images d'entrée sont idéales.
Si onnxruntime est installé avec succès et que le point de contrôle utilisé se termine par .onnx
, il remplacera le backend cv2 par défaut pour tirer parti du GPU. Notez que si vous utilisez une carte NVidia, cette méthode ne peut actuellement fonctionner que sur CUDA 11.8 (ComfyUI_windows_portable_nvidia_cu118_or_cpu.7z), sauf si vous compilez vous-même onnxruntime.
Connaissez votre build onnxruntime :
NVidia CUDA 11.x ou ci-dessous/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
Notez que si c'est la première fois que vous utilisez ComfyUI, veuillez tester s'il peut s'exécuter sur votre appareil avant de passer aux étapes suivantes.
Ajoutez-le dans requirements.txt
Exécutez la commande install.bat
ou pip mentionnée dans l'installation
anime_face_segment : bdsqlsz/qinglong_controlnet-lllite/Annotators/UNet.pth, anime-seg/isnetis.ckpt
densepose : LayerNorm/DensePose-TorchScript-with-hint-image/densepose_r50_fpn_dl.torchscript
pose :
bbox_detector : Soit 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 : Soit hr16/DWPose-TorchScript-BatchSize5/dw-ll_ucoco_384_bs5.torchscript.pt, yzd-v/DWPose/dw-ll_ucoco_384.onnx
animal_pose (ap10k) :
bbox_detector : Soit 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 : Soit hr16/DWPose-TorchScript-BatchSize5/rtmpose-m_ap10k_256_bs5.torchscript.pt, hr16/UnJIT-DWPose/rtmpose-m_ap10k_256.onnx
hed : lllyasviel/Annotators/ControlNetHED.pth
fichiers : lllyasviel/Annotators/res101.pth, lllyasviel/Annotators/latest_net_G.pth
linéaire : 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
uniforme : lllyasviel/Annotators/upernet_global_small.pth
zoé : lllyasviel/Annotators/ZoeD_M12_N.pt
teed : bdsqlsz/qinglong_controlnet-lllite/7_model.pth
deep_anything : Soit LiheYoung/Depth-Anything/checkpoints/degree_anything_vitl14.pth, LiheYoung/Depth-Anything/checkpoints/third_anything_vitb14.pth ou LiheYoung/Depth-Anything/checkpoints/third_anything_vits14.pth
diffusion_edge : Soit hr16/Diffusion-Edge/diffusion_edge_indoor.pt, hr16/Diffusion-Edge/diffusion_edge_urban.pt ou hr16/Diffusion-Edge/diffusion_edge_natrual.pt
unimatch : soit hr16/Unimatch/gmflow-scale2-regrefine6-mixdata.pth, hr16/Unimatch/gmflow-scale2-mixdata.pth ou hr16/Unimatch/gmflow-scale1-mixdata.pth
zoe_approfondissement_anything : Soit LiheYoung/Depth-Anything/checkpoints_metric_degree/third_anything_metric_third_indoor.pt, soit LiheYoung/Depth-Anything/checkpoints_metric_owned/third_anything_metric_third_outdoor.pt
Merci pour votre soutien. Je n'aurais jamais pensé que le graphique des étoiles serait linéaire mdr.