ComfyUI Extension: NormalCrafterWrapper
ComfyUI diffusers wrapper nodes for a/NormalCrafter
Custom Nodes (0)
README
ComfyUI NormalCrafter
This is a ComfyUI custom node implementation for NormalCrafter: Learning Temporally Consistent Normals from Video Diffusion Priors by Yanrui Bin, Wenbo Hu, Haoyuan Wang, Xinya Chen, and Bing Wang.
It allows you to generate temporally consistent normal map sequences from input video frames.
Installation
- Clone this repository into your
ComfyUI/custom_nodes/
directory:cd ComfyUI/custom_nodes/ git clone https://github.com/AIWarper/ComfyUI-NormalCrafterWrapper.git
- Install the required dependencies. Navigate to the
ComfyUI-NormalCrafter
directory and install using therequirements.txt
:
(See theACTIVATE YOUR VENV FIRST ComfyUI-NormalCrafterWrapper pip install -r requirements.txt
requirements.txt
for notes on thediffusers
dependency, which ComfyUI often manages.) - Restart ComfyUI.
Node: NormalCrafter (Process Video)
This node takes a sequence of images (video frames) and processes them to output a corresponding sequence of normal map images.
Parameters
images
(Input Socket): The input image sequence (video frames).pipe_override
(Input Socket, Optional): Allows providing a pre-loaded NormalCrafter pipeline instance. If unconnected, the node loads its own.seed
: (Integer, Default: 42) Controls the randomness for reproducible results.control_after_generate
: (Fixed, Increment, Decrement, Randomize) Standard ComfyUI widget for seed behavior on subsequent runs. Note: The underlying pipeline uses the seed for each full video processing.max_res_dimension
: (Integer, Default: 1024) The maximum dimension (height or width) to which input frames are resized while maintaining aspect ratio.window_size
: (Integer, Default: 14) The number of consecutive frames processed together in a sliding window. Affects temporal consistency.time_step_size
: (Integer, Default: 10) How many frames the sliding window moves forward after processing a chunk. If less thanwindow_size
, frames will overlap, potentially improving smoothness.decode_chunk_size
: (Integer, Default: 4) Number of latent frames decoded by the VAE at once. Primarily a VRAM management setting.fps_for_time_ids
: (Integer, Default: 7) Conditions the model on an intended Frames Per Second, influencing motion characteristics in the generated normals. Note: In testing, this parameter showed minimal to no visible effect on the output for this specific model and task. As such I hard coded the valuemotion_bucket_id
: (Integer, Default: 127) Conditions the model on an expected amount of motion. Note: In testing, this parameter showed minimal to no visible effect on the output for this specific model and task. As such I hard coded the valuenoise_aug_strength
: (Float, Default: 0.0) Strength of noise augmentation applied to conditioning information. Note: In testing, this parameter showed minimal to no visible effect on the output for this specific model and task. As such I hard coded the value
Troubleshooting Flicker / Improving Temporal Consistency
If you are experiencing flickering or temporal inconsistencies in your output:
- Increase
window_size
: A larger window allows the model to see more temporal context, which can significantly improve consistency between frames. - Adjust
time_step_size
: Using atime_step_size
smaller thanwindow_size
creates an overlap between processed windows. This overlap is merged, which can smooth transitions. For example, ifwindow_size
is 20, try atime_step_size
of 10 or 15.
You may be able to increase window_size
and time_step_size
substantially (e.g., to their maximum values) without encountering Out Of Memory (OOM) issues, depending on your hardware. Experiment to find the best balance for your needs.
Dependencies
mediapy
decord
diffusers
(and its dependencies liketransformers
,huggingface_hub
) - ComfyUI usually manages its owndiffusers
version. Install manually if you encounter specific import errors related to it.torch
,numpy
,Pillow
(standard Python ML/Image libraries)
Refer to requirements.txt
for more details.