浏览代码

人脸识别相关功能,及证书安装相关改造

wukai 1 年之前
父节点
当前提交
42327042e4

+ 14 - 15
doc-admin/src/main/java/com/doc/task/DocIndexTask.java

@@ -4,7 +4,6 @@ import com.doc.biz.domain.DocIndex;
 import com.doc.biz.service.IDocIndexService;
 import com.doc.biz.service.IDocInfoService;
 import com.doc.biz.service.IElasticSearchService;
-import com.doc.framework.web.domain.Server;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -29,20 +28,20 @@ public class DocIndexTask {
         search.setStatus("N");
         List<DocIndex> list = indexService.selectDocIndexList(search);
         for (DocIndex index : list) {
-            try {
-                Server server = new Server();
-                server.copyTo();
-                double cpuUsed = server.getCpu().getUsed();
-                double memUsed = server.getMem().getUsage();
-                double jvmUsed = server.getJvm().getUsage();
-                double limit = 95d;
-                if (cpuUsed > limit || memUsed > limit || jvmUsed > limit) {
-                    //如果cpu或者内存或者jvm内存使用率超过80,则退出任务,等待下次执行
-                    return;
-                }
-
-            } catch (Exception ignored) {
-            }
+//            try {
+//                Server server = new Server();
+//                server.copyTo();
+//                double cpuUsed = server.getCpu().getUsed();
+//                double memUsed = server.getMem().getUsage();
+//                double jvmUsed = server.getJvm().getUsage();
+//                double limit = 95d;
+//                if (cpuUsed > limit || memUsed > limit || jvmUsed > limit) {
+//                    //如果cpu或者内存或者jvm内存使用率超过80,则退出任务,等待下次执行
+//                    return;
+//                }
+//
+//            } catch (Exception ignored) {
+//            }
 
             //先设置状态为正在处理
             index.setStatus("Y");

+ 223 - 24
doc-admin/src/test/java/Test.java

@@ -1,32 +1,231 @@
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.doc.common.utils.StringUtils;
-
-/**
- * Test$
- *
- * @author wukai
- * @date 2023/11/14 15:13
- */
+import com.arcsoft.face.*;
+import com.arcsoft.face.enums.DetectMode;
+import com.arcsoft.face.enums.DetectOrient;
+import com.arcsoft.face.enums.ExtractType;
+import com.arcsoft.face.toolkit.ImageFactory;
+import com.arcsoft.face.toolkit.ImageInfo;
+
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
 public class Test {
+
+
     public static void main(String[] args) {
 
+        //激活码,从官网获取
+        String appId = "D86z2YwLmGT1upsnxzGSdUKGuLyGp27VjEdPaVJepbGo";
+        String sdkKey = "ALyL4ErWU6FrBX1GTj7UCZrtUEpgKgUYXBLT3XroMbV9";
+        String activeKey = "086L-11C9-315C-PKCN";
 
-        String content = "[{\"label\": \"一级二\", \"children\": [{\"label\": \"二级2\", \"children\": []}]}, {\"label\": \"一级一\", \"children\": [{\"label\": \"二级1\", \"children\": []}]}]";
-        if (StringUtils.isNotEmpty(content)) {
-            JSONArray jsonArray = JSONArray.parseArray(content);
-            children(jsonArray);
+        System.err.println("注意,如果返回的errorCode不为0,可查看com.arcsoft.face.enums.ErrorInfo类获取相应的错误信息");
 
-        }
-    }
+        //人脸识别引擎库存放路径
+        FaceEngine faceEngine = new FaceEngine("/opt/doc/face-lib");
+        faceEngine.unInit();
+        //激活引擎
+//        int errorCode = faceEngine.activeOnline(appId, sdkKey, activeKey);
+//        System.out.println("引擎激活errorCode:" + errorCode);
+        int errorCode = 0;
+        ActiveDeviceInfo activeDeviceInfo = new ActiveDeviceInfo();
+        //采集设备信息(可离线)
+        errorCode = faceEngine.getActiveDeviceInfo(activeDeviceInfo);
+        System.out.println("采集设备信息errorCode:" + errorCode);
+        System.out.println("设备信息:" + activeDeviceInfo.getDeviceInfo());
+
+//        faceEngine.activeOffline("D:\\arcsoft_lib\\086L11C9315CPKCN.dat");
+
+        ActiveFileInfo activeFileInfo = new ActiveFileInfo();
+        errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
+        System.out.println("获取激活文件errorCode:" + errorCode);
+        System.out.println("激活文件信息:" + activeFileInfo.toString());
+
+        //引擎配置
+        EngineConfiguration engineConfiguration = new EngineConfiguration();
+        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
+        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
+        engineConfiguration.setDetectFaceMaxNum(10);
+        //功能配置
+        FunctionConfiguration functionConfiguration = new FunctionConfiguration();
+        functionConfiguration.setSupportAge(true);
+        functionConfiguration.setSupportFaceDetect(true);
+        functionConfiguration.setSupportFaceRecognition(true);
+        functionConfiguration.setSupportGender(true);
+        functionConfiguration.setSupportLiveness(true);
+        functionConfiguration.setSupportIRLiveness(true);
+        functionConfiguration.setSupportImageQuality(true);
+        functionConfiguration.setSupportMaskDetect(true);
+        functionConfiguration.setSupportUpdateFaceData(true);
+        engineConfiguration.setFunctionConfiguration(functionConfiguration);
+
+        //初始化引擎
+        errorCode = faceEngine.init(engineConfiguration);
+        System.out.println("初始化引擎errorCode:" + errorCode);
+        VersionInfo version = faceEngine.getVersion();
+        System.out.println(version);
+
+        //人脸检测
+        ImageInfo imageInfo = ImageFactory.getRGBData(new File("D:\\SYSTEM\\Desktop\\temp\\face\\111.jpeg"));
+        List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
+        errorCode = faceEngine.detectFaces(imageInfo, faceInfoList);
+        System.out.println("人脸检测errorCode:" + errorCode);
+        System.out.println("检测到人脸数:" + faceInfoList.size());
+
+        ImageQuality imageQuality = new ImageQuality();
+        errorCode = faceEngine.imageQualityDetect(imageInfo, faceInfoList.get(0), 0, imageQuality);
+        System.out.println("图像质量检测errorCode:" + errorCode);
+        System.out.println("图像质量分数:" + imageQuality.getFaceQuality());
+
+        //特征提取
+        FaceFeature faceFeature = new FaceFeature();
+        errorCode = faceEngine.extractFaceFeature(imageInfo, faceInfoList.get(0), ExtractType.REGISTER, 0, faceFeature);
+        System.out.println("特征提取errorCode:" + errorCode);
+        byte[] fd = faceFeature.getFeatureData();
+        String xx = new String(fd, StandardCharsets.UTF_8);
+        System.out.println("特征值:" + fd);
+        System.out.println("特征值:" + xx);
+        System.out.println("特征值:" + xx.getBytes(StandardCharsets.UTF_8));
+
+        //人脸检测2
+        ImageInfo imageInfo2 = ImageFactory.getRGBData(new File("D:\\SYSTEM\\Desktop\\temp\\face\\222.jpg"));
+        List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
+        errorCode = faceEngine.detectFaces(imageInfo2, faceInfoList2);
+        System.out.println("222人脸检测errorCode:" + errorCode);
+        System.out.println("222检测到人脸数:" + faceInfoList2.size());
+
+        //特征提取2
+        FaceFeature faceFeature2 = new FaceFeature();
+        errorCode = faceEngine.extractFaceFeature(imageInfo2, faceInfoList2.get(0), ExtractType.RECOGNIZE, 0, faceFeature2);
+        System.out.println("特征提取errorCode:" + errorCode);
+
+        //特征比对
+        FaceFeature targetFaceFeature = new FaceFeature();
+        targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
+        FaceFeature sourceFaceFeature = new FaceFeature();
+        sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());
+        FaceSimilar faceSimilar = new FaceSimilar();
+
+        errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
+        System.out.println("特征比对errorCode:" + errorCode);
+        System.out.println("人脸相似度:" + faceSimilar.getScore());
+
+
+        //人脸属性检测
+        FunctionConfiguration configuration = new FunctionConfiguration();
+        configuration.setSupportAge(true);
+        configuration.setSupportGender(true);
+        configuration.setSupportLiveness(true);
+        configuration.setSupportMaskDetect(true);
+        errorCode = faceEngine.process(imageInfo, faceInfoList, configuration);
+        System.out.println("图像属性处理errorCode:" + errorCode);
+
+        //性别检测
+        List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
+        errorCode = faceEngine.getGender(genderInfoList);
+        System.out.println("性别:" + genderInfoList.get(0).getGender());
+
+        //年龄检测
+        List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
+        errorCode = faceEngine.getAge(ageInfoList);
+        System.out.println("年龄:" + ageInfoList.get(0).getAge());
+
+        //活体检测
+        List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
+        errorCode = faceEngine.getLiveness(livenessInfoList);
+        System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
+
+        //口罩检测
+        List<MaskInfo> maskInfoList = new ArrayList<MaskInfo>();
+        errorCode = faceEngine.getMask(maskInfoList);
+        System.out.println("口罩:" + maskInfoList.get(0).getMask());
+
+
+//        //IR属性处理
+//        ImageInfo imageInfoGray = ImageFactory.getGrayData(new File("d:\\IR_480p.jpg"));
+//        List<FaceInfo> faceInfoListGray = new ArrayList<FaceInfo>();
+//        errorCode = faceEngine.detectFaces(imageInfoGray, faceInfoListGray);
+//
+//        FunctionConfiguration configuration2 = new FunctionConfiguration();
+//        configuration2.setSupportIRLiveness(true);
+//        errorCode = faceEngine.processIr(imageInfoGray, faceInfoListGray, configuration2);
+//        //IR活体检测
+//        List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();
+//        errorCode = faceEngine.getLivenessIr(irLivenessInfo);
+//        System.out.println("IR活体:" + irLivenessInfo.get(0).getLiveness());
+//
+//        //获取激活文件信息
+//        ActiveFileInfo activeFileInfo2 = new ActiveFileInfo();
+//        errorCode = faceEngine.getActiveFileInfo(activeFileInfo2);
+//
+//        //更新人脸数据
+//        errorCode = faceEngine.updateFaceData(imageInfo, faceInfoList);
+//
+//        //高级人脸图像处理接口
+//        ImageInfoEx imageInfoEx = new ImageInfoEx();
+//        imageInfoEx.setHeight(imageInfo.getHeight());
+//        imageInfoEx.setWidth(imageInfo.getWidth());
+//        imageInfoEx.setImageFormat(imageInfo.getImageFormat());
+//        imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});
+//        imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});
+//        List<FaceInfo> faceInfoList1 = new ArrayList<>();
+//        errorCode = faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList1);
+//        ImageQuality imageQuality1 = new ImageQuality();
+//        errorCode = faceEngine.imageQualityDetect(imageInfoEx, faceInfoList1.get(0), 0, imageQuality1);
+//        FunctionConfiguration fun = new FunctionConfiguration();
+//        fun.setSupportAge(true);
+//        errorCode = faceEngine.process(imageInfoEx, faceInfoList1, fun);
+//        List<AgeInfo> ageInfoList1 = new ArrayList<>();
+//        int age = faceEngine.getAge(ageInfoList1);
+//        FaceFeature feature = new FaceFeature();
+//        errorCode = faceEngine.extractFaceFeature(imageInfoEx, faceInfoList1.get(0), ExtractType.REGISTER, 0, feature);
+//        errorCode = faceEngine.updateFaceData(imageInfoEx, faceInfoList1);
+//
+//        //设置活体测试
+//        errorCode = faceEngine.setLivenessParam(0.5f, 0.7f, 0.3f);
+//        System.out.println("设置活体活体阈值errorCode:" + errorCode);
+//
+//        LivenessParam livenessParam = new LivenessParam();
+//        errorCode = faceEngine.getLivenessParam(livenessParam);
+//
+//        //注册人脸信息1
+//        FaceFeatureInfo faceFeatureInfo = new FaceFeatureInfo();
+//        faceFeatureInfo.setSearchId(5);
+//        faceFeatureInfo.setFaceTag("FeatureData1");
+//        faceFeatureInfo.setFeatureData(faceFeature.getFeatureData());
+//        errorCode = faceEngine.registerFaceFeature(faceFeatureInfo);
+//
+//        //注册人脸信息2
+//        FaceFeatureInfo faceFeatureInfo2 = new FaceFeatureInfo();
+//        faceFeatureInfo2.setSearchId(6);
+//        faceFeatureInfo2.setFaceTag("FeatureData2");
+//        faceFeatureInfo2.setFeatureData(faceFeature2.getFeatureData());
+//        errorCode = faceEngine.registerFaceFeature(faceFeatureInfo2);
+//
+//        //获取注册人脸个数
+//        FaceSearchCount faceSearchCount = new FaceSearchCount();
+//        errorCode = faceEngine.getFaceCount(faceSearchCount);
+//        System.out.println("注册人脸个数:" + faceSearchCount.getCount());
+//
+//        //搜索最相似人脸
+//        SearchResult searchResult = new SearchResult();
+//        errorCode = faceEngine.searchFaceFeature(faceFeature, CompareModel.LIFE_PHOTO, searchResult);
+//        System.out.println("最相似人脸Id:" + searchResult.getFaceFeatureInfo().getSearchId());
+//
+//        //更新人脸信息
+//        FaceFeatureInfo faceFeatureInfo3 = new FaceFeatureInfo();
+//        faceFeatureInfo3.setSearchId(6);
+//        faceFeatureInfo3.setFaceTag("FeatureData2Update");
+//        faceFeatureInfo3.setFeatureData(faceFeature2.getFeatureData());
+//        errorCode = faceEngine.updateFaceFeature(faceFeatureInfo3);
+//
+//        //移除人脸信息
+//        errorCode = faceEngine.removeFaceFeature(6);
+
+        //引擎卸载
+        errorCode = faceEngine.unInit();
+        System.err.println(errorCode);
 
-    public static void children(JSONArray jsonArray) {
-        for (int index = 0; index < jsonArray.size(); index++) {
-            JSONObject obj = jsonArray.getJSONObject(index);
-            String name = obj.getString("label");
-            System.err.println(name);
-            JSONArray arr = obj.getJSONArray("children");
-            children(arr);
-        }
     }
 }

+ 26 - 8
doc-biz/src/main/java/com/doc/face/init/FaceEngineInit.java

@@ -1,15 +1,18 @@
 package com.doc.face.init;
 
+import com.arcsoft.face.ActiveDeviceInfo;
 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.doc.common.utils.Tools;
 import com.doc.face.util.FaceEngineUtil;
 import com.doc.system.service.ISysUserExpandService;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationListener;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
@@ -32,16 +35,21 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
     @Resource
     private ISysUserExpandService expandService;
 
-    private void initEngine() {
+    private boolean initEngine() {
         String lib = environment.getProperty("face-engine.lib");
-        String appId = environment.getProperty("face-engine.app-id");
-        String sdkKey = environment.getProperty("face-engine.sdk-key");
-        String activeKey = environment.getProperty("face-engine.active-key");
+//        String appId = environment.getProperty("face-engine.app-id");
+//        String sdkKey = environment.getProperty("face-engine.sdk-key");
+//        String activeKey = environment.getProperty("face-engine.active-key");
         String activeFile = environment.getProperty("face-engine.active-file");
+        //成功返回0
+        int errorCode = 0;
         //人脸识别引擎库存放路径
         faceEngine = new FaceEngine(lib);
         //离线激活引擎
-        faceEngine.activeOffline(activeFile);
+        errorCode = faceEngine.activeOffline(activeFile);
+        if (errorCode != 0 && errorCode != 90114) {
+            return false;
+        }
         //引擎配置
         EngineConfiguration engineConfiguration = new EngineConfiguration();
         engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
@@ -61,7 +69,8 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
         engineConfiguration.setFunctionConfiguration(functionConfiguration);
 
         //初始化引擎
-        faceEngine.init(engineConfiguration);
+        errorCode = faceEngine.init(engineConfiguration);
+        return errorCode == 0;
     }
 
     /**
@@ -79,8 +88,17 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
             boolean flag = "true".equals(environment.getProperty("face-engine.flag"));
             log.info("SpringBoot项目加载后执行人脸识别初始化!,人脸识别开启:{}", flag);
             if (flag) {
-                initEngine();
-                register();
+                if (initEngine()) {
+                    //初始化成功,注册所有人脸信息
+                    register();
+                } else {
+                    //生成激活需要的CODE
+                    ActiveDeviceInfo activeDeviceInfo = new ActiveDeviceInfo();
+                    //采集设备信息(可离线)
+                    int errorCode = faceEngine.getActiveDeviceInfo(activeDeviceInfo);
+                    Tools.generateRegFile(activeDeviceInfo.getDeviceInfo(), "face_reg_code.txt", "人脸识别激活失败");
+                    ((ConfigurableApplicationContext) event.getApplicationContext()).close();
+                }
             }
         }
     }

+ 7 - 29
doc-common/src/main/java/com/doc/common/data/DataListener.java

@@ -7,7 +7,6 @@ import com.doc.common.utils.encrypt.Sm2Util;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.system.ApplicationHome;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationListener;
 import org.springframework.context.ConfigurableApplicationContext;
@@ -20,8 +19,6 @@ import org.springframework.data.domain.DataPara;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.FileWriter;
 
 /**
  * 授权许可验证监听器
@@ -108,33 +105,14 @@ public class DataListener implements ApplicationListener<ContextRefreshedEvent>
             } else {//其他服务器类型
                 infos = new LinuxInfos();
             }
-
-            ApplicationHome home = new ApplicationHome(getClass());
-            String path = home.getSource().getParent() + File.separator + "register_code.txt";
-            File codeFile = new File(path);
-            try (FileWriter fw = new FileWriter(codeFile)) {
-                //json对象转字符串
-                String s = JSON.toJSONString(infos.getServerInfos());
-                //sm2加密
-                s = Sm2Util.encrypt(s);
-                //字符串压缩
-                s = Tools.compress(s);
-                fw.write(s);
-            } catch (Exception ignored) {
-            }
-
-            logger.error("============证书安装/校验失败=================");
-            logger.error("===========================================");
-            logger.error("===========================================");
-            logger.error("===========================================");
-            logger.error("===========================================");
-            logger.error("========请将文件件||" + path + "||提供给供应商===============");
-            logger.error("===========================================");
-            logger.error("===========================================");
-            logger.error("===========================================");
-            logger.error("===========================================");
+            //json对象转字符串
+            String content = JSON.toJSONString(infos.getServerInfos());
+            //sm2加密
+            content = Sm2Util.encrypt(content);
+            //字符串压缩
+            content = Tools.compress(content);
+            Tools.generateRegFile(content, "register_code.txt", "证书安装/校验失败");
             ((ConfigurableApplicationContext) context).close();
-
         } catch (Exception ignored) {
         }
     }