WIP: document original automatic face-follow mechanism and prepare 1.0.4

这个提交包含在:
dayu 于 2026-10-21 18:35:46 +08:00 提交
1 父节点 77d386825c
当前提交 764994a1c4
11 个文件已更改
+199 -22

没有与搜索条件相匹配的文件

+1 -1
查看文件
@@ -6,7 +6,7 @@
## 使用 ## 使用
正式安装路径为 `/Library/Plug-Ins/FxPlug/beatygril.app`。Motion 滤镜分类为「大鱼」,滤镜名「大鱼人像美化」。Final Cut Pro 在「效果 → 大鱼 → 大鱼人像美化」中使用配套 Motion 效果,模板目录必须同时保留 `.moef` 与 `Drop Zone.tiff`。先调高中频磨皮,再按需调肤色与脸型;勾选「只处理选中人脸」可在画面点击选脸,随后选择跟踪目标、向前/向后分析,数据随工程保存。 正式安装路径为 `/Library/Plug-Ins/FxPlug/beatygril.app`。Motion 滤镜分类为「大鱼」,滤镜名「大鱼人像美化」。Final Cut Pro 在「效果 → 大鱼 → 大鱼人像美化」中使用配套 Motion 效果,模板目录必须同时保留 `.moef` 与 `Drop Zone.tiff`。美化会随当前帧的人脸自动更新,不需要先点分析;默认脸型跟随主要人脸,开启多人高速模式后对多脸变形。可按需调中频磨皮、肤色与脸型;「只处理选中人脸」用于画面重选目标。三个目标的向前/向后分析属于可选扩展,数据可随工程保存。
## 开发和恢复 ## 开发和恢复
+3 -3
查看文件
@@ -12,7 +12,7 @@
```sh ```sh
git clone https://dayu.media/git/dayu/paintfcp-fxplug.git git clone https://dayu.media/git/dayu/paintfcp-fxplug.git
cd paintfcp-fxplug cd paintfcp-fxplug
git switch --detach v1.0.3 git switch --detach v1.0.4
``` ```
需要继续编辑时,基于该提交创建新分支。安装 Xcode 与 Apple FxPlug 4 SDK;盘点版本和构建入口见 README.md。SDK/framework 为 Apple 外部开发依赖,应重新安装匹配版本。证书、私钥和公证凭据需从独立加密备份恢复或重新申请;Git 不包含它们。 需要继续编辑时,基于该提交创建新分支。安装 Xcode 与 Apple FxPlug 4 SDK;盘点版本和构建入口见 README.md。SDK/framework 为 Apple 外部开发依赖,应重新安装匹配版本。证书、私钥和公证凭据需从独立加密备份恢复或重新申请;Git 不包含它们。
@@ -25,9 +25,9 @@ git switch --detach v1.0.3
初始模板存在行尾空白,修改前基线保留原样。本次核验未执行初始 APP 编译、签名、公证、安装或宿主加载;这些将由最终实现阶段单独验证。 初始模板存在行尾空白,修改前基线保留原样。本次核验未执行初始 APP 编译、签名、公证、安装或宿主加载;这些将由最终实现阶段单独验证。
## 1.0.3 恢复入口 ## 1.0.4 恢复入口
最终交付标签为 `v1.0.3`,工作分支为 `main`;本次实际编译和独立恢复测试的代码节点为完整 SHA `d561537eed99cc7c5f2fdbfbe3792fe0b52b3ccf`。最终标签还包含验证文档。需要精确恢复已测试源码时可执行 `git switch --detach d561537eed99cc7c5f2fdbfbe3792fe0b52b3ccf`。两者都保留初始模板及全部中间提交。 最终交付标签为 `v1.0.4`,工作分支为 `main`;本次实际编译和独立恢复测试的代码节点为完整 SHA `22cd96a772f84895aacd5ccc1ef24e0711e933fa`。最终标签还包含验证文档。需要精确恢复已测试源码时可执行 `git switch --detach 22cd96a772f84895aacd5ccc1ef24e0711e933fa`。两者都保留初始模板及全部中间提交。
依赖:Xcode27.1、FxPlug SDK4.3.4、PluginManager1.7.4,系统最低macOS13;Metal与Vision由系统提供。SDK头文件/链接存根安装到 `/Library/Developer/SDKs/FxPlug.sdk/Library/Frameworks`,可执行运行框架在 `/Library/Developer/Frameworks`;不要把SDK链接存根当运行框架嵌入APP。两者属于需重新安装的Apple外部依赖,仓库不保存证书/私钥或登录凭据。 依赖:Xcode27.1、FxPlug SDK4.3.4、PluginManager1.7.4,系统最低macOS13;Metal与Vision由系统提供。SDK头文件/链接存根安装到 `/Library/Developer/SDKs/FxPlug.sdk/Library/Frameworks`,可执行运行框架在 `/Library/Developer/Frameworks`;不要把SDK链接存根当运行框架嵌入APP。两者属于需重新安装的Apple外部依赖,仓库不保存证书/私钥或登录凭据。
+2 -2
查看文件
@@ -1,6 +1,6 @@
# 大鱼人像美化 FCP 效果模板 # 大鱼人像美化 FCP 效果模板
版本:1.0.3。滤镜 UUID:`FB14B0E6-59B2-4836-916F-CD0C559E9241`。模板必须与已安装的大鱼人像美化 FxPlug APP 配套使用。 版本:1.0.4。滤镜 UUID:`FB14B0E6-59B2-4836-916F-CD0C559E9241`。模板必须与已安装的大鱼人像美化 FxPlug APP 配套使用。
## 默认数值 ## 默认数值
@@ -28,6 +28,6 @@ Apple项目、群组、Effect Source和滤镜节点骨架来源于用户自有
前版生成稿(SHA256 `3b7984e11a92487834ab67121fd3814bf13c22b77a70851298efa84206f91478`)将效果源的 Source Media 设为0,并删除了原生clip/footage。用户在FCP应用后实测整幅黑屏。这是模板装配错误;保留Type=3本身并不能证明FCP输入替换链完整。此前XML解析、发布路径和无缺媒体检查通过,也没有覆盖真实FCP画面输入,不能当作该模板已经可用的证据。 前版生成稿(SHA256 `3b7984e11a92487834ab67121fd3814bf13c22b77a70851298efa84206f91478`)将效果源的 Source Media 设为0,并删除了原生clip/footage。用户在FCP应用后实测整幅黑屏。这是模板装配错误;保留Type=3本身并不能证明FCP输入替换链完整。此前XML解析、发布路径和无缺媒体检查通过,也没有覆盖真实FCP画面输入,不能当作该模板已经可用的证据。
黑屏修复恢复标准效果源clip/footage和Source Media关联,并随包加入标准`Drop Zone.tiff`,保留49个插件参数、48个发布入口与Type=3/Drop Zone=1。1.0.3同时包含独立的提亮蒙版与选脸坐标修复。该占位图从Apple Motion的Ozone.framework标准资源复制,实际运行只引用本模板内的相对副本。图像SHA256为 `a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e`,420128字节。 黑屏修复恢复标准效果源clip/footage和Source Media关联,并随包加入标准`Drop Zone.tiff`,保留49个插件参数、48个发布入口与Type=3/Drop Zone=1。1.0.4同时包含独立的提亮蒙版与选脸坐标修复。该占位图从Apple Motion的Ozone.framework标准资源复制,实际运行只引用本模板内的相对副本。图像SHA256为 `a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e`,420128字节。
本次已经静态核验Source Media→clip→相对文件链存在、文件字节一致、48项发布仍解析、隐藏数据未发布和保存选择状态;修复后已在FCP独立验收项目新增实例,确认输入替换、实际人像和提亮画面正常;Mix=0逐字节直通由宿主适配器IOSurface回归测试覆盖,未将其混称为FCP截图逐像素核验。 本次已经静态核验Source Media→clip→相对文件链存在、文件字节一致、48项发布仍解析、隐藏数据未发布和保存选择状态;修复后已在FCP独立验收项目新增实例,确认输入替换、实际人像和提亮画面正常;Mix=0逐字节直通由宿主适配器IOSurface回归测试覆盖,未将其混称为FCP截图逐像素核验。
+3 -3
查看文件
@@ -1,6 +1,6 @@
{ {
"version": "1.0.3", "version": "1.0.4",
"sha256": "74b045f0e93baa783f469e776e1a1dddd5f1933d7376afd3cac196c589c944b1", "sha256": "d234d504eba9e6d37b910b622a46c92458e658c5bbdad2caf5831c2a1463a3e2",
"filterUUID": "FB14B0E6-59B2-4836-916F-CD0C559E9241", "filterUUID": "FB14B0E6-59B2-4836-916F-CD0C559E9241",
"publishedFunctionalControls": 46, "publishedFunctionalControls": 46,
"informationalControls": 2, "informationalControls": 2,
@@ -27,6 +27,6 @@
"date": "2026-10-21", "date": "2026-10-21",
"FCP": "Restored input-chain template shows supplied real video; effect parameters and forward analysis responded in independent QA project.", "FCP": "Restored input-chain template shows supplied real video; effect parameters and forward analysis responded in independent QA project.",
"Motion": "Real-video ordinary project played with midtone=0.5 and brightness=0.75; face boxes followed changing positions.", "Motion": "Real-video ordinary project played with midtone=0.5 and brightness=0.75; face boxes followed changing positions.",
"scope": "Native smoke and brightness regression; not exhaustive controls/occlusion or cross-host saved-track validation." "scope": "1.0.3 render/brightness smoke passed; 1.0.4 automatic geometry alignment and canvas event native verification pending."
} }
} }
@@ -46,7 +46,7 @@
<flags>1</flags> <flags>1</flags>
</template> </template>
<build /> <build />
<description>大鱼人像美化 1.0.3:人像磨皮、肤色、脸型、五官保护和三目标人脸跟踪。模板中频磨皮默认为50%。</description> <description>大鱼人像美化 1.0.4:人像磨皮、肤色、脸型、五官保护和三目标人脸跟踪。模板中频磨皮默认为50%。</description>
<scene> <scene>
<sceneSettings> <sceneSettings>
<width>1920</width> <width>1920</width>
@@ -298,7 +298,7 @@
<parameter name="Width" id="313" flags="8589934610" default="1" value="1920" /> <parameter name="Width" id="313" flags="8589934610" default="1" value="1920" />
<parameter name="Height" id="314" flags="8589934610" default="1" value="1080" /> <parameter name="Height" id="314" flags="8589934610" default="1" value="1080" />
</parameter> </parameter>
<filter name="大鱼人像美化" id="510000005" factoryID="6" pluginUUID="FB14B0E6-59B2-4836-916F-CD0C559E9241" pluginVersion="1.0.3" pluginName="大鱼人像美化" pluginDynamicParams="0"> <filter name="大鱼人像美化" id="510000005" factoryID="6" pluginUUID="FB14B0E6-59B2-4836-916F-CD0C559E9241" pluginVersion="1.0.4" pluginName="大鱼人像美化" pluginDynamicParams="0">
<timing in="0 1 1 0" out="299 30 1 0" offset="0 1 1 0" /> <timing in="0 1 1 0" out="299 30 1 0" offset="0 1 1 0" />
<baseFlags>8589934608</baseFlags> <baseFlags>8589934608</baseFlags>
<parameter name="磨皮" id="100" flags="8589938704"> <parameter name="磨皮" id="100" flags="8589938704">
+4 -4
查看文件
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>XPC!</string> <string>XPC!</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.0.3</string> <string>1.0.4</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>5</string> <string>6</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string></string> <string></string>
<key>PlugInKit</key> <key>PlugInKit</key>
@@ -72,7 +72,7 @@
<key>uuid</key> <key>uuid</key>
<string>FB14B0E6-59B2-4836-916F-CD0C559E9241</string> <string>FB14B0E6-59B2-4836-916F-CD0C559E9241</string>
<key>version</key> <key>version</key>
<string>1.0.3</string> <string>1.0.4</string>
</dict> </dict>
<dict> <dict>
<key>className</key> <key>className</key>
@@ -84,7 +84,7 @@
<key>uuid</key> <key>uuid</key>
<string>E0E432C8-3D71-4ABA-B006-E7F519E06C87</string> <string>E0E432C8-3D71-4ABA-B006-E7F519E06C87</string>
<key>version</key> <key>version</key>
<string>1.0.3</string> <string>1.0.4</string>
<key>protocolNames</key> <key>protocolNames</key>
<array> <array>
<string>FxOnScreenControl</string> <string>FxOnScreenControl</string>
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.0.3</string> <string>1.0.4</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>5</string> <string>6</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string> <string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
+10 -2
查看文件
@@ -22,7 +22,7 @@ REA 直接打开内嵌插件。原包为 arm64/x86_64 通用 Mach-O,Ghidra 无
## 原版 FCP 模板的实际发布范围 ## 原版 FCP 模板的实际发布范围
补充检查用户指定的 `~/Movies/Motion Templates.localized/Effects.localized/💙MS超级美颜/MS超级美颜V2/MS超级美颜V2.moef`:共15个发布入口,包括空名自定义面板入口、脸型、脸框预览、白牙、亮眼和混合,没有跟踪目标、跟踪开关或前向/后向分析按钮。清单和模板摘要见 [发布参数记录](reference-template-parameters.json)。二进制内部的分析/跟踪代码不能据此解释成当前FCP模板已开放的功能;本项目的三目标分析与跟踪是独立扩展,没有完成原版同类功能的用户界面或运动等价验证。 补充检查用户指定的 `~/Movies/Motion Templates.localized/Effects.localized/💙MS超级美颜/MS超级美颜V2/MS超级美颜V2.moef`:共15个发布入口,包括空名自定义面板入口、脸型、脸框预览、白牙、亮眼和混合,没有跟踪目标、跟踪开关或前向/后向分析按钮。清单和模板摘要见 [发布参数记录](reference-template-parameters.json)。二进制内部的分析/跟踪代码不能据此解释成当前FCP模板已开放的功能;本项目的三目标离线分析是独立扩展;原版无需离线分析就会自动跟随,不能从没有发布按钮推断没有自动跟随。
## 已实现的功能 ## 已实现的功能
@@ -43,7 +43,7 @@ REA 直接打开内嵌插件。原包为 arm64/x86_64 通用 Mach-O,Ghidra 无
2. 原版人脸网格/曲线位移采用本项目的平滑椭圆采样位移替代。各脸型权重和曲线、眼嘴软蒙版由本项目编写。 2. 原版人脸网格/曲线位移采用本项目的平滑椭圆采样位移替代。各脸型权重和曲线、眼嘴软蒙版由本项目编写。
3. 皮肤支持区域使用 Vision 面部区域及独立的肤色/高通备用蒙版;原版完整皮肤分割、时间稳定和细部 mask 尚未等价恢复。 3. 皮肤支持区域使用 Vision 面部区域及独立的肤色/高通备用蒙版;原版完整皮肤分割、时间稳定和细部 mask 尚未等价恢复。
4. 本版最多保存三个独立目标、每次最多处理十六张脸。原版存在动态目标列表与旧版三目标字段,本次未完整恢复动态列表上限及全部分页操作。 4. 本版最多保存三个独立目标、每次最多处理十六张脸。原版存在动态目标列表与旧版三目标字段,本次未完整恢复动态列表上限及全部分页操作。
5. 本版逐帧 Vision 分析并保存几何数据,渲染仅读取记录;原版 OpenCV 光流与时间稳定策略没有照搬。真实运动、多人交叉、遮挡、快速切镜的身份保持尚需专项对照。 5. 离线分析记录与默认实时自动跟随须分开比较。原版实时几何链已证实由Vision重检测、temporal主体关联、防跳范围、关键点稳定/保持及回看历史组成;OpenCV动态库与VNTrackObject备用方法的存在不足以证明它们驱动当前render主链。复刻版实时流程正在按这些机制对齐,完整运动、多人交叉、遮挡与切镜仍需专项对照。
6. 界面使用宿主的分组滑块与开关;原版卡片面板的布局没有照搬。眼睛提亮在本版可用,所分析原版主链实际将该项输入设为零。 6. 界面使用宿主的分组滑块与开关;原版卡片面板的布局没有照搬。眼睛提亮在本版可用,所分析原版主链实际将该项输入设为零。
跟踪数据每目标保存上限为 64 MB;超过上限时保留此前已保存的数据并报告错误。长素材应分段分析。仅实际验证通过的内容计入完成;本说明中的未知项不因编译或离屏测试通过而自动消除。 跟踪数据每目标保存上限为 64 MB;超过上限时保留此前已保存的数据并报告错误。长素材应分段分析。仅实际验证通过的内容计入完成;本说明中的未知项不因编译或离屏测试通过而自动消除。
@@ -53,3 +53,11 @@ REA 直接打开内嵌插件。原包为 arm64/x86_64 通用 Mach-O,Ghidra 无
`./scripts/test.sh` 运行实际 Metal/Core Image 像素测试及 Vision 人脸测试。测试素材是 scikit-image 发布的 NASA 公共领域人像,出处见 `tests/fixtures/ATTRIBUTION.txt`。测试包含实际人脸 landmarks、真实几何变化、五官蒙版、单次混合、透明度和跟踪存储恢复。 `./scripts/test.sh` 运行实际 Metal/Core Image 像素测试及 Vision 人脸测试。测试素材是 scikit-image 发布的 NASA 公共领域人像,出处见 `tests/fixtures/ATTRIBUTION.txt`。测试包含实际人脸 landmarks、真实几何变化、五官蒙版、单次混合、透明度和跟踪存储恢复。
正式签名、公证、安装、宿主发现/加载以及最终远程恢复结果记录在 `docs/验证记录.md`。 正式签名、公证、安装、宿主发现/加载以及最终远程恢复结果记录在 `docs/验证记录.md`。
## 默认自动跟随的补充分析
用户澄清后,已追查默认render→temporalFacePoints活跃路径,证据见 [自动跟随报告](auto-follow-report.json) 与 [REA证据包](rea-auto-tracking.json)。原版以Vision重检测当前帧,在默认非多人几何路径中自动选主要人脸;显式选点是重选种子,快速多人是独立分支。主要人脸初始化按面积与居中打分,其后将前框宽高扩到180%形成防跳矩形,在范围内选择最近中心。失检/无匹配可保持原点阵,关键点另有自适应稳定和轴向突变保护。默认几何单主脸不等于美肤/牙齿蒙版只能处理一人。
原版保存time/points/box历史,至多1200条并支持回看;平滑包含时间因子与约0.84–0.96的混合范围,完整组内公式及轴保护布尔组合未逐像素验证。原版存在近未来历史选择分支,所以不能宣称任意乱序严格确定。复刻将以独立公式实现机制,并限制读取当前时间之前的近时参考;该时间策略会比原版更保守,属于明确的实现差异。
本机原生观察:Motion中使用同一蓝发视频,原版UI默认多人关闭(单人)、防跳180%;启用检测框并调瘦脸/大眼后,播放时自动更新人脸框,没有先执行离线分析。此观察只覆盖该单人片段,不能替代多人遮挡与所有参数对照。
+168
查看文件
@@ -0,0 +1,168 @@
{
"schema": 1,
"date": "2026-10-21",
"scope": "只读静态 REA:原版无需离线分析的自动人脸跟随;未执行原版、未控制宿主 UI、未修改源码或原版。原生运行信息由 root 另行记录,不能把本报告静态结论称为已观察执行。",
"target": {
"original_binary": "/Applications/MSE18V2.app/Contents/PlugIns/MSE18V2.pluginkit/Contents/MacOS/MSE18V2",
"original_sha256": "6c5d74bc844a5c5f745718b48ea10ec6635d08aa08a5b6dc6e62653980849f8a",
"analyzed_arm64": "/tmp/paintfcp-rea.b3j9Te/MSE18V2-arm64",
"analyzed_sha256": "f01e8c0b7e2676b2961950b0e48efdd2589af218e4b36de7d39f5d1c76852bfb"
},
"evidence": {
"new_bundle": "rea-auto-tracking.json",
"existing_bundle": "rea-plugin.json",
"parameter_population": "ev_4ab9fb8e1643d141ad84355f7fde14e9269f94adadf9348b1175bf308cbcb7c1",
"render": "ev_65936f315a3978bebcafd04e028acc5609c1c092282c05e0ca08cf2b279bc9ad",
"procedure_search": "ev_0719399b08d56c80e1ac22c44d76b02e1f05d307dcb5a95eac02f8dd0445ccb9",
"detection_temporal_and_optional_tracker": "ev_2d9d2d633ad190e846ba2411ce96b44b9b12c0ee4d7f06e540673e8578628182",
"tracker_dossier": "ev_445b4f2ff33a93ce32a49568a2417245fccd4c2fcf18d3bb12fef66e60d6c37b",
"association_selection_rewind": "ev_65d6a413bebd10f2af76e06d523cde43146db3a53e7d028e4054e31c4b003990",
"jump_guard_axis_guard_landmark_layout": "ev_ede612c32d16a78e3ac8ec9228fa0e71fcf2ffd827d99e649bdd73f5133163a5",
"new_bundle_sha256": "dc1007f3798fade5e454bb2ef0b58e4cfe2bb0256948c364070fd9af70a97377"
},
"conclusion": "原版默认几何链为当前帧 Vision 人脸关键点检测 + 跨帧主要人脸关联 + 防跳范围 + 关键点稳定/保持与回看历史;不需要先按离线分析。仅加一个 VNTrackObjectRequest 或现有逐帧重检测,均不能等价复刻这条链。",
"findings": [
{
"id": "live_entry",
"confidence": "high-static",
"addresses": [
"0x10001cba4",
"0x10002e4f4",
"0x10002f700"
],
"observed": "renderDestinationImage 在需要几何、局部处理或预览时调用 cachedFaceObservations,再在没有持久跟踪框/选择框可用时直接调用 temporalFacePointsForObservations;该调用不以先完成离线分析为条件。原版字符串 vision_temporal 与 vision_temporal_held 位于此分支。",
"limitations": "不是所有参数为零时都运行人脸检测;标签只证明代码分支,不能代替宿主运行日志。"
},
{
"id": "detection_cache",
"confidence": "high-static",
"addresses": [
"0x10002e4f4"
],
"observed": "缓存比较 CMTime、图像 extent 和 sourceTileRect;相同时间的相同区域可复用。否则创建 VNDetectFaceLandmarksRequest,失败/关键点不足可再试,结果包括空结果会缓存。共享缓存受锁保护。",
"limitations": "allowForwardReuse 的可选时长常量未继续还原;render 的主要几何需求路径传 false,不能声称每帧复用旧检测。"
},
{
"id": "default_primary_and_parameters",
"confidence": "high-static",
"addresses": [
"0x10001b84c",
"0x10002973c",
"0x10002f700",
"0x100023b60",
"0x10002398c"
],
"observed": "id20(0x14)=faceSingleSelection,注册默认0,写入 params+0xf0;它控制显式选点种子,关闭时 temporalFacePoints 仍会自动选一个主要人脸。id39(0x27)=fastMultiFaceMode,注册默认0,写入 params+0xe2;开启时强制清除 faceSingleSelection。无前态、非显式选点时 helper 023b60 按面积与靠近画心的组合得分选一个人脸;有显式选点时 02398c 按选点到脸框中心的平方距离选种子。",
"derived_formula": "默认 primary 得分约为 1.8*clamp(框面积,0,1)+1.1*(1-clamp(距画心/0.72,0,1));以标准化、裁剪后框为准,公式为反编译推导。",
"implication": "faceSingleSelection=false 不等于默认处理全部人脸。UI 所谓多人模式对应 fastMultiFaceMode;不要将 id20 命名直译成 all/single 总开关。"
},
{
"id": "association_jump_guard",
"confidence": "high-static",
"addresses": [
"0x10002f700",
"0x100031640",
"0x1000319b8",
"0x100025428"
],
"observed": "已有有效参考脸框时,025428 将其围绕中心按 faceJumpGuardRange 倍数扩成矩形并裁剪;031640 只保留脸框中心落在该范围内的候选;0319b8 在候选中选距上一框中心最近者。注册范围1..4,默认1.8即180%。候选不匹配/检测丢失时存在保持之前几何的分支,而非立即跳到画面另一个人。",
"implication": "当前 PG 的圆形半径 guard 与原版矩形 guard 不同。原版证据显示几何关联,没有发现此链使用人脸 embedding/实名身份识别。",
"limitations": "未建立任意遮挡时长下必然找回同一身份的承诺;不能把几何跟随称为生物识别。",
"hold_details": "空检测或范围内无匹配时,valid参考>=77点的路径直接沿用旧点/旧框,返回strength=1,并可推进outputTime。恢复出的该默认控制流未见明确前向hold超时/逐帧衰减阈值;不得将0.35或0.45秒当作此处失检保留时限。"
},
{
"id": "landmark_stability",
"confidence": "high-static-structure-medium-exact-math",
"addresses": [
"0x10002f700",
"0x100023e00",
"0x100022c70"
],
"observed": "022c70 从 allPoints 取76点、变到全图标准坐标后追加一个中心点,后续链要求至少77点。temporalFacePoints 对同长度新旧数组进行混合;小于0.03秒的有效前向间隔有 dt/0.03 因子,一般混合系数由脸部左右几何对称程度调到约0.84..0.96并作0.82..0.96限制;部分点组另做更强稳定,点组59..75有额外修正,部分归一化位移限制为0.075。023e00 比较前后脸部轴向/几何,异常时可把旧点重映射到当前框并保持,render还有 axis_hold 分支。",
"limitations": "Ghidra 对 ObjC/CGRect/CMTime ABI 恢复不完整,组名与完全等价公式尚未逐条汇编验证;建议先重建稳定机制再通过原生视频对照调系数,不能声称像素一致。",
"axis_guard_constants": "023e00含框重叠约0.08、中心距离阈值max(0.04,0.82*参考框最大边)、轴长有效阈值max(0.003,0.055*较小框高)、轴方向点积阈值约-0.18等组合判定。它检查方向突变/轴翻转,返回后由调用者选择旧点重映射;系数与方向已恢复,整个布尔表达式尚未逐汇编校对。"
},
{
"id": "time_seek_state",
"confidence": "high-static",
"addresses": [
"0x100018fe0",
"0x100018c10",
"0x100019490",
"0x10002f700"
],
"observed": "实例含 temporal points/box、detection time、output time、valid 及 rewind points/box/time/frames;历史保存 time/points/box 并排序,上限1200条,时间差<=0.0005秒替换原条目。reference helper 根据当前时间与 allowCurrentTime 选择历史:一个分支取不晚于当前时间的最新记录,另一个分支可选距当前0.0005..0.35秒的最近历史。temporal/reference 对倒退超过0.05秒有额外判定,限制直接沿用当前 temporal 状态。选择点位置变化>0.01与 selection revision 也参与重新选种子。",
"limitations": "这不是简单 seek 就全部清空。最近历史分支可能使用时间上晚于请求的缓存,因此不能宣称原版任意乱序渲染严格无未来状态/完全确定性。首次远跳与长时间丢失的全部优先级未继续做运行验证。",
"reselection_reset": "显式选择重种子时清理rewind references和部分待选框状态,缓存新的selection坐标与递增revision,随后新几何成为temporal参考。seek主要靠history/time-local reference,不是统一清空。"
},
{
"id": "vn_object_tracker_presence_vs_reachability",
"confidence": "high-static-presence-unproven-live-reachability",
"addresses": [
"0x10002ee74"
],
"observed": "trackedFaceBoxForInputImage 内确有 VNSequenceRequestHandler + VNTrackObjectRequest,检测框作 seed、支持 revision 选择、trackingLevel=0(本机 Vision header 为 Accurate)、performRequests:onCIImage:orientation:1、confidence>=0.22、时间间隔0.45秒及倒退/失败重置处理。",
"bounded_negative": "该函数 dossier callers=[],仅两个 DATA incoming references;render/temporal pseudocode中未出现对它的调用,procedure搜索未找到其 objc_stub。",
"inference": "它可能是备用/旧版/动态调用路径;当前已建立的 live render 证据是检测+temporal关联链。不得仅因导入存在便把自动跟随归因于 VNTrackObjectRequest。间接 ObjC 调用并未穷尽排除。"
},
{
"id": "multi_and_beauty_scope",
"confidence": "high-static",
"addresses": [
"0x10001cba4",
"0x10002ae04"
],
"observed": "fastMultiFaceMode开启且有几何需求时,render另走检测矩形/landmark枚举,构建多套point sets并执行多人变形。默认几何使用单套temporal primary点。applySkinSmoothing 在局部美化/牙齿等条件下仍可获得整组faceObservations;全局肤色与皮肤频率处理也不等同于 primary 几何选脸。",
"implication": "不要把默认几何单主脸扩大推断为所有美肤/牙齿只能处理一人。",
"multi_details": "render fastMulti分支仅当fastMulti开启且非零几何参数产生需求时组装多点集;先枚举landmark候选,再枚举rectangle候选,使用统一block生成points/box,记录rememberFaceThinPointSets。后续points集>=2才走多套变形,只有一个时沿用单套路径。每张脸的具体去重/旧点补全block未继续反编译,不能保证它与默认单主脸temporal滤波完全相同。"
}
],
"current_implementation_comparison": {
"repo_head_at_read": "22cd96a772f84895aacd5ccc1ef24e0711e933fa",
"source": "/Users/dayu/Documents/PaintFCP/beatygril/beatygril/Plugin/PGFaceProcessor.m",
"source_sha256": "b5b5b57a4baaf1ba6d0d53af6602025c9897207826865b9cf215032f910b47d4",
"findings": [
"168..185: 每次 observationsInImage 创建 VNImageRequestHandler + VNDetectFaceLandmarksRequest;没有 live 几何缓存。",
"214..243: selectOne=singleFace||trackingEnabled,默认两者false时取所有有效脸(最多16)。原版默认几何是单主脸,显式快速多人另开关。",
"225..238: 当前 guard 是以max(width,height)*range为半径的圆+宽度比例限制;原版对应 helper 是扩展矩形内的候选中心筛选。",
"288..315: trackingEnabled为false时不读取分析记录,也不给geometryForObservations传previous;因此默认实时帧没有跨帧主体关联、防跳、landmark smoothing/hold/replay状态。",
"188..211和246..263: _targets是离线分析写入的持久记录;processImage不写历史。它保证当前设计的render顺序独立,但不能提供原版live temporal机制。",
"需要自动跟随不等于需要用户点分析;默认检测确实每帧跟随脸部,但多人交叉/遮挡/检测抖动时无法稳定主体与关键点。"
]
},
"recommended_minimum_alignment": [
"仅在PGFaceProcessor新增实例级live状态,与离线_targets分离;无需新增UI或要求点分析。fastMultiFace决定多人几何;否则自动primary,singleFace决定显式选点种子。",
"首帧primary按面积+居中评分;随后先用上一框的矩形180% guard筛候选,再选最近中心。选择点/target/revision变更时重新种子;短暂丢失保留几何,超出策略范围时重新检测且明确失效。",
"在匹配身份后对同一布局关键点作时间感知平滑,必要时将旧点映射到新框;warp与其局部mask共享同一稳定几何。可以先用清晰的自有公式,再用原生运动片对照调整,不复制反编译文本。",
"为相同CMTime/区域缓存结果,维护有界time-keyed几何快照;seek回看从近时历史恢复,离线轨迹优先、live为fallback。extent/来源/epoch/选择变更隔离状态。并发渲染下锁住状态快照和更新,避免跨时间抢写。",
"时间乱序应明确定义:可只使用不晚于请求的参考,作为确定性设计选择;这是有意收紧原版最近历史行为,不应宣称完全同算法。",
"先实现已证实的检测+关联+稳定链。VNTrackObjectRequest只能作为后续可测的优化/桥接;当前证据不足以将其列为必需对齐项。"
],
"meaningful_validation": [
"不调用analyzeImage,默认参数但开启可见瘦脸:连续帧人脸移动时主体框/点位移动,分析记录保持空。",
"两人接近/交叉:默认只改变primary;guard外更大的旁人不可抢占;显式fastMultiFace开启后双方可变形。",
"选点更换另一人:立即重种子,后续移动自动跟随新主体,不反复选择距固定点击点最近的人。",
"检测缺失1..数帧后恢复:几何短时保持;未匹配旁人不跳;超过自定hold策略须可验证回退。",
"在固定脸框的抖动关键点序列上,输出关键点方差下降;真实平移不应长时间滞后,面部轴向翻转异常不应造成瞬时形变。",
"同一时间重复/正向/倒放/远seek/并发请求:不会把远处未来几何写到请求帧,extent或选择变化不复用旧缓存;测试明确原版证据与自有确定性设计的差异。",
"原生Motion/FCP使用同视频逐帧对照默认单主脸、显式选点、防跳与快速多人,记录实际主体验证,不能用纯mock替代宿主验收。"
],
"unresolved": [
"VNTrackObject路径是否通过运行时动态发送调用;当前无运行追踪,静态无caller不等于绝对不可达。",
"temporalFace全部系数、按点组语义、首帧/远seek/长丢失保持时间的完全等价行为。",
"皮肤mask playbackStabilizedMask另有时序链;本次只确认其存在,未扩展到完整光流/蒙版跟踪还原。",
"原生原版UI映射、实际render调用次数和宿主乱序行为由root当前运行观察补充。"
],
"documentation_correction": {
"file": "/Users/dayu/Documents/PaintFCP/docs/analysis/REA-分析与复刻说明.md",
"line": 46,
"problem": "“原版OpenCV光流”把二进制依赖/其他代码存在推成当前实时几何主链的已证实实现。",
"replacement": "本版离线分析记录与原版默认自动跟随须分开比较。原版实时几何链已证实由Vision检测、temporal主体关联、防跳范围、关键点稳定/保持及回看历史组成;OpenCV动态库和VNTrackObject备用方法存在,但不足以证明它们驱动当前render主链。完整运动、多人交叉、遮挡与切镜行为仍需同视频原生对照。"
},
"native_observation_by_root": {
"host": "Motion 6.4",
"test": "Same blue-haired portrait movie; ordinary local 25fps video project with original plugin UUID, face preview enabled and thin/bigEye set to 0.5 through original custom UI.",
"result": "Original preview followed moving face during playback without offline analysis; default fast-multi switch read off/single, jump range 180%.",
"scope": "Single-person smoke test; no claims of exhaustive identity/occlusion behavior."
}
}
+1
查看文件
@@ -0,0 +1 @@
{"artifacts":[{"architecture":"arm64","digest":{"sha256":"f01e8c0b7e2676b2961950b0e48efdd2589af218e4b36de7d39f5d1c76852bfb"},"format":"mach-o"}],"captures":[],"environments":[],"providers":[{"id":"ghidra","name":"Ghidra","version":"12.1.4"},{"id":"rea-workflow","name":"REA composed investigation workflow","version":"1"}],"records":[{"analysis_profile":{"digest":"20565088524a2d0359b9b96f46ac48e679d774c7b0092c56abc06de8fdbec11c","parameters":{"analyzer_preset":"ghidra-default","annotation_policy":"atomic-function-entry-metadata-v1","architecture":"arm64","available_architectures":["arm64"],"compiler_spec_id":"auto-default","decompiler_jump_loads":true,"function_body_evidence":"complete-inclusive-ranges-v1","function_boundary_observations":"ghidra-terminal-call-limitations-v1","function_references":"complete-body-and-entry-reference-manager-v2","import_mode":"ephemeral-source-immutable","instruction_flow_evidence":"decoded-return-pcode-v1","jump_table_evidence":"typed-case-default-blocks-v1","language_id":"auto-from-header","load_image_observations":"source-mappings-entry-context-v2","loader":"auto-from-header","location_resolution":"explicit-address-exact-entry-symbol-first-v3","no_return_repair":"returning-imports-decoded-return-v2","process_launch":"inspected-jvm-launch-support-v1","string_inventory_evidence":"defined-data-coverage-v1","target_format":"mach-o","target_kind":"executable"},"provider":{"id":"ghidra","name":"Ghidra","version":"12.1.4"}},"authority":"shipped-artifact","confidence":"observed","environment":null,"evidence_id":"ev_0719399b08d56c80e1ac22c44d76b02e1f05d307dcb5a95eac02f8dd0445ccb9","evidence_links":[],"limitations":["The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.","The imported Program and temporary project are ephemeral and deleted on close. Annotation operations edit session database metadata; original executable bytes are never written.","Cancelling an active Ghidra request terminates its ephemeral database and discards session annotations. The selected target remains open; the next provider query imports the original artifact again.","Default-space addresses use lowercase 0x-prefixed hexadecimal; other address spaces use <percent-encoded-space>:0x<hex>.","Regex mode uses Java Pattern semantics. Matcher or compiler stack exhaustion returns a resource constraint without closing the session; literal mode avoids regex recursion and returns complete matching values.","macOS sessions require a matching executable Ghidra native decompiler; REA checks for it but does not build native components or change Gatekeeper quarantine state."],"locations":[],"normalized_result":[{"address":"0x100008948","value":"MSSSectionCardParameterValue::showFaceTrackBox"},{"address":"0x100008950","value":"MSSSectionCardParameterValue::setShowFaceTrackBox:"},{"address":"0x1000089b8","value":"MSSSectionCardParameterValue::faceTrackEnabled"},{"address":"0x1000089c0","value":"MSSSectionCardParameterValue::setFaceTrackEnabled:"},{"address":"0x1000089c8","value":"MSSSectionCardParameterValue::faceTrackStatus"},{"address":"0x1000089d0","value":"MSSSectionCardParameterValue::setFaceTrackStatus:"},{"address":"0x1000089d8","value":"MSSSectionCardParameterValue::faceTrackRevision"},{"address":"0x1000089e0","value":"MSSSectionCardParameterValue::setFaceTrackRevision:"},{"address":"0x1000089e8","value":"MSSSectionCardParameterValue::faceTrackFrameCount"},{"address":"0x1000089f0","value":"MSSSectionCardParameterValue::setFaceTrackFrameCount:"},{"address":"0x1000089f8","value":"MSSSectionCardParameterValue::faceTrackSeedTimeSeconds"},{"address":"0x100008a00","value":"MSSSectionCardParameterValue::setFaceTrackSeedTimeSeconds:"},{"address":"0x100008a08","value":"MSSSectionCardParameterValue::faceTrackProgress"},{"address":"0x100008a10","value":"MSSSectionCardParameterValue::setFaceTrackProgress:"},{"address":"0x100008a18","value":"MSSSectionCardParameterValue::faceTrackAppendMode"},{"address":"0x100008a20","value":"MSSSectionCardParameterValue::setFaceTrackAppendMode:"},{"address":"0x100008a28","value":"MSSSectionCardParameterValue::faceTrackData"},{"address":"0x100008a30","value":"MSSSectionCardParameterValue::setFaceTrackData:"},{"address":"0x100008a38","value":"MSSSectionCardParameterValue::faceTrackTargetCount"},{"address":"0x100008a40","value":"MSSSectionCardParameterValue::setFaceTrackTargetCount:"},{"address":"0x100008a48","value":"MSSSectionCardParameterValue::faceTrackActiveTargetIndex"},{"address":"0x100008a50","value":"MSSSectionCardParameterValue::setFaceTrackActiveTargetIndex:"},{"address":"0x100008a58","value":"MSSSectionCardParameterValue::faceTrackAnalysisTargetIndex"},{"address":"0x100008a60","value":"MSSSectionCardParameterValue::setFaceTrackAnalysisTargetIndex:"},{"address":"0x100008a68","value":"MSSSectionCardParameterValue::faceTrackTargetPageStartIndex"},{"address":"0x100008a70","value":"MSSSectionCardParameterLine truncated
+3 -3
查看文件
@@ -1,4 +1,4 @@
# 大鱼人像美化 1.0.3 验证记录 # 大鱼人像美化 1.0.4 验证记录
日期:2026-10-21。环境:Apple Silicon M1 Max,macOS27.2、Motion6.4、Final Cut Pro12.4、Xcode27.1、FxPlug SDK4.3.4、PluginManager1.7.4。Release包含arm64和x86_64;原生宿主实测为arm64,未在Intel机器实测。 日期:2026-10-21。环境:Apple Silicon M1 Max,macOS27.2、Motion6.4、Final Cut Pro12.4、Xcode27.1、FxPlug SDK4.3.4、PluginManager1.7.4。Release包含arm64和x86_64;原生宿主实测为arm64,未在Intel机器实测。
@@ -14,7 +14,7 @@ FCP:使用用户给定的3840×2160、25fps蓝发人像视频。新建独立
Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通过本机链接引用给定视频;开启50%中频、75%提亮与人脸框。切换滤镜启用、从第1帧播放到第179帧均正常出图,人脸框随画面位置更新;选中滤镜可正常建立OSC连接。此QA工程依赖外置卷原视频,不作为可移植产品资源交付。 Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通过本机链接引用给定视频;开启50%中频、75%提亮与人脸框。切换滤镜启用、从第1帧播放到第179帧均正常出图,人脸框随画面位置更新;选中滤镜可正常建立OSC连接。此QA工程依赖外置卷原视频,不作为可移植产品资源交付。
选脸控件:原生验收额外发现OBJECT坐标被二次归一化,十字落在画面角落;本轮修复和原生回写结果将在最终验收后补齐。 选脸控件:原生验收额外发现OBJECT坐标被二次归一化,十字落在画面角落;现直接使用归一化OBJECT坐标转换至CANVAS像素。Motion点参数桥接会归一化读取,却按中心像素写入,新增事件内读回检测及兼容转换,并校验最终位置;不依赖宿主版本号猜测。50项OSC测试同时覆盖文档约定与Motion像素桥接。原生回写结果待最终安装后补齐。公开坐标依据:[Apple Creating Onscreen Controls](https://developer.apple.com/library/archive/documentation/AppleApplications/Conceptual/FXPlug_overview/OnScreenControls/OnScreenControls.html)。
宿主在更新前退出,新正式版安装后重新打开。曾在旧XPC连接未释放、临时构建插件仍被注册的热替换环境出现宿主关闭挂起/OSC连接崩溃;交付流程已增加宿主关闭检查,并在原生验收前注销构建目录的插件。没有把该崩溃直接归因为某条提亮公式。 宿主在更新前退出,新正式版安装后重新打开。曾在旧XPC连接未释放、临时构建插件仍被注册的热替换环境出现宿主关闭挂起/OSC连接崩溃;交付流程已增加宿主关闭检查,并在原生验收前注销构建目录的插件。没有把该崩溃直接归因为某条提亮公式。
@@ -26,7 +26,7 @@ Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通
## 自动化与恢复 ## 自动化与恢复
渲染/人脸/宿主适配器/OSC测试使用公共NASA人像与合成数据,覆盖默认直通、像素格式与画面原点、极值、连续调色蒙版、蓝发抑制、选脸/分析状态和错误处理。最终计数与源节点将在代码冻结后记录。宿主适配器和OSC测试启用AddressSanitizer。 渲染/人脸/宿主适配器/OSC测试使用公共NASA人像与合成数据,覆盖默认直通、像素格式与画面原点、极值、连续调色蒙版、蓝发抑制、选脸/分析状态和错误处理。最终代码节点为22cd96a772f84895aacd5ccc1ef24e0711e933fa,281项检查通过:渲染49、人脸65、宿主适配117、OSC50,零失败。宿主适配器和OSC测试启用AddressSanitizer。
远端独立克隆核验检查受跟踪文件字节、工程资源、Git对象完整性和可执行脚本模式,无LFS与子模块。scripts/checkpoint.py以100644保存,按文档使用python3调用;它不是可直接执行的入口,恢复测试报告中该权限提示不表示源码丢失。 远端独立克隆核验检查受跟踪文件字节、工程资源、Git对象完整性和可执行脚本模式,无LFS与子模块。scripts/checkpoint.py以100644保存,按文档使用python3调用;它不是可直接执行的入口,恢复测试报告中该权限提示不表示源码丢失。