Nodes/AnimateDiff Evolved/FreeInit Iteration Options πŸŽ­πŸ…πŸ…“
ComfyUI Node Runs on cloud

FreeInit Iteration Options πŸŽ­πŸ…πŸ…“

FreeInit for AnimateDiff, and why almost nobody plugs it in

By KosinkadinkΒ·Created 3 years agoΒ·Updated 13 days agoΒ· 3,519
FreeInit Iteration Options πŸŽ­πŸ…πŸ…“
    • ITERATION_OPTS
    β—„iterations2β–Ί
    β—„filterβ–Ύβ–Ί
    β—„d_s0.250β–Ί
    β—„d_t0.250β–Ί
    β—„n_butterworth4β–Ί
    β—„sigma_step999β–Ί
    β—„apply_to_1st_iterfalseβ–Ί
    β—„init_typeβ–Ύβ–Ί
    β—„iter_batch_offset0β–Ί
    β—„iter_seed_offset1β–Ί

    This is the FreeInit implementation for AnimateDiff. The README lists it in one line - "FreeInit and FreeNoise support (FreeInit is under iteration opts...)" - and this node is the whole of that "under iteration opts" part. It's a settings bundle, not something that touches your image directly: you build it here, then plug the result into the iteration_opts slot on Sample Settings (ADE_AnimateDiffSamplingSettings), which in turn feeds your loader or Use Evolved Sampling.

    What it buys you is temporal consistency - less flicker, less boiling detail between frames - at the direct cost of render time. There's no way around that tradeoff, so it's worth knowing upfront: with the default iterations: 2, you're roughly doubling how long your sampling takes for one clip.

    How it works

    A video diffusion run starts from random noise, and the low-frequency component of that starting noise quietly shapes the whole clip's temporal layout - fresh random noise doesn't have great low-frequency structure for coherence, which is a big part of why AnimateDiff clips flicker. FreeInit's trick: sample the clip once, take the low-frequency part of what came out, keep the high-frequency part of a new batch of random noise, and re-sample from that blend. Do it a couple of times and the motion settles down.

    filter picks how the frequency split happens (with n_butterworth as the filter order, only relevant if you pick that filter), and d_s/d_t are the spatial and temporal cutoffs - d_t is the one actually driving the video-consistency effect. sigma_step and apply_to_1st_iter control exactly where in the sampling process the re-init kicks in.

    The inputs and outputs that matter

    • iterations (default 2) - this is the cost dial. Each iteration is close to a full extra sampling pass. 2 is the default for a reason; going higher rarely earns its keep.
    • filter - the low-pass filter type used to split frequencies.
    • d_s / d_t (both default 0.25) - spatial/temporal cutoff. Lower d_t if motion goes stiff.
    • init_type - which FreeInit initialization strategy to run.

    Less commonly touched: n_butterworth (default 4, Butterworth order), sigma_step (default 999 - near the start of sampling), apply_to_1st_iter (default false), and the optional iter_batch_offset/iter_seed_offset for varying the seed across iterations rather than reusing the same one. Output is a single ITERATION_OPTS, which only fits Sample Settings' iteration_opts input.

    How to install it

    Through ComfyUI Manager: search AnimateDiff Evolved, confirm the author is Kosinkadink, install. Manually:

    cd ComfyUI/custom_nodes && git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved
    

    then restart. This node needs no model download of its own - it's pure configuration sitting on top of whichever motion module you've already loaded elsewhere in the graph.

    Common issues & troubleshooting

    Generation is taking way longer and you don't know why. Check for this node in the graph. iterations multiplies your sampling cost directly - if it's set to 2 or 3 and wired into your Sample Settings, that's the tax you're paying.

    Barely any visible difference. FreeInit fixes a specific problem (temporal flicker/inconsistency), and if your clip is already fairly coherent - short clip, good motion module, sane context_options - there's less for it to fix. It's a targeted repair tool, not a general quality boost.

    Motion looks flat or stuck after enabling it. You've pushed the temporal constraint too hard. Lower d_t, drop back to 1 iteration, or leave apply_to_1st_iter off so the first pass gets a normal, unconstrained start.

    Worth saying plainly: this is one of the more obscure corners of the pack. It's a real, working academic technique (FreeInit predates AnimateDiff-Evolved's implementation of it), but the community rarely mentions using it in practice - most people fighting flicker reach for a better context-window setup or a different motion module before they reach for this. If you're a beginner landing here from search, it's fine to skip this node entirely until you have a specific consistency problem nothing else has fixed.

    CategoryAnimate Diff πŸŽ­πŸ…πŸ…“/iteration opts

    Inputs (10)

    NameTypeDefaultDescription
    iterationsINT2β€”
    filterCOMBO4 options: gaussian, butterworth, ideal, box
    d_sFLOAT0.2500–1β€”
    d_tFLOAT0.2500–1β€”
    n_butterworthINT41–100β€”
    sigma_stepINT9991–999β€”
    apply_to_1st_iterBOOLEANfalseβ€”
    init_typeCOMBO3 options: FreeInit [sampler sigma], FreeInit [model sigma], DinkInit_v1
    iter_batch_offsetoptINT00–9007199254740991β€”
    iter_seed_offsetoptINT1-9007199254740991–9007199254740991β€”

    Outputs (1)

    NameTypeDescription
    ITERATION_OPTSITERATION_OPTSβ€”