@sssxyd/face-liveness-detector 0.4.0 → 0.4.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAsDhF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC/C,qBAAqB,CAwBvB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAiDhF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC/C,qBAAqB,CAwBvB"}
@@ -28,8 +28,6 @@ export declare class FaceDetectionEngine extends SimpleEventEmitter {
28
28
  private preallocatedGrayFrame;
29
29
  private isDetectingFrameActive;
30
30
  private frameIndex;
31
- private lastDetectionFrameIndex;
32
- private lastScreenFeatureDetectionFrameIndex;
33
31
  private detectionState;
34
32
  /**
35
33
  * Constructor
@@ -108,39 +106,6 @@ export declare class FaceDetectionEngine extends SimpleEventEmitter {
108
106
  */
109
107
  getOptions(): FaceDetectionEngineOptions;
110
108
  private updateVideoFPS;
111
- /**
112
- * Adjust detect_frame_delay to ensure main detection interval is at least 3 frames
113
- * This is important for proper spacing of corner detection, feature detection, and main detection
114
- */
115
- private adjustDetectFrameDelay;
116
- /**
117
- * Get the frame interval for main face detection based on videoFPS and detect_frame_delay
118
- * Uses Math.ceil to ensure actual interval >= configured delay
119
- * @returns Number of frames between detections
120
- */
121
- private getDetectionFrameInterval;
122
- /**
123
- * Check if main face detection should be performed this frame
124
- * @returns true if enough frames have passed since last detection
125
- */
126
- private shouldPerformMainDetection;
127
- /**
128
- * Check if screen corner detection should be performed this frame
129
- * Executes once per main detection interval
130
- * Logic:
131
- * - If mainInterval <= 2: disabled (insufficient frames)
132
- * - If mainInterval > 2: executes at calculated point, unless it's the last frame
133
- * @returns true if conditions are met
134
- */
135
- private shouldPerformScreenCornersDetection;
136
- /**
137
- * Check if screen feature detection (multi-frame) should be performed this frame
138
- * Logic:
139
- * - Executes at calculated point in the cycle (40% position)
140
- * - If missed, can execute at last frame of cycle (fallback)
141
- * @returns true if conditions are met
142
- */
143
- private shouldPerformScreenFeatureDetection;
144
109
  /**
145
110
  * Cancel pending detection frame
146
111
  */
@@ -151,39 +116,16 @@ export declare class FaceDetectionEngine extends SimpleEventEmitter {
151
116
  * Orchestrates the detection pipeline with clear separation of concerns
152
117
  */
153
118
  private detect;
154
- /**
155
- * Check if current frame should be captured based on detection scheduling
156
- */
157
- private shouldCaptureFrame;
158
119
  /**
159
120
  * Capture video frame and convert to BGR and Grayscale Mat objects
160
121
  * @returns {Object | null} Object with bgrFrame and grayFrame, or null if failed
161
122
  */
162
123
  private captureAndPrepareFrames;
163
- /**
164
- * Perform screen detection (corners and multi-frame features)
165
- * @returns true if screen is detected, false otherwise
166
- */
167
- private performScreenDetection;
168
124
  /**
169
125
  * Perform main face detection and handle results
170
126
  */
171
127
  private performFaceDetection;
172
- /**
173
- * Clean up frame Mat objects
174
- * Note: Both BGR and Gray Mats are preallocated and reused
175
- * They are only deleted in clearPreallocatedMats()
176
- */
177
- private cleanupFrames;
178
128
  private getPerformActionCount;
179
- /**
180
- * Detect screen by corners and contours analysis (fast detection)
181
- */
182
- private detectScreenCorners;
183
- /**
184
- * Detect screen by multi-frame feature analysis
185
- */
186
- private detectScreenFeatures;
187
129
  /**
188
130
  * Handle single face detection
189
131
  */
@@ -1 +1 @@
1
- {"version":3,"file":"face-detection-engine.d.ts","sourceRoot":"","sources":["../../src/face-detection-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"face-detection-engine.d.ts","sourceRoot":"","sources":["../../src/face-detection-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,0BAA0B,EAQ3B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAmF,WAAW,EAAE,MAAM,SAAS,CAAA;AAEtH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAwBpD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB;IACzD,OAAO,CAAC,OAAO,CAAuB;IAEtC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,KAAK,CAAqB;IAElC,OAAO,CAAC,WAAW,CAAgC;IAEnD,OAAO,CAAC,QAAQ,CAAa;IAG7B,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,qBAAqB,CAAyD;IAGtF,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,kBAAkB,CAAwC;IAElE,OAAO,CAAC,gBAAgB,CAAsB;IAE9C,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAAY;IAIrC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,qBAAqB,CAAY;IAGzC,OAAO,CAAC,sBAAsB,CAAiB;IAG/C,OAAO,CAAC,UAAU,CAAY;IAI9B,OAAO,CAAC,cAAc,CAAgB;IAEtC;;;OAGG;gBACS,OAAO,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC;IAMzD;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,IAAI;IAalE,cAAc,IAAI,WAAW;IAM7B;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAcjC;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAWlC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkKjC;;;;;;;OAOG;IACG,cAAc,CAAC,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqKnE;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA2FrC;;;OAGG;IACH,UAAU,IAAI,0BAA0B;IAMxC,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;;;OAIG;YACW,MAAM;IAoEpB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAsD/B;;OAEG;YACW,oBAAoB;IAmClC,OAAO,CAAC,qBAAqB;IAY7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyIxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,OAAO,CAAC,SAAS;IA4CjB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAsEzB,OAAO,CAAC,gBAAgB;IAqBxB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAuC9B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CA2B9B"}
@@ -1,7 +1,5 @@
1
1
  import { DetectionPeriod, LivenessAction } from "./enums";
2
2
  import { MotionLivenessDetector } from "./motion-liveness-detector";
3
- import { ScreenCaptureDetector } from './screen-capture-detector';
4
- import { ScreenCornersContourDetector } from './screen-corners-contour-detector';
5
3
  /**
6
4
  * Internal detection state interface
7
5
  */
@@ -19,21 +17,16 @@ export declare class DetectionState {
19
17
  lastFrontalScore: number;
20
18
  motionDetector: MotionLivenessDetector | null;
21
19
  liveness: boolean;
22
- realness: boolean;
23
- screenDetector: ScreenCaptureDetector | null;
24
- cornersContourDetector: ScreenCornersContourDetector | null;
25
20
  constructor(options: Partial<DetectionState>);
26
21
  reset(): void;
27
- updateVideoFPS(fps: number): void;
28
22
  needFrontalFace(): boolean;
29
23
  isReadyToVerify(minCollectCount: number): boolean;
30
24
  onActionStarted(nextAction: LivenessAction, timeoutMills: number, timeoutCallback: () => void): void;
31
25
  onActionCompleted(): void;
32
- setCVInstance(cvInstance: any): void;
33
26
  /**
34
27
  * Clear action verify timeout
35
28
  */
36
29
  private clearActionVerifyTimeout;
37
30
  }
38
- export declare function createDetectionState(fps: number, strictPhotoDetection: boolean): DetectionState;
31
+ export declare function createDetectionState(): DetectionState;
39
32
  //# sourceMappingURL=face-detection-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"face-detection-state.d.ts","sourceRoot":"","sources":["../../src/face-detection-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAA;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAA;AAGhF;;GAEG;AACH,qBAAa,cAAc;IACvB,MAAM,EAAE,eAAe,CAAyB;IAChD,SAAS,EAAE,MAAM,CAAoB;IACrC,YAAY,EAAE,MAAM,CAAI;IACxB,oBAAoB,EAAE,MAAM,CAAI;IAChC,gBAAgB,EAAE,MAAM,CAAI;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAO;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IACnC,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAY;IACjD,aAAa,EAAE,cAAc,GAAG,IAAI,CAAO;IAC3C,mBAAmB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAO;IAChE,gBAAgB,EAAE,MAAM,CAAI;IAC5B,cAAc,EAAE,sBAAsB,GAAG,IAAI,CAAO;IACpD,QAAQ,EAAE,OAAO,CAAQ;IACzB,QAAQ,EAAE,OAAO,CAAQ;IACzB,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAO;IACnD,sBAAsB,EAAE,4BAA4B,GAAG,IAAI,CAAO;gBAEtD,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;IAI5C,KAAK,IAAI,IAAI;IAgBb,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAYjC,eAAe,IAAI,OAAO;IAK1B,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAUjD,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,IAAI,GAAG,IAAI;IASpG,iBAAiB,IAAI,IAAI;IASzB,aAAa,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI;IAMpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAMnC;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAG,cAAc,CAM/F"}
1
+ {"version":3,"file":"face-detection-state.d.ts","sourceRoot":"","sources":["../../src/face-detection-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAEnE;;GAEG;AACH,qBAAa,cAAc;IACvB,MAAM,EAAE,eAAe,CAAyB;IAChD,SAAS,EAAE,MAAM,CAAoB;IACrC,YAAY,EAAE,MAAM,CAAI;IACxB,oBAAoB,EAAE,MAAM,CAAI;IAChC,gBAAgB,EAAE,MAAM,CAAI;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAO;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IACnC,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAY;IACjD,aAAa,EAAE,cAAc,GAAG,IAAI,CAAO;IAC3C,mBAAmB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAO;IAChE,gBAAgB,EAAE,MAAM,CAAI;IAC5B,cAAc,EAAE,sBAAsB,GAAG,IAAI,CAAO;IACpD,QAAQ,EAAE,OAAO,CAAQ;gBAEb,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;IAI5C,KAAK,IAAI,IAAI;IAab,eAAe,IAAI,OAAO;IAK1B,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAUjD,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,IAAI,GAAG,IAAI;IASpG,iBAAiB,IAAI,IAAI;IASzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAMnC;AAID,wBAAgB,oBAAoB,IAAI,cAAc,CAIrD"}
@@ -1,218 +1,337 @@
1
1
  /**
2
- * 运动和活体检测 - 防止照片攻击
3
- * 检测微妙的面部运动和运动模式,以区分真实面孔和高质量照片
2
+ * 活体检测器 - 微妙运动检测版本 + 照片几何特征检测
3
+ *
4
+ * 双重检测策略:
5
+ * 1. 正向检测:检测生物特征(微妙眨眼、细微张嘴、面部肌肉微动)
6
+ * 2. 逆向检测:检测照片几何特征(平面约束、透视变换规律、交叉比率)
7
+ *
8
+ * ⚠️ 关键理解 ⚠️
9
+ * MediaPipe 返回的 Z 坐标(深度)是从2D图像【推断】出来的,不是真实的物理深度!
10
+ * - 对真实人脸:推断出正确的 3D 结构
11
+ * - 对照片人脸:也可能推断出"假"的 3D 结构(因为照片上的人脸看起来也像 3D 的)
12
+ *
13
+ * 因此,检测策略优先级:
14
+ * 1. 【最可靠】2D 几何约束检测(单应性、交叉比率、透视变换规律)——物理定律,无法欺骗
15
+ * 2. 【次可靠】生物特征时序检测(眨眼时间、对称性)——行为模式
16
+ * 3. 【辅助参考】Z 坐标分析——可能被欺骗,仅作辅助
4
17
  */
5
18
  import type { FaceResult } from '@vladmandic/human';
6
19
  import type { Box } from '@vladmandic/human';
7
20
  /**
8
- * 运动检测结果
21
+ * 活体检测结果
9
22
  */
10
23
  export declare class MotionDetectionResult {
11
- motionScore: number;
12
- opticalFlowMagnitude: number;
13
- keypointVariance: number;
14
- eyeMotionScore: number;
15
- mouthMotionScore: number;
16
- motionType: MotionType;
17
24
  isLively: boolean;
18
25
  details: {
19
26
  frameCount: number;
20
- avgKeypointDistance: number;
21
- maxKeypointDistance: number;
22
- faceAreaVariance: number;
23
- eyeAspectRatioVariance: number;
24
- mouthAspectRatioVariance: number;
27
+ eyeAspectRatioStdDev: number;
28
+ mouthAspectRatioStdDev: number;
29
+ eyeFluctuation: number;
30
+ mouthFluctuation: number;
31
+ muscleVariation: number;
32
+ hasEyeMovement: boolean;
33
+ hasMouthMovement: boolean;
34
+ hasMuscleMovement: boolean;
35
+ isPhoto?: boolean;
36
+ photoConfidence?: number;
37
+ homographyScore?: number;
38
+ perspectiveScore?: number;
39
+ crossRatioScore?: number;
40
+ depthVariation?: number;
41
+ crossFramePattern?: number;
25
42
  };
26
- constructor(motionScore: number, opticalFlowMagnitude: number, keypointVariance: number, eyeMotionScore: number, mouthMotionScore: number, motionType: MotionType, isLively: boolean, details: {
27
- frameCount: number;
28
- avgKeypointDistance: number;
29
- maxKeypointDistance: number;
30
- faceAreaVariance: number;
31
- eyeAspectRatioVariance: number;
32
- mouthAspectRatioVariance: number;
33
- });
34
- /**
35
- * 获取活体检测结果信息
36
- * 如果活跃,返回空字符串,否则返回非活体检测的原因
37
- */
38
- getMessage(minMotionScore: number, minKeypointVariance: number): string;
43
+ constructor(isLively: boolean, details: any);
44
+ getMessage(): string;
39
45
  }
40
- export type MotionType = 'none' | 'rotation' | 'translation' | 'breathing' | 'micro_expression';
41
- /**
42
- * 运动活体检测选项
43
- */
44
46
  export interface MotionLivenessDetectorOptions {
45
- minMotionThreshold?: number;
46
- minKeypointVariance?: number;
47
47
  frameBufferSize?: number;
48
- eyeAspectRatioThreshold?: number;
49
- motionConsistencyThreshold?: number;
50
- minOpticalFlowThreshold?: number;
51
- strictPhotoDetection?: boolean;
48
+ eyeMinFluctuation?: number;
49
+ mouthMinFluctuation?: number;
50
+ muscleMinVariation?: number;
51
+ activityThreshold?: number;
52
52
  }
53
53
  /**
54
- * 运动活体检测器
55
- * 使用光流、关键点跟踪和面部特征分析
54
+ * 活体检测器 - 超敏感微动作版本 + 照片几何特征检测
55
+ *
56
+ * 双重策略:
57
+ * 1. 检测生物微动(正向)
58
+ * 2. 检测照片几何约束(逆向)- 更可靠
56
59
  */
57
60
  export declare class MotionLivenessDetector {
58
61
  private config;
59
- private frameBuffer;
60
- private frameWidth;
61
- private frameHeight;
62
- private keypointHistory;
63
- private faceAreaHistory;
64
62
  private eyeAspectRatioHistory;
65
63
  private mouthAspectRatioHistory;
66
- private opticalFlowHistory;
67
- private pupilSizeHistory;
68
- private cv;
69
- constructor(strictPhotoDetection?: boolean);
70
- setCVInstance(cvInstance: any): void;
64
+ private faceLandmarksHistory;
65
+ private normalizedLandmarksHistory;
66
+ private leftEyeEARHistory;
67
+ private rightEyeEARHistory;
68
+ private frameTimestamps;
69
+ private rigidMotionHistory;
70
+ private homographyErrors;
71
+ private depthConsistencyScores;
72
+ private planarityScores;
73
+ constructor();
71
74
  getOptions(): Required<MotionLivenessDetectorOptions>;
72
75
  isReady(): boolean;
76
+ reset(): void;
77
+ analyzeMotion(faceResult: FaceResult, faceBox: Box): MotionDetectionResult;
73
78
  /**
74
- * 重置运动检测状态
79
+ * 检测眼睛的微妙波动(任何变化)
80
+ * 防护:排除透视畸变、噪声,确保是真实的连续或周期性波动
75
81
  */
76
- reset(): void;
82
+ private detectEyeFluctuation;
77
83
  /**
78
- * 从当前帧和历史记录分析运动和活体性
84
+ * 检测嘴巴的微妙波动(任何变化)
85
+ * 防护:排除噪声,确保是真实的张嘴/闭嘴动作
79
86
  */
80
- analyzeMotion(grayMat: any, faceResult: FaceResult, faceBox: Box): MotionDetectionResult;
87
+ private detectMouthFluctuation;
81
88
  /**
82
- * 将帧添加到循环缓冲区
89
+ * 【关键】检测真实的嘴巴张嘴→闭嘴动作
90
+ *
91
+ * 原理类似眨眼,需要检测下降和上升的连续段
83
92
  */
84
- private addFrameToBuffer;
93
+ private detectRealMouthMovement;
85
94
  /**
86
- * 验证运动一致性 - 防止照片微动攻击
87
- * 真实面部运动:光流和关键点方差应该都有意义(都不为零)
88
- * 照片微动:通常表现为只有光流或只有噪声,或两者都非常低
95
+ * 检测面部肌肉的微动(关键点位置微妙变化)
96
+ * 关键:允许刚性运动+生物特征(真人摇头),拒绝纯刚性运动(照片旋转)
89
97
  *
90
- * 修复:允许不同类型运动的不同比例关系
91
- * - 大幅度头部运动(旋转/平移): 高keypoint variance, 中等optical flow
92
- * - 微妙表情运动: 中等optical flow, 低keypoint variance
93
- * - 照片微动: 两者都很低,或严重不匹配(一个近零一个不近零)
98
+ * 【重要修复】使用归一化坐标进行比较,消除人脸在画面中移动的影响
94
99
  */
95
- private validateMotionConsistency;
100
+ private detectMuscleMovement;
96
101
  /**
97
- * 检测瞳孔反应 - 活体的关键特征
98
- * 照片的瞳孔无法反应光线变化
102
+ * 【防护机制】检测照片透视畸变(倾角拍摄)
103
+ *
104
+ * 原理:
105
+ * - 照片是平面:所有关键点Z坐标(深度)应该相同且恒定
106
+ * - 当从倾角看平面照片时,虽然会产生2D投影变形,但深度仍然固定在一个平面
107
+ * - 真实活体:脸部有Z坐标深度,不同区域有深度差异(鼻子、下巴等突出)
108
+ *
109
+ * 返回值:照片平面性得分(0-1,越接近1越可能是平面照片)
99
110
  */
100
- private detectPupilResponse;
111
+ private detectPhotoPlanarity;
101
112
  /**
102
- * 计算眼睛大小(用于瞳孔反应检测)
113
+ * 【防护机制】检测刚性运动(照片被拿着旋转/平移)
114
+ *
115
+ * 原理:
116
+ * - 照片所有关键点运动是【刚性的】→ 所有点以相同方向、相似幅度移动
117
+ * - 活体肌肉运动是【非刚性的】→ 不同部位独立运动(眼睛、嘴、脸颊等)
118
+ *
119
+ * 【重要修复】使用归一化坐标进行比较
120
+ *
121
+ * 返回值 0-1:值越接近1说明是刚性运动(照片运动)
103
122
  */
104
- private calculateEyeSize;
123
+ private detectRigidMotion;
105
124
  /**
106
- * 从 Human.js 面部检测结果中提取面部关键点
107
- * 使用网格标志点(来自 MediaPipe Face Mesh 模型的 468 个点)
125
+ * 计算角度的平均值(考虑循环性)
108
126
  */
109
- private extractKeypoints;
127
+ private calculateMeanAngle;
110
128
  /**
111
- * 计算光流幅度(需要 OpenCV)
112
- * 检测帧之间的像素运动
129
+ * 检测序列是否呈现【往复波动】而不是【单向变化】
113
130
  *
114
- * 针对5帧短视频优化的参数:
115
- * - pyr_scale: 0.8(更陡峭的金字塔,保留细节)
116
- * - levels: 2(减少层级数,适合小尺寸视频)
117
- * - winsize: 7(更小的窗口,捕捉微小运动)
131
+ * 原理:
132
+ * - 真实眨眼/表情:值会【往复波动】 0.4 → 0.3 → 0.4 → 0.5
133
+ * - 照片透视变形:值会【单向变化】 如 0.4 → 0.3 → 0.25 → 0.2
134
+ *
135
+ * 返回值:true = 检测到往复波动(活体特征)
118
136
  */
119
- private analyzeOpticalFlow;
137
+ private detectOscillation;
120
138
  /**
121
- * 计算光流的平均幅度
122
- * 包含诊断日志用于调试
139
+ * 【关键】检测真实眨眼(连续的闭眼→睁眼周期)
140
+ *
141
+ * 原理:
142
+ * - 真实眨眼:快速下降(EAR↓ 1-2帧)→ 保持低值(EAR低 2-3帧)→ 快速上升(EAR↑ 1-2帧)
143
+ * - 噪声或光线变化:孤立的异常值,前后没有连续的变化模式
144
+ *
145
+ * 返回值:true = 检测到完整或部分眨眼周期
123
146
  */
124
- private calculateFlowMagnitude;
147
+ private detectRealBlink;
125
148
  /**
126
- * 计算关键点位置在帧间的方差
127
- * 高方差 = 自然运动(活跃)
128
- * 低方差 = 静止如照片
149
+ * 【新增防护】检测左右眼对称性
150
+ *
151
+ * 原理:
152
+ * - 真实眨眼:左右眼几乎同时闭合和睁开,EAR变化高度同步
153
+ * - 照片透视畸变:根据偏转方向,一只眼睛可能比另一只变化更大
154
+ *
155
+ * 返回值 0-1:越接近1说明左右眼越对称(越像真实眨眼)
129
156
  */
130
- private calculateKeypointVariance;
157
+ private detectEyeSymmetry;
131
158
  /**
132
- * 计算两帧中对应标志点之间的平均距离
159
+ * 【新增防护】检测眨眼时间模式
160
+ *
161
+ * 原理:
162
+ * - 真实眨眼非常快:完整周期 100-400ms(3-12帧@30fps)
163
+ * - 手动摆动照片:周期通常 500ms-2000ms(15-60帧@30fps)
164
+ *
165
+ * 返回值:true = 检测到符合真实眨眼的快速时间模式
133
166
  */
134
- private calculateLandmarkDistance;
167
+ private detectBlinkTiming;
135
168
  /**
136
- * 计算所有帧中的平均关键点距离
169
+ * 【新增防护】检测运动-形变相关性
170
+ *
171
+ * 原理:
172
+ * - 照片偏转攻击:刚性运动越大 → EAR/MAR形变越大(高度相关)
173
+ * - 真实活体:眨眼/张嘴与头部运动无关(低相关或无相关)
174
+ *
175
+ * 返回值 0-1:越接近1说明运动和形变越相关(越像照片攻击)
137
176
  */
138
- private calculateAvgKeypointDistance;
177
+ private detectMotionDeformCorrelation;
139
178
  /**
140
- * 计算帧间的最大关键点距离
179
+ * 【关键】检测最近几帧是否有运动
180
+ *
181
+ * 防护:某人在检测开始时眨眼,之后就完全静止
182
+ * 这种情况应该判定为照片,因为照片可以有偶然的反光
183
+ * 活体应该有【持续的或周期性的】动作
184
+ *
185
+ * 返回值:true = 最近3-5帧内有明显变化
141
186
  */
142
- private calculateMaxKeypointDistance;
187
+ private detectRecentMovement;
143
188
  /**
144
- * 计算眼睛宽高比 (EAR)
145
- * 用于检测眨眼和眼睛开度变化
189
+ * 【核心】照片几何特征检测(逆向检测)
190
+ *
191
+ * 重要说明:
192
+ * - MediaPipe的Z坐标是从2D图像【推断】的,不是真实深度
193
+ * - 对照片也可能推断出"假"的3D结构
194
+ * - 因此【2D几何约束】比【Z坐标分析】更可靠
195
+ *
196
+ * 可靠的检测(基于2D几何,物理定律):
197
+ * 1. 单应性变换约束 - 平面必须满足
198
+ * 2. 特征点相对位置变化 - 照片偏转时遵循透视规律
199
+ *
200
+ * 参考性检测(基于推断的Z坐标,可能被欺骗):
201
+ * 1. 深度一致性 - 辅助参考
202
+ * 2. 跨帧深度模式 - 辅助参考
146
203
  */
147
- private calculateEyeAspectRatio;
204
+ private detectPhotoGeometry;
148
205
  /**
149
- * 计算嘴巴宽高比 (MAR)
150
- * 用于检测嘴巴张开的变化
206
+ * 【新增核心检测】交叉比率不变性检测
207
+ *
208
+ * 原理(射影几何的基本定理):
209
+ * - 平面上共线4点的【交叉比率】在透视变换下保持不变
210
+ * - 真实3D人脸旋转时,面部各点不共面,交叉比率会变化
211
+ * - 照片无论怎么偏转,共线点的交叉比率保持不变
212
+ *
213
+ * 这是纯2D几何检测,非常可靠!
151
214
  */
152
- private calculateMouthAspectRatio;
153
215
  /**
154
- * 计算面部中心(所有关键点的平均位置)
216
+ * 【交叉比率不变性检测】
217
+ *
218
+ * 原理(射影几何的基本定理):
219
+ * - 平面上共线4点的【交叉比率】在透视变换下保持不变
220
+ * - 真实3D人脸旋转时,面部各点不共面,交叉比率会变化
221
+ * - 照片无论怎么偏转,共线点的交叉比率保持不变
222
+ *
223
+ * 【注意】交叉比率本身是比率,不依赖绝对坐标
224
+ * 使用归一化坐标只是为了一致性
155
225
  */
156
- private calculateFaceCenter;
226
+ private detectCrossRatioInvariance;
157
227
  /**
158
- * 计算两个点之间的距离
228
+ * 【关键】检测单应性变换约束
229
+ *
230
+ * 原理:
231
+ * - 平面物体(照片)在不同视角下的投影满足 H * p1 = p2(H是3x3单应性矩阵)
232
+ * - 3D物体不满足这个约束,会有残差误差
233
+ *
234
+ * 方法:用4对点计算H,然后检验其他点是否符合H变换
159
235
  */
160
- private pointDistance;
161
236
  /**
162
- * 基于眼睛宽高比变化计算眼睛运动评分
237
+ * 【单应性约束检测】判断多帧特征点是否满足平面约束
238
+ *
239
+ * 【重要修复】使用归一化坐标进行比较
240
+ * 这是纯 2D 几何检测,最可靠!
163
241
  */
164
- private calculateEyeMotionScore;
242
+ private detectHomographyConstraint;
165
243
  /**
166
- * 基于嘴巴宽高比变化计算嘴巴运动评分
244
+ * 估计仿射变换矩阵 (简化的单应性)
245
+ * 输入:源点和目标点对
246
+ * 输出:[a, b, c, d, e, f] 表示变换 x' = ax + by + c, y' = dx + ey + f
167
247
  */
168
- private calculateMouthMotionScore;
248
+ private estimateAffineTransform;
169
249
  /**
170
- * 计算人脸区域方差
250
+ * 应用仿射变换
171
251
  */
172
- private calculateFaceAreaVariance;
252
+ private applyAffineTransform;
173
253
  /**
174
- * 计算人脸区域的变化率 - 用于检测呼吸或其他微妙运动
175
- * 活体在呼吸或说话时,面部区域会有微小的周期性变化
176
- * 照片:变化很小或波动随机
254
+ * 【关键】检测深度一致性
255
+ *
256
+ * 原理:
257
+ * - 真实人脸:鼻子Z坐标明显大于眼睛和脸颊(凸出)
258
+ * - 照片:所有点Z坐标接近相同(平面)
177
259
  */
178
- private calculateFaceAreaChangeRate;
260
+ private detectDepthConsistency;
179
261
  /**
180
- * 计算数字数组的方差
262
+ * 【关键】检测跨帧深度模式
263
+ *
264
+ * 原理:
265
+ * - 照片旋转时:所有点的深度变化遵循平面投影规律(线性关系)
266
+ * - 真实人脸旋转时:不同部位的深度变化不成线性关系
181
267
  */
182
- private calculateVariance;
268
+ private detectCrossFrameDepthPattern;
183
269
  /**
184
- * 基于分析检测运动类型
270
+ * 【关键】检测透视变换模式
271
+ *
272
+ * 原理:
273
+ * - 照片偏转时,特征点位置变化遵循严格的透视变换规律
274
+ * - 检测左右脸的相对变化是否符合透视投影
185
275
  */
186
- private detectMotionType;
187
276
  /**
188
- * 从多个来源计算总体运动评分
189
- * 针对照片攻击进行优化:提高光流和关键点方差的权重
277
+ * 【透视变换模式检测】
278
+ *
279
+ * 【重要修复】使用归一化坐标进行比较
280
+ *
281
+ * 原理:照片左右偏转时,左右脸宽度比例会平滑变化
190
282
  */
191
- private calculateOverallMotionScore;
283
+ private detectPerspectiveTransformPattern;
192
284
  /**
193
- * 根据运动分析确定面部是否活跃
194
- * 【针对5帧场景优化】:改为"多数票"制,使用6个独立指标
285
+ * 综合判定 - 结合正向检测(生物特征)和逆向检测(照片几何)
195
286
  *
196
- * 6个检测指标(互相独立):
197
- * 1. 关键点变化 - 照片无法改变关键点位置
198
- * 2. 光流幅度 - 照片产生的光流极低
199
- * 3. 运动类型 - 照片只能是'none'
200
- * 4. 眼睛运动(眨眼)- 照片眼睛无法眨动
201
- * 5. 嘴巴运动 - 照片嘴巴完全静止
202
- * 6. 面部区域变化 - 照片无法产生呼吸迹象
287
+ * 双重策略:
288
+ * 1. 正向:检测生物微动特征(有 活体)
289
+ * 2. 逆向:检测照片几何约束(满足 照片)
203
290
  *
204
- * 判决规则:
205
- * - 数据充足(>= 5帧):需要至少2个指标支持才判定为活体
206
- * - 数据不足(< 5帧):需要至少3个指标支持
291
+ * 逆向检测优先级更高,因为照片几何约束是物理定律,无法伪造
207
292
  */
208
- private determineLiveness;
293
+ private makeLivenessDecision;
209
294
  /**
210
- * 分析失败时创建空结果
295
+ * 【防护机制】检查脸部形状稳定性
296
+ *
297
+ * 原理:
298
+ * - 真实脸部:眨眼、张嘴等会改变脸部几何形状(EAR/MAR 变化)
299
+ * - 照片:脸部形状完全固定,不会有任何变化
300
+ * - 倾角照片:虽然会产生透视变形,但仍然是平面的,Z坐标无深度
301
+ *
302
+ * 返回值 0-1:值越接近1说明脸部形状越稳定(越可能是照片)
211
303
  */
212
- private createEmptyResult;
213
304
  /**
214
- * 获取运动检测结果(用于调试)
305
+ * 检查脸部形状稳定性
306
+ *
307
+ * 【重要修复】使用归一化坐标进行比较
308
+ * 这样即使人脸在画面中移动或缩放,比较仍然有效
215
309
  */
310
+ private checkFaceShapeStability;
311
+ private extractKeypoints;
312
+ private calculateEyeAspectRatio;
313
+ private calculateMouthAspectRatio;
314
+ private pointDist;
315
+ private calculateStdDev;
316
+ /**
317
+ * 【关键方法】将关键点坐标归一化到人脸局部坐标系
318
+ *
319
+ * 问题:
320
+ * - MediaPipe 返回的 x,y 坐标是相对于【图像左上角】的像素坐标
321
+ * - 如果人脸在画面中移动,同一个关键点的绝对坐标会完全不同
322
+ * - 多帧之间直接比较绝对坐标是错误的!
323
+ *
324
+ * 解决:
325
+ * - 将坐标转换为相对于人脸边界框的归一化坐标
326
+ * - 归一化坐标 = (点坐标 - 人脸左上角) / 人脸尺寸
327
+ * - 这样无论人脸在画面中的位置,归一化坐标都一致
328
+ *
329
+ * @param landmarks 原始关键点数组
330
+ * @param faceBox 人脸边界框 [x, y, width, height]
331
+ * @returns 归一化后的关键点数组
332
+ */
333
+ private normalizeLandmarks;
334
+ private createEmptyResult;
216
335
  getStatistics(): any;
217
336
  }
218
337
  //# sourceMappingURL=motion-liveness-detector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"motion-liveness-detector.d.ts","sourceRoot":"","sources":["../../src/motion-liveness-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"motion-liveness-detector.d.ts","sourceRoot":"","sources":["../../src/motion-liveness-detector.ts"],"names":[],"mappings":"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"}
@@ -48,8 +48,6 @@ export interface FaceDetectionEngineOptions {
48
48
  detect_video_mirror?: boolean;
49
49
  /** 加载视频流的超时时间(毫秒,默认 5000) */
50
50
  detect_video_load_timeout?: number;
51
- /** 检测帧之间的延迟(毫秒,默认 150) */
52
- detect_frame_delay?: number;
53
51
  /** 要采集的静默检测次数(默认 3) */
54
52
  collect_min_collect_count?: number;
55
53
  /** 最小人脸尺寸比例(默认 0.5) */
@@ -74,8 +72,6 @@ export interface FaceDetectionEngineOptions {
74
72
  action_liveness_verify_timeout?: number;
75
73
  /** 最小嘴部张开百分比(默认 0.2) */
76
74
  action_liveness_min_mouth_open_percent?: number;
77
- /** 是否启用严格照片检测模式(默认 false) */
78
- motion_liveness_strict_photo_detection?: boolean;
79
75
  }
80
76
  /**
81
77
  * 与默认值合并后的已解析配置