项目地址
前期准备
人脸特征相似度介绍
- 特征提取过程可以分为两个步骤:1. 根据人脸5个关键点裁剪出人脸区域;2. 将人脸区域输入特征提取网络提取特征。
这两个步骤可以分开调用,也可以独立调用。 - 特征长度是不同模型可能不同的,要使用faceRecognizer.GetExtractFeatureSize()方法获取当前使用模型提取的特征长度。
- 相似度的范围是[0, 1],但是需要注意的是,如果是直接用內积计算的话,因为特征中存在复数,所以计算出的相似度可能为负数。识别器内部会将负数映射到0。
- 在一些特殊的情况下,需要将特征提取分开两步进行,比如前端裁剪处理图片,服务器进行特征提取和对比。
- 戴口罩人脸相似度计算需要切换成 face_recognizer_mask.csta模型
- 下面代码中,一张图片中可能有多个人脸(也可能没有人脸),这里演示用图片至少包含一个人脸,且只取第一个。
人脸特征模型介绍
模型 | 模型说明 | 备注 |
---|---|---|
face_recognizer.csta | 高精度人脸识别人脸向量特征提取模型,建议阈值:0.62 | 返回1024长度向量特征 |
face_recognizer_mask.csta | 戴口罩人脸向量特征提取模型,建议阈值:0.48 | 返回512长度向量特征 |
face_recognizer_light.csta | 轻量级人脸向量特征提取模型,建议阈值:0.55 | 返回512长度向量特征 |
人脸特征相似度代码
package com.seeta.sdk.proxy;
import com.seeta.proxy.FaceDetectorProxy;
import com.seeta.proxy.FaceLandmarkerProxy;
import com.seeta.proxy.FaceRecognizerProxy;
import com.seeta.pool.SeetaConfSetting;
import com.seeta.sdk.*;
import com.seeta.sdk.util.LoadNativeCore;
import com.seeta.sdk.util.SeetafaceUtil;
/**
* 人脸特征相似度 1:1
* 人脸相似度计算
*/
public class FaceRecognizerProxyTest {
static {
LoadNativeCore.LOAD_NATIVE(SeetaDevice.SEETA_DEVICE_AUTO);
}
//模型文件夹路径
public static String CSTA_PATH = "E:\\models";
// 拼接模型路径
public static String[] detector_cstas = {CSTA_PATH + "/face_detector.csta"};
// 人脸关键点定位模型路径拼接
public static String[] landmarker_cstas = {CSTA_PATH + "/face_landmarker_pts5.csta"};
//高精度人脸特征提取模型,1024维
public static String[] recognizer_cstas = {CSTA_PATH + "/face_recognizer.csta"};
public static String fileName = "E:\\111.jpg";
public static String fileName2 = "E:\\222.jpg";
public static void main(String[] args) {
//人脸识别检测器对象池配置,可以配置对象的个数哦
SeetaConfSetting detectorPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(0, detector_cstas, SeetaDevice.SEETA_DEVICE_AUTO));
//人脸检测器对象池代理 , spring boot可以用FaceDetectorProxy来配置Bean
FaceDetectorProxy faceDetectorProxy = new FaceDetectorProxy(detectorPoolSetting);
//人脸关键点定位器对象池配置
SeetaConfSetting faceLandmarkerPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(0, landmarker_cstas, SeetaDevice.SEETA_DEVICE_AUTO));
//人脸关键点定位器对象池代理 , spring boot可以用FaceLandmarkerProxy来配置Bean
FaceLandmarkerProxy faceLandmarkerProxy = new FaceLandmarkerProxy(faceLandmarkerPoolSetting);
SeetaConfSetting faceRecognizerPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(0, recognizer_cstas, SeetaDevice.SEETA_DEVICE_AUTO));
//人脸特征提取器,人脸特征相似度计算器
FaceRecognizerProxy faceRecognizerProxy = new FaceRecognizerProxy(faceRecognizerPoolSetting);
SeetaImageData image1 = SeetafaceUtil.toSeetaImageData(fileName);
SeetaImageData image2 = SeetafaceUtil.toSeetaImageData(fileName2);
try {
//照片1
SeetaRect[] detects1 = faceDetectorProxy.detect(image1);
//detects1[0] 图片中可能有多个人脸(也可能没有人脸),这里演示只取第一个
SeetaPointF[] pointFS1 = faceLandmarkerProxy.mark(image1, detects1[0]);
//向量特征数组
float[] features1 = faceRecognizerProxy.extract(image1, pointFS1);
//照片2
SeetaRect[] detects2 = faceDetectorProxy.detect(image2);
//detects1[0] 图片中可能有多个人脸(也可能没有人脸),这里演示只取第一个
SeetaPointF[] pointFS2 = faceLandmarkerProxy.mark(image2, detects2[0]);
//向量特征数组
float[] features2 = faceRecognizerProxy.extract(image2, pointFS2);
//对比向量特征数组
if (features1 != null && features2 != null) {
float calculateSimilarity = faceRecognizerProxy.cosineSimilarity(features1, features2);
System.out.printf("第相似度:%f\n", calculateSimilarity);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果
- float: 分数
结果:0.776509
总结
1. 人脸识别过程复杂,但这个代码简单。
2. 精度高,这边的模型都是中科院商业开源的,比起社区的模型,用到的训练集多很多。
3. 功能齐全 :
人脸检测和关键点定位
人脸特征提取和对比
人脸特征提取
人脸特征对比
活体检测
人脸跟踪
质量评估
年龄识别
性别识别
口罩检测
口罩人脸识别
眼睛状态检测