Spaces:
Running
Running
| <html lang="en"><head><meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>Results β Force Estimation on GelSight Mini</title> | |
| <link rel="preconnect" href="https://fonts.googleapis.com"> | |
| <link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600;9..144,700&family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;600&family=Noto+Serif+SC:wght@600;700&family=Noto+Sans+SC:wght@400;500&display=swap" rel="stylesheet"> | |
| <style> | |
| :root{--paper:#0d1526;--ink:#dce7f5;--dim:#7c8db0;--grid:#1a2540; | |
| --force:#ffb347;--target:#ff7847;--ok:#7be0a0;--card:#111b31;--line:#24345;} | |
| *{box-sizing:border-box} | |
| body{margin:0;background:var(--paper);color:var(--ink); | |
| font-family:'IBM Plex Sans','Noto Sans SC',sans-serif;line-height:1.65;font-size:16px; | |
| background-image:linear-gradient(var(--grid) 1px,transparent 1px), | |
| linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:44px 44px} | |
| .wrap{max-width:880px;margin:0 auto;padding:0 24px 80px} | |
| h1,h2{font-family:'Fraunces','Noto Serif SC',serif} | |
| h1{font-size:2.1rem;font-weight:700;line-height:1.2;margin:0 0 10px} | |
| h2{font-size:1.25rem;font-weight:600;margin:46px 0 8px;color:var(--force)} | |
| .kicker{font-family:'IBM Plex Mono',monospace;font-size:.76rem;letter-spacing:.16em; | |
| text-transform:uppercase;color:var(--force);margin-bottom:14px} | |
| header{padding:60px 0 26px;border-bottom:1px dashed var(--line)} | |
| .sub{color:var(--dim);max-width:720px} | |
| .card{background:var(--card);border:1px solid var(--line);border-radius:10px; | |
| padding:18px 22px;margin:14px 0} | |
| .step{display:grid;grid-template-columns:34px 200px 1fr;gap:12px; | |
| padding:10px 0;border-bottom:1px solid var(--line);align-items:baseline} | |
| .step:last-child{border-bottom:none} | |
| .step .n{font-family:'Fraunces',serif;font-size:1.25rem;color:var(--target)} | |
| .step .t{font-family:'IBM Plex Mono',monospace;font-size:.85rem} | |
| .step .d{color:var(--dim);font-size:.9rem} | |
| table{border-collapse:collapse;width:100%;font-size:.88rem;margin:10px 0; | |
| font-variant-numeric:tabular-nums} | |
| th,td{padding:7px 10px;border-bottom:1px solid var(--line);text-align:right} | |
| th{color:var(--dim);font-family:'IBM Plex Mono',monospace;font-size:.72rem; | |
| text-transform:uppercase;letter-spacing:.08em} | |
| td:first-child,th:first-child{text-align:left} | |
| img,video{max-width:100%;height:auto;border-radius:8px;border:1px solid var(--line); | |
| display:block;margin:12px auto} | |
| a{color:#4fd8e0}a:hover{color:var(--force)} | |
| .pill{display:inline-block;border:1px solid var(--line);border-radius:999px; | |
| padding:3px 12px;font-size:.75rem;font-family:'IBM Plex Mono',monospace; | |
| color:var(--dim);margin-right:8px;margin-top:12px;text-decoration:none} | |
| code{font-family:'IBM Plex Mono',monospace;background:#0a1120;padding:1px 5px; | |
| border-radius:4px;font-size:.85em} | |
| .ok{color:var(--ok)}.warn{color:#e0b34f} | |
| footer{margin-top:60px;padding-top:18px;border-top:1px dashed var(--line); | |
| color:var(--dim);font-size:.8rem} | |
| @media(max-width:640px){.step{grid-template-columns:28px 1fr;grid-auto-flow:dense} | |
| .step .d{grid-column:2} | |
| h1{font-size:1.45rem} | |
| table{display:block;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch} | |
| th,td{white-space:normal;min-width:110px}} | |
| .matrix td.best{color:var(--ok);font-weight:700} | |
| .matrix td.dead{color:#c0392b} | |
| </style></head><body><div class="wrap"> | |
| <header> | |
| <div class="kicker">React force recovery Β· results</div> | |
| <h1>Three estimators Γ three ground-truth datasets</h1> | |
| <p class="sub">Every method evaluated on every dataset with force-sensor labels, | |
| predicted vs ground truth per dataset β so dataset quality is controlled within | |
| each row, and differences between panels are differences between methods.</p> | |
| <a class="pill" href="method.html">β how the method is designed</a> | |
| <a class="pill" href="index.html">overview</a> | |
| <a class="pill" href="gallery.html">gallery</a> | |
| <a class="pill" href="results_zh.html">δΈζ</a> | |
| </header> | |
| <h2>The matrix (Spearman Ο, predicted vs F/T ground truth)</h2> | |
| <div class="card"><table class="matrix"> | |
| <tr><th>dataset (gel type)</th><th>Ours β physics,<br>0 training frames</th> | |
| <th>FEATS U-net<br>(trained: marker gel)</th> | |
| <th>FeelAnyForce<br>(trained: markerless)</th></tr> | |
| <tr><td>FEATS val (marker)</td><td>0.77</td> | |
| <td class="best">0.96 Β· in-domain</td><td class="dead">0.43</td></tr> | |
| <tr><td>FoTa cnc_Mini (markerless)</td><td>0.94 (in view)</td> | |
| <td class="dead">0.07</td><td class="best">0.83</td></tr> | |
| <tr><td>GlowTact (markerless)</td><td>0.98</td> | |
| <td class="dead">0.04</td><td class="best">0.90</td></tr> | |
| </table> | |
| <p>The pattern is the finding: <b>each network dominates its own gel domain and | |
| collapses outside it</b> (FEATS 0.96 β 0.04β0.07; FeelAnyForce 0.90 β 0.43), | |
| while <b>the physics pipeline is the only estimator that works everywhere</b> | |
| (0.74β0.99) β it never sees training data, so it has no domain to leave.</p> | |
| </div> | |
| <h2>FEATS dataset β marker-dot gel</h2> | |
| <div class="card"><img src="assets/results_feats.png" alt="FEATS dataset panels"> | |
| <p class="footnote">In-domain, the FEATS U-net is excellent (Ο=0.96) β the | |
| negative results elsewhere are domain effects, not a weak model. FeelAnyForce, | |
| markerless-trained, degrades on the dotted gel (0.43): the same knife cuts both | |
| ways.</p></div> | |
| <h2>FoTa cnc_Mini β markerless gel</h2> | |
| <div class="card"><img src="assets/results_cnc.png" alt="cnc_Mini panels"> | |
| <p class="footnote">Hard conditions: only 4 contact-free frames, 62% of presses | |
| near the pad border β the press grid is larger than the field of view (see | |
| <a href="debug_pipeline.html">pipeline debug</a>). Strictly in view our Ο is | |
| 0.94 (MAE 0.26 N); FeelAnyForce reaches 0.92 non-edge.</p></div> | |
| <h2>GlowTact β markerless gel, cleaned</h2> | |
| <div class="card"><img src="assets/results_glowtact.png" alt="GlowTact panels"> | |
| <p class="footnote">Friendliest ground truth (centred presses, 10 free frames, | |
| 0β20 N). Per-indenter, calibrated within each family under the physical scope | |
| (contact fully in view, gel not bottomed out), Ο is 0.975β0.992 across all six | |
| indenters with MAE β€ 0.73 N. Caveat: that calibration is refit per family, so | |
| it measures rank agreement within a group, not a transferable absolute-newton | |
| scale β see <a href="method.html">per-dataset calibration</a>.</p></div> | |
| <h2>Sparsh (Meta) β a fourth dataset, and where the method breaks</h2> | |
| <div class="card"><img src="assets/results_sparsh.png" alt="Sparsh results"> | |
| <p class="footnote">10 gel pads (6 sphere, 2 flat, 2 sharp), force in newtons. | |
| Our GlowTact table applied to this foreign sensor reaches ρ=0.878 on | |
| in-view frames. Rebuilding the table from <b>Sparsh's own sphere presses</b> | |
| β 708 frames, radius fitted at R=2.44 mm from a²=d(2R−d) β takes it | |
| to <b>ρ=0.968, MAE 0.042 N</b>, against a labels-shuffled-within-pad | |
| control of 0.23. Fitting on one pad and applying it <b>unchanged</b> to another | |
| costs nothing measurable (0.96–0.98 everywhere): one table, six gel pads.</p> | |
| <img src="assets/sparsh_dome.png" alt="dome before and after"> | |
| <p class="footnote">Why the table matters more than the fit: with the wrong | |
| sensor's table a sphere press integrates to a <b>bilobed shape with a central | |
| dip</b>; with the self-calibrated table it is a single dome matching the | |
| analytic spherical cap (residual RMS 0.179 → <b>0.0545 mm</b>). Measured | |
| before any integration, the LUT gradient sits <b>93.3°</b> from the analytic | |
| sphere gradient β chance is 90° β and self-calibration brings it to | |
| <b>4.5°</b> (within 30°: 15% → 99%). Reverse control: the Sparsh | |
| table fails on GlowTact frames too, so this is a per-sensor property, not a | |
| bad table.</p> | |
| <p class="footnote"><b>What this costs and where it still fails.</b> The price | |
| is one set of sphere presses with logged depth on the target sensor: this is | |
| <b>calibrate once per sensor</b>, not zero-shot. Rank order transfers across | |
| indenter shapes but <i>absolute newtons do not</i> β a sphere-fitted model | |
| applied to a flat punch degrades to MAE 0.37–0.40 N, and it got | |
| <i>worse</i> with the correct table, because true geometry widens the real | |
| feature-scale gap between a sphere and a punch. The sharp indenter is | |
| unsupported (in-view ρ 0.58). Shear stays out of reach by construction β | |
| the top shear decile keeps 1.6× the residual whichever table is used. | |
| Frames are restricted to a visible contact disc: 36% of presses show none and | |
| 11% are clipped, and the clipped subset carries the <i>highest</i> median force | |
| yet scores worse, so this is visibility, not force-range filtering. Three | |
| dataset defects had to be fixed first: flat/sharp trajectories ship 5 more | |
| frame indices than forces (silently drifting the labels, ρ≈0 until | |
| paired within each trajectory), sharp/batch_2 is stored BGR while the other | |
| nine are RGB, and flat/batch_2 ships only 3 of 4 image files.</p></div> | |
| <h2>React β no ground truth, so: do independent methods agree?</h2> | |
| <div class="card"><img src="assets/results_react.png" alt="React agreement"> | |
| <p class="footnote">On the dataset we actually care about, the two surviving | |
| estimators β physics (zero training) and FeelAnyForce (200K frames) β agree at | |
| Ο=0.91, and FeelAnyForce reads β0 N on every frame the physics pipeline calls | |
| contact-free. Neither can copy the other's mistakes.</p></div> | |
| <h2>Takeaway</h2> | |
| <div class="card"><p style="margin-top:0"><b>For labelling React</b> (markerless | |
| Mini): FeelAnyForce as the primary labeller, the physics pipeline as an | |
| independent audit, disagreement rows flagged. <b>For any new gel or sensor</b> | |
| where no trained model matches the domain: the physics pipeline is the only | |
| option that works out of the box β and its FEATS-dataset score (0.74) shows | |
| what it does on a domain nobody tuned it for.</p></div> | |
| <p><a href="debug_pipeline.html"><b>Pipeline debug page</b></a>: raw | |
| image → force step by step on all three datasets, and the cnc | |
| field-of-view ablation (in-view ρ=0.94).</p> | |
| <footer>React force recovery Β· <a href="index.html">overview</a> Β· | |
| <a href="method.html">method design</a> Β· <a href="gallery.html">gallery</a> Β· | |
| data: FEATS (2411.03315) Β· FoTa/T3 (2406.13640) Β· GlowTact | |
| (dacongming666/GlowTact_Datasets) Β· FeelAnyForce (2410.02048)</footer> | |
| </div></body></html> |