<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arkadiusz</title>
    <description>The latest articles on DEV Community by Arkadiusz (@arkadiuss).</description>
    <link>https://dev.to/arkadiuss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3845046%2F559de795-fc6c-4d26-8914-5ede4577cdf0.png</url>
      <title>DEV Community: Arkadiusz</title>
      <link>https://dev.to/arkadiuss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arkadiuss"/>
    <language>en</language>
    <item>
      <title>A 3D Body from Eight Questions — No Photo, No GPU</title>
      <dc:creator>Arkadiusz</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:34:49 +0000</pubDate>
      <link>https://dev.to/arkadiuss/a-3d-body-from-eight-questions-no-photo-no-gpu-4277</link>
      <guid>https://dev.to/arkadiuss/a-3d-body-from-eight-questions-no-photo-no-gpu-4277</guid>
      <description>&lt;p&gt;8 questions in, 58 Anny body params out. A small MLP trained with a physics-aware loss, runs in milliseconds on CPU. Height accuracy 0.3 cm, mass 0.3 kg, BWH 3-4 cm — better than our photo pipeline on circumferences, without needing a photo. That's the questionnaire path I &lt;a href="https://clad.you/blog/posts/body-pipeline/" rel="noopener noreferrer"&gt;promised in the previous post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The whole story begins with one observation: that height and weight can estimate body measurements quite accurately (&lt;a href="https://www.mdpi.com/1424-8220/22/5/1885" rel="noopener noreferrer"&gt;Bartol's regression&lt;/a&gt;). The original idea isn't as accurate as it claims, but after a bit of tuning the results are quite promising.&lt;/p&gt;

&lt;p&gt;The questionnaire addresses privacy, speed and cost concerns. Plus we skip the phase where the user spends 5 minutes scrolling for perfect-light, tight-clothes photos. Additionally, it helped us find and address a mass calculation inconsistency in the Anny model, and model the "muscle weighs more" problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backstory
&lt;/h2&gt;

&lt;p&gt;When we want to create a digital twin, we naturally think of HMR photo reconstruction. This route has a lot of &lt;a href="https://clad.you/blog/posts/body-pipeline/" rel="noopener noreferrer"&gt;ups and downs&lt;/a&gt;. During one "down", the research agent brought up this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The most striking finding is from Bartol et al. (2022): a simple linear regression from just height + weight (no photo!) predicts 15 body measurements at 1.2-1.6 cm MAE. Many deep learning methods with photos don't even beat this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first I quickly calculated the number of combinations and the number of people, and thought it didn't make sense. But then, after comparing friends, I thought there might be something to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not just height and weight
&lt;/h2&gt;

&lt;p&gt;Intuitively we all know that you can be a man with 178cm and 80kg with a belly, or from the gym. So it wasn't a surprise that we came up with these two bodies:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuaopk98xm3pifjy0k7k3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuaopk98xm3pifjy0k7k3.jpg" alt="Extreme bodies for the same height and weight" width="800" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They are a bit cartoonish and pushed to extremes, but clearly show the problem.&lt;/p&gt;

&lt;p&gt;Next obvious thing to do: the weights from the original regression are public, so we downloaded them and ran them on our validation set. Raw BWH MAE landed around 9-11 cm, up to ~25 cm at the worst. Some of that is measurement-convention mismatch — Bartol slices SMPL meshes at fixed landmark vertex indices (e.g. a "lower belly point" vertex for waist), while we follow ISO 8559-1 anatomical rules (waist at the narrowest point, bust at the breast prominence). Same plane-sweep math, different slice location — bust alone is off by ~10 cm systematically. After correcting for that bias, BWH MAE drops to ~7 cm. Still above Bartol's own ~3 cm BWH MAE on their data (paper Table 6 on BODY-fit+W: chest 3.0, waist 4.0, hips 2.2 cm), but that's not really the story — we're evaluating on a different population. Anny has explicit body-shape variation at fixed h/w that an h+w regression fundamentally can't see, regardless of how well it was trained. And I'm not saying this to undermine the original research, but rather the opposite — it's a good spark for this project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else carries signal
&lt;/h2&gt;

&lt;p&gt;As the previous example showed, the same height and weight can produce different results, but we can differentiate them via more params. Some obvious ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build/belly — muscular athletic or soft with a belly. Common knowledge is that muscle weighs more than fat, so a fat-heavy body will have more volume (and thus different measurements) than an athletic one.&lt;/li&gt;
&lt;li&gt;Shape — there are people with wider hips, while others have a bigger bust. This difference is part of body shape, which tells us how the weight is distributed. The problem I will describe later is that people don't know their shape.&lt;/li&gt;
&lt;li&gt;Cupsize — relevant for women, quite an obvious feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the features we naturally think of. To make sure they carry enough signal and aren't too noisy, we ran the numbers against the dataset. The method is simple — bucket people by height (±1 cm), weight (±1 kg), and shape, then measure how much waist variation is left as each additional feature is locked in.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Features locked&lt;/th&gt;
&lt;th&gt;Waist std inside bucket&lt;/th&gt;
&lt;th&gt;Theoretical best MAE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;h, w, shape, build&lt;/td&gt;
&lt;td&gt;2.25 cm&lt;/td&gt;
&lt;td&gt;~1.8 cm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ belly&lt;/td&gt;
&lt;td&gt;2.08 cm&lt;/td&gt;
&lt;td&gt;~1.7 cm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ cup, gender&lt;/td&gt;
&lt;td&gt;1.30 cm&lt;/td&gt;
&lt;td&gt;~1.0 cm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Smaller std inside a bucket means the features explain more of what's going on. Build does most of the work — on its own, it moves the waist by about 1.8 cm at fixed h/w/shape. Belly adds another ~0.2 cm. Cup plus gender knocks 0.8 cm more off. Each feature earns its place.&lt;/p&gt;

&lt;p&gt;Side-finding: build signal is strongest on inverted-triangle shapes — 8 of the top 10 high-signal buckets are inverted triangle. The narrow waist amplifies relative fat changes; shapes with wider baseline waists (apple, rectangle) show smaller absolute shifts.&lt;/p&gt;

&lt;p&gt;At the extremes: same height, same weight, different body shape — bust can differ by 25 cm, hips by 30. Six clothing sizes at identical h/w. A height+weight regression simply can't see this — the signal isn't there in the input.&lt;/p&gt;

&lt;p&gt;And there's a floor. Even with every questionnaire input locked, about 1.3 cm of waist variation stays, coming from ~50 continuous blendshape params that don't map to any multiple-choice question. So the theoretical best a form can ever do is ~1 cm waist MAE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model &amp;amp; dataset
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://clad.you/blog/posts/body-pipeline/" rel="noopener noreferrer"&gt;The previous article&lt;/a&gt; describes the available body models. After the initial phase we operate solely on the Anny model, heavily leveraging its explainable features. Thanks to it, tasks like generating a huge dataset of people are easy.&lt;/p&gt;

&lt;p&gt;The dataset we generate and use for distribution analysis, training and validation contains a couple of tens of thousands of synthetically generated bodies, validated against a broad population distribution. For each body in the dataset we determine the described features using the body measurements.&lt;/p&gt;

&lt;p&gt;Anny is full of blendshapes, but for the virtual try-on, not all of them matter. We carefully selected 58 of them which matter here. The 8 questionnaire questions one-hot encode into 20 features, so the space is 20 input x 58 output params. We actually train two such models — one per gender. Male and female bodies differ enough that a shared network wastes capacity reconciling them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Training a small MLP
&lt;/h2&gt;

&lt;p&gt;The original paper used simple regression to predict the params, so that was the obvious starting point. On our synthetic dataset it gets around 2.5 cm BWH MAE — decent. The problem was mass: Ridge predicts each of the 58 params independently, but mass depends on many of them working together (torso width × depth × height, hip volume, limb fat...). L2 regularization shrinks them all toward zero, and the small errors compound. Result: 3.9 kg mean mass error, 9.7 kg at p95, up to 16 kg for heavy bodies — even after output standardization and tuned regularization (the best Ridge we could build on this dataset).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1uwzgpfzljgbm6ogbe7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1uwzgpfzljgbm6ogbe7.jpg" alt="Histogram of absolute mass error for Ridge vs MLP on 100 test bodies. Ridge: mean 3.9 kg, p95 9.7 kg. MLP: mean 0.3 kg, p95 0.8 kg." width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we moved to an MLP. Two hidden layers, 256 units each, ReLU, a bit of dropout. Tiny — about 85 KB of weights, trains on a laptop in ~60 minutes per gender. Nothing fancy architecturally.&lt;/p&gt;

&lt;p&gt;The loss is the interesting part. The user already gives us their exact height and weight — those need to match precisely in the generated body, not just be close on average. Standard MSE on the 58 params doesn't care about that and treats every param equally. And mass isn't a param at all, instead it's a consequence of volume, which comes out of the body model's forward pass.&lt;/p&gt;

&lt;p&gt;So we include the forward pass in the loss. The MLP's 58 outputs go through Anny — blendshapes, vertices, volume — and we compare the resulting mass and height against the user-provided targets. Gradients from a mass error flow back through all the volume-related params together. Ridge couldn't do that because each output was solved independently; the MLP can, because the hidden layers couple them. This is what closes the mass gap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4db1lktfvgnrbxyjfbhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4db1lktfvgnrbxyjfbhg.png" alt="Loss diagram" width="664" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dotted arrow is the whole trick. Anny's forward is surprisingly autograd-friendly — blendshapes are linear, volume is a sum of signed tetrahedra. No custom backward, standard PyTorch ops end to end. Measurements like waist are differentiable too, but that's a whole story for the measurements tuning post.&lt;/p&gt;

&lt;p&gt;On top of params, mass, and height, we added a waist term. That's it — bust and hip looked tempting, but in practice they introduced more noise than signal, and waist carries the most body-shape signal anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest results
&lt;/h2&gt;

&lt;p&gt;Height is essentially solved — 0.3 cm mean MAE on both genders. Mass lands right there too, around 0.3 kg mean (p95 under 1 kg). Circumferences are harder; BWH sits at 3-4 cm, with waist the weakest.&lt;/p&gt;

&lt;p&gt;Averages lie about the tails, and a person who gets a 15 cm bust error doesn't care that the mean is 4 cm. So we tracked p95 (5% of predictions worse than this) and max alongside the mean, and actively optimized for them — barrier terms in the loss that specifically penalize outliers on height and mass.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Male&lt;/th&gt;
&lt;th&gt;Female&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Height — mean / p95 / max&lt;/td&gt;
&lt;td&gt;0.3 / 0.8 / 3.9 cm&lt;/td&gt;
&lt;td&gt;0.3 / 0.8 / 4.6 cm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mass — mean / p95 / max&lt;/td&gt;
&lt;td&gt;0.5 / 1.2 / 3.3 kg&lt;/td&gt;
&lt;td&gt;0.4 / 1.0 / 2.1 kg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bust — mean / p95 / max&lt;/td&gt;
&lt;td&gt;4.9 / 11.9 / 18.4 cm&lt;/td&gt;
&lt;td&gt;2.7 / 6.6 / 11.0 cm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Waist — mean / p95 / max&lt;/td&gt;
&lt;td&gt;4.3 / 10.0 / 20.7 cm&lt;/td&gt;
&lt;td&gt;4.0 / 9.0 / 13.0 cm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hips — mean / p95 / max&lt;/td&gt;
&lt;td&gt;3.3 / 8.4 / 14.8 cm&lt;/td&gt;
&lt;td&gt;3.3 / 8.0 / 13.3 cm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For comparison: on the same validation set, Bartol's h+w regression sits at ~7 cm BWH MAE (bias-corrected, as above). Our photo-based pipeline from the &lt;a href="https://clad.you/blog/posts/body-pipeline/" rel="noopener noreferrer"&gt;previous post&lt;/a&gt; gets 5-8 cm BWH MAE on real people. The questionnaire beats both — without needing a photo.&lt;/p&gt;

&lt;p&gt;The numbers above are from synthetic Anny bodies — same model we train against. We also validated on a small group of real people measured by hand with tape. First results there were ugly — mass off by several kg even when circumferences were close. That pushed us to fix how mass is calculated in the first place (next section). After those fixes landed, real-people numbers line up with the synthetic ones on the measurements we tested.&lt;/p&gt;

&lt;p&gt;Worth remembering: it's a statistical model, so what you get is the population-average body for your inputs, not your exact body. Everyone is different — but it's a very good base for measurements tuning, which then gets &amp;lt;1 cm error. I'm planning the next article on that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;p&gt;The most striking was the real-world inconsistency in Anny's anthropometry module. To calculate the mass, the approach is simple: calculate the volume of the body and multiply by body density. Primary school math. But Anny used 980 kg/m³ density, which is indeed the value you get after typing "average person density" into a web search. However, it's more subtle than it initially seems.&lt;/p&gt;

&lt;p&gt;The first thing is that the value is different for men and women. The second is that "body density" isn't one number — it depends on the convention. Whole-body density (lungs included, ~985 kg/m³) is what you'd measure by submerging someone in a tank — just below water, which is why humans barely float. Tissue-only density (~1030–1080 kg/m³) is what hydrostatic weighing reports after subtracting residual lung air, and it's what fat-vs-muscle composition actually gives you. The 980 kg/m³ figure sits between these two conventions — close to whole-body but not quite. The third is that "muscle weighs more". The per-gender tissue-only medians we ended up using (male ~1059, female ~1031 kg/m³) live in &lt;a href="https://github.com/datar-psa/clad-body" rel="noopener noreferrer"&gt;clad-body&lt;/a&gt;, derived from body-fat percentage via the Siri two-component model. Empirically the correction works — lean bodies gain mass, soft bodies lose it — though the absolute scale still rests on the 980 calibration being roughly right for the "average" subject.&lt;/p&gt;

&lt;p&gt;Density isn't unique for all people, and muscle has a different density than fat. Not much, but it can change the mass by 2–3 kg. To respond to that, &lt;a href="https://github.com/datar-psa/clad-body" rel="noopener noreferrer"&gt;clad-body&lt;/a&gt; estimates body fat using the Navy formula.&lt;/p&gt;

&lt;p&gt;The second finding (which will be described more in the measurements tuning post) is that each cm matters. A 2 cm shift across all torso circumferences (bust, waist, hips) moves the computed mass by ~2 kg!&lt;/p&gt;

&lt;p&gt;All the above summed together had a big impact on predicting incorrect mass. Once we adjusted density via body-fat estimation, athletic bodies gained up to 1 kg and soft bodies lost up to 2. Small in absolute terms, but it's the difference between matching the scale and being systematically off for anyone not shaped like the average.&lt;/p&gt;

&lt;p&gt;Another thing that had a big impact on mass accuracy: the ancestry feature. For a while, mass MAE refused to drop below 3 kg no matter what we tried. The error distribution looked bimodal which seemed to be suspicious.&lt;/p&gt;

&lt;p&gt;Turns out Anny has three race blendshapes (african, asian, caucasian) that subtly affect body proportions. In training we sampled them randomly, but at inference we hardcoded them to a uniform mix — the user hadn't told us anything about ancestry. So the MLP was trained on one distribution and predicted under another: a 3 kg noise floor we'd built ourselves. The fix is simple: add ancestry to the questionnaire, four categories mapped to fixed blendshape values. Training and inference now use the same numbers for the same label. Mass MAE dropped from ~3 kg to under 0.5. Some odd height errors on a few bodies disappeared too.&lt;/p&gt;

&lt;p&gt;The broader lesson (like last time!) is that spending time on the dataset and the evaluation harness paid off more than spending time on the model. A bigger network wouldn't have caught the bugs. Running the pipeline on real people is what exposed the mass calculation issue, not synthetic eval. The MLP itself with 2 layers and 256 units is boring. The work that mattered was upstream and downstream of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it the final form?
&lt;/h2&gt;

&lt;p&gt;Definitely not. As I mentioned, people are struggling more than anticipated when choosing the body shape. What's missing in the current form but should be addressed are long/short arms/legs, which also impact how mass is distributed. &lt;a href="https://github.com/muelea/shapy#attributes-to-shape-a2s" rel="noopener noreferrer"&gt;SHAPY's Attributes-to-Shape (A2S)&lt;/a&gt; goes further in the same direction — a body described with a whole set of attributes like "muscular", "pear-shaped", "long torso", "broad shoulders". Plenty of ideas to borrow from there.&lt;/p&gt;

&lt;p&gt;A better idea that is going around us is to make it more interactive and exactly features based. Instead of asking "what's your body shape?", show a body the user can adjust directly — bust vs hips, arms vs legs, shoulder width — and let them tune what they see. Probably where we're heading next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkbx02x9jhrkjthcxtqx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkbx02x9jhrkjthcxtqx.jpg" alt="SizeMe questionnaire page — form inputs on the left, generated 3D body with ISO measurement contours in the middle, measurements panel on the right" width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live in the PWA at &lt;a href="https://clad.you/size-aware/size-me" rel="noopener noreferrer"&gt;clad.you/size-aware/size-me&lt;/a&gt; — eight questions, 3D body in under a second. Also exposed as a REST API at &lt;a href="https://api.clad.you" rel="noopener noreferrer"&gt;api.clad.you&lt;/a&gt; — questionnaire or photo in, body params + measurements out. Free for now while we work out whether anyone actually wants this; key at &lt;a href="https://clad.you/developers" rel="noopener noreferrer"&gt;clad.you/developers&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://clad.you/blog/posts/questionnaire-mlp/" rel="noopener noreferrer"&gt;clad.you&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>bodyreconstruction</category>
      <category>computervision</category>
    </item>
    <item>
      <title>A 3D Body Scan for Nine Cents — Without SMPL</title>
      <dc:creator>Arkadiusz</dc:creator>
      <pubDate>Fri, 27 Mar 2026 16:51:21 +0000</pubDate>
      <link>https://dev.to/arkadiuss/a-3d-body-scan-for-nine-cents-without-smpl-4me1</link>
      <guid>https://dev.to/arkadiuss/a-3d-body-scan-for-nine-cents-without-smpl-4me1</guid>
      <description>&lt;p&gt;Everyone in computer vision uses &lt;a href="https://smpl.is.tue.mpg.de/" rel="noopener noreferrer"&gt;SMPL&lt;/a&gt; for human body reconstruction. There is one problem: SMPL has a &lt;a href="https://smpl.is.tue.mpg.de/modellicense.html" rel="noopener noreferrer"&gt;non-commercial license&lt;/a&gt; that blocks production use, unless you pay a lot. For us — a tiny, two-person startup — it was out of reach.&lt;/p&gt;

&lt;p&gt;Instead we built a fully commercial pipeline using Naver's Anny and Meta's MHR — both with permissive licenses. Both appeared in November 2025. The whole pipeline is cheap enough to become consumer-grade — and by consumer-grade I mean not just cost, but also time and UX. A normal person shouldn't need instructions, a special photo, or more than a minute. Did we solve the holy grail of fashion? Here is how it works, what it costs, and where it breaks down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SMPL licensing trap
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://smpl.is.tue.mpg.de/" rel="noopener noreferrer"&gt;SMPL&lt;/a&gt; became the standard for body models. Almost all the research about Human Mesh Recovery (HMR) you read uses it under the hood. However, the &lt;a href="https://smpl.is.tue.mpg.de/modellicense.html" rel="noopener noreferrer"&gt;license&lt;/a&gt; is very clear — while its source is available, it cannot be used for commercial purposes unless you get a commercial sub-license from &lt;a href="https://meshcapade.com/infopages/licensing.html" rel="noopener noreferrer"&gt;Meshcapade&lt;/a&gt; — the exclusive sub-licensor appointed by Max Planck. Pricing has never been public; you email sales and negotiate. Recently &lt;a href="https://www.mpg.de/26082348/max-planck-spin-off-meshcapade-draws-epic-games-to-tuebingen" rel="noopener noreferrer"&gt;Epic Games acquired Meshcapade&lt;/a&gt; (February 2026, closing April), so the future of SMPL commercial licensing is unclear. Either way — not an option for a two-person startup.&lt;/p&gt;

&lt;p&gt;The SMPL license also prohibits training neural networks for commercial use. Given how many commercial products rely on HMR models trained with SMPL supervision, the licensing gap in this space is wider than most people realize.&lt;/p&gt;

&lt;p&gt;You need to pay when you create a 3D mesh from params. And here is the biggest trap: almost all work on body models at some point has SMPL params and performs a non-commercial conversion of them into a 3D mesh. HMR is a good example of this: most of the NNs do not predict a mesh but rather SMPL params, and only then create a mesh.&lt;/p&gt;

&lt;p&gt;What's more, it's very often not clear that SMPL is used there. Even things you would never suspect, like Naver's &lt;a href="https://github.com/naver/multi-hmr" rel="noopener noreferrer"&gt;MultiHMR&lt;/a&gt; — which does have Anny-based checkpoints that skip SMPL entirely, but the model itself is non-commercial. So close, yet so far. The list goes on: &lt;a href="https://github.com/shubham-goel/4D-Humans" rel="noopener noreferrer"&gt;HMR 2.0&lt;/a&gt;, &lt;a href="https://github.com/saidwivedi/TokenHMR" rel="noopener noreferrer"&gt;TokenHMR&lt;/a&gt;, &lt;a href="https://github.com/MotrixLab/SMPLer-X" rel="noopener noreferrer"&gt;SMPLer-X&lt;/a&gt;, &lt;a href="https://github.com/Arthur151/ROMP" rel="noopener noreferrer"&gt;ROMP&lt;/a&gt;, &lt;a href="https://github.com/jeffffffli/HybrIK" rel="noopener noreferrer"&gt;HybrIK&lt;/a&gt;, &lt;a href="https://github.com/yohanshin/WHAM" rel="noopener noreferrer"&gt;WHAM&lt;/a&gt; — their code may be MIT or Apache 2.0, but they all output SMPL params. To get a mesh from those params you need the SMPL model files, and those are non-commercial.&lt;/p&gt;

&lt;h2&gt;
  
  
  The landscape (March 2026)
&lt;/h2&gt;

&lt;p&gt;Two body models changed everything in late 2025. Both commercially permissive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/naver/anny" rel="noopener noreferrer"&gt;Anny&lt;/a&gt; from Naver Labs Europe. The big deal: its 11 shape params actually mean something — gender, age, weight, height, muscle, cup size. When a customer asks "will this fit my hips?" you need params like these, not abstract PCA coefficients. On top of that it has 256 local change blendshapes for things like waist circumference or breast volume. 14K vertices, 163 bones, fully differentiable. Great work from the HUMANS team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/facebookresearch/MHR" rel="noopener noreferrer"&gt;MHR&lt;/a&gt; from Meta. Different philosophy: 45 abstract shape coefficients. Shape param #37 means nothing to a human. But the mesh quality is excellent — 18K vertices, 127 joints, 7 LOD levels. And critically: Meta's &lt;a href="https://github.com/facebookresearch/sam-3d-body" rel="noopener noreferrer"&gt;SAM 3D Body&lt;/a&gt; outputs MHR params directly — under Meta's &lt;a href="https://github.com/facebookresearch/sam-3d-body/blob/main/LICENSE" rel="noopener noreferrer"&gt;SAM License&lt;/a&gt;, which is commercially permissive but not Apache 2.0. Right now it's the best single-image HMR you can use commercially.&lt;/p&gt;

&lt;p&gt;We use both. MHR because it's the only body model with a commercial HMR path (SAM 3D Body). Anny for semantic understanding and fit guidelines. The bridge between them is our own MHR→Anny conversion — more on that below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://smpl.is.tue.mpg.de/" rel="noopener noreferrer"&gt;SMPL/SMPL-X&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/facebookresearch/MHR" rel="noopener noreferrer"&gt;MHR&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/naver/anny" rel="noopener noreferrer"&gt;Anny&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Non-commercial (Meshcapade for commercial)&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vertices&lt;/td&gt;
&lt;td&gt;6,890 / 10,475&lt;/td&gt;
&lt;td&gt;18,439&lt;/td&gt;
&lt;td&gt;13,718&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shape params&lt;/td&gt;
&lt;td&gt;10 / 10 (abstract PCA)&lt;/td&gt;
&lt;td&gt;45 (abstract)&lt;/td&gt;
&lt;td&gt;11 semantic + 256 local&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Param meaning&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Human-readable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HMR support&lt;/td&gt;
&lt;td&gt;Almost everything&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/facebookresearch/sam-3d-body" rel="noopener noreferrer"&gt;SAM 3D Body&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/naver/multi-hmr" rel="noopener noreferrer"&gt;MultiHMR&lt;/a&gt; (non-commercial)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production-ready&lt;/td&gt;
&lt;td&gt;Behind paywall&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;We decided to build the whole pipeline around Anny as the target body model. The semantic params are the reason — they don't just describe the body, they let you manipulate it meaningfully. Want to tune a specific region like waist or bust? Change one param. Want to predict how a body looks two kilos lighter, or two months into pregnancy? You can do that too. No other body model gives you this.&lt;/p&gt;

&lt;p&gt;The pipeline has two input paths that converge into the same downstream flow: body mesh → measurements → measurement tuning → physics draping.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rqlhjjtp6yczfnhhfrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rqlhjjtp6yczfnhhfrb.png" alt="Pipeline diagram" width="574" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The photo path starts with SAM 3D Body. Given the SMPL trap, we had a hard time finding a commercially usable HMR model. We're optimistic about Naver's MultiHMR on Anny-only params, but it's also non-commercial. Fortunately, in late 2025, Meta published SAM 3D Body — single photo in, MHR body params out, 12GB VRAM. A sharp eye can spot one thing though: SAM 3D outputs MHR params while Anny is a different model entirely. So the photo path needs a bridge — we built our own MHR→Anny converter since Anny's built-in regressor gave quite poor results.&lt;/p&gt;

&lt;p&gt;The questionnaire path is different. We trained a model that predicts Anny body params directly from 8 inputs — height, weight, gender, body shape, and a few more. No photo, no GPU, &amp;lt;1s inference. More on the questionnaire in the next post.&lt;/p&gt;

&lt;p&gt;Both paths converge at measurement tuning. This is the key insight of the whole pipeline. No single method — photo or questionnaire — nails body measurements on the first attempt. The goal isn't to get 1 cm MAE from reconstruction alone. It's to get a close enough body model that you can then tune to less than 1 cm. Given a reconstructed body and a few known measurements, tuning optimizes the body params to close the gap.&lt;/p&gt;

&lt;p&gt;Once you have a tuned body mesh, the garment gets draped on it with physics. But that's a different post.&lt;/p&gt;

&lt;p&gt;Here's what the output looks like — an Anny body with circumference measurements:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8nyupv7h4cslwvngive.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8nyupv7h4cslwvngive.png" alt="Anny body mesh with circumference measurements — female curvy body type" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs to run
&lt;/h2&gt;

&lt;p&gt;Our goal was simple: do it at almost no cost, as we don't have many funds. The most expensive thing is obviously the GPU. We tried to avoid it as much as possible, but in some cases we had to use it. Here are real numbers from our GCP billing — not estimates, not projections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmd9ph1aacidiaopefjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmd9ph1aacidiaopefjo.png" alt="GCP Cloud Run billing for clad-photo-body-recon" width="800" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The photo body reconstruction step (SAM 3D Body + MHR→Anny conversion) runs as a Cloud Run job with an L4 GPU at ~$0.67/hour. We ran it 30 times during development — about 61 minutes of total GPU time, ~$2.60 total (GPU + CPU + memory). That's about $0.09 per run. And honestly — it's not optimized. Each successful job takes about 5 minutes, but the actual compute (SAM 3D inference + fitting) is around 80 seconds. The rest is loading models — SAM 3D weights (~66s) and Anny blendshapes (~2 min) get re-downloaded on every cold start. With proper caching that should bring the total under 2 minutes and the cost to ~$0.03 per run.&lt;/p&gt;

&lt;p&gt;And keep in mind — body reconstruction is a one-time thing per user. You build their body model once, then every try-on reuses it.&lt;/p&gt;

&lt;p&gt;The questionnaire path is &amp;lt;1s, no GPU at all. Physics draping takes about 1 minute on an L4 — so another ~$0.01 per try-on. But unlike body reconstruction, draping runs on every garment the user tries.&lt;/p&gt;

&lt;p&gt;Important caveat on the tables below: our numbers are raw infrastructure cost — no margin, no API layer, no support. The third-party prices are commercial APIs that include all of that. Still, the difference is large enough to matter.&lt;/p&gt;

&lt;p&gt;Body scan and measurement APIs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Per-scan cost&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://3dlook.ai/pricing/" rel="noopener noreferrer"&gt;3DLOOK&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$2-5&lt;/td&gt;
&lt;td&gt;Measurements from 2 photos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://me.meshcapade.com/subscriptions" rel="noopener noreferrer"&gt;Meshcapade&lt;/a&gt; (SMPL commercial)&lt;/td&gt;
&lt;td&gt;~€1-5&lt;/td&gt;
&lt;td&gt;Body model (credit-based: 100-500 credits per avatar, €5/500 credits)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://boldmetrics.com/" rel="noopener noreferrer"&gt;Bold Metrics&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Contact sales&lt;/td&gt;
&lt;td&gt;AI body data from questionnaire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Our pipeline, photo path (current, unoptimized)&lt;/td&gt;
&lt;td&gt;~$0.09&lt;/td&gt;
&lt;td&gt;3D body + measurements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Our pipeline, photo path (optimized)&lt;/td&gt;
&lt;td&gt;~$0.03-0.04&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Our pipeline, questionnaire path (no GPU)&lt;/td&gt;
&lt;td&gt;&amp;lt;$0.01&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Virtual try-on (diffusion, 2D only — no measurements, no fit info):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Per-image cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://fashn.ai/pricing" rel="noopener noreferrer"&gt;FASHN&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.049-0.075&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://replicate.com/cuuupid/idm-vton" rel="noopener noreferrer"&gt;IDM-VTON on Replicate&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;~$0.025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/imagen/virtual-try-on-001" rel="noopener noreferrer"&gt;Google Vertex AI VTO&lt;/a&gt; (Imagen)&lt;/td&gt;
&lt;td&gt;$0.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Our pipeline (body recon + physics draping)&lt;/td&gt;
&lt;td&gt;~$0.10-0.15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Honest results
&lt;/h2&gt;

&lt;p&gt;The standard way to evaluate HMR models is MPJPE (mean per-joint position error) and PVE (per-vertex error) — both in millimeters. SAM 3D Body scores well on these: ~55mm MPJPE on 3DPW, ~61mm PVE on RICH. But for size-aware VTO none of that matters. What matters is circumference MAE in centimeters — waist, bust, hips. That's what tells you if a garment will fit.&lt;/p&gt;

&lt;p&gt;Recovering from a photo has one fundamental flaw — it's impossible to determine absolute measurements of the person. Even with one known measurement, pose, lighting, or camera lens can throw off the rest. A &lt;a href="https://arxiv.org/abs/2601.06035" rel="noopener noreferrer"&gt;recent study&lt;/a&gt; on SAM 3D Body's anthropometric fidelity confirms what we see in practice — the model suffers from regression to the mean. The encoder discards fine geometric cues and the low-dimensional shape space can't capture variation like muscle atrophy or pregnancy. Every body gets smoothed toward a generic average. This is architectural, not tunable.&lt;/p&gt;

&lt;p&gt;The MHR→Anny conversion itself works well: ~10mm mean nearest-neighbor surface error across the body. The accuracy gap comes from the upstream photo reconstruction, not from the conversion step.&lt;/p&gt;

&lt;p&gt;We're still early on evaluation. We've tested the full photo pipeline on a couple of real people measured by hand with tape — not a large dataset, not final numbers. From these first results the BWH (bust-waist-hips) MAE is roughly 5-8 cm. Some measurements are much better than others — waist tends to be very close, bust is the weakest point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslyrtdhc0z3oh5sgw6y7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslyrtdhc0z3oh5sgw6y7.png" alt="Anny body mesh with circumference measurements — male average body type" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For context: single-image body reconstruction from in-the-wild photos typically achieves 3-12 cm MAE on circumferences (&lt;a href="https://www.mdpi.com/2313-433X/11/6/205" rel="noopener noreferrer"&gt;survey&lt;/a&gt;). Controlled environments with synthetic data get 1.6-3 cm. Professional 3D body scanners get ±0.5-1.6 cm. We're somewhere in the middle — and still evaluating.&lt;/p&gt;

&lt;p&gt;The key insight: no single method nails all measurements on the first attempt. The goal isn't 1 cm MAE from reconstruction alone. It's to get a close enough body that measurement tuning can close the gap — and that's what we do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'd do differently
&lt;/h2&gt;

&lt;p&gt;If starting over, we'd invest in reliable body measurement infrastructure from day one. Sounds obvious, but neither MHR nor Anny ship with a measurement library. You get a mesh with 14-18K vertices and no standard way to extract waist circumference from it. We had to build our own — ISO 8559-1 plane-sweep circumferences, landmark detection, contour separation. That measurement layer ended up being foundational for everything downstream: accuracy evaluation, measurement tuning, fit guidelines. Without it you're guessing. We're planning to open-source this as &lt;code&gt;clad-body&lt;/code&gt; — because anyone working with MHR or Anny will hit the same wall.&lt;/p&gt;

&lt;p&gt;The other surprise was UX. When you tell someone to upload a photo for body reconstruction (tight clothes, one person, good lighting), scrolling through their gallery to find a suitable picture rarely takes less than 3 minutes — and by then they've lost focus. The questionnaire has its own problem: people don't always know their body shape or belly type. Both paths have friction we didn't expect. We're testing both on real people to see which one actually works for consumers.&lt;/p&gt;

&lt;p&gt;Validation is harder than we thought. There aren't good datasets for this use case. Model agency measurements can't be fully trusted. The only reliable method is what we're doing now: measuring real people by hand and comparing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;A commercial 3D body pipeline without SMPL is possible today — for nine cents per body. The first results show that cm-perfect measurements are within reach once you combine reconstruction with tuning. We're actively evaluating and developing this — the pipeline will likely look quite different soon as we improve accuracy and speed. You can &lt;a href="https://clad.you/size-aware/size-me" rel="noopener noreferrer"&gt;try it yourself&lt;/a&gt;. More on that in the next posts.&lt;/p&gt;

</description>
      <category>computervision</category>
      <category>opensource</category>
      <category>bodyreconstruction</category>
    </item>
  </channel>
</rss>
