H3 Turnaround LoRA β€” character sheets from one image

The first release of Contact-Sheet diffusion: a video model's timeline repurposed as a slot axis for coordinated image sets.

One reference image + one instruction β†’ five coherent, progressively rotated views of the same subject, jointly denoised in a single pass, each view an independently-decoded crisp still. A character turnaround from one photo in ~10 s (512Β²) to ~57 s (1024Β²) on one GPU.

real photo cat β†’ five views A real photograph (DIV2K) the model never saw, β†’ five views. The LoRA trained only on H3-generated subjects β€” real-photo identity transfer is out-of-distribution and works.

The trick

H3 is a video+audio model. Its VAE stores video as one keyframe plus bundles of four frames, and the transformer's superpower is "keep everything consistent along the timeline." This LoRA hijacks that: five standalone image latents are packed where a 5-position video latent would go, with timeline positions stretched so the model believes they span one continuous shot. The model thinks it is making a tiny video β€” but every "frame" is a full independent image at a different camera angle, so its temporal-consistency machinery gets repurposed into cross-view identity. The timeline becomes a slot axis.

Proof it really is "video brain, image body": apply this LoRA to a normal video generation and motion breaks β€” spinning windmill blades render as superimposed discrete positions, because the LoRA has learned that time = poses.

Files

file step character
minimax_h3_five_view_512_s1500.safetensors 1500 default β€” best rotation geometry
minimax_h3_five_view_512_s400_instruct.safetensors 400 better instruction following (e.g. "neutral studio background" override honored), shallower rotation
minimax_h3_five_view_1024cont_s600.safetensors 600 1024-finetuned variant β€” see methodology

All: rank 16, attention-only (qkv/out on 50 blocks, 100 modules), 63 MB, ref2va_pruned partition. Strength 1.0 for rotation; ~0.7 trades rotation for scene fidelity.

Checkpoint methodology β€” how the files differ

One dataset (90 self-generated orbit clips, 30 subjects Γ— 3 seeds; 75 train / 15 val split by subject), one LoRA config (rank 16 Ξ± 16, attention-only), one de-distillation training adapter (ostris alpha, train-time only). The files differ only in training resolution and schedule:

  • 512_s400_instruct / 512_s1500 β€” the same single run at 512Β², lr 5e-5, adamw8bit, bs 1 Γ— grad-accum 4, flowmatch/shift, saved at steps 400 and 1500. Early = instruction-following era; late = rotation era. (~6.8 s/step; the whole 1500-step run is ~2.8 h on one card.)
  • 1024cont_s600 β€” took the step-400 weights above and continued 200 steps at 1024Β², lr 1e-5 (a short calibration tail, PixArt-style). Measured against the 512 checkpoints on held-out subjects at matched seeds: image quality at 1024/2048 is comparable (512-trained weights transfer to high-res inference surprisingly well β€” that's the headline finding), the studio-override instruction response is weaker than s400, and the 2048 early-arc back-loading is not fixed by 1024 training (it's a resolution-dependent sampling effect, not a weights gap). Published for completeness and for users generating primarily at 1024+.
  • A third arm (1024 from scratch, lr 5e-5, 400 steps) is not published yet: at its endpoint it measures comparably to the arms above at every inference size, but it's only 400 steps in (vs 1500 for the 512 run) β€” parked mid-experiment in favor of higher-priority work, and worth extending to 1500 at some point. Full judgment writeup in the research log.

Resolution transfer (measured)

Trained at 512 β€” inference transfers to 1024 and 2048:

512-trained LoRA at 2048 512-trained weights, five fresh 2048Β² views (shown downscaled). No upscaling anywhere in the pipeline β€” all views generated from noise.

time scales linearly with area

per sheet 512Β²/slot 1024Β²/slot 2048Β²/slot
time (RTX PRO 6000 @ 450 W cap, 28 steps) ~10 s ~57 s ~227 s
peak VRAM 41 GiB 42 GiB 47 GiB

Before / after

before after fennec before after toybot Top rows: base model with the same prompt/seed. Bottom rows: + this LoRA (step-400 weights).

How to run

ComfyUI users: there's a node. ComfyUI-H3-ContactSheet β€” two custom nodes bracketing a stock sampler, LoRA loaded via the stock loader, output verified visually indistinguishable from the reference sampler. Do NOT just drop the LoRA into loras/ with a normal workflow: stock samplers can't do the five-slot packing (and on normal video generation this LoRA actively degrades motion). The Python CLI below is the alternative path.

Requirements (this CLI path): a β‰₯48 GB VRAM NVIDIA card β€” the toolkit keeps the whole quantized base (~41 GiB) resident with no streaming offload. The ComfyUI node does not share this floor: stock ComfyUI offloads to system RAM on smaller cards, so any setup that runs MiniMax-H3 video can run sheets (slower). Common to both: ~43 GB disk for the base weights (auto-downloaded from the public Comfy-Org repackage, no login needed), Linux, Python 3.10+.

# 1. install ai-toolkit
git clone https://github.com/ostris/ai-toolkit && cd ai-toolkit
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt

# 2. install the five-view extension (folder name must match exactly)
git clone https://github.com/matlowai/h3-contact-sheet \
    extensions/minimax_h3_five_view

# 3. download a LoRA from this repo, then:
.venv/bin/python extensions/minimax_h3_five_view/inference.py \
    --lora minimax_h3_five_view_512_s1500.safetensors \
    --ref  my_character.png \
    --out  out/ --size 1024        # 512 / 1024 / 2048 all work
# -> out/my_character_contact_sheet.png  ([ref | view0..view4])
#    out/my_character_slot0..4.png       (the five views, full size)

First run stalls at "Loading..." while the 43 GB downloads β€” that's normal. Key dials: --strength (1.0 = rotation, 0.7 = fidelity), --seed (deterministic per seed), --prompt (append ", neutral studio background, constant lighting" with the _s400_instruct weights to replace the background).

The extension README has the full walkthrough with a troubleshooting section (OOM, module naming, unconsumed-weights warnings, under-rotation). Python API: generate_five_views(...) in five_view_sampler.py.

Honest limitations

  • Rotation axis follows the subject's pose. Training orbits always started square-on frontal, so "orbit" anchors to the subject's facing direction β€” a subject photographed looking upward gets a tilted arc. Stating the starting view in the prompt helps.
  • Some subjects under-rotate. H3 under-delivers prompted arcs on some classes; strength >1.0 buys more arc at some fidelity cost.
  • At 2048 the rotation back-loads: early views cluster near the reference and the arc arrives in the last slots (measured; the effect is resolution-dependent attention dilution, not a weights issue).
  • Do not stack with video generation β€” it degrades motion (see "The trick" above; this is inherent, not a bug).
  • Slight subject re-posing between views is in-distribution; this is a view set, not a photogrammetry rig.
  • Trained purely on self-generated H3 corpus data (90 text-prompted orbit clips, 30 subjects; frame 0 of each clip is its reference). Angles were measured, not trusted from prompts.

Roadmap β€” what we're building next

Same machinery, new tricks (the slot packing is agnostic to what varies across slots):

  • ComfyUI custom node β€” βœ… shipped: ComfyUI-H3-ContactSheet. Drag-in workflow file still to come.
  • Tiled joint-diffusion upscale β€” slots as overlapping zoomed tiles of one image instead of rotated views, jointly denoised so tiles agree, anchored to the low-res source, with true spatial RoPE offsets per tile. Goal: 4K+ reassembled outputs from ~1 MP passes β€” the same in-context-regeneration idea MiniMax uses for its own 2K, spatialized.
  • Fast-motion restoration β€” a program to fix video motion blur/ morphing using self-manufactured slow-motion accumulation pairs and motion-targeted repaint; the five-slot testbed doubles as its eval rig. (One arm already killed by a cheap pre-test β€” research log has the numbers.)
  • v2 training recipe: caption mixture (heals the instruction-vs-rotation checkpoint split), ref dropout (text-only mode for free), measured-angle captions, 10-slot sheets, 180Β°/360Β° spans.

Follow along / argue with us: the full research log is public at research/five-view-docs.

Provenance

Training data: self-manufactured (H3 generates its own supervision β€” text-prompted constant-rate orbit clips at 25 steps, no LoRA). Recipe, measurements, and the full research log are public: research/five-view-docs. Base model: MiniMaxAI/MiniMax-H3 (license follows the base model's).

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for matlod/minimax-h3-turnaround

Adapter
(3)
this model