文件

169 行
15 KiB
JSON

{
"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."
}
}