opencv+ArcFace人脸识别

短命女 2023-10-03 09:57 83阅读 0赞

前几天逛知乎看到有免费的工具来做人脸识别,觉得很有意思;心血来潮,想自己也搞一个人脸识别;不得不说虹软ArcFace真的是太好用了;对于我这种完全不懂人脸识别算法的人,也可以构建出人脸识别的应用;只需要调用封装好的API就行了。
环境准备:

  • 1.到虹软ArcFace官网下载虹软ArcFacezip格式的压缩文件,解压后将libs文件夹copy到自己的工程下,注意libs文件下有一个:arcsoft-sdk-face-3.0.0.0.jar,添加工程对jar的路径依赖;
  • 2.maven下载opencv;

    1. <dependency>
    2. <groupId>org.bytedeco</groupId>
    3. <artifactId>javacv-platform</artifactId>
    4. <version>1.4.1</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.bytedeco.javacpp-presets</groupId>
    8. <artifactId>opencv-platform</artifactId>
    9. <version>3.4.1-1.4.1</version>
    10. </dependency>
    11. <!-- jna:调用windows系统的API~-->
    12. <dependency>
    13. <groupId>net.java.dev.jna</groupId>
    14. <artifactId>jna</artifactId>
    15. <version>5.8.0</version>
    16. </dependency>
    17. <dependency>
    18. <groupId>net.java.dev.jna</groupId>
    19. <artifactId>jna-platform</artifactId>
    20. <version>5.8.0</version>
    21. </dependency>

项目的结构:
在这里插入图片描述

arcFace

从官方下载的zip文件节后,samplecode文件夹下FaceEngineTest.java是官方给出的示例代码;下面是人脸特征对比部分的代码:

  1. //从官网获取
  2. String appId = "";
  3. String sdkKey = "";
  4. //加载dll文件,就是最开始准备的libs下面的dll文件路径;
  5. FaceEngine faceEngine = new FaceEngine("E:/Project/2021/face-learning/libs/WIN64");
  6. //激活引擎
  7. int errorCode = faceEngine.activeOnline(appId, sdkKey);
  8. if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
  9. System.out.println("引擎激活失败");
  10. }
  11. ActiveFileInfo activeFileInfo=new ActiveFileInfo();
  12. errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
  13. if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
  14. System.out.println("获取激活文件信息失败");
  15. }
  16. //引擎配置
  17. EngineConfiguration engineConfiguration = new EngineConfiguration();
  18. engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
  19. engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
  20. engineConfiguration.setDetectFaceMaxNum(10);
  21. engineConfiguration.setDetectFaceScaleVal(16);
  22. //功能配置
  23. FunctionConfiguration functionConfiguration = new FunctionConfiguration();
  24. functionConfiguration.setSupportAge(true);
  25. functionConfiguration.setSupportFace3dAngle(true);
  26. functionConfiguration.setSupportFaceDetect(true);
  27. functionConfiguration.setSupportFaceRecognition(true);
  28. functionConfiguration.setSupportGender(true);
  29. functionConfiguration.setSupportLiveness(true);
  30. functionConfiguration.setSupportIRLiveness(true);
  31. engineConfiguration.setFunctionConfiguration(functionConfiguration);
  32. //初始化引擎
  33. errorCode = faceEngine.init(engineConfiguration);
  34. if (errorCode != ErrorInfo.MOK.getValue()) {
  35. System.out.println("初始化引擎失败");
  36. }
  37. //人脸检测
  38. ImageInfo imageInfo = ImageFactory.getRGBData(new File("C:\\Users\\Pictures\\b0488b9ed27271eab692bd0097fe67ce.jpeg"));
  39. List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
  40. errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
  41. System.out.println(faceInfoList);
  42. //特征提取
  43. FaceFeature faceFeature = new FaceFeature();
  44. errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
  45. System.out.println("特征值1大小:" + faceFeature.getFeatureData().length);
  46. //人脸检测2
  47. ImageInfo imageInfo2 = ImageFactory.getRGBData(new File("C:\\Users\\Pictures\\WIN_20210628_13_25_19_Pro.jpg"));
  48. List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
  49. errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo.getImageFormat(), faceInfoList2);
  50. System.out.println(faceInfoList);
  51. //特征提取2
  52. FaceFeature faceFeature2 = new FaceFeature();
  53. errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo.getImageFormat(), faceInfoList2.get(0), faceFeature2);
  54. System.out.println("特征值2大小:" + faceFeature2.getFeatureData().length);
  55. //特征比对
  56. FaceSimilar faceSimilar = new FaceSimilar();
  57. errorCode = faceEngine.compareFaceFeature(faceFeature, faceFeature2, faceSimilar);
  58. System.out.println("相似度:" + faceSimilar.getScore());

上面这段代码流程:

  • 1.FaceEngine引擎 对象创建(加载dll文件)
  • 2.激活引擎
  • 3.引擎配置,功能配置
  • 4.初始化引擎
  • 5.分别做2张图片的:人脸检测:imageInfo(人脸信息),特征提取:faceFeatur(人脸特征)
  • 6.对比2张图片的人脸特征,得出相似度FaceSimilar

opencv

用opencv调用摄像头,获取实时的人脸信息;

  1. OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
  2. Java2DFrameConverter converter = new Java2DFrameConverter();
  3. grabber.start(); //开始获取摄像头数据
  4. Frame frame = grabber.grab();//获取此刻的图像数据
  5. BufferedImage bufferedImage = converter.convert(frame);//opencv:用Java2DFrameConverter将Frame转化成BufferedImage
  6. ImageInfo imageInfo =ImageFactory.bufferedImage2ImageInfo(bufferedImage);//ArcFace:获取到人脸信息;

opencv_ArcFace

将上面的代码整合一下

  1. public class TestArcFace{
  2. static String appId = "";
  3. static String sdkKey = "";
  4. static String enginePath ="E:/Project/2021/face-learning/libs/WIN64";
  5. static OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
  6. static Java2DFrameConverter converter = new Java2DFrameConverter();
  7. public static void main(String[] args) throws Throwable{
  8. FaceEngine faceEngine = getFaceEngine();//获取FaceEngine
  9. grabber.start();//开启摄像头
  10. FaceFeature bossFace = getFaceFeature(faceEngine,getImageInfoFromPicture("")).get(0);//从boss的单人照中获取boss脸部特征
  11. boolean bossComing=false;
  12. while(!bossComing){
  13. //检测boss是否出现摄像头中;
  14. List<FaceFeature> captureFaces = getFaceFeature(faceEngine,getImageInfoFromCamera());//捕获出现在镜头中的人脸特征
  15. for (FaceFeature captureFace : captureFaces) {
  16. //遍历list检测捕获到的人脸特征
  17. FaceSimilar faceSimilar = getFaceSimilar(faceEngine,captureFace,bossFace);
  18. if(samePeople(faceSimilar,0.8f)){
  19. //boss出现
  20. bossComing=true;
  21. break;
  22. }
  23. }
  24. Thread.sleep(100);//每隔100ms检测一次,检测boss是否出现在镜头中。。
  25. }
  26. User32.INSTANCE.LockWorkStation();//锁屏
  27. grabber.stop();
  28. faceEngine.unInit();
  29. }
  30. public static FaceEngine getFaceEngine(){
  31. FaceEngine faceEngine = new FaceEngine(enginePath);
  32. int errorCode = faceEngine.activeOnline(appId, sdkKey);
  33. if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
  34. System.out.println("引擎激活失败");
  35. }
  36. ActiveFileInfo activeFileInfo=new ActiveFileInfo();
  37. errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
  38. if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
  39. System.out.println("获取激活文件信息失败");
  40. }
  41. //引擎配置
  42. EngineConfiguration engineConfiguration = new EngineConfiguration();
  43. engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
  44. engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
  45. engineConfiguration.setDetectFaceMaxNum(10);//图片中人脸数
  46. engineConfiguration.setDetectFaceScaleVal(30);//人脸相对于所在图片的长边的占比,建议16
  47. //功能配置
  48. FunctionConfiguration functionConfiguration = new FunctionConfiguration();
  49. functionConfiguration.setSupportAge(true);
  50. functionConfiguration.setSupportFace3dAngle(true);
  51. functionConfiguration.setSupportFaceDetect(true);
  52. functionConfiguration.setSupportFaceRecognition(true);
  53. functionConfiguration.setSupportGender(true);
  54. functionConfiguration.setSupportLiveness(true);
  55. functionConfiguration.setSupportIRLiveness(true);
  56. engineConfiguration.setFunctionConfiguration(functionConfiguration);
  57. //初始化引擎
  58. errorCode = faceEngine.init(engineConfiguration);
  59. if(ErrorInfo.MOK.getValue()!= errorCode){
  60. throw new RuntimeException("初始化引擎失败。。。errorCode:"+errorCode);
  61. }
  62. return faceEngine;
  63. }
  64. /*
  65. 获取图片中人脸信息
  66. */
  67. public static ImageInfo getImageInfoFromPicture(String picturePath){
  68. return ImageFactory.getRGBData(new File(picturePath));
  69. }
  70. /*
  71. 从摄像头中获取到人脸信息;
  72. */
  73. public static ImageInfo getImageInfoFromCamera() throws FrameGrabber.Exception {
  74. Frame frame = grabber.grab();
  75. BufferedImage bufferedImage = converter.convert(frame);
  76. return ImageFactory.bufferedImage2ImageInfo(bufferedImage);
  77. }
  78. /*
  79. 获取ImageInfo人脸特征
  80. */
  81. public static List<FaceFeature> getFaceFeature(FaceEngine faceEngine,ImageInfo imageInfo){
  82. List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
  83. List<FaceFeature> faceFeatures = new ArrayList<>();
  84. //提取人脸信息
  85. faceEngine.detectFaces(imageInfo.getImageData(),imageInfo.getWidth(),imageInfo.getHeight(),imageInfo.getImageFormat(),faceInfoList);
  86. if(!faceInfoList.isEmpty()){
  87. //提取人脸特征
  88. for (FaceInfo faceInfo : faceInfoList) {
  89. FaceFeature faceFeature = new FaceFeature();
  90. faceEngine.extractFaceFeature(imageInfo.getImageData(),imageInfo.getWidth(),imageInfo.getHeight(),imageInfo.getImageFormat(),faceInfo,faceFeature);
  91. faceFeatures.add(faceFeature);
  92. }
  93. }else{
  94. System.out.println("faceInfoList is empty");
  95. }
  96. return faceFeatures;
  97. }
  98. /*
  99. 对比FaceFeature,获取相似度
  100. */
  101. public static FaceSimilar getFaceSimilar(FaceEngine faceEngine,FaceFeature captureFaceFeature,FaceFeature target){
  102. FaceSimilar faceSimilar = new FaceSimilar();
  103. faceEngine.compareFaceFeature(captureFaceFeature,target,faceSimilar);
  104. return faceSimilar;
  105. }
  106. /*
  107. 判断是否是同一个人,
  108. score:自定义设置 ;
  109. 当相似度超过score,判定是同一人;
  110. */
  111. public static boolean samePeople(FaceSimilar faceSimilar,float score){
  112. return faceSimilar.getScore()>score?true:false;
  113. }
  114. }

发表评论

表情:
评论列表 (有 0 条评论,83人围观)

还没有评论,来说两句吧...

相关阅读

    相关 人脸识别

    计划 实现了一个基于 PCA 的人脸识别 方法 ,我 称之为 “ 特征点方法 ”, 所有的功能简单而且实用 。 下面,我使用一个简单的MATLAB脚本 说明 它的用法

    相关 人脸识别

    人脸检测 [长文干货!走近人脸检测:从 VJ 到深度学习(上)][VJ] [长文干货!走近人脸检测:从VJ到深度学习(下)][VJ 1]

    相关 人脸识别系统_人脸注册

        基于上次的人脸检测后,一直纠结人脸注册,照片存放方式,我想到了两种方式,1.数据库存照片存放的路径,2.数据库存放照片的二进制码。但是针对我的毕业设计我想要是存路径的话

    相关 人脸识别系统_人脸检测

    项目:基于人脸识别的无卡ATM机模拟系统 主要实现内容: 包括实现AMT机模拟人脸识别和密码输入、PC端模拟实现储户数据库服务器系统。 1. ATM模拟端实现采用手

    相关 人脸识别杂谈

    Gabor 及 LBP 特征描述子是迄今为止在人脸识别领域最为成功的两种人工设计局部描述子。 对各种人脸识别影响因子的针对性处理也是那一阶段的研究热点,比如人脸光照归一化、人