Loading

软虹sdk基本使用

虹软SDK的简单使用

Java实现人脸识别,但是又不会自己实现算法,找SDK时发现了虹软。虹软SDK具有免费、识别率高等优点,然后到网上搜这个SDK的教程,没搜到,就自己探索,发现它自带的官方文档其实介绍的挺全面的,本文是由官方文档改编。

虹软SDK的激活

首先到官网注册账号,然后新建应用,然后获取到APP_ID和SDK_KEY

然后点击下载SDK,下好之后的项目结构:

|---doc
| |---ARCSOFT_ARC_FACE_JAVA_DEVELOPER'S_GUIDE.pdf 开发说明文档
|---lib
|---|---Win32/x64/linux64
| |---|---libarcsoft_face.dll 算法库
| |---|---libarcsoft_face_engine.dll 引擎库
| |---|---libarcsoft_face_engine_jni.dll 引擎库
| |---arcsoft-sdk-face-3.0.0.0.jar java依赖库
|---samplecode
| |---FaceEngineTest.java 示例代码
|---releasenotes.txt 说明文件

这里介绍的是windows版本,要将这三个.dll文件所在的文件夹添加到环境变量里面的Path里面去

再把下载的文件里面的jar包导入到项目里面去

然后就可以开始激活了

import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.enums.ErrorInfo;

/**
 * @author xuziao
 * @date 2021/8/21 12:44
 */

public class FaceTestMd {
    public void engineTest() {
        String appId = "你的APP_ID";
        String sdkKey = "你的SDK_KEY";
		//实例化一个面部引擎
        FaceEngine faceEngine = new FaceEngine();
		//这个SDK几乎每一个调用引擎的操作都会返回一个int类型的结果,称为错误码,每一种错误码对应一种程序执行的结果,如果错误对应着错误类型,可以去官网查这个码对应的错误
        int errorCode = faceEngine.activeOnline(appId, sdkKey);
        if (errorCode != ErrorInfo.MOK.getValue() &&
                errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("引擎激活失败:" + errorCode);
        } else {
            System.out.println("引擎激活成功");
        }
    }

    public static void main(String[] args) {
        new FaceTestMd().engineTest();
    }
}

对引擎进行引擎配置和功能配置

package top.gostack.demo1;

import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FunctionConfiguration;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;

/**
 * @author xuziao
 * @date 2021/8/21 12:44
 */

public class FaceTestMd {
    public void engineTest() {
        String appId = "";
        String sdkKey = "";

        FaceEngine faceEngine = new FaceEngine();

        int errorCode = faceEngine.activeOnline(appId, sdkKey);
        if (errorCode != ErrorInfo.MOK.getValue() &&
                errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("引擎激活失败:" + errorCode);
        } else {
            System.out.println("引擎激活成功");
        }
        //以下为引擎配置
        EngineConfiguration engineConfiguration = new EngineConfiguration();

        //设置为单张高精度识别
        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
        //人脸不旋转,为零度
        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
        //识别的最小人脸比例 = 图片长边 / 人脸框长边的比值
        engineConfiguration.setDetectFaceScaleVal(16);
        //设置最多能检测的人脸数量
        engineConfiguration.setDetectFaceMaxNum(10);

        //以下为功能设置
        final FunctionConfiguration functionConfiguration = new FunctionConfiguration();
        //年龄检测
        functionConfiguration.setSupportAge(true);
        //启用支持人脸检测
        functionConfiguration.setSupportFaceDetect(true);
        //启用人脸识别
        functionConfiguration.setSupportFaceRecognition(true);
        //启用性别识别
        functionConfiguration.setSupportGender(true);
        //启用3D检测
        functionConfiguration.setSupportFace3dAngle(true);
        //启用RGB活体检测
        functionConfiguration.setSupportLiveness(true);
        //不启用IR活体检测
        functionConfiguration.setSupportIRLiveness(false);

        //需要防止纸张、屏幕等攻击可以传入 supportLiveness 和 supportIRLiveness, RGB 和 IR 活体检测

        //将额外的设置注入到引擎中
        engineConfiguration.setFunctionConfiguration(functionConfiguration);
        int errorCode2 = faceEngine.init(engineConfiguration);
        if (errorCode2 != ErrorInfo.MOK.getValue()) {
            System.out.println("初始化引擎失败");
        } else {
            System.out.println("初始化引擎成功");
        }
    }

    public static void main(String[] args) {
        new FaceTestMd().engineTest();
    }
}

经过以上的操作引擎初始化算是成功了,然后下面可以进行功能测试

人脸相似度比对

package top.gostack.demo1;

import com.arcsoft.face.*;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;

/**
 * @author xuziao
 * @date 2021/8/21 12:44
 */

public class FaceTestMd {
    public void engineTest() {
        String appId = "";
        String sdkKey = "";

        FaceEngine faceEngine = new FaceEngine();

        int errorCode = faceEngine.activeOnline(appId, sdkKey);
        if (errorCode != ErrorInfo.MOK.getValue() &&
                errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("引擎激活失败:" + errorCode);
        } else {
            System.out.println("引擎激活成功");
        }
        //以下为引擎配置
        EngineConfiguration engineConfiguration = new EngineConfiguration();

        //设置为单张高精度识别
        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
        //人脸不旋转,为零度
        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
        //识别的最小人脸比例 = 图片长边 / 人脸框长边的比值
        engineConfiguration.setDetectFaceScaleVal(16);
        //设置最多能检测的人脸数量
        engineConfiguration.setDetectFaceMaxNum(10);

        //以下为功能设置
        final FunctionConfiguration functionConfiguration = new FunctionConfiguration();
        //年龄检测
        functionConfiguration.setSupportAge(true);
        //启用支持人脸检测
        functionConfiguration.setSupportFaceDetect(true);
        //启用人脸识别
        functionConfiguration.setSupportFaceRecognition(true);
        //启用性别识别
        functionConfiguration.setSupportGender(true);
        //启用3D检测
        functionConfiguration.setSupportFace3dAngle(true);
        //启用RGB活体检测
        functionConfiguration.setSupportLiveness(true);
        //不启用IR活体检测
        functionConfiguration.setSupportIRLiveness(false);

        //需要防止纸张、屏幕等攻击可以传入 supportLiveness 和 supportIRLiveness, RGB 和 IR 活体检测

        //将额外的设置注入到引擎中
        engineConfiguration.setFunctionConfiguration(functionConfiguration);

        int errorCode2 = faceEngine.init(engineConfiguration);
        if (errorCode2 != ErrorInfo.MOK.getValue()) {
            System.out.println("初始化引擎失败");
        } else {
            System.out.println("初始化引擎成功");
        }

        String imgPath1 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy1.jpg";
        String imgPath2 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy4.jpg";

        FaceFeature faceFeature1 = getFaceFeature(imgPath1, faceEngine);
        FaceFeature faceFeature2 = getFaceFeature(imgPath2, faceEngine);

        //人脸相似度
        FaceSimilar faceSimilar = new FaceSimilar();
        int errorCode5 = faceEngine.compareFaceFeature(faceFeature1, faceFeature2, faceSimilar);
        if (errorCode5 != ErrorInfo.MOK.getValue()) {
            System.out.println("人脸对比操作失败!");
        } else {
            System.out.println("人脸对比成功!");
            System.out.println("人脸相似度:" + faceSimilar.getScore());
        }
    }

    /**
     *
     * @param imgPath 传入图片的地址
     * @param faceEngine 传入引擎
     * @return faceFeature 输出的人脸特征信息
     */

    public FaceFeature getFaceFeature(String imgPath, FaceEngine faceEngine) {
        //这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据
        ImageInfo imageInfo = getRGBData(new File(imgPath));
        //新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面
        List<FaceInfo> faceInfoList = new ArrayList<>();

        //向引擎传入从图片分离的信息数据
        int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
                imageInfo.getImageFormat(), faceInfoList);

        if (errorCode3 != ErrorInfo.MOK.getValue()) {
            System.out.println("数据传入失败");
        } else {
            System.out.println("数据传入成功");
            System.out.println(faceInfoList);
        }

        //下面提取人脸特征
        FaceFeature faceFeature = new FaceFeature();
        int errorCode4 = faceEngine.extractFaceFeature(imageInfo.getImageData(),
                imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),
                faceInfoList.get(0), faceFeature);
        if (errorCode4 != ErrorInfo.MOK.getValue()) {
            System.out.println("人脸特征提取失败!");
        } else {
            System.out.println("人脸特征提取成功!");
            System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
        }

        return faceFeature;
    }

    public static void main(String[] args) {
        new FaceTestMd().engineTest();
    }
}

其余的还有年龄检测,活体检测,性别检测等等,其中在官方文档里面介绍的很清楚,我就不再一一赘述了,直接放上的测试代码和结果

我的测试代码

package top.gostack.demo1;

import com.arcsoft.face.*;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;

/**
 * @author xuziao
 * @date 2021/8/19 19:12
 */

public class FaceTest {
    public void engineTest() {
        String appId = "";
        String sdkKey = "";

        FaceEngine faceEngine = new FaceEngine();

        int errorCode = faceEngine.activeOnline(appId, sdkKey);
        if (errorCode != ErrorInfo.MOK.getValue() &&
                errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue())
        {
            System.out.println("引擎激活失败:"+errorCode);
        } else {
            System.out.println("引擎激活成功");
        }

        //以下为引擎配置
        EngineConfiguration engineConfiguration = new EngineConfiguration();

        //设置为单张高精度识别
        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
        //人脸不旋转,为零度
        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
        //识别的最小人脸比例 = 图片长边 / 人脸框长边的比值
        engineConfiguration.setDetectFaceScaleVal(16);
        //设置最多能检测的人脸数量
        engineConfiguration.setDetectFaceMaxNum(10);

        //以下为功能设置
        final FunctionConfiguration functionConfiguration = new FunctionConfiguration();
        //年龄检测
        functionConfiguration.setSupportAge(true);
        //启用支持人脸检测
        functionConfiguration.setSupportFaceDetect(true);
        //启用人脸识别
        functionConfiguration.setSupportFaceRecognition(true);
        //启用性别识别
        functionConfiguration.setSupportGender(true);
        //启用3D检测
        functionConfiguration.setSupportFace3dAngle(true);
        //启用RGB活体检测
        functionConfiguration.setSupportLiveness(true);
        //不启用IR活体检测
        functionConfiguration.setSupportIRLiveness(false);

        //需要防止纸张、屏幕等攻击可以传入 supportLiveness 和 supportIRLiveness, RGB 和 IR 活体检测

        //将额外的设置注入到引擎中
        engineConfiguration.setFunctionConfiguration(functionConfiguration);

        int errorCode2 = faceEngine.init(engineConfiguration);
        if (errorCode2 != ErrorInfo.MOK.getValue()) {
            System.out.println("初始化引擎失败");
        } else {
            System.out.println("初始化引擎成功");
        }

        String imgPath1 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy1.jpg";
        String imgPath2 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy4.jpg";

        FaceFeature faceFeature1 = getFaceFeature(imgPath1, faceEngine);
        FaceFeature faceFeature2 = getFaceFeature(imgPath2, faceEngine);

        //人脸相似度
        FaceSimilar faceSimilar = new FaceSimilar();
        int errorCode5 = faceEngine.compareFaceFeature(faceFeature1, faceFeature2, faceSimilar);
        if (errorCode5 != ErrorInfo.MOK.getValue()) {
            System.out.println("人脸对比操作失败!");
        } else {
            System.out.println("人脸对比成功!");
            System.out.println("人脸相似度:" + faceSimilar.getScore());
        }

        int errorCode11 = faceEngine.unInit();
        if (errorCode11 != ErrorInfo.MOK.getValue()) {
            System.out.println("引擎卸载失败,错误码:");
            System.out.println(errorCode);
        } else {
            System.out.println("引擎卸载成功!");
        }


    }

    /**
     *
     * @param imgPath 传入图片的地址
     * @param faceEngine 传入引擎
     * @return faceFeature 输出的人脸特征信息
     */

    public FaceFeature getFaceFeature(String imgPath, FaceEngine faceEngine) {
        //这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据
        ImageInfo imageInfo = getRGBData(new File(imgPath));
        //新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面
        List<FaceInfo> faceInfoList = new ArrayList<>();

        //向引擎传入从图片分离的信息数据
        int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
                imageInfo.getImageFormat(), faceInfoList);

        if (errorCode3 != ErrorInfo.MOK.getValue()) {
            System.out.println("数据传入失败");
        } else {
            System.out.println("数据传入成功");
            System.out.println(faceInfoList);
        }
        //以下实现属性提取,提取某个属性要启用相关的功能
        FunctionConfiguration functionConfiguration = new FunctionConfiguration();
        functionConfiguration.setSupportAge(true);
        functionConfiguration.setSupportFace3dAngle(true);
        functionConfiguration.setSupportGender(true);
        functionConfiguration.setSupportLiveness(true);

        faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),
                imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);

        //下面提取属性,首先实现process接口
        int errorCode6 = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),
                imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);
        if (errorCode6 != ErrorInfo.MOK.getValue()) {
            System.out.println("process接口调用失败,错误码:"+errorCode6);
        } else {
            System.out.println("process接口调用成功!");
        }

        //年龄检测
        //创建一个存储年龄的列表
        List<AgeInfo> ageInfoList = new ArrayList<>();
        int errorCode7 = faceEngine.getAge(ageInfoList);
        if (errorCode7 != ErrorInfo.MOK.getValue()) {
            System.out.print("获取年龄失败,错误码:");
            System.out.println(errorCode7);
        } else {
            System.out.println("年龄获取成功!");
            System.out.println("年龄:" + ageInfoList.get(0).getAge());
        }

        //以下为性别检测
        //性别检测
        List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
        int errorCode8 = faceEngine.getGender(genderInfoList);
        if (errorCode8 != ErrorInfo.MOK.getValue()) {
            System.out.print("获取性别失败,错误码:");
            System.out.println(errorCode8);
        } else {
            System.out.println("性别获取成功!");
            System.out.println("性别:" + genderInfoList.get(0).getGender());
        }

        //3D信息检测
        List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
        int errorCode9 = faceEngine.getFace3DAngle(face3DAngleList);
        if (errorCode9 != ErrorInfo.MOK.getValue()) {
            System.out.println("3D信息检测失败,错误码:"+errorCode9);
        } else {
            System.out.println("3D信息获取成功!");
            System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," +
                    face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());
        }
        //活体检测
        List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
        int errorCode10 = faceEngine.getLiveness(livenessInfoList);
        if (errorCode10 != ErrorInfo.MOK.getValue()) {
            System.out.println("活体检测失败,错误码:"+errorCode10);
        } else {
            System.out.println("活体检测成功");
            System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
        }

        //下面提取人脸特征
        FaceFeature faceFeature = new FaceFeature();
        int errorCode4 = faceEngine.extractFaceFeature(imageInfo.getImageData(),
                imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),
                faceInfoList.get(0), faceFeature);
        if (errorCode4 != ErrorInfo.MOK.getValue()) {
            System.out.println("人脸特征提取失败!");
        } else {
            System.out.println("人脸特征提取成功!");
            System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
        }

        return faceFeature;
    }

    public static void main(String[] args) {
        new FaceTest().engineTest();
    }
}

运行结果:

引擎激活成功
初始化引擎成功
数据传入成功
[com.arcsoft.face.Rect(332, 152 - 924, 744),1]
process接口调用成功!
年龄获取成功!
年龄:21
性别获取成功!
性别:1
3D信息获取成功!
3D角度:-15.243982,21.721786,16.343493
活体检测成功
活体:1
人脸特征提取成功!
特征值大小:1032
数据传入成功
[com.arcsoft.face.Rect(345, 163 - 942, 760),1]
process接口调用成功!
年龄获取成功!
年龄:20
性别获取成功!
性别:1
3D信息获取成功!
3D角度:-11.13369,0.69471675,17.24398
活体检测成功
活体:1
人脸特征提取成功!
特征值大小:1032
人脸对比成功!
人脸相似度:0.9812902
引擎卸载成功!

最后注意,要学习这个SDK一定去看官方文档,写的很详细!

posted @ 2021-08-21 13:21  [X_O]  阅读(449)  评论(0编辑  收藏  举报