Java+seetaface6实现人脸识别

seetaface6是中科视拓开源的一套基于深度学习的高性能人脸识别框架,其中包含了人脸检测、人脸识别、人脸跟踪、口罩检测、年龄估计、性别估计、特征点检测、眼睛状态检测、质量评估器、静默活体功能。seetaface6SDK是基于seetaface6源码和seetaface6JNI源码编译得到的一个sdk项目
项目地址如下:
seetaface6
seetaface6SDK

安装环境

  1. 需要JDK8-JDK14
  2. windows系统需要64位版本
  3. 使用GPU计算需要安装cuda

识别流程

人脸识别的流程如下:

  1. 摄像头拍照后保存人像到指定的路径。
  2. 将保存的人像文件路径传入SeetafaceUtil.toSeetaImageData计算图片信息
  3. 通过faceRecognizer根据图片信息计算出当前照片的特征值
  4. 通过faceRecognizer.CalculateSimilarity计算返回的特征与当前用户注册时保存的特征值相似度是否大于设置的阈值(阈值默认为0.7),如果大于阈值,说明是同一个人

在这里插入图片描述

项目整合

1. 打包并引入seetaface6SDK
在这里插入图片描述

            <dependency>
                <groupId>com.project.model</groupId>
                <artifactId>seeta-sdk-platform</artifactId>
                <version>${seeta-sdk-platform.version}</version>
            </dependency>

2. 下载并引入模型文件
模型文件1 提取码:ngne

模型文件2 提取码:t6j0
模型文件放到指定的路径下,这里是放到了/opt/models目录下
在这里插入图片描述

public class SeetaConstant {
    // 模型文件目录
    public static final String CSTA_PATH = "/opt/models";
    //模型文件
    public static final String[] face_detector = {CSTA_PATH + "/face_detector.csta"};
    //年龄
    public static final String[] age_predictor = {CSTA_PATH + "/age_predictor.csta"};
    //五点
    public static final String[] face_landmarker_pts5 = {CSTA_PATH + "/face_landmarker_pts5.csta"};
    //68点
    public static final String[] face_landmarker_pts68 = {CSTA_PATH + "/face_landmarker_pts68.csta"};
    // 攻击人脸检测
    public static final String[] fas_arr = {CSTA_PATH + "/fas_first.csta", CSTA_PATH + "/fas_second.csta"};
    //眼睛状态检测的模型文件
    public static final String[] eye_state = {CSTA_PATH + "/eye_state.csta"};
    //人脸向量特征提取和对比模型
    public static final String[] face_recognizer = {CSTA_PATH + "/face_recognizer.csta"};
    //性别
    public static final String[] gender_predictor = {CSTA_PATH + "/gender_predictor.csta"};
    //姿态
    public static final String[] pose_estimation = {CSTA_PATH + "/pose_estimation.csta"};
    //清晰度
    public static final String[] quality_lbn = {CSTA_PATH + "/quality_lbn.csta"};
    //口罩模型文件
    public static final  String[] mask_cstas = {CSTA_PATH + "/mask_detector.csta"};
}

2. 解析特征值
根据图片的保存路径,得到图片的特征值

public static float[] analyzeEcognizer(String fileName)
    {
        float[] features1 = null;
        try {
            //人脸检测器
            FaceDetector detector = new FaceDetector(new SeetaModelSetting(SeetaFileConstant.face_detector, SeetaDevice.SEETA_DEVICE_AUTO));
            //关键点定位器 5点
            FaceLandmarker faceLandmarker = new FaceLandmarker(new SeetaModelSetting(SeetaFileConstant.face_landmarker_pts5, SeetaDevice.SEETA_DEVICE_AUTO));
            //人脸向量特征提取和对比器
            FaceRecognizer faceRecognizer = new FaceRecognizer(new SeetaModelSetting(SeetaFileConstant.face_recognizer, SeetaDevice.SEETA_DEVICE_AUTO));
            //第1张照片
            SeetaImageData image1 = SeetafaceUtil.toSeetaImageData(fileName);
            //第一张照片人脸识别
            SeetaRect[] detects1 = detector.Detect(image1);
            SeetaPointF[] pointFS1 = new SeetaPointF[faceRecognizer.GetExtractFeatureSize()];
            int[] masks1 = new int[faceRecognizer.GetExtractFeatureSize()];
            //第一张图片,第一个人脸关键点定位,有多个人脸的情况下,只取第一个人脸(这是测试,先这样写)
            faceLandmarker.mark(image1, detects1[0], pointFS1, masks1);
            //第一张图片,第一个人脸向量特征提取features1
            features1 = new float[faceRecognizer.GetExtractFeatureSize()];
            faceRecognizer.Extract(image1, pointFS1, features1);
        } catch (Exception e) {
            e.printStackTrace();
            return features1;
        }
        return features1;
    }

3. 比对特征值

遍历数据库中的用户,比对特征值找出大于阈值的用户

public Boolean compareEigenvalue(String fileName) {
        try {
            //人脸向量特征提取和对比器
            FaceRecognizer faceRecognizer = new FaceRecognizer(new SeetaModelSetting(SeetaConstant.face_recognizer, SeetaDevice.SEETA_DEVICE_AUTO));
            //遍历所有用户,查询出特征值大于0.75的第一个
            List<User> users = userService.selectUsers();
            float[] features1 = SeetaUtil.analyzeEcognizer(fileName);
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < features1.length; i++) {
                builder.append(features1[i]);
                if (i < features1.length - 1) {
                    builder.append(" ");
                }
            }
            String featuresStr = builder.toString();

            for (User user: users) {
                float[] features2 = convertStringToFloatArray(user.getData());
                if (features1 != null && features2 != null ) {
                    float calculateSimilarity = faceRecognizer.CalculateSimilarity(features1, features2);
                    
                    if (calculateSimilarity > 0.75) {
                        return ture;
                        break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }
 private static float[] convertStringToFloatArray(String input) {
        String[] stringArray = StrUtil.splitToArray(input, ' ');
        float[] floatArray = new float[stringArray.length];
        for (int i = 0; i < stringArray.length; i++) {
            try {
                floatArray[i] = Float.parseFloat(stringArray[i]); // 转换字符串为浮点数
            } catch (NumberFormatException e) {
                floatArray[i] = 0; // 处理转换失败的情况
            }
        }
        return floatArray; // 返回转换后的浮点数数组
    }

总结

这个方案开箱即用,整合速度快,模型的识别率也高,识别速度大概在一秒以内。由于识别的方式是通过拍照比对照片的方式,在人脸采集时活体需要保持静止的状态,所以在要求实时识别要求高的使用场景表现一般。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青皮桔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值