Plug-and-Play-ComfyUI-Knotensätze zum Erstellen von ControlNet-Hinweisbildern
„Anime-Stil, ein Protest auf der Straße, Cyberpunk-Stadt, eine Frau mit rosa Haaren und goldenen Augen (schaut den Betrachter an) hält ein Schild mit dem Text „ComfyUI ControlNet Aux“ in Fettschrift, Neonpink“ auf Flux.1 Dev
Der Code wird aus den entsprechenden Ordnern in https://github.com/lllyasviel/ControlNet/tree/main/annotator kopiert und mit dem ? verbunden. Nabe.
Alle Urheber- und Urheberrechte gehen an https://github.com/lllyasviel.
Gehen Sie zur Update-Seite, um Updates zu verfolgen
Installieren Sie ComfyUI Manager und führen Sie die dort beschriebenen Schritte aus, um dieses Repo zu installieren.
Wenn Sie Linux oder ein Nicht-Administratorkonto unter Windows verwenden, sollten Sie sicherstellen, dass /ComfyUI/custom_nodes
und comfyui_controlnet_aux
über Schreibberechtigungen verfügen.
Es gibt jetzt eine install.bat, die Sie ausführen können, um bei Erkennung auf einem tragbaren Gerät zu installieren. Andernfalls wird standardmäßig das System verwendet und davon ausgegangen, dass Sie die manuellen Installationsschritte von ConfyUI befolgt haben.
Wenn Sie install.bat nicht ausführen können (z. B. wenn Sie ein Linux-Benutzer sind). Öffnen Sie CMD/Shell und gehen Sie wie folgt vor:
Navigieren Sie zu Ihrem Ordner /ComfyUI/custom_nodes/
git clone https://github.com/Fannovel16/comfyui_controlnet_aux/
ausführen
Navigieren Sie zu Ihrem Ordner comfyui_controlnet_aux
.
Führen Sie pip install -r requirements.txt
aus
Führen Sie path/to/ComfUI/python_embeded/python.exe -s -m pip install -r requirements.txt
Tragbar/venv:
Mit Systempython
Starten Sie ComfyUI
Bitte beachten Sie, dass dieses Repo nur Präprozessoren unterstützt, die Hinweisbilder erstellen (z. B. Stickman, Canny Edge usw.). Alle Präprozessoren außer Inpaint sind in AIO Aux Preprocessor
Knoten integriert. Mit diesem Knoten können Sie den Präprozessor schnell abrufen, die Schwellenwertparameter eines Präprozessors können jedoch nicht festgelegt werden. Sie müssen seinen Knoten direkt verwenden, um Schwellenwerte festzulegen.
Präprozessorknoten | sd-webui-controlnet/andere | ControlNet/T2I-Adapter |
---|---|---|
Binäre Linien | binär | control_scribble |
Canny Edge | schlau | control_v11p_sd15_canny control_canny t2iadapter_canny |
HED Soft-Edge-Linien | hed | control_v11p_sd15_softedge control_hed |
Standard-Lineart | standard_lineart | control_v11p_sd15_lineart |
Realistische Lineart | lineart (oder lineart_coarse , wenn coarse aktiviert ist) | 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-Linien | mlsd | control_v11p_sd15_mlsd control_mlsd |
PiDiNet Soft-Edge-Linien | pidinet | control_v11p_sd15_softedge control_scribble |
Kritzellinien | kritzeln | control_v11p_sd15_scribble control_scribble |
Kritzeln Sie XDoG-Linien | scribble_xdog | control_v11p_sd15_scribble control_scribble |
Gefälschte Kritzellinien | scribble_hed | control_v11p_sd15_scribble control_scribble |
TEED Soft-Edge-Linien | Tee | controlnet-sd-xl-1.0-softedge-dexined control_v11p_sd15_softedge (Theoretisch) |
PiDiNet-Linien kritzeln | scribble_pidinet | control_v11p_sd15_scribble control_scribble |
AnyLine Lineart | mistoLine_fp16.safetensors mistoLine_rank256 control_v11p_sd15s2_lineart_anime control_v11p_sd15_lineart |
Präprozessorknoten | sd-webui-controlnet/andere | ControlNet/T2I-Adapter |
---|---|---|
MiDaS-Tiefenkarte | (normale) Tiefe | control_v11f1p_sd15_ Depth Kontrolltiefe t2iadapter_ Depth |
LeReS-Tiefenkarte | Depth_leres | control_v11f1p_sd15_ Depth Kontrolltiefe t2iadapter_ Depth |
Zoe-Tiefenkarte | Depth_zoe | control_v11f1p_sd15_ Depth Kontrolltiefe t2iadapter_ Depth |
MiDaS-Normalkarte | normale_map | control_normal |
BAE-Normalkarte | normal_bae | control_v11p_sd15_normalbae |
MeshGraphormer Hand Refiner (HandRefinder) | Tiefe_Hand_Refiner | control_sd15_inpaint_ Depth_hand_fp16 |
Tiefe Alles | tiefe_irgendetwas | Tiefe – alles |
Zoe Depth Alles (Grundsätzlich Zoe, aber der Encoder wird durch DepthAnything ersetzt) | tiefe_irgendetwas | Tiefe – alles |
Normaler DSINE | control_normal/control_v11p_sd15_normalbae | |
Metrische 3D-Tiefe | control_v11f1p_sd15_ Depth Kontrolltiefe t2iadapter_ Depth | |
Metric3D Normal | control_v11p_sd15_normalbae | |
Tiefe Alles V2 | Tiefe – alles |
Präprozessorknoten | sd-webui-controlnet/andere | ControlNet/T2I-Adapter |
---|---|---|
DWPose-Schätzer | dw_openpose_full | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
OpenPose-Schätzer | openpose (detect_body) openpose_hand (detect_body + discover_hand) openpose_faceonly (detect_face) openpose_full (detect_hand + Erkennung_körper + Erkennung_gesicht) | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
MediaPipe-Gesichtsnetz | mediapipe_face | controlnet_sd21_laion_face_v2 |
Tierschätzer | animal_openpose | control_sd15_animal_openpose_fp16 |
Präprozessorknoten | sd-webui-controlnet/andere | ControlNet/T2I-Adapter |
---|---|---|
Unimatch optischer Fluss | DragNUWA |
Dieser Workflow speichert Bilder im Ausgabeordner von ComfyUI (dem gleichen Speicherort wie die Ausgabebilder). Wenn Sie den Knoten Save Pose Keypoints
nicht gefunden haben, aktualisieren Sie diese Erweiterung
Ein Array von JSON im OpenPose-Format, das jedem Frame in einem IMAGE-Stapel entspricht, kann von DWPose und OpenPose mithilfe von app.nodeOutputs
auf der Benutzeroberfläche oder /history
API-Endpunkt abgerufen werden. Die JSON-Ausgabe von AnimalPose verwendet ein ähnliches Format wie 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 }, ... ]
Für Erweiterungsentwickler (z. B. Openpose-Editor):
constposeNodes = app.graph._nodes.filter(node => ["OpenposePreprocessor", "DWPreprocessor", "AnimalPosePreprocessor"].includes(node.type))for (constposeNode ofposeNodes) { const openposeResults = JSON.parse( app.nodeOutputs[poseNode.id].openpose_json[0]) console.log(openposeResults) //Ein Array, das Openpose JSON für jeden Frame enthält}
Für API-Benutzer: Javascript
import fetch from „node-fetch“ //Denken Sie daran, „type“: „module“ zu „package.json“ hinzuzufügen.async function main() { const promptId = '792c1905-ecfe-41f4-8114-83e6a4a09a9f' //Zu faul to POST /queue let History = waiting 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) for (const nodeOutput of nodeOutputs) { const openposeResults = JSON.parse(nodeOutput.openpose_json[0]) console.log(openposeResults) //Ein Array enthält Openpose JSON für jeden Frame }}main()
Python
import json, urllib.requestserver_address = "127.0.0.1:8188"prompt_id = '' #Too lazy to POST /queuedef get_history(prompt_id): with urllib.request.urlopen("http://{}/history/{}" .format(server_address, prompt_id)) als Antwort: return json.loads(response.read())history = get_history(prompt_id)[prompt_id]for o in History['outputs']: for node_id in History['outputs'] : node_output = History['outputs'][node_id] if 'openpose_json' in node_output: print(json.loads(node_output['openpose_json'][0])) #Eine Liste mit Openpose JSON für jeden Frame
Präprozessorknoten | sd-webui-controlnet/andere | ControlNet/T2I-Adapter |
---|---|---|
OneFormer ADE20K Segmentierer | oneformer_ade20k | control_v11p_sd15_seg |
OneFormer COCO-Segmentierer | oneformer_coco | control_v11p_sd15_seg |
UniFormer-Segmentierer | Segmentierung | control_sd15_seg control_v11p_sd15_seg |
Präprozessorknoten | sd-webui-controlnet/andere | ControlNet/T2I-Adapter |
---|---|---|
Farbpalette | Farbe | t2iadapter_color |
Inhaltsmischung | Shuffle | t2iadapter_style |
Präprozessorknoten | sd-webui-controlnet/andere | ControlNet/T2I-Adapter |
---|---|---|
Bildhelligkeit | recolor_luminance | ioclab_sd15_recolor sai_xl_recolor_256lora bdsqlsz_controlllite_xl_recolor_luminance |
Bildintensität | recolor_intensity | Keine Ahnung. Vielleicht dasselbe wie oben? |
Ein Bild sagt mehr als tausend Worte
https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/ExecuteAll.png Eingabebild: https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/comfyui-controlnet-aux-logo. png
Dieses Repo verfügt über einen neuen Mechanismus, der alle benutzerdefinierten Knoten überspringt, die nicht importiert werden können. Wenn Sie auf diesen Fall stoßen, erstellen Sie bitte über die Befehlszeile ein Problem auf der Registerkarte „Probleme“ mit dem Protokoll.
Es gibt zwei Möglichkeiten, DWPose zu beschleunigen: mithilfe von TorchScript-Prüfpunkten (.torchscript.pt), Prüfpunkten oder ONNXRuntime (.onnx). TorchScript ist zwar etwas langsamer als ONNXRuntime, benötigt aber keine zusätzliche Bibliothek und ist immer noch viel schneller als die CPU.
Ein Torchscript-BBox-Detektor ist mit einem ONNX-Posenschätzer kompatibel und umgekehrt.
Stellen Sie bbox_detector
pose_estimator
entsprechend diesem Bild ein. Sie können andere Bbox-Detektor-Endungen mit .torchscript.pt
ausprobieren, um die Bbox-Erkennungszeit zu verkürzen, wenn die Eingabebilder ideal sind.
Wenn onnxruntime erfolgreich installiert wurde und der verwendete Prüfpunkt die Endung .onnx
hat, ersetzt es das standardmäßige cv2-Backend, um die Vorteile der GPU zu nutzen. Beachten Sie, dass diese Methode bei Verwendung einer NVidia-Karte derzeit nur auf CUDA 11.8 (ComfyUI_windows_portable_nvidia_cu118_or_cpu.7z) funktioniert, es sei denn, Sie kompilieren onnxruntime selbst.
Kennen Sie Ihren onnxruntime-Build:
NVidia CUDA 11.x oder unten/AMD GPU: 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
Beachten Sie: Wenn Sie ComfyUI zum ersten Mal verwenden, testen Sie bitte, ob es auf Ihrem Gerät ausgeführt werden kann, bevor Sie die nächsten Schritte ausführen.
Fügen Sie es in requirements.txt
ein
Führen Sie den in der Installation erwähnten Befehl install.bat
oder pip aus
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
dwpose:
bbox_detector: Entweder 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: Entweder hr16/DWPose-TorchScript-BatchSize5/dw-ll_ucoco_384_bs5.torchscript.pt, yzd-v/DWPose/dw-ll_ucoco_384.onnx
animal_pose (ap10k):
bbox_detector: Entweder 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: Entweder hr16/DWPose-TorchScript-BatchSize5/rtmpose-m_ap10k_256_bs5.torchscript.pt, hr16/UnJIT-DWPose/rtmpose-m_ap10k_256.onnx
hed: lllyasviel/Annotators/ControlNetHED.pth
Lesen Sie: lllyasviel/Annotators/res101.pth, lllyasviel/Annotators/latest_net_G.pth
Lineart: 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
Einheitlich: lllyasviel/Annotators/upernet_global_small.pth
zoe: lllyasviel/Annotators/ZoeD_M12_N.pt
Teed: bdsqlsz/qinglong_controlnet-lllite/7_model.pth
Depth_anything: Entweder LiheYoung/Depth-Anything/checkpoints/ Depth_anything_vitl14.pth, LiheYoung/Depth-Anything/checkpoints/ Depth_anything_vitb14.pth oder LiheYoung/Depth-Anything/checkpoints/ Depth_anything_vits14.pth
diffusion_edge: Entweder hr16/Diffusion-Edge/diffusion_edge_indoor.pt, hr16/Diffusion-Edge/diffusion_edge_urban.pt oder hr16/Diffusion-Edge/diffusion_edge_natrual.pt
unimatch: Entweder hr16/Unimatch/gmflow-scale2-regrefine6-mixdata.pth, hr16/Unimatch/gmflow-scale2-mixdata.pth oder hr16/Unimatch/gmflow-scale1-mixdata.pth
zoe_ Depth_anything: Entweder LiheYoung/Depth-Anything/checkpoints_metric_ Depth/ Depth_anything_metric_ Depth_indoor.pt oder LiheYoung/Depth-Anything/checkpoints_metric_ Depth/ Depth_anything_metric_ Depth_outdoor.pt
Vielen Dank für eure Unterstützung. Ich hätte nie gedacht, dass die Grafik für Sterne linear sein würde, lol.