Conjuntos de nós ComfyUI plug-and-play para criar imagens de dicas do ControlNet
"estilo anime, um protesto na rua, cidade cyberpunk, uma mulher de cabelo rosa e olhos dourados (olhando para o espectador) está segurando uma placa com o texto" ComfyUI ControlNet Aux "em negrito, rosa neon" no Flux.1 Dev
O código é copiado e colado das respectivas pastas em https://github.com/lllyasviel/ControlNet/tree/main/annotator e conectado ao ? Eixo.
Todos os créditos e direitos autorais vão para https://github.com/lllyasviel.
Vá para a página de atualização para acompanhar as atualizações
Instale o ComfyUI Manager e siga as etapas apresentadas lá para instalar este repositório.
Se você estiver executando no Linux ou em uma conta não administrativa no Windows, certifique-se de que /ComfyUI/custom_nodes
e comfyui_controlnet_aux
tenham permissões de gravação.
Agora existe um install.bat que você pode executar para instalar no portátil, se detectado. Caso contrário, o padrão será o sistema e assumirá que você seguiu as etapas de instalação manual do ConfyUI.
Se você não consegue executar install.bat (por exemplo, você é um usuário Linux). Abra o CMD/Shell e faça o seguinte:
Navegue até sua pasta /ComfyUI/custom_nodes/
Execute git clone https://github.com/Fannovel16/comfyui_controlnet_aux/
Navegue até sua pasta comfyui_controlnet_aux
Execute pip install -r requirements.txt
Execute path/to/ComfUI/python_embeded/python.exe -s -m pip install -r requirements.txt
Portátil/venv:
Com sistema python
Inicie o ComfyUI
Observe que este repositório suporta apenas pré-processadores que criam imagens de dicas (por exemplo, stickman, astuto edge, etc). Todos os pré-processadores, exceto o Inpaint, são integrados ao nó AIO Aux Preprocessor
. Este nó permite que você obtenha rapidamente o pré-processador, mas os parâmetros de limite do próprio pré-processador não poderão ser definidos. Você precisa usar seu nó diretamente para definir limites.
Nó pré-processador | sd-webui-controlnet/outro | Adaptador ControlNet/T2I |
---|---|---|
Linhas Binárias | binário | control_scribble |
Canny Edge | astuto | control_v11p_sd15_canny control_canny t2iadapter_canny |
Linhas de borda suave HED | ele | control_v11p_sd15_softedge control_hed |
Linear padrão | padrão_lineart | control_v11p_sd15_lineart |
Linear realista | lineart (ou lineart_coarse se coarse estiver habilitado) | control_v11p_sd15_lineart |
Arte Linear de Anime | lineart_anime | control_v11p_sd15s2_lineart_anime |
Arte Linear do Mangá | lineart_anime_denoise | control_v11p_sd15s2_lineart_anime |
Linhas M-LSD | mlsd | control_v11p_sd15_mlsd control_mlsd |
Linhas de borda suave PiDiNet | pidinet | control_v11p_sd15_softedge control_scribble |
Linhas de rabisco | rabisco | control_v11p_sd15_scribble control_scribble |
Rabiscar linhas XDoG | scribble_xdog | control_v11p_sd15_scribble control_scribble |
Linhas de rabiscos falsos | scribble_hed | control_v11p_sd15_scribble control_scribble |
Linhas de borda suave TEED | teed | controlnet-sd-xl-1.0-softedge-dexinado control_v11p_sd15_softedge (teoricamente) |
Rabiscar linhas PiDiNet | scribble_pidinet | control_v11p_sd15_scribble control_scribble |
Linha Linear AnyLine | mistoLine_fp16.safetensors mistoLine_rank256 control_v11p_sd15s2_lineart_anime control_v11p_sd15_lineart |
Nó pré-processador | sd-webui-controlnet/outro | Adaptador ControlNet/T2I |
---|---|---|
Mapa de profundidade MiDaS | profundidade (normal) | control_v11f1p_sd15_profundidade control_profundidade t2iadapter_profundidade |
Mapa de profundidade LeReS | profundidade_leres | control_v11f1p_sd15_profundidade control_profundidade t2iadapter_profundidade |
Mapa de profundidade de Zoe | profundidade_zoe | control_v11f1p_sd15_profundidade control_profundidade t2iadapter_profundidade |
Mapa Normal MiDaS | mapa_normal | controle_normal |
Mapa Normal BAE | normal_bae | control_v11p_sd15_normalbae |
Refinador manual MeshGraphormer (HandRefinder) | profundidade_hand_refiner | control_sd15_inpaint_profundidade_hand_fp16 |
Profundidade Qualquer coisa | profundidade_qualquer coisa | Profundidade-Qualquer coisa |
Zoe Profundidade Qualquer coisa (Basicamente Zoe, mas o codificador foi substituído por DepthAnything) | profundidade_qualquer coisa | Profundidade-Qualquer coisa |
DSINE normal | control_normal/control_v11p_sd15_normalbae | |
Profundidade Métrica3D | control_v11f1p_sd15_profundidade control_profundidade t2iadapter_profundidade | |
Métrica3D Normal | control_v11p_sd15_normalbae | |
Profundidade Qualquer coisa V2 | Profundidade-Qualquer coisa |
Nó pré-processador | sd-webui-controlnet/outro | Adaptador ControlNet/T2I |
---|---|---|
Estimador DWPose | dw_openpose_full | control_v11p_sd15_openpose control_openpose t2iadapter_openpose |
Estimador OpenPose | 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 |
Malha facial MediaPipe | mediapipe_face | controlnet_sd21_laion_face_v2 |
Estimador de animais | animal_openpose | control_sd15_animal_openpose_fp16 |
Nó pré-processador | sd-webui-controlnet/outro | Adaptador ControlNet/T2I |
---|---|---|
Fluxo Óptico Unimatch | ArrastarNUWA |
Este fluxo de trabalho salvará as imagens na pasta de saída do ComfyUI (no mesmo local das imagens de saída). Se você não encontrou o nó Save Pose Keypoints
, atualize esta extensão
Uma matriz de JSON no formato OpenPose correspondente a cada quadro em um lote IMAGE pode ser obtida de DWPose e OpenPose usando app.nodeOutputs
na interface do usuário ou no endpoint da API /history
. A saída JSON do AnimalPose usa um formato semelhante ao 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 desenvolvedores de extensões (por exemplo, editor 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) //Um matriz contendo Openpose JSON para cada quadro}
Para usuários de API: Javascript
import fetch from "node-fetch" //Lembre-se de adicionar "type": "module" a "package.json"async function main() { const promptId = '792c1905-ecfe-41f4-8114-83e6a4a09a9f' //Com preguiça para POST /queue deixe histórico = aguardar fetch(`http://127.0.0.1:8188/history/${promptId}`).then(re => re.json()) histórico = histórico[promptId] const nodeOutputs = Object.values(history.outputs) .filter (saída => saída.openpose_json) for (const nodeOutput de nodeOutputs) { const openposeResults = JSON.parse(nodeOutput.openpose_json[0]) console.log(openposeResults) //Um array contendo Openpose JSON para cada quadro }}main()
Pitão
import json, urllib.requestserver_address = "127.0.0.1:8188"prompt_id = '' #Com preguiça de POST /queuedef get_history(prompt_id): com urllib.request.urlopen("http://{}/history/{}" .format(server_address, prompt_id)) como resposta: return json.loads(response.read())history = get_history(prompt_id)[prompt_id]para o no histórico['outputs']: para node_id no histórico['outputs']: node_output = histórico['outputs'][node_id] if 'openpose_json' em node_output: print(json.loads (node_output['openpose_json'][0])) #Uma lista contendo Openpose JSON para cada quadro
Nó pré-processador | sd-webui-controlnet/outro | Adaptador ControlNet/T2I |
---|---|---|
Segmentador OneFormer ADE20K | oneformer_ade20k | control_v11p_sd15_seg |
Segmentador OneFormer COCO | oneformer_coco | control_v11p_sd15_seg |
Segmentador UniFormer | segmentação | control_sd15_seg control_v11p_sd15_seg |
Nó pré-processador | sd-webui-controlnet/outro | Adaptador ControlNet/T2I |
---|---|---|
Paleta de cores | cor | t2iadapter_color |
Embaralhamento de conteúdo | embaralhar | t2iadapter_style |
Nó pré-processador | sd-webui-controlnet/outro | Adaptador ControlNet/T2I |
---|---|---|
Luminância da imagem | recolor_luminance | ioclab_sd15_recolor sai_xl_recolor_256lora bdsqlsz_controlllite_xl_recolor_luminance |
Intensidade da imagem | recolor_intensity | Eu não sei. Talvez o mesmo que acima? |
Uma imagem vale mais que mil palavras
https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/ExecuteAll.png Imagem de entrada: https://github.com/Fannovel16/comfyui_controlnet_aux/blob/main/examples/comfyui-controlnet-aux-logo. png
Este repositório possui um novo mecanismo que irá ignorar qualquer nó personalizado que não possa ser importado. Se você encontrar esse caso, crie um problema na guia Problemas com o log da linha de comando.
Existem duas maneiras de acelerar o DWPose: usando pontos de verificação TorchScript (.torchscript.pt) ou ONNXRuntime (.onnx). O modo TorchScript é um pouco mais lento que o ONNXRuntime, mas não requer nenhuma biblioteca adicional e ainda é muito mais rápido que a CPU.
Um detector torchscript bbox é compatível com um estimador de pose onnx e vice-versa.
Defina bbox_detector
e pose_estimator
de acordo com esta imagem. Você pode tentar outras terminações de detector de bbox com .torchscript.pt
para reduzir o tempo de detecção de bbox se as imagens de entrada forem ideais.
Se onnxruntime for instalado com sucesso e o ponto de verificação usar terminações com .onnx
, ele substituirá o back-end cv2 padrão para aproveitar as vantagens da GPU. Observe que se você estiver usando uma placa NVidia, este método atualmente só funciona em CUDA 11.8 (ComfyUI_windows_portable_nvidia_cu118_or_cpu.7z), a menos que você mesmo compile o onnxruntime.
Conheça sua compilação onnxruntime:
NVidia CUDA 11.x ou abaixo/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
Observe que se esta é a primeira vez que você usa o ComfyUI, teste se ele pode ser executado no seu dispositivo antes de executar as próximas etapas.
Adicione-o em requirements.txt
Execute o comando install.bat
ou pip mencionado na Instalação
anime_face_segment: bdsqlsz/qinglong_controlnet-lllite/Annotators/UNet.pth, anime-seg/isnetis.ckpt
densopose: LayerNorm/DensePose-TorchScript-with-hint-image/densepose_r50_fpn_dl.torchscript
dwpose:
bbox_detector: 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: Ou hr16/DWPose-TorchScript-BatchSize5/dw-ll_ucoco_384_bs5.torchscript.pt, yzd-v/DWPose/dw-ll_ucoco_384.onnx
pose_animal (ap10k):
bbox_detector: 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: Ou hr16/DWPose-TorchScript-BatchSize5/rtmpose-m_ap10k_256_bs5.torchscript.pt, hr16/UnJIT-DWPose/rtmpose-m_ap10k_256.onnx
hed: lllyasviel/Annotators/ControlNetHED.pth
leia: 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: llyasviel/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
uniformizador: lllyasviel/Annotators/upernet_global_small.pth
zoe: lllyasviel/Anotadores/ZoeD_M12_N.pt
teed: bdsqlsz/qinglong_controlnet-lllite/7_model.pth
profundidade_qualquer coisa: LiheYoung/Depth-Anything/checkpoints/profundidade_anything_vitl14.pth, LiheYoung/Depth-Anything/checkpoints/profundidade_anything_vitb14.pth ou LiheYoung/Depth-Anything/checkpoints/profundidade_anything_vits14.pth
diffusion_edge: Ou hr16/Diffusion-Edge/diffusion_edge_indoor.pt, hr16/Diffusion-Edge/diffusion_edge_urban.pt ou hr16/Diffusion-Edge/diffusion_edge_natrual.pt
unimatch: hr16/Unimatch/gmflow-scale2-regrefine6-mixdata.pth, hr16/Unimatch/gmflow-scale2-mixdata.pth ou hr16/Unimatch/gmflow-scale1-mixdata.pth
zoe_profundidade_qualquer coisa: Ou LiheYoung/Depth-Anything/checkpoints_metric_profundidade/profundidade_anything_metric_profundidade_indoor.pt ou LiheYoung/Depth-Anything/checkpoints_metric_profundidade/profundidade_anything_metric_profundidade_outdoor.pt
Obrigado pelo apoio de todos vocês. Nunca pensei que o gráfico das estrelas fosse linear haha.