Skip to content

VisoMaster Fusion 3.12.3

Latest

Choose a tag to compare

@Glat0s Glat0s released this 29 Aug 06:07
9f9dd96

Highlights

  • AlphaFace swapper (new): a 256 px swapper with strong identity transfer that injects the identity embedding into every encoder stage instead of only at the bottleneck, so it holds up noticeably better on off-angle faces. It reuses the existing ArcFace encoder — no extra recognition model is loaded — and runs FP16 under TensorRT. A Swapper Resolution selector (256 / 512 / Auto) adds an optional sub-pixel phase-shift tiling mode at 512 for very fine skin and eye detail.
  • Secondary Swapper (new): run a second swapper model after the first and blend the two results, with its own model, resolution, Blend Amount (0 = primary only, 100 = secondary only) and Secondary Strength controls. Both engines now stay resident in VRAM instead of being unloaded and rebuilt every frame, which is what made this practical.
  • Face Shaping (2D mesh) (new): cosmetic reshaping in the Face Editor — Face Slimming, Chin Slimming, Forehead, Chin Length and Face Length — applied as a mesh deformation, independent of the LivePortrait expression editor.
  • Three new landmark models (new): tufa98 (TUFA, IJCV 2025) is the most accurate option here on strongly angled faces; tufa314 is the same network asked for a dense 314-point set at practically the same cost, for a detailed overlay when you are judging alignment; orformer98 (ORFormer, WACV 2025) is built for occluded faces and estimates which regions are hidden. All three bring their own crop, so Detect From Points does not apply to them.
  • VR coverage and projection are now configurable: VR Projection (Equirectangular / Fisheye equidistant) and VR Coverage (per eye) from 90° to 360°. 180° equirectangular remains the default and behaves exactly as before, but 200° lens formats (MKX200, VRCA220, Fisheye190), unstitched single-lens-per-eye footage and full 360° monoscopic panoramas are now handled correctly instead of landing swapped faces in the wrong place.
  • macOS support (new): a CPU/CoreML port with Start_mac.sh, requirements_mac.txt and a setup guide. It produces correct output but is much slower than a supported NVIDIA setup — read docs/macos.md before committing to it.
  • LSFG Bridge (new): Steam LSFG (Lossless Scaling) Bridge - frame-generation layer
  • Performance and VRAM: a Number of Streams slider (1–15) for multi-stream processing on large-VRAM cards, PyTorch allocator tuning so VRAM is returned to the driver instead of hoarded, non-spinning CUDA synchronisation (less CPU burned while waiting on the GPU), and a broad optimisation pass across the video pipeline, denoiser, swappers and UI workers.
  • Fewer multi-threading crashes: ONNX Runtime inference is now serialised per session with correct pre- and post-inference synchronisation, and GFPGAN is additionally isolated from every other inference — it was the model that misbehaved when run concurrently.
  • Job queue you can stop: the queue runs through a cancellable processor with a Process All / Stop Queue button that reflects the real state, and job-file checks time out after 2 s so a slow or disconnected network drive no longer hangs the app.
  • Video seek bar and media list: reworked seek slider, an option to turn seek-bar thumbnails off entirely, cached thumbnail metadata, atomic thumbnail writes, and a fix for the media-list placeholder text.
  • Notification and confirmation controls: toggle toast notifications, set their duration, and skip the warning before unloading media.
  • Smaller, faster saves: reference K/V maps are stored as content-hashed files with a registry, so identical maps are written once and shared across embeddings instead of being duplicated per save.
  • Finer border control: the single Border Blur slider became four — Top, Bottom, Left and Right — and the Noise, JPEG Compression and Block Shift controls moved into Blend Adjustments where they belong.

Changelog by version

3.12.3

TUFA 314-point landmark model (PR #340):

  • New tufa314 entry in Landmark Detect Model: the same TUFA checkpoint as tufa98, exported with the dense 314-point structure prompt. The shared ViT-S/8 image encoder dominates the cost, so the extra decoder queries are nearly free: identical timing on the CUDA provider and about 10% slower than tufa98 through TensorRT (5.6 vs 5.1 ms/face on an RTX 4090).
  • The 314 points are TUFA's own dense definition, not a standard dataset layout, so its numbering matches nothing else in the app. The 5-point set used for swap alignment is derived from the anchors the 314- and 98-point structure prompts share exactly, verified against the 98-point model on a real face through the app's TensorRT path (worst paired-point disagreement 0.05 px).
  • Runs FP32 by design, like the other TUFA/ORFormer models.
  • Fixed a latent crash in single-frame mode: the placeholder built when landmark detection returns nothing derived its point count by parsing the mode name as an integer, which raised for every non-numeric mode (3d68, tufa98, tufa314, orformer98).

3.12.2

Secondary Swapper (PR #337):

  • New Secondary Swapper toggle with Secondary Model, Secondary Resolution (256 / 512 / Auto), Blend Amount (0–100) and Secondary Strength (0–500, where 100 = one pass and 0 disables the secondary swap). Model choice is restricted to swappers sharing the Inswapper128ArcFace latent space.
  • The swapper cache keeps up to two models resident instead of one. Previously, a session whose faces selected two different swappers unloaded and reloaded a TensorRT engine per face per frame.

Stability (PR #339):

  • GFPGAN 1.4 now runs under an exclusive inference gate, isolated from every other ONNX Runtime / TensorRT call, while all other models continue to run concurrently.

3.12.1

Face Shaping (PR #336):

  • New Enable Face Shaping (2D Mesh) toggle in the Face Editor with Face Slimming, Chin Slimming, Forehead, Chin Length and Face Length sliders (50 = neutral on each).

K/V map storage:

  • Reference K/V maps are written as content-hashed .pt payloads tracked in a registry. Identical maps are stored once and referenced by every embedding that uses them, instead of being duplicated on each save.

Swapper resolution:

  • Swapper Resolution gained an Auto option that picks the resolution from the input face size; the separate Enable Auto Resolution toggle is gone.

3.12.0

TUFA and ORFormer landmark models (PR #335):

  • tufa98 (TUFA, IJCV 2025): 98-point WFLW topology, best accuracy of the available models on strongly angled faces, ~4 ms/face.
  • orformer98 (ORFormer, WACV 2025 oral): 98-point WFLW topology built for occlusion, also estimating which regions are hidden, ~6 ms/face. Somewhat more sensitive to bounding-box framing than tufa98.
  • Both use their own upright square crop rather than the frontal-template warp, so Detect From Points has no effect on them, and both run FP32 — FP16 breaks them, so they are deliberately excluded from the FP16 fast path.
  • Landmark Detect Score is ignored for orformer98, whose per-point values are visibility estimates rather than detection confidences.

3.11.1

  • AlphaFace tweaks: Swapper Resolution selector for AlphaFace (256 native / 512 via sub-pixel phase-shift tiling, ~4x slower / Auto), plus pipeline work behind it (PR #333).
  • New "save embedding as" icon and an icon-build fix (PR #332).
  • Pre-commit and unit-test fixes (PR #334).

3.11.0

AlphaFace face swapper (PR #331):

  • New AlphaFace entry in Swapper Model: a 256 px swapper that injects the identity embedding at every encoder stage, with pose-aware alignment. Reuses the existing W600K ArcFace encoder and re-projects the embedding through AlphaFace's own identity matrix, so no additional recognition model is loaded.
  • The ONNX file is downloaded on demand (~529 MiB) and runs FP16 under TensorRT. See docs/alphaface.md.
  • Builds on the AlphaFace integration work and model release by @kodek4.

3.10.0

Lossless Scaling preview bridge (PR #326):

  • Optional companion helper (tools/lsfg_preview.py) for using Lossless Scaling as a preview-only frame-generation layer, with a documented profile table (60 Hz / 120 Hz / 144 Hz / 240 Hz) and setup notes in docs/lsfg_preview.md.
  • Preview only: Lossless Scaling captures the visible window through its own capture path. Fusion does not feed frames into it, and exported video FPS is unaffected.

3.9.12

Video seek bar (PR #324, #325):

  • Seek slider logic extracted into its own module and reworked, with a thumbnail fix.

Notifications and confirmations (PR #328 and related):

  • Show Seek Bar Thumbnails toggle — disabling it stops generation as well as display.
  • Toast notifications can be disabled entirely, and their duration is configurable.
  • Optional suppression of the warning shown before unloading media.
  • Fixed toast notifications not appearing while working with videos; tooltip and icon updates.

3.9.11

  • Completed the conversion to non-spinning CUDA synchronisation across the denoiser, DFM models, media pipeline, worker pool and frame workers — the previous busy-wait pattern burned CPU while waiting on the GPU (PR #319).
  • Further CPU-side memory optimisation in the media pipeline and worker pool.

3.9.10

  • VRAM and job fixes across the sequential detector, VR frame worker and job manager (PR #317).
  • New Swap Original Faces toggle: allows the swap pipeline to run on original (blank target) faces.

3.9.9

All from PR #316:

  • Embeddings: optional A–Z sorting for new embeddings, and embedding buttons now show the full name instead of truncating it.
  • Noise, JPEG Compression and Block Shift controls moved into the Blend Adjustments menu.
  • Fixed the "drop files or click here to select a folder" placeholder.

3.9.8

macOS support (PR #313):

  • Start_mac.sh, requirements_mac.txt and docs/macos.md. CPU/CoreML only, and much slower than a supported NVIDIA setup. Original port contributed by @roiamiel1.

VRAM optimisation (PR #312):

  • New Number of Streams slider (1–15, default 1) controlling worker streams during playback and recording. Strongly VRAM-dependent; applies to the next processing task.
  • PyTorch's caching allocator is configured before torch is imported (max_split_size_mb:128, garbage_collection_threshold:0.8) so unused segments are released back to the CUDA driver instead of being hoarded.
  • Explicit model-unload paths added across detectors, masks, restorers, swappers, editors, enhancers and Recast.

Video refactoring and optimisation (PR #311):

  • Broad rework of the media pipeline, worker pool, frame workers and UI action modules.

3.9.7

Configurable VR coverage and projection (PR #308):

  • VR Projection: Equirectangular (latitude/longitude grid, the usual stitched VR180 output) or Fisheye (equidistant) (circular lens image, typical of 200° formats and unstitched single-lens-per-eye footage).
  • VR Coverage (per eye): 90°–360°, default 180°. Vertical coverage is derived from this and the frame aspect ratio, capped at 180° for equirectangular content. Use 360° with Single Eye for a full monoscopic panorama.
  • New vr_geometry helper module with unit and integration test coverage.

3.9.6

All from PR #307.

Job queue:

  • Cancellable JobProcessor with a Process All / Stop Queue button that reflects the actual queue state.
  • Job-file existence checks are guarded with a 2 s timeout, so job files on slow or disconnected network drives no longer hang the app.

Inference stability:

  • ONNX Runtime inference is serialised per session, with a pre-inference stream sync outside the lock and ORT-native output synchronisation inside it — PyTorch stream syncs do not order ORT's internal stream, which is what made concurrent runs unsafe.

Media handling:

  • Thumbnail metadata caching and faster filter/sort restore.
  • The ffprobe child process is reaped on timeout, and thumbnail writes are atomic.

3.9.5

  • Broad optimisation pass across the issue scanner, media pipeline, worker pool manager, pipeline processor, denoiser, swappers and UI workers.

3.9.4

Video processor split (PR #305):

  • video_processor.py went from ~5,300 lines to ~3,450, with the heavy parts moved into three new modules: video_utils/media_pipeline.py, video_utils/worker_pool_manager.py and video_utils/issue_scanner.py.

New options:

  • Plays Active Segments Only: playback skips inactive parts of the video.
  • Border Blur split into Top, Bottom, Left and Right Border Blur sliders (default 8 each).
  • Removed the Audio Start Delay slider.

Contributors in this range

@Elricfae, @Glat0s, @masterofobzene, @chyanbo, @Jbla0712, @roiamiel1 — and @kodek4, whose AlphaFace work the swapper integration builds on. Thanks to everyone who contributed code, fixes, testing and reviews.


Upgrade notes

  • Portable launcher users: download the latest Start_Portable.bat attached to this release (or via the "latest" link in the README).
  • No manual migration steps required; the launcher's dependency update handles environment changes on next start.
  • AlphaFace (~529 MiB) and the tufa98 / tufa314 / orformer98 landmark models are downloaded on demand the first time you select them. The TUFA and ORFormer models build a TensorRT engine on first use, which takes a few minutes.
  • Existing TensorRT engine caches are reused; engines built by earlier versions do not need to be rebuilt.
  • Workspaces and saved jobs from earlier versions load normally. The removed Enable Auto Resolution toggle is replaced by the Auto entry in Swapper Resolution, the single Border Blur value is superseded by the four per-side sliders, and the Audio Start Delay slider is gone — these are sanitised out of old saves automatically and fall back to defaults.
  • Number of Streams defaults to 1, matching previous behaviour. Raise it only if you have VRAM headroom; it applies to the next processing task, not the running one.
  • VR projects keep their previous behaviour at the default Equirectangular / 180° settings. Only change them if your footage is fisheye or has a coverage other than 180°.
  • macOS is CPU/CoreML only and considerably slower than a supported NVIDIA setup — see docs/macos.md.