Align 2.4.0 pin tracking and pupil-based eyes; add sequence and target-field regressions
这个提交包含在:
1 父节点
524f536a53
当前提交
75e7f4a00d
26 个文件已更改
+16839
-87
没有与搜索条件相匹配的文件
@@ -0,0 +1,195 @@
|
||||
# 2.4.0 region / pin branch review
|
||||
|
||||
2026-10-23. Independent read-only review of the existing AIR and local arm64
|
||||
slice. No shared REA operation, target execution, product edit, Git operation,
|
||||
or user image/landmark extraction was performed.
|
||||
|
||||
## The default-path correction
|
||||
|
||||
**The inspected main encoders and both direct fallback callers select mode 0
|
||||
(pin), not region. Fragment buffer 8 is sampleFlipY, not faceThinMode.**
|
||||
|
||||
AIR file: `build/vface-analysis/new-face-thin.air.txt`, SHA-256
|
||||
`1d5bd8d5a3917afbb3b4fe1c40b44480760614102685ac826e84ad2e30a450f9`.
|
||||
Arm64 slice: `build/tracking-audit/MSE18V2-arm64`, SHA-256
|
||||
`afc71d0d21fd3c1ca95ca745ddafcd729e36ad95f17d8638009f2e45d9b7e8df`.
|
||||
|
||||
AIR metadata lines 4126–4135 give the actual Metal binding indices:
|
||||
|
||||
| Fragment buffer | Name | AIR parameter |
|
||||
| --- | --- | --- |
|
||||
| 0 | facePoints | `%3` |
|
||||
| 1 | faceCount | `%4` |
|
||||
| 2 | faceThinStrength | `%5` |
|
||||
| 4 | faceThinMode | `%6` |
|
||||
| 7 | faceShapeParams | `%7` |
|
||||
| 8 | sampleFlipY | `%8` |
|
||||
| 9 | warpFlipY | `%9` |
|
||||
| 10 | sourceSampleRect | `%10` |
|
||||
|
||||
This is not merely a name inference: lines 447–465 load `%6`, test it `>0`,
|
||||
and choose region. Lines 569–583 load `%8` and perform the final sample Y flip.
|
||||
|
||||
The independent native instruction check used Xcode llvm-objdump on that exact
|
||||
slice; addresses below are original virtual addresses. The ObjC stub
|
||||
`0x100081d00` is `setFragmentBytes:length:atIndex:` in the saved REA pseudocode.
|
||||
|
||||
| Native path | Source of buffer 4 data | Binding instructions | Result |
|
||||
| --- | --- | --- | --- |
|
||||
| `FUN_100030084` | `0x1000300d0: str wzr,[sp,#0x70]` | `0x100030524 add x2,sp,#0x70`; `0x100030530 mov w4,#4`; call `0x100030534` | mode 0 |
|
||||
| `FUN_100030840` | `0x100030888: str wzr,[sp,#0x70]` | `0x100030bf4 add x2,sp,#0x70`; `0x100030c00 mov w4,#4`; call `0x100030c04` | mode 0 |
|
||||
| `FUN_10003127c`, called at `0x100027a34` | caller `0x1000279f8 str wzr,[sp,#0x18]` | callee `0x10003156c add x2,x29,#0x28`; `0x100031578 mov w4,#4`; call `0x10003157c` | mode 0 |
|
||||
| `FUN_10003127c`, called at `0x10002be14` | `0x10002bd04 str wzr,[sp,#0xbc]`; `0x10002bdb4 ldr w9,[sp,#0xbc]`; `0x10002bde0 str w9,[sp,#0x18]` | same callee binding | mode 0 |
|
||||
| inline fallback in `FUN_10002b8a4` | same zero at `0x10002bd04` | `0x10002bf74 add x2,sp,#0xbc`; `0x10002bf80 mov w4,#4`; call `0x10002bf84` | mode 0 |
|
||||
|
||||
The callee creates a 0x110-byte frame and sets fp=sp+0x100, so its fp+0x28
|
||||
is the caller's sp+0x18. The whole decoded executable text contains exactly
|
||||
the two direct `bl 0x10003127c` calls listed above. This bounds the conclusion:
|
||||
the inspected default/fallback paths do not establish any fixed region=1 path;
|
||||
this is not an exhaustive exclusion of arbitrary indirect calls or runtime
|
||||
buffer replacement.
|
||||
|
||||
Saved provider corroboration in `renderpath-evidence.json`:
|
||||
|
||||
- `0x100030084`: `ev_f6e9622db324900aa5bc7d21598097df4abfb2f1270503751af959c61d7c8405`.
|
||||
- `0x100030840`: `ev_30343763e68d261f018fb476b50a8695ca677d85cbcea9eda709c4e46c89ada6`.
|
||||
- `0x10003127c`: `ev_537b8f52a769c64a08223b18f0fb2fd1a0b1daa0f44ffeb9b5c132513a9bcaf8`.
|
||||
- inline fallback `0x10002b8a4`: `ev_4a2bf9e0530d651ae929ef861a2c52bfdf691445def0a16d8bbe07d723ce0c0e`.
|
||||
|
||||
## Exact shader branch contract
|
||||
|
||||
`faceThinFragmentShader` lines 388–587:
|
||||
|
||||
1. `warpFlipY` optionally flips the working UV before deformation (389–402).
|
||||
2. Source texture width/height are read and clamped to >=1 (427–434).
|
||||
3. If any shape parameter is active, iterate faces with **stride77** (454).
|
||||
With mode>0, run region with `clamp(abs(shoulian)*40,0,1)` (458–465), then
|
||||
run the other shape pins with thin forced to0 (470–474). With mode0, run
|
||||
`mssFaceShapePinCoordinate` with the original thin parameter (478).
|
||||
4. If the shape structure is inactive but the separate faceThinStrength is
|
||||
active, mode>0 uses region directly with clamped overall strength (506);
|
||||
mode0 calls the old thin pin with `0.025*clamp(strength,0,1)` (510–512).
|
||||
5. Clamp UV, undo warpFlipY, map sourceSampleRect, clamp again, apply sampleFlipY,
|
||||
then sample the source (521–583). These are separate coordinate operations.
|
||||
|
||||
The active-shape pin helper's thin branch at 3168–3268 uses its incoming thin
|
||||
ratio directly in the sequential17 pin field. Its pixel-size vector is not
|
||||
used in that branch. This does not alone prove the CPU supplies no size gain;
|
||||
CPU parameter generation remains a separate evidence question.
|
||||
|
||||
Therefore region should not replace the default field based on buffer8=1.
|
||||
The current frame's qualified points may be accepted as-is without implying
|
||||
that its spatial warp must be changed to region.
|
||||
|
||||
## Region function, retained as an optional-path analysis
|
||||
|
||||
`mssFaceThinRegionCoordinate` is lines 706–2835 (another copy appears at
|
||||
4369 onward inside the offset-map shader). Its inputs are working UV, readonly
|
||||
point array, face offset, strength, and source texture size. There is **no time,
|
||||
previous frame, previous point set, persistent buffer write, texture history,
|
||||
atomic, or other temporal input**. All stores in this function initialize local
|
||||
index arrays. It is a pure spatial function of the supplied points/parameters.
|
||||
|
||||
Use `S=(sourceTextureWidth,sourceTextureHeight)`; the point buffer stores UVs.
|
||||
The function loads `P76` as center (747–750), obtains contour bounds from all
|
||||
17 points59..75 (714–793), and computes `W/H` as contour spans multiplied by S
|
||||
(757–772). It returns identity for W<=1 or H<=1 (773–776).
|
||||
|
||||
Query `p=uv*S` at810. Radius, distance, axis normalization, and most amplitude
|
||||
caps are calculated in **pixel space**. The contour center and all point
|
||||
positions must be multiplied componentwise by S before such operations.
|
||||
Displacements are divided componentwise by S to return to UV. Substituting UV
|
||||
Euclidean distance for pixel Euclidean distance changes the aspect behavior.
|
||||
|
||||
The main axis is normalized `P67*S - P76*S`, falling back to (0,1); its
|
||||
perpendicular is `(axis.y,-axis.x)` (863–894). This is based on chin and center,
|
||||
not a fixed vertical image direction, and follows head roll.
|
||||
|
||||
Strength `s=clamp(input,0,1)` is nonlinearly mapped:
|
||||
`u=mix(s,s*s*(3-2*s),.28)`, `a=.105*u*(1.08-.08*u)` (795–805).
|
||||
Aspect and asymmetric left/right center-to-contour spans modulate the field
|
||||
(812–841). These are spatial shape adaptations, not temporal smoothing.
|
||||
|
||||
The output is a combination of:
|
||||
|
||||
- An analytic side contraction with head-local horizontal/vertical smooth
|
||||
envelopes and analytic face support (862–1117).
|
||||
- A neighbor-aware17-contour weighted field (1133–1638), with protected center
|
||||
anchors, smooth radial/directional support, weight-sum normalization and a
|
||||
pixel amplitude cap.
|
||||
- Another17-contour field with strength-dependent neighboring-point averaging
|
||||
(`mix(Pi,(Pprev+2*Pi+Pnext)/4,alpha)`,1683–1699); contour index distance from
|
||||
chin67 affects weights (1704 onward); contributions are accumulated before
|
||||
normalization rather than sequentially updating the query (1905–1939).
|
||||
- Additional lower-face/chin components using65..69, including a three-point
|
||||
chin mean and roll-aware local envelopes (1954–2765).
|
||||
|
||||
Final group caps include `(0.04+.066*s)*W` and `(0.064+.058*s)*W`
|
||||
(2785–2814). The final face envelope multiplies the total by
|
||||
`.32+.68*analyticMask`, then returns `clamp(uv-totalUVDisplacement,0,1)`
|
||||
(2815–2829). This is an inverse sampling field.
|
||||
|
||||
These features can reduce sensitivity to an isolated spatial point perturbation
|
||||
if this mode is selected; that is an inference about the mathematics, not a
|
||||
measured temporal improvement or evidence that the default path uses it.
|
||||
|
||||
## Protection formulas
|
||||
|
||||
Below `smooth(a,b,x)` means smoothstep with clamped input. All dimensions and
|
||||
distances here are in pixels, and decimal constants are decoded AIR float
|
||||
constants (small float rounding retained in the original text).
|
||||
|
||||
Let `C=P76*S`, `D=normalize(P67*S-C)`, `T=(D.y,-D.x)`.
|
||||
|
||||
Analytic face mask, lines2839–2916:
|
||||
|
||||
```
|
||||
q = p-C-.12*H*D
|
||||
x = dot(q,T)/max(.5*W,1)
|
||||
y = dot(q,D)/max(.7*H,1)
|
||||
r = sqrt(x*x+y*y)
|
||||
mask = (1-smooth(.88,1.03,r)) * smooth(-.92,-.72,y)
|
||||
* (1-smooth(1.02,1.16,y))
|
||||
```
|
||||
|
||||
Temple factor, lines3047–3149:
|
||||
|
||||
```
|
||||
x = abs(dot(p-C,T))/max(.52*W,1)
|
||||
y = dot(p-C,D)/max(.60*H,1)
|
||||
k = smooth(-.28,-.02,y) * (1-smooth(.42,.72,y))
|
||||
factor = clamp(1
|
||||
-.62*smooth(.50,.80,x)*(1-smooth(-.46,-.14,y))*(1-.86*k)
|
||||
-.20*smooth(.34,.70,x)*(1-smooth(-.72,-.34,y))*(1-.70*k), .30,1)
|
||||
```
|
||||
|
||||
Anchor factor, lines2993–3043: indices47/48/49/52/76; radius
|
||||
`R=max(12,.28*min(W,H))`; take the minimum
|
||||
`smooth(.34*R,R,distance(p,Pi*S))`, then clamp to [.12,1].
|
||||
|
||||
Chin/mouth factor, lines2929–2977: indices47/48/49/52; radius
|
||||
`R=max(10,.16*min(W,H))`; take the minimum
|
||||
`smooth(.38*R,R,distance(p,Pi*S))`, then clamp to [.24,1].
|
||||
|
||||
The floors protect without hard disabling the whole field. Several region
|
||||
subcomponents additionally interpolate these factors by their local support,
|
||||
so merely multiplying an old17-pin warp by these factors is not equivalent.
|
||||
|
||||
## Smallest justified alignment path
|
||||
|
||||
For the inspected default: keep the pin family and validate the actual CPU
|
||||
ratios, point layout/UV orientation, operation order and optional offset-map
|
||||
processing. Do not insert region or stronger point smoothing as an asserted
|
||||
fix for the user's clip. The large eye control and any offset-map spatial
|
||||
filter need their own evidence; this review has not established their exact
|
||||
runtime contribution.
|
||||
|
||||
Only if a separate reachable region-mode path is later established should its
|
||||
field be reconstructed. A faithful implementation needs the pure coordinate
|
||||
function, all four protections, pixel-space geometry, contour accumulation and
|
||||
caps, followed by the remaining shape pins with thin=0. Evaluate that same
|
||||
coordinate map for RGB and every mask. A generated float2 offset texture plus
|
||||
one inverse sampler is a viable integration boundary; a reduced grid introduces
|
||||
an approximation and needs measured UV error. Temporal state belongs upstream.
|
||||
|
||||
No region=1 runtime path or target output has been observed by this audit.
|
||||
文件差异过大,未显示。
加载差异
@@ -0,0 +1,453 @@
|
||||
{
|
||||
"cases" : [
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 0,
|
||||
"maximum_independent_error_pixels" : 0,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose0 size0 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0.25,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 0.35382923640349639,
|
||||
"maximum_independent_error_pixels" : 0.0026882437460426967,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose0 size0 eye-only",
|
||||
"target_rms_error_pixels" : 2.1921713206428187e-05,
|
||||
"thin" : 0,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 7.0728000415791215,
|
||||
"maximum_independent_error_pixels" : 0.002755077444486212,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose0 size0 thin-only",
|
||||
"target_rms_error_pixels" : 0.00011702992366181097,
|
||||
"thin" : 1,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0.25,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 7.0728000415791215,
|
||||
"maximum_independent_error_pixels" : 0.0027413680285147649,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose0 size0 thin+eye",
|
||||
"target_rms_error_pixels" : 0.0001240079365079365,
|
||||
"thin" : 1,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.3980817331903381e-14,
|
||||
"maximum_independent_error_pixels" : 9.830249857363302e-06,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose0 size1 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0.25,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 0.53075330293307399,
|
||||
"maximum_independent_error_pixels" : 0.0027120972635748626,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose0 size1 eye-only",
|
||||
"target_rms_error_pixels" : 7.0133057212432167e-05,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 8.2005901709704148,
|
||||
"maximum_independent_error_pixels" : 0.0027728968676576145,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose0 size1 thin-only",
|
||||
"target_rms_error_pixels" : 0.00023521707359494627,
|
||||
"thin" : 1,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0.25,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 8.2005901709704148,
|
||||
"maximum_independent_error_pixels" : 0.0027728968676576145,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose0 size1 thin+eye",
|
||||
"target_rms_error_pixels" : 0.00024352479987655608,
|
||||
"thin" : 1,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 1.7763568394002505e-14,
|
||||
"maximum_independent_error_pixels" : 8.5299224090530028e-06,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose0 size2 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0.25,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 0.26537789376221338,
|
||||
"maximum_independent_error_pixels" : 0.0026286369668807358,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose0 size2 eye-only",
|
||||
"target_rms_error_pixels" : 5.0712301697452399e-05,
|
||||
"thin" : 0,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 8.8528177374135399,
|
||||
"maximum_independent_error_pixels" : 0.0027577518479714133,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose0 size2 thin-only",
|
||||
"target_rms_error_pixels" : 0.0002095422906842435,
|
||||
"thin" : 1,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0.25,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 8.8528177374135399,
|
||||
"maximum_independent_error_pixels" : 0.0027577518479714133,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose0 size2 thin+eye",
|
||||
"target_rms_error_pixels" : 0.00021076686089680123,
|
||||
"thin" : 1,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 0,
|
||||
"maximum_independent_error_pixels" : 0,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose1 size0 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0.90354866293532343,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 1.4980655360450705,
|
||||
"maximum_independent_error_pixels" : 0.002736966310374967,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose1 size0 eye-only",
|
||||
"target_rms_error_pixels" : 3.7969521062487261e-05,
|
||||
"thin" : 0,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 8.2983365210307376,
|
||||
"maximum_independent_error_pixels" : 0.0027466016331799312,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose1 size0 thin-only",
|
||||
"target_rms_error_pixels" : 0.00012969060431145763,
|
||||
"thin" : 1,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0.90354866293532343,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 8.2983365210307376,
|
||||
"maximum_independent_error_pixels" : 0.0027466016331799312,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose1 size0 thin+eye",
|
||||
"target_rms_error_pixels" : 0.0001249729933702032,
|
||||
"thin" : 1,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.3980817331903381e-14,
|
||||
"maximum_independent_error_pixels" : 9.830249857363302e-06,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose1 size1 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0.90354866293532343,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.1744460803927361,
|
||||
"maximum_independent_error_pixels" : 0.002720070336115162,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose1 size1 eye-only",
|
||||
"target_rms_error_pixels" : 9.2332938119698104e-05,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 10.38677748064452,
|
||||
"maximum_independent_error_pixels" : 0.0027597851282901023,
|
||||
"maximum_target_error_pixels" : 0.0055219139903783798,
|
||||
"name" : "pose1 size1 thin-only",
|
||||
"target_rms_error_pixels" : 0.00026077041763909807,
|
||||
"thin" : 1,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0.90354866293532343,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 10.38677748064452,
|
||||
"maximum_independent_error_pixels" : 0.0027597851282901023,
|
||||
"maximum_target_error_pixels" : 0.0055219139903783798,
|
||||
"name" : "pose1 size1 thin+eye",
|
||||
"target_rms_error_pixels" : 0.00026150911830191969,
|
||||
"thin" : 1,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 1.7763568394002505e-14,
|
||||
"maximum_independent_error_pixels" : 8.5299224090530028e-06,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose1 size2 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0.90354866293532343,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 1.2129269895950687,
|
||||
"maximum_independent_error_pixels" : 0.0027074615946477646,
|
||||
"maximum_target_error_pixels" : 0.003910064697265625,
|
||||
"name" : "pose1 size2 eye-only",
|
||||
"target_rms_error_pixels" : 4.5346296046615942e-05,
|
||||
"thin" : 0,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 10.144258143830054,
|
||||
"maximum_independent_error_pixels" : 0.0027638516828663376,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose1 size2 thin-only",
|
||||
"target_rms_error_pixels" : 0.00022775554094271662,
|
||||
"thin" : 1,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0.90354866293532343,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 10.144258143830054,
|
||||
"maximum_independent_error_pixels" : 0.0027638516828663376,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose1 size2 thin+eye",
|
||||
"target_rms_error_pixels" : 0.00022830552736565732,
|
||||
"thin" : 1,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 0,
|
||||
"maximum_independent_error_pixels" : 0,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose2 size0 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 1,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 1.9006110949587283,
|
||||
"maximum_independent_error_pixels" : 0.0026860115231048072,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose2 size0 eye-only",
|
||||
"target_rms_error_pixels" : 4.1011770074785939e-05,
|
||||
"thin" : 0,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 9.5084281896725376,
|
||||
"maximum_independent_error_pixels" : 0.0027749358063331774,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose2 size0 thin-only",
|
||||
"target_rms_error_pixels" : 0.00017673850215450427,
|
||||
"thin" : 1,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 1,
|
||||
"height" : 256,
|
||||
"maximum_displacement_pixels" : 9.5084281896725376,
|
||||
"maximum_independent_error_pixels" : 0.0027749358063331774,
|
||||
"maximum_target_error_pixels" : 0.00390625,
|
||||
"name" : "pose2 size0 thin+eye",
|
||||
"target_rms_error_pixels" : 0.00017399820437006796,
|
||||
"thin" : 1,
|
||||
"width" : 256
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.3980817331903381e-14,
|
||||
"maximum_independent_error_pixels" : 9.830249857363302e-06,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose2 size1 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 1,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.65191960410192,
|
||||
"maximum_independent_error_pixels" : 0.0026956562280248753,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose2 size1 eye-only",
|
||||
"target_rms_error_pixels" : 0.00010205516806844121,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 12.235777303453091,
|
||||
"maximum_independent_error_pixels" : 0.002741529812605142,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose2 size1 thin-only",
|
||||
"target_rms_error_pixels" : 0.0002526036292317462,
|
||||
"thin" : 1,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 1,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 12.235777303453091,
|
||||
"maximum_independent_error_pixels" : 0.0027522254693324445,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "pose2 size1 thin+eye",
|
||||
"target_rms_error_pixels" : 0.00025965073459259622,
|
||||
"thin" : 1,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 1.7763568394002505e-14,
|
||||
"maximum_independent_error_pixels" : 8.5299224090530028e-06,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "pose2 size2 passthrough",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 1,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 1.6564609111123645,
|
||||
"maximum_independent_error_pixels" : 0.002608603255927031,
|
||||
"maximum_target_error_pixels" : 0.003910064697265625,
|
||||
"name" : "pose2 size2 eye-only",
|
||||
"target_rms_error_pixels" : 3.5839771916069625e-05,
|
||||
"thin" : 0,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 0,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 11.320027734419691,
|
||||
"maximum_independent_error_pixels" : 0.0027770856999663083,
|
||||
"maximum_target_error_pixels" : 0.0055225868709385395,
|
||||
"name" : "pose2 size2 thin-only",
|
||||
"target_rms_error_pixels" : 0.00022890932538955193,
|
||||
"thin" : 1,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 1,
|
||||
"height" : 320,
|
||||
"maximum_displacement_pixels" : 11.320027734419691,
|
||||
"maximum_independent_error_pixels" : 0.0027770856999663083,
|
||||
"maximum_target_error_pixels" : 0.0055225868709385395,
|
||||
"name" : "pose2 size2 thin+eye",
|
||||
"target_rms_error_pixels" : 0.0002305974089591263,
|
||||
"thin" : 1,
|
||||
"width" : 192
|
||||
},
|
||||
{
|
||||
"eye" : 1,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.6925237951548051,
|
||||
"maximum_independent_error_pixels" : 0.0027203383917974236,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "indexed eye centers",
|
||||
"target_rms_error_pixels" : 8.2559591202410913e-05,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : -0.5,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.3980817331903381e-14,
|
||||
"maximum_independent_error_pixels" : 9.830249857363302e-06,
|
||||
"maximum_target_error_pixels" : 0,
|
||||
"name" : "negative eye strength clamps to zero",
|
||||
"target_rms_error_pixels" : 0,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 2,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 2.6925237951548051,
|
||||
"maximum_independent_error_pixels" : 0.0027203383917974236,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "high eye strength clamps to one",
|
||||
"target_rms_error_pixels" : 8.2559591202410913e-05,
|
||||
"thin" : 0,
|
||||
"width" : 384
|
||||
},
|
||||
{
|
||||
"eye" : 0.90000000000000002,
|
||||
"height" : 216,
|
||||
"maximum_displacement_pixels" : 6.9857867334571617,
|
||||
"maximum_independent_error_pixels" : 0.0027701099063711732,
|
||||
"maximum_target_error_pixels" : 0.00391387939453125,
|
||||
"name" : "overlapping sequential eyes",
|
||||
"target_rms_error_pixels" : 0.00024035192027544236,
|
||||
"thin" : 0.69999999999999996,
|
||||
"width" : 384
|
||||
}
|
||||
],
|
||||
"checks" : 211,
|
||||
"device" : "Apple M1 Max",
|
||||
"maximum_independent_error_pixels" : 0.0027770856999663083,
|
||||
"maximum_target_error_pixels" : 0.0055225868709385395,
|
||||
"mode_buffer4" : 0,
|
||||
"sample_flip_y_buffer8" : 0,
|
||||
"scope" : "Authored synthetic Vision76 geometry; thin and big-eye controls only; no user media or target binaries embedded",
|
||||
"target_oracle_executed" : 1,
|
||||
"warp_flip_y_buffer9" : 0
|
||||
}
|
||||
@@ -101,3 +101,10 @@ build/tracking-diagnostics/inspect-sequence '/绝对路径/源素材.mov' \
|
||||
用户已要求实施。新增静态证据见 `tracking-flicker-20261022/implementation-evidence.json`。补核对检测长边默认960(0x1000bd1f8),失败/空结果/不足76点时使用RGBA CGImage重试;下巴轴为点66、67、68按1:1.65:1加权减脸框中心,并非眼轴。接纳分支仍为原样复制合格点。新代码已加入对应检测、连续框、质量门槛、下巴轴/中位数/P90保护和保持重映射,反向/模式变化重置对象跟踪,同帧检测和几何复用。
|
||||
|
||||
同一草帽素材1920解码、25fps离线重跑469帧:连续框469帧可用,检测/完整76/结构/置信均合格,held为0。输出轮廓步幅P95为0.03344、峰值0.06458;旧输出P95为0.02872、峰值0.05240。两者包含真实动作,不能把更大的输出步幅称为闪烁改善,也不能用合成坏点测试代替此片段的最终视觉验收。实施继续追查关键点后的变形路径;尚未发布或替换已安装版。完整实拍点阵/帧不入仓,仅保留标量摘要。
|
||||
|
||||
|
||||
### 后续变形核对与范围纠正
|
||||
|
||||
新shader虽含region算法,但本次确认的主encoder与fallback将buffer4(faceThinMode)写0;buffer8=1是sampleFlipY。不能因region函数存在或buffer8值为1,就称其默认启用。见 `tracking-flicker-20261022/region-mode-review.md` 与 `renderpath-evidence.json`(完整主render指令、encoder汇编及CPU参数)。本轮保留实际可达pin算法,未移植region。
|
||||
|
||||
另查明与当前片段叠加相关的两处差异:2.4.0的CPU thin系数为user×0.025,pin shader直接使用,移除本品旧版280像素sizeGain;大眼采用点6/13瞳孔为中心、点0–1/7–8的像素距离为半径,user×0.15与圆形二次权重,先左后右。本品原来使用眼区外框中心、脸框椭圆和smoothstep²,已改为上述明确公式。当前片段大眼约0.90355,不能将其影响全部归于瘦脸跟踪。其余窄脸/颧骨/小头近似与下巴/短脸/下颌既有尺寸增益不在本轮逐像素对齐范围内。
|
||||
+9
@@ -290,3 +290,12 @@ git switch --detach v1.2.0
|
||||
新增稳定 float ID:75 五官保护量、76 非肤色区保护、77 局部微细锐化。旧 bool 30、独立全局磨皮 17 和全局锐化 4 均保留;后两项在更多设置中,不能重新解释其历史数值。PGBeautySettings v2 只追加三个 float,接受明确的 v1/160 字节旧状态。PGInspectorState 仍为 schema 1,缺 75 时从旧 bool 导入;旧 bool 为 true 时不得覆盖已读到的新浮点值。
|
||||
|
||||
1636 项检查与离屏面板已验,含 ASan 宿主/OSC/Inspector;本次未在原生宿主中重新操作新滑杆或验收效果视觉。正式插件发现只核验 PluginKit 路径,不把它写作 FCP 或 Motion 实际加载/画面通过。当前无需重新安装、重做封面或更新 1.2.0 安装包;用户反馈实际效果后继续针对性处理。
|
||||
|
||||
|
||||
## 2026-10-23 跟踪稳定链实施(1.3.3 / 18)
|
||||
|
||||
当前开发分支 `codex/tracking-stability-240`,正式安装在交付完成前仍为1.3.2。用户已要求按目标2.4.0实施、签名公证后同步双仓与文章。新默认链:960检测+CGImage重试、VN连续框、结构/置信门槛、下巴轴/quantile异常保护、有效形状保持和同步蒙版、同帧复用/异常可重试。瘦脸去旧sizeGain,大眼切到瞳孔/像素眼宽与.15圆形权重。实际核对的Metal主encoder mode为0;region存在不证明默认启用,勿再次按buffer8误判。
|
||||
|
||||
本机目标Metal和生产同点数值场40场景最大坐标差约.005523px;469帧草帽离线采样无掉点/quality hold,但还没有原生时间线的前后导出,不能宣称用户闪烁已消除。详情 `docs/analysis/跟踪闪烁对齐分析.md`。同尺寸换源缺少真正来源ID、fastMulti/多人遮挡、窄脸/颧骨/小头近似与其他旧gain仍有边界。
|
||||
|
||||
FCP已切到用户另一项剪辑工程,不应强退或改时间线。新增 `deliver.py --prepare-only` 可在不替换正式APP的情况下完成Release签名公证粘票并释放共享锁;之后 `package-release.py --prepared-app` 用精确Accepted/stapled的staging APP和指定安装模板,经本机PKG工坊打包、公证与payload校验。两种打包来源都要求CDHash匹配交付回执及产品源码未变,防止旧APP与新源码混包。用户保存退出后用 `deliver.py --resume-prepared --wait-for-hosts --user-tests` 安装并清理,再回读正式路径、更新公证安装回执与发布状态。不要将准备完成说成已安装。
|
||||
+9
@@ -166,3 +166,12 @@ origin/github 的 main、工作分支和 v1.3.2 标签已推送并回读。匿
|
||||
用户报告目标稳定而本插件闪烁。新目标2.4.0的静态REA复核发现瘦脸单主要人脸改走 pin-style 筛选与保持,条件可达连续对象框跟踪。现有旧版自动跟随报告不能作为该新版主路径完全对齐的依据。直接链接当前产品源码的合成探针确认:76点完整/缺失/完整使变形通道85835/0/85835;纯框抖动输出/输入振幅比1;先请求40ms空帧、再补0ms有效脸后,缓存40ms仍空,与顺序请求不同;默认外观蒙版在几何保持时可清零。这些均为合成诊断,不是用户素材或目标运行统计。
|
||||
|
||||
见 analysis/跟踪闪烁对齐分析.md 和同目录 tracking-flicker-20261022;诊断入口 `zsh scripts/diagnose-tracking.sh`。产品源码与正式1.3.2保持相同,未构建APP、未安装、未重发PKG或文章。已定位当前FCP草帽素材并以项目25fps独立扫描469帧,全部单脸/完整76点、无held/错误,未复现缺点归零;源5.72秒轮廓步幅raw6.33%、稳定后5.24%,仍含真实头动。原生请求与大眼叠加贡献未分离;原1901项回归不代表连续跟踪稳定性已通过。
|
||||
|
||||
|
||||
## 2026-10-23 · 1.3.3 跟踪稳定链实施与数值场
|
||||
|
||||
实时检测改为960长边与CGImage重试;加入连续Vision对象框、完整76/五官结构/置信门槛、加权下巴轴保护、中位数/P90跳变筛选与上一组有效形状保持。重复CMTime冻结检测和几何,反向重新开始对象跟踪,检测API错误也进入live保持;保持形状同步四种美容蒙版。fastMulti和显式离线分析保留其独立语义。
|
||||
|
||||
瘦脸去掉旧尺寸增益;大眼改为瞳孔中心、眼宽像素圆和0.15强度映射。图像回归57+123+1034、跟踪序列87、宿主适配370 ASan、OSC98 ASan、面板227 ASan、独立眼部/瘦脸数值126,共2122项通过。另一次可选本机目标Metal对照211项、40场景,最大坐标差0.005523像素,见 `analysis/tracking-flicker-20261022/shape-field-oracle.json`。两批存在重叠,不将211再加到2118中。
|
||||
|
||||
同一草帽源素材25fps/1920离线检查469帧:完整点/质量筛选均通过,连续框全部可用,held为0。没有原生宿主前后导出对照,不能凭上述检查声称该素材闪烁已解决。FCP当前打开另一项剪辑工程,未改该时间线,也未强退宿主。APP安装与发布将在签名公证及安装包准备完成后继续。
|
||||
在新工单中引用
屏蔽一个用户