js实现人脸比对
人脸比对的基本原理
人脸比对通常涉及两个核心步骤:人脸检测和人脸特征提取。通过比较两张人脸图像的特征向量相似度来判断是否为同一人。JavaScript中可通过Web API或第三方库实现。

使用Face-api.js实现
Face-api.js是基于TensorFlow.js的轻量级人脸识别库,支持浏览器端运行:

// 加载模型
await faceapi.nets.ssdMobilenetv1.loadFromUri('/models');
await faceapi.nets.faceRecognitionNet.loadFromUri('/models');
await faceapi.nets.faceLandmark68Net.loadFromUri('/models');
// 提取人脸特征
const img1 = await faceapi.fetchImage('/image1.jpg');
const img2 = await faceapi.fetchImage('/image2.jpg');
const detection1 = await faceapi.detectSingleFace(img1).withFaceLandmarks().withFaceDescriptor();
const detection2 = await faceapi.detectSingleFace(img2).withFaceLandmarks().withFaceDescriptor();
// 计算欧氏距离
const distance = faceapi.euclideanDistance(detection1.descriptor, detection2.descriptor);
console.log('相似度:', (1 - distance).toFixed(4));
使用TensorFlow.js自定义实现
如需更底层控制,可使用TensorFlow.js构建自定义模型:
// 加载预训练模型
const model = await tf.loadGraphModel('face_recognition_model.json');
// 图像预处理
const preprocess = (img) => {
const tensor = tf.browser.fromPixels(img).toFloat();
return tf.image.resizeBilinear(tensor, [112, 112]).expandDims();
};
// 特征提取
const getEmbedding = async (img) => {
const preprocessed = preprocess(img);
return model.predict(preprocessed).dataSync();
};
// 余弦相似度计算
const cosineSimilarity = (a, b) => {
const dotProduct = a.reduce((sum, _, i) => sum + a[i] * b[i], 0);
const magA = Math.sqrt(a.reduce((sum, x) => sum + x * x, 0));
const magB = Math.sqrt(b.reduce((sum, x) => sum + x * x, 0));
return dotProduct / (magA * magB);
};
性能优化建议
- 使用Web Worker避免主线程阻塞
- 对图像进行适当压缩(建议分辨率不低于224x224)
- 启用TensorFlow.js的WebGL后端加速
- 采用IndexedDB缓存模型和计算结果
阈值参考值
常见相似度判断阈值:
- 欧氏距离:< 0.6 可认为同一人
- 余弦相似度:> 0.5 可认为同一人
实际阈值需根据具体应用场景通过测试数据调整。






