Browse Source

人脸识别相关

wukai 1 year ago
parent
commit
25620198e8

+ 16 - 23
doc-biz/src/main/java/com/doc/face/service/init/FaceEngineInit.java → doc-biz/src/main/java/com/doc/face/init/FaceEngineInit.java

@@ -1,24 +1,23 @@
-package com.doc.face.service.init;
+package com.doc.face.init;
 
 import com.arcsoft.face.EngineConfiguration;
 import com.arcsoft.face.FaceEngine;
-import com.arcsoft.face.FaceFeatureInfo;
 import com.arcsoft.face.FunctionConfiguration;
 import com.arcsoft.face.enums.DetectMode;
 import com.arcsoft.face.enums.DetectOrient;
+import com.doc.face.util.FaceEngineUtil;
 import com.doc.system.service.ISysUserExpandService;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationListener;
 import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.nio.charset.StandardCharsets;
 
 /**
- * 聊天消息管理Service业务层处理
+ * faceinit
  *
  * @author wukai
  * @date 2023-08-24
@@ -27,21 +26,18 @@ import java.nio.charset.StandardCharsets;
 @Slf4j
 @Data
 public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent> {
-    @Value("${face-engine.lib}")
-    private String lib;
-    @Value("${face-engine.sdk-key}")
-    private String appId;
-    @Value("${face-engine.sdk-key}")
-    private String sdkKey;
-    @Value("${face-engine.active-key}")
-    private String activeKey;
-    @Value("${face-engine.active-file}")
-    private String activeFile;
+    @Resource
+    private Environment environment;
     private FaceEngine faceEngine;
     @Resource
     private ISysUserExpandService expandService;
 
     private void 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 activeFile = environment.getProperty("face-engine.active-file");
         //人脸识别引擎库存放路径
         faceEngine = new FaceEngine(lib);
         //离线激活引擎
@@ -73,12 +69,7 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
      */
     private void register() {
         expandService.selectFaceFeatureList().forEach(expand -> {
-            FaceFeatureInfo faceFeatureInfo = new FaceFeatureInfo();
-            faceFeatureInfo.setSearchId(expand.getUserId().intValue());
-            faceFeatureInfo.setFaceTag(expand.getRemark());
-            String feature = expand.getFaceFeature();
-            faceFeatureInfo.setFeatureData(feature.getBytes(StandardCharsets.ISO_8859_1));
-            faceEngine.registerFaceFeature(faceFeatureInfo);
+            FaceEngineUtil.registerFaceFeature(faceEngine, expand);
         });
     }
 
@@ -86,8 +77,10 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
     public void onApplicationEvent(ContextRefreshedEvent event) {
         if (event.getApplicationContext().getParent() == null) {
             log.info("SpringBoot项目加载后执行人脸识别初始化!");
-            initEngine();
-            register();
+            if ("true".equals(environment.getProperty("chat-glm3.flag"))) {
+                initEngine();
+                register();
+            }
         }
     }
 }

+ 1 - 0
doc-biz/src/main/java/com/doc/face/service/IFaceService.java

@@ -22,6 +22,7 @@ public interface IFaceService {
      * 人脸匹配
      *
      * @param file 人脸图片
+     * @return key 用户ID value 分数
      */
     Pair<Long, Float> searchFaces(File file);
 }

+ 16 - 6
doc-biz/src/main/java/com/doc/face/service/impl/FaceServiceImpl.java

@@ -7,15 +7,17 @@ import com.arcsoft.face.toolkit.ImageFactory;
 import com.arcsoft.face.toolkit.ImageInfo;
 import com.doc.common.core.domain.entity.SysUserExpand;
 import com.doc.common.utils.SecurityUtils;
+import com.doc.common.utils.sign.Base64;
+import com.doc.face.init.FaceEngineInit;
 import com.doc.face.service.IFaceService;
-import com.doc.face.service.init.FaceEngineInit;
+import com.doc.face.util.FaceEngineUtil;
 import com.doc.system.service.ISysUserExpandService;
 import javafx.util.Pair;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.io.File;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -29,18 +31,26 @@ import java.util.List;
 public class FaceServiceImpl implements IFaceService {
     @Resource
     private FaceEngineInit faceEngineInit;
+
+    private FaceEngine faceEngine;
     @Resource
     private ISysUserExpandService expandService;
 
+    @PostConstruct
+    public void init() {
+        faceEngine = faceEngineInit.getFaceEngine();
+    }
+
     @Override
     public void detectFaces(File file) {
         byte[] featureData = faceFeature(file);
         if (featureData != null) {
-            String feature = new String(featureData, StandardCharsets.ISO_8859_1);
+            String feature = Base64.encode(featureData);
             SysUserExpand expand = new SysUserExpand();
             expand.setUserId(SecurityUtils.getUserId());
             expand.setFaceFeature(feature);
             expandService.updateSysUserExpand(expand);
+            FaceEngineUtil.registerFaceFeature(faceEngine, expand);
         }
     }
 
@@ -51,7 +61,6 @@ public class FaceServiceImpl implements IFaceService {
      * @return 特征值
      */
     private byte[] faceFeature(File file) {
-        FaceEngine faceEngine = faceEngineInit.getFaceEngine();
         ImageInfo imageInfo = ImageFactory.getRGBData(file);
         List<FaceInfo> faceInfoList = new ArrayList<>();
         faceEngine.detectFaces(imageInfo, faceInfoList);
@@ -71,10 +80,10 @@ public class FaceServiceImpl implements IFaceService {
      * 人脸识别
      *
      * @param file 人脸图片
+     *             * @return key 用户ID value 分数
      */
     @Override
     public Pair<Long, Float> searchFaces(File file) {
-        FaceEngine faceEngine = faceEngineInit.getFaceEngine();
         byte[] featureData = faceFeature(file);
         if (featureData != null) {
             FaceFeature faceFeature = new FaceFeature();
@@ -82,7 +91,8 @@ public class FaceServiceImpl implements IFaceService {
             SearchResult searchResult = new SearchResult();
             faceEngine.searchFaceFeature(faceFeature, CompareModel.LIFE_PHOTO, searchResult);
             int userId = searchResult.getFaceFeatureInfo().getSearchId();
-            System.err.println(searchResult.getFaceFeatureInfo().getSearchId());
+//            System.err.println(searchResult.getFaceFeatureInfo().getSearchId());
+
             //特征比对
             FaceSimilar faceSimilar = new FaceSimilar();
             FaceFeature targetFace = new FaceFeature();

+ 23 - 0
doc-biz/src/main/java/com/doc/face/util/FaceEngineUtil.java

@@ -0,0 +1,23 @@
+package com.doc.face.util;
+
+import com.arcsoft.face.FaceEngine;
+import com.arcsoft.face.FaceFeatureInfo;
+import com.doc.common.core.domain.entity.SysUserExpand;
+import com.doc.common.utils.sign.Base64;
+
+/**
+ * FaceEngineUtil$
+ *
+ * @author wukai
+ * @date 2024/3/15 17:43
+ */
+public class FaceEngineUtil {
+    public static void registerFaceFeature(FaceEngine faceEngine, SysUserExpand expand) {
+        FaceFeatureInfo faceFeatureInfo = new FaceFeatureInfo();
+        faceFeatureInfo.setSearchId(expand.getUserId().intValue());
+        faceFeatureInfo.setFaceTag(expand.getRemark());
+        String feature = expand.getFaceFeature();
+        faceFeatureInfo.setFeatureData(Base64.decode(feature));
+        faceEngine.registerFaceFeature(faceFeatureInfo);
+    }
+}