• Hi Guest!

    We have posted a new VaM2 dev log on Patreon, starting a monthly cadence of written progress updates between Beta releases. Highlights include the new Gizmos System, Selection Carousel, and Modes System with Context-Specific Editing. Beta1.2 is 15 of 21 items complete.

    Read the full post on Patreon, or follow progress on the public Trello roadmap.

VaM 1.x VaM Character Generator

Threads regarding the original VaM 1.x
Thanks, everybody. All very relevant and helpful comments.

To understand the true limitations of the current approach, I'm running a brand new capture set of 500K samples with a slightly enhanced morph library.
The process is semi-automated and will take about 4 days (and nights) to finish.

Also, the Model has been updated to a Dual KNN architecture.
The morph mapper has been split into two separate models:
  • Front model — trained on front-facing captures, handles overall face shape, eye spacing, nose width, jaw, brows, etc.
  • Side model — trained on side-view captures, handles depth-related features, nose projection, lip depth, chin projection, forehead slope, etc.
The reason for the split:
A single combined model trained on both front and side features was dominated by the 21 front measurements, effectively drowning out the 7 side measurements.
Separating them gives the side view its own dedicated model with full weight on depth features, rather than competing against the front measurements in a shared feature space.

At inference time, both models run independently, and their predictions are blended, with the front model weighted slightly higher.
This gives the generator a genuine understanding of facial depth rather than approximating it from the front view alone.

The result is noticeably more accurate profile silhouettes.
I should be able to present some examples to you within a week.
 
VaM Character Generator — Development Update


The project has moved away from random morph training data toward a systematic single-morph sweep approach for calibration.

The old approach generated 360,000 training captures by randomising all morphs simultaneously, then used a KNN model to find the nearest matching VaM face in feature space. The problem: with 687 morphs randomised together, individual morph contributions were buried in noise, correlations were weak, and the KNN was effectively guessing from a haystack.

The new approach sweeps each morph individually through its native range (-1.0, -0.5, 0.0, +0.5, +1.0), capturing front and side photos at each value against a fixed camera. 260 hand-curated morphs. Around 2,600 captures total, completed in under an hour.

This gives something that wasn't available before: a true response curve per morph, exactly how much each morph moves each facial landmark measurement.
From that, a direct lookup can be built: measure a feature in a reference photo, find which morphs control it, and compute the exact value needed.

Why this is better:
  • No statistical approximation, each morph's effect is measured directly
  • Conflict detection becomes explicit, and morphs that affect the same measurements are identified and ranked by strength
  • New morphs can be added incrementally without rerunning the entire dataset
  • The resulting mapper is deterministic and fully auditable

The morph list was curated using a custom tool that reads the full VaM morph catalogue, filtered to visible face and head morphs only, with expression, pose, fantasy and internal morphs excluded.

Updates will follow as results improve.
 
As I said before, the core problem is morph crosstalk. If the morphs are not isolated, every correction can destroy points that were already matched by previous corrections.

With such morphs, KNN can only find the nearest possible approximation inside the available morph space. It cannot produce an exact copy of the photo-derived mesh.

For a proper measurement-based reconstruction, you would need an independent morph basis and a response matrix/Jacobian that describes exactly how each morph affects each measured point. Without that, the solver is always fighting the morph set itself.

btw. when i run training sessions, I use services like RunPod rather than having to wait for days on end, even on my 5090.
 
Back
Top Bottom