UNPKG

id-scanner-lib

Version:

Browser-based ID card, QR code, and face recognition scanner with liveness detection

309 lines (293 loc) 6.72 kB
/** * @file 人脸检测接口 * @description 定义人脸检测相关的数据类型和接口 * @module interfaces/face-detection */ import { BaseScannerResult } from './scanner-module'; /** * 坐标点接口,表示2D坐标 */ export interface Point { /** X坐标 */ x: number; /** Y坐标 */ y: number; } /** * 矩形接口,表示检测框 */ export interface Rect { /** 左上角X坐标 */ x: number; /** 左上角Y坐标 */ y: number; /** 宽度 */ width: number; /** 高度 */ height: number; } /** * 人脸关键点 */ export interface FaceLandmarks { /** 左眼位置 */ leftEye: Point; /** 右眼位置 */ rightEye: Point; /** 鼻尖位置 */ nose: Point; /** 嘴巴中心位置 */ mouth: Point; /** 左眼角位置 */ leftEyeOuterCorner?: Point; /** 右眼角位置 */ rightEyeOuterCorner?: Point; /** 左耳位置 */ leftEar?: Point; /** 右耳位置 */ rightEar?: Point; /** 所有关键点(有些实现可能提供更多点) */ points?: Point[]; } /** * 人脸角度 */ export interface FaceAngle { /** 俯仰角(上下) */ pitch: number; /** 偏航角(左右) */ yaw: number; /** 滚动角(倾斜) */ roll: number; } /** * 人脸质量评估指标 */ export interface FaceQualityMetrics { /** 亮度评分(0-1) */ brightness: number; /** 清晰度评分(0-1) */ sharpness: number; /** 姿态合规程度(0-1) */ pose: number; /** 人脸完整度(0-1) */ integrity: number; /** 整体质量分数(0-1) */ overall: number; } /** * 人脸属性 */ export interface FaceAttributes { /** 年龄估计(岁) */ age?: number; /** 性别置信度(0-1,越大越倾向于男性) */ gender?: number; /** 是否戴眼镜置信度 */ glasses?: number; /** 是否戴口罩置信度 */ mask?: number; /** 微笑程度置信度 */ smile?: number; /** 人脸表情分类 */ emotion?: { /** 生气程度 */ angry?: number; /** 恐惧程度 */ fear?: number; /** 厌恶程度 */ disgust?: number; /** 高兴程度 */ happy?: number; /** 平静程度 */ neutral?: number; /** 伤心程度 */ sad?: number; /** 惊讶程度 */ surprise?: number; }; /** 人种类别置信度 */ ethnicity?: { /** 亚洲人程度 */ asian?: number; /** 黑人程度 */ black?: number; /** 白人程度 */ caucasian?: number; /** 其他人种程度 */ other?: number; }; /** 其他自定义属性 */ [key: string]: any; } /** * 人脸特征向量(人脸嵌入) */ export interface FaceEmbedding { /** 特征向量数据 */ vector: number[]; /** 特征维度 */ dimension: number; /** 模型版本 */ modelVersion?: string; } /** * 人脸检测结果 */ export interface FaceDetectionResult extends BaseScannerResult { /** 人脸区域 */ boundingBox: Rect; /** 人脸关键点 */ landmarks?: FaceLandmarks; /** 人脸角度 */ angle?: FaceAngle; /** 检测质量 */ quality?: FaceQualityMetrics; /** 人脸属性 */ attributes?: FaceAttributes; /** 人脸特征向量 */ embedding?: FaceEmbedding; /** 相似度分数(用于比对场景) */ similarityScore?: number; /** 是否有活体检测结果 */ isLive?: boolean; /** 活体检测分数(0-1) */ livenessScore?: number; /** 标识符(可用于跟踪) */ trackId?: string; /** 人脸图像数据(裁剪后) */ faceImageData?: string; } /** * 人脸比对结果 */ export interface FaceComparisonResult { /** 相似度分数(0-1) */ similarity: number; /** 是否匹配(基于阈值判断) */ isMatch: boolean; /** 使用的阈值 */ threshold: number; /** 源人脸 */ sourceFace?: FaceDetectionResult; /** 目标人脸 */ targetFace?: FaceDetectionResult; /** 处理时间(毫秒) */ processingTime: number; } /** * 活体检测类型 */ export enum LivenessDetectionType { /** 被动活体检测(单图分析) */ PASSIVE = 'passive', /** 主动活体检测(动作挑战) */ ACTIVE = 'active', /** 混合活体检测(结合多种方法) */ HYBRID = 'hybrid' } /** * 活体检测动作类型 */ export enum LivenessAction { /** 眨眼 */ BLINK = 'blink', /** 点头 */ NOD = 'nod', /** 摇头 */ SHAKE = 'shake', /** 微笑 */ SMILE = 'smile', /** 张嘴 */ MOUTH_OPEN = 'mouth_open', /** 注视点 */ GAZE = 'gaze' } /** * 活体检测结果 */ export interface LivenessDetectionResult { /** 是否为真人 */ isLive: boolean; /** 活体分数(0-1) */ score: number; /** 使用的活体检测类型 */ type: LivenessDetectionType; /** 活体检测动作(如果使用了主动活体检测) */ actions?: LivenessAction[]; /** 检测时间(毫秒) */ processingTime: number; /** 检测结果图片 */ imageData?: string; } /** * 活体检测会话 */ export interface LivenessSession { /** 会话ID */ id: string; /** 活体检测类型 */ type: LivenessDetectionType; /** 需要完成的动作 */ requiredActions?: LivenessAction[]; /** 当前动作索引 */ currentActionIndex?: number; /** 会话开始时间 */ startTime: number; /** 会话超时时间(毫秒) */ timeout: number; /** 会话状态 */ status: 'active' | 'completed' | 'failed' | 'timeout'; /** 完成的动作 */ completedActions?: LivenessAction[]; /** 活体检测结果 */ result?: LivenessDetectionResult; } /** * 人脸跟踪结果 */ export interface FaceTrackingResult { /** 跟踪ID */ trackId: string; /** 当前检测结果 */ detection: FaceDetectionResult; /** 首次检测时间 */ firstDetectedAt: number; /** 上次检测时间 */ lastDetectedAt: number; /** 跟踪状态 */ status: 'tracked' | 'lost' | 'removed'; /** 连续跟踪帧数 */ consecutiveFrames: number; /** 历史位置(最近几帧) */ history?: Rect[]; } /** * 人脸检测选项 */ export interface FaceDetectionOptions { /** 最低人脸置信度 */ minConfidence?: number; /** 最大检测人脸数 */ maxFaces?: number; /** 是否检测关键点 */ withLandmarks?: boolean; /** 是否检测属性 */ withAttributes?: boolean; /** 是否进行人脸对齐 */ doAlignment?: boolean; /** 是否提取人脸特征 */ withEmbedding?: boolean; /** 是否启用跟踪 */ enableTracking?: boolean; /** 是否执行活体检测 */ withLiveness?: boolean; /** 活体检测类型 */ livenessType?: LivenessDetectionType; /** 返回人脸图像 */ returnFaceImage?: boolean; /** 活体检测选项 */ livenessOptions?: Record<string, any>; /** 其他选项 */ [key: string]: any; }