Просмотр исходного кода

人脸服务激活问题处理

linfutong лет назад: 2
Родитель
Сommit
4242b6b19c
22 измененных файлов с 227 добавлено и 236 удалено
  1. 17 0
      zd-common/common-core/src/main/java/com/zd/common/core/utils/file/FileUtils.java
  2. 28 0
      zd-common/face-component/pom.xml
  3. 23 18
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/service/FaceService.java
  4. 26 15
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/handle/FaceEngineFactory.java
  5. 10 11
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/config/FaceProperties.java
  6. 10 2
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/handle/SDKRegister.java
  7. 0 0
      zd-common/face-component/src/main/resources/libs/3.0/LINUX64/libarcsoft_face.so
  8. 0 0
      zd-common/face-component/src/main/resources/libs/3.0/LINUX64/libarcsoft_face_engine.so
  9. 0 0
      zd-common/face-component/src/main/resources/libs/3.0/LINUX64/libarcsoft_face_engine_jni.so
  10. 0 0
      zd-common/face-component/src/main/resources/libs/3.0/WIN64/libarcsoft_face.dll
  11. 0 0
      zd-common/face-component/src/main/resources/libs/3.0/WIN64/libarcsoft_face_engine.dll
  12. 0 0
      zd-common/face-component/src/main/resources/libs/3.0/WIN64/libarcsoft_face_engine_jni.dll
  13. 0 0
      zd-common/face-component/src/main/resources/libs/arcsoft-sdk-face-3.0.0.0.jar
  14. 1 0
      zd-common/pom.xml
  15. 46 0
      zd-model/src/main/java/com/zd/model/entity/FaceCompare.java
  16. 4 6
      zd-modules/zd-algorithm/pom.xml
  17. 27 35
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/controller/FaceApi.java
  18. 4 11
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/controller/FaceManagerApi.java
  19. 0 29
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/utils/FileUtil.java
  20. 0 26
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/valid/KeyNotNull.java
  21. 0 26
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/valid/KeyValidator.java
  22. 31 57
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/FireImageService.java

+ 17 - 0
zd-common/common-core/src/main/java/com/zd/common/core/utils/file/FileUtils.java

@@ -2,6 +2,7 @@ package com.zd.common.core.utils.file;
 
 import com.zd.common.core.utils.StringUtils;
 import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -217,4 +218,20 @@ public class FileUtils {
         String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
         return encode.replaceAll("\\+", "%20");
     }
+
+    /**
+     * MultipartFile 转 File
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static File multipartFileToFile(MultipartFile file) throws IOException {
+        File toFile = null;
+        String originalFilename = file.getOriginalFilename();
+        String[] filename = originalFilename.split("\\.");
+        toFile=File.createTempFile(filename[0], "." +filename[1]);
+        file.transferTo(toFile);
+//        toFile.deleteOnExit();//在jvm 退出时删除
+        return toFile;
+    }
 }

+ 28 - 0
zd-common/face-component/pom.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>zd</artifactId>
+        <groupId>com.zd</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.zd.common</groupId>
+    <artifactId>face-component</artifactId>
+    <packaging>jar</packaging>
+    <description>人脸识别组件</description>
+
+    <dependencies>
+        <!-- 人脸对接  -->
+        <dependency>
+            <groupId>arcsoft</groupId>
+            <artifactId>arcsoft-sdk-face</artifactId>
+            <version>3.0.0.0</version>
+            <scope>system</scope>
+            <systemPath>${pom.basedir}/src/main/resources/libs/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
+        </dependency>
+    </dependencies>
+
+</project>

+ 23 - 18
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/service/FaceService.java

@@ -1,4 +1,4 @@
-package com.zd.alg.face.service;
+package com.zd.common.face;
 
 import com.arcsoft.face.FaceEngine;
 import com.arcsoft.face.FaceFeature;
@@ -6,14 +6,13 @@ import com.arcsoft.face.FaceInfo;
 import com.arcsoft.face.FaceSimilar;
 import com.arcsoft.face.enums.ErrorInfo;
 import com.arcsoft.face.toolkit.ImageInfo;
-import com.zd.alg.face.config.FaceProperties;
-import com.zd.alg.face.controller.FaceApi;
-import com.zd.alg.face.handle.FaceEngineFactory;
-import com.zd.common.core.utils.Assert;
+import com.zd.common.face.config.FaceEngineFactory;
+import com.zd.common.face.config.FaceProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -21,15 +20,17 @@ import java.util.List;
 
 import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
 
-/**
- * @Author: zhoupan
- * @Date: 2021/10/12/14:30
- * @Description:
+/***
+ * <p>人脸识别</p>
+ *
+ * @author linft
+ * @date 7/7/2023
+ * @version 3.0
  */
 @Service
-public class FaceService {
+public class FaceRecognitionService {
 
-    private static Logger logger = LoggerFactory.getLogger(FaceApi.class);
+    private Logger logger = LoggerFactory.getLogger(FaceRecognitionService.class);
 
     @Autowired
     FaceEngineFactory faceEngineFactory;
@@ -40,7 +41,6 @@ public class FaceService {
     @Autowired
     FaceEngine faceEngine;
 
-
     /**
      * 人脸检测
      *
@@ -48,7 +48,7 @@ public class FaceService {
      */
     public List<FaceInfo> faceDetect(ImageInfo imageInfo) {
         List<FaceInfo> faceInfoList = new ArrayList<>();
-        int errorCode=faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
+        int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
         logger.info("errorCode:"+errorCode);
         Assert.isTrue(errorCode == ErrorInfo.MOK.getValue(), "人脸检测失败!");
         return faceInfoList;
@@ -63,8 +63,8 @@ public class FaceService {
         int errorCode = 0;
         try {
             errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
-        }catch (Exception e){
-            e.printStackTrace();
+        }  finally {
+            logger.info("errorCode:"+errorCode);
         }
         Assert.isTrue(errorCode == ErrorInfo.MOK.getValue(), "人脸特征提取失败!");
         return faceFeature;
@@ -73,18 +73,23 @@ public class FaceService {
     /**
      * 人脸对比
      */
-    public Boolean compore(FaceFeature targetFaceFeature, FaceFeature sourceFaceFeature) {
+    public Boolean compare(FaceFeature targetFaceFeature, FaceFeature sourceFaceFeature) {
         FaceSimilar faceSimilar = new FaceSimilar();
         int errorCode = 0;
         try {
             errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
-        }catch (Exception e){
-            e.printStackTrace();
+        } finally {
+            logger.info("errorCode:"+errorCode);
         }
         Assert.isTrue(errorCode == ErrorInfo.MOK.getValue(), "人脸对比失败!");
         return faceSimilar.getScore() >= faceProperties.getScore();
     }
 
+    /**
+     * 文件转Image
+     * @param file
+     * @return
+     */
     public ImageInfo getImageInfo(File file) {
         return getRGBData(file);
     }

+ 26 - 15
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/handle/FaceEngineFactory.java

@@ -1,4 +1,5 @@
-package com.zd.alg.face.handle;
+package com.zd.common.face.config;
+
 
 import com.arcsoft.face.ActiveFileInfo;
 import com.arcsoft.face.EngineConfiguration;
@@ -7,16 +8,19 @@ import com.arcsoft.face.FunctionConfiguration;
 import com.arcsoft.face.enums.DetectMode;
 import com.arcsoft.face.enums.DetectOrient;
 import com.arcsoft.face.enums.ErrorInfo;
-import com.zd.alg.face.config.FaceProperties;
-import com.zd.common.core.exception.ServiceException;
+import com.zd.common.face.register.FaceSDKRegister;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.event.ApplicationStartedEvent;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -33,8 +37,7 @@ import java.util.List;
 @Service
 @EnableConfigurationProperties(FaceProperties.class)
 public class FaceEngineFactory {
-
-    static Logger logger = LoggerFactory.getLogger(FaceEngineFactory.class);
+    Logger logger = LoggerFactory.getLogger(FaceEngineFactory.class);
 
     @Autowired
     FaceProperties faceProperties;
@@ -50,6 +53,14 @@ public class FaceEngineFactory {
 
     public static final String ARC_FACE_VERSION = "3.0";
 
+    @PostConstruct
+    @ConditionalOnProperty(prefix = "face",name = "init",havingValue = "true")
+    public void onApplicationEvent() {
+        //在线激活
+        logger.info("人脸识别引擎开始激活");
+        activeOnline();
+    }
+
     //初始化一个图片模式引擎
     @Bean
     public FaceEngine initFaceEngineImage() {
@@ -61,13 +72,10 @@ public class FaceEngineFactory {
         FaceEngine faceEngine = getFaceEngine();
         int errorCode;
         //初始化引擎
-        long time=System.currentTimeMillis();
         errorCode = faceEngine.init(getEngineConfiguration);
-        long time2=System.currentTimeMillis();
-        logger.info("初始化引擎需要多长时间:"+(time2-time));
         if (errorCode != ErrorInfo.MOK.getValue()) {
             logger.error("初始化引擎失败:errorCode:{},", errorCode);
-            throw new ServiceException("初始化引擎失败!");
+            throw new RuntimeException("初始化引擎失败!");
         }
         return faceEngine;
     }
@@ -84,7 +92,7 @@ public class FaceEngineFactory {
         errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
         if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
             logger.error("获取激活文件信息失败:errorCode:{},", errorCode);
-            throw new ServiceException("获取激活文件信息失败");
+            throw new RuntimeException("获取激活文件信息失败");
         }
     }
 
@@ -125,6 +133,7 @@ public class FaceEngineFactory {
 
     public void afterPropertiesSet() throws IOException {
         CACHE_LIB_FOLDER = USER_HOME + "/.arcface/cache/" + ARC_FACE_VERSION + "/" + PLATFORM + "/";
+        System.out.println("CACHE_LIB_FOLDER:"+CACHE_LIB_FOLDER);
         loadLibrary();
     }
 
@@ -170,8 +179,7 @@ public class FaceEngineFactory {
         }
     }
 
-    private void writeToLocal(String destination, InputStream input)
-            throws IOException {
+    private void writeToLocal(String destination, InputStream input) throws IOException {
         int index;
         byte[] bytes = new byte[1024 * 100];
         FileOutputStream fileOutputStream = new FileOutputStream(destination);
@@ -195,7 +203,7 @@ public class FaceEngineFactory {
         int errorCode = faceEngine.activeOnline(faceProperties.getAppId(), key);
         if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
             logger.error("引擎激活失败:errorCode:{},", errorCode);
-            throw new ServiceException("引擎激活失败");
+            throw new RuntimeException("引擎激活失败");
         }
     }
 
@@ -214,7 +222,7 @@ public class FaceEngineFactory {
         try {
             afterPropertiesSet();
         } catch (IOException e) {
-            throw new ServiceException(e.getMessage());
+            throw new RuntimeException(e.getMessage());
         }
         faceEngine = new FaceEngine(CACHE_LIB_FOLDER);
         return faceEngine;
@@ -231,7 +239,7 @@ public class FaceEngineFactory {
         //检测模式
         engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
         //人脸检测角度,根据官网说明按当前一体机使用情况 0角度检测 最佳
-        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
+        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
         engineConfiguration.setDetectFaceMaxNum(10);
         engineConfiguration.setDetectFaceScaleVal(32);
         //人脸识别时一般都需要supportFaceDetect和supportFaceRecognition这两个属性。
@@ -256,4 +264,7 @@ public class FaceEngineFactory {
         return engineConfiguration;
     }
 
+    public static void main(String[] args) {
+        System.out.println(System.getProperty("user.home"));
+    }
 }

+ 10 - 11
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/config/FaceProperties.java

@@ -1,26 +1,25 @@
-package com.zd.alg.face.config;
+package com.zd.common.face.config;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.validation.annotation.Validated;
 
-import javax.validation.constraints.NotBlank;
-
-/**
- * @Author: zhoupan
- * @Date: 2021/10/12/10:39
- * @Description:
+/***
+ * <p>类注释说明</p>
+ *
+ * @author linft
+ * @date 7/7/2023
+ * @version 3.0
  */
-@ConfigurationProperties(prefix = "face" ,ignoreUnknownFields=true,ignoreInvalidFields=true)
 @Validated
+@Configuration
+@ConfigurationProperties(prefix = "face" ,ignoreUnknownFields=true,ignoreInvalidFields=true)
 public class FaceProperties {
 
     boolean isInit;
 
-    @NotBlank(message = "应用ID不能为空,请配置!")
     String appId;
 
-
-//    @NotBlank(message = "sdk key 不能为空,请配置!")
     /**
      * 已放弃使用改为linuxKey和winKey
      */

+ 10 - 2
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/handle/SDKRegister.java

@@ -1,5 +1,9 @@
-package com.zd.alg.face.handle;
+package com.zd.common.face.register;
 
+import com.zd.common.face.FaceRecognitionService;
+import com.zd.common.face.config.FaceEngineFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.event.ApplicationStartedEvent;
@@ -14,14 +18,18 @@ import org.springframework.stereotype.Component;
  */
 @Component
 @ConditionalOnProperty(prefix = "face",name = "init",havingValue = "true",matchIfMissing = true)
-public class SDKRegister implements ApplicationListener<ApplicationStartedEvent> {
+public class FaceSDKRegister implements ApplicationListener<ApplicationStartedEvent> {
+
+    private Logger logger = LoggerFactory.getLogger(FaceSDKRegister.class);
 
     @Autowired
     FaceEngineFactory faceEngineFactory;
 
     @Override
     public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
+
         //在线激活
+        logger.info("人脸识别引擎开始激活");
         faceEngineFactory.activeOnline();
     }
 }

zd-modules/zd-algorithm/src/main/resources/libs/3.0/LINUX64/libarcsoft_face.so → zd-common/face-component/src/main/resources/libs/3.0/LINUX64/libarcsoft_face.so


zd-modules/zd-algorithm/src/main/resources/libs/3.0/LINUX64/libarcsoft_face_engine.so → zd-common/face-component/src/main/resources/libs/3.0/LINUX64/libarcsoft_face_engine.so


zd-modules/zd-algorithm/src/main/resources/libs/3.0/LINUX64/libarcsoft_face_engine_jni.so → zd-common/face-component/src/main/resources/libs/3.0/LINUX64/libarcsoft_face_engine_jni.so


zd-modules/zd-algorithm/src/main/resources/libs/3.0/WIN64/libarcsoft_face.dll → zd-common/face-component/src/main/resources/libs/3.0/WIN64/libarcsoft_face.dll


zd-modules/zd-algorithm/src/main/resources/libs/3.0/WIN64/libarcsoft_face_engine.dll → zd-common/face-component/src/main/resources/libs/3.0/WIN64/libarcsoft_face_engine.dll


zd-modules/zd-algorithm/src/main/resources/libs/3.0/WIN64/libarcsoft_face_engine_jni.dll → zd-common/face-component/src/main/resources/libs/3.0/WIN64/libarcsoft_face_engine_jni.dll


zd-modules/zd-algorithm/src/main/resources/libs/arcsoft-sdk-face-3.0.0.0.jar → zd-common/face-component/src/main/resources/libs/arcsoft-sdk-face-3.0.0.0.jar


+ 1 - 0
zd-common/pom.xml

@@ -15,5 +15,6 @@
         <module>common-core</module>
         <module>common-mqtt</module>
         <module>common-swagger</module>
+        <module>face-component</module>
     </modules>
 </project>

+ 46 - 0
zd-model/src/main/java/com/zd/model/entity/FaceCompare.java

@@ -0,0 +1,46 @@
+package com.zd.model.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author: zhoupan
+ * @Date: 2021/10/12/17:54
+ * @Description:
+ */
+@ApiModel("提交参数")
+public class FaceCompare {
+    @ApiModelProperty("userId")
+    private Long userId;
+
+    @ApiModelProperty("实验室ID")
+    private Long labId;
+
+    @ApiModelProperty("特征码")
+    private byte[] data;
+
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public byte[] getData() {
+        return data;
+    }
+
+    public void setData(byte[] data) {
+        this.data = data;
+    }
+
+    public Long getLabId() {
+        return labId;
+    }
+
+    public void setLabId(Long labId) {
+        this.labId = labId;
+    }
+}

+ 4 - 6
zd-modules/zd-algorithm/pom.xml

@@ -93,13 +93,11 @@
             <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
 
-        <!-- 人脸对接  -->
+        <!-- 人脸识别 -->
         <dependency>
-            <groupId>arcsoft</groupId>
-            <artifactId>arcsoft-sdk-face</artifactId>
-            <version>3.0.0.0</version>
-            <scope>system</scope>
-            <systemPath>${pom.basedir}/src/main/resources/libs/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
+            <groupId>com.zd.common</groupId>
+            <artifactId>face-component</artifactId>
+            <version>${project.version}</version>
         </dependency>
 
         <!-- https://mvnrepository.com/artifact/org.bytedeco/ffmpeg-platform -->

+ 27 - 35
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/controller/FaceApi.java

@@ -1,15 +1,13 @@
-package com.zd.alg.face.controller;
+package com.zd.alg.face;
 
 import com.arcsoft.face.FaceFeature;
 import com.arcsoft.face.FaceInfo;
 import com.arcsoft.face.toolkit.ImageInfo;
-import com.github.xiaoymin.knife4j.annotations.ApiSupport;
-import com.zd.alg.face.service.FaceService;
-import com.zd.alg.face.utils.FileUtil;
-import com.zd.algorithm.api.face.feign.FaceCompare;
+import com.zd.model.entity.FaceCompare;
 import com.zd.common.core.utils.DateUtils;
 import com.zd.common.core.utils.StringUtils;
-import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.common.core.utils.file.FileUtils;
+import com.zd.common.face.FaceRecognitionService;
 import com.zd.laboratory.api.entity.LabStudentsInfo;
 import com.zd.laboratory.api.entity.LabSysUserInfo;
 import com.zd.laboratory.api.feign.RemoteDutyService;
@@ -24,7 +22,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-
 import java.io.*;
 import java.util.*;
 import java.util.concurrent.*;
@@ -37,22 +34,18 @@ import java.util.stream.Collectors;
  */
 
 @Api(tags = "【人脸识别】")
-@ApiSupport(author = Knife4jConfiguration.Author.ZP)
 @RestController
 @RequestMapping("/faceApi")
 public class FaceApi {
 
-    //private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
-
     private static final int taskSize = 50;
 
     private static ExecutorService pool = Executors.newFixedThreadPool(taskSize);
-
-
+    
     private Logger logger = LoggerFactory.getLogger(FaceApi.class);
 
     @Autowired
-    private FaceService faceService;
+    private FaceRecognitionService faceService;
 
     @Autowired
     private RemoteStudentsService remoteStudentsService;
@@ -66,7 +59,7 @@ public class FaceApi {
         ImageInfo imageInfo;
         File file1 = null;
         try {
-            file1 = FileUtil.multipartFileToFile(file);
+            file1 = FileUtils.multipartFileToFile(file);
             imageInfo = faceService.getImageInfo(file1);
         } finally {
             if (file1 != null) {
@@ -87,7 +80,7 @@ public class FaceApi {
     public ResultData detectFaces(@RequestParam("file") MultipartFile file) throws IOException {
         File fileToFile = null;
         try {
-            fileToFile = FileUtil.multipartFileToFile(file);
+            fileToFile = FileUtils.multipartFileToFile(file);
             ImageInfo  imageInfo = faceService.getImageInfo(fileToFile);
             List<FaceInfo> faceInfos = faceService.faceDetect(imageInfo);
             if(null==faceInfos || faceInfos.size()==0){
@@ -110,15 +103,13 @@ public class FaceApi {
     @ApiOperation("人脸比较")
     @PostMapping("/compare")
     public ResultData faceDetection(@RequestBody FaceCompare faceCompare) {
-        logger.info("====人脸比较====");
         R<LabStudentsInfo> info = remoteStudentsService.getInfo(faceCompare.getUserId());
         if (info.getCode() == 200 && info.getData() != null) {
-            logger.info("====人脸data组装====");
             FaceFeature target = new FaceFeature(info.getData().getFaceFeature());
             FaceFeature source = new FaceFeature(faceCompare.getData());
-            Boolean compore = faceService.compore(target, source);
-            logger.info("====compore====" + compore);
-            return ResultData.result(compore, () -> "人脸对比不符!");
+            Boolean bool = faceService.compare(target, source);
+            logger.info("【人脸识别】 识别的用户 userId = {}, 人脸对比结果: {}", faceCompare.getUserId(), bool);
+            return ResultData.result(bool, () -> "人脸对比不符!");
         } else {
             return ResultData.fail("未获取到对比数据!:" + info.getMsg());
         }
@@ -135,7 +126,7 @@ public class FaceApi {
         ImageInfo imageInfo;
         File file1 = null;
         try {
-            file1 = FileUtil.multipartFileToFile(file);
+            file1 = FileUtils.multipartFileToFile(file);
             imageInfo = faceService.getImageInfo(file1);
         } finally {
             if (file1 != null) {
@@ -148,15 +139,13 @@ public class FaceApi {
         }
         FaceFeature faceFeature = faceService.faceFeature(imageInfo, faceInfos);
         if(StringUtils.isNotNull(faceFeature.getFeatureData())){
-            logger.info("====人脸比较====");
             R<LabStudentsInfo> info = remoteStudentsService.getInfo(faceCompare.getUserId());
             if (info.getCode() == 200 && info.getData() != null) {
-                logger.info("====人脸data组装====");
                 FaceFeature target = new FaceFeature(info.getData().getFaceFeature());
                 FaceFeature source = new FaceFeature(faceFeature.getFeatureData());
-                Boolean compore = faceService.compore(target, source);
-                logger.info("====compore====" + compore);
-                return ResultData.result(compore, () -> "人脸对比不符!");
+                Boolean bool = faceService.compare(target, source);
+                logger.info("【人脸识别】 识别的用户 userId = {}, 人脸对比结果: {}", faceCompare.getUserId(), bool);
+                return ResultData.result(bool, () -> "人脸对比不符!");
             } else {
                 return ResultData.fail("未获取到对比数据!:" + info.getMsg());
             }
@@ -165,8 +154,6 @@ public class FaceApi {
         }
     }
 
-
-
     /**
      * 人脸比较
      *
@@ -174,26 +161,31 @@ public class FaceApi {
      */
     @ApiOperation("人脸比较")
     @PostMapping("/multiCompare")
-    public ResultData multiFaceDetection(@RequestBody FaceCompare faceCompare) throws ExecutionException, InterruptedException, TimeoutException {
-        logger.info("====人脸比较====");
+    public ResultData multiFaceDetection(@RequestBody FaceCompare faceCompare) throws ExecutionException, InterruptedException {
+        long time=System.currentTimeMillis();
         ResultData<List<LabSysUserInfo>> infoList = remoteStudentsService.getFaceBySecuritySubjectId(faceCompare.getLabId());
         if(infoList.getCode() == 200 && infoList.getData() != null){
             List<Future> list = Optional.ofNullable(infoList.getData()).orElseGet(Collections::emptyList)
                     .stream()
                     .map(a->{
-                        Future f = pool.submit((Callable<Object>) () -> {
-                            logger.info("执行线程名称:" + Thread.currentThread().getName());
-                            return getMultiFaceDetection(a, faceCompare);
+                        Future f = pool.submit(new Callable<Object>() {
+                            @Override
+                            public Object call() throws Exception {
+                                return getMultiFaceDetection(a,faceCompare);
+                            }
                         });
                         return f;
                     })
                     .collect(Collectors.toList());
             for(Future future:list){
-                ResultData r = (ResultData) future.get();
+                ResultData r=(ResultData)future.get();
                 if(r.getCode()==200){
+                    long time2=System.currentTimeMillis();
+                    System.out.println("执行时间:"+(time2-time));
                     return r;
                 }
             }
+            //pool.shutdown();
         }
         return ResultData.fail("未获取实验室安全准入人脸数据!");
     }
@@ -202,7 +194,7 @@ public class FaceApi {
         Integer isDutyUser=0;
         FaceFeature target = new FaceFeature(info.getFaceFeature());
         FaceFeature source = new FaceFeature(faceCompare.getData());
-        Boolean compore = faceService.compore(target, source);
+        Boolean compore = faceService.compare(target, source);
         if(compore){
             String userType=info.getUserType();
             Integer isWhite=info.getIsWhite();

+ 4 - 11
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/controller/FaceManagerApi.java

@@ -1,13 +1,11 @@
-package com.zd.alg.face.controller;
+package com.zd.alg.face;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
-import com.github.xiaoymin.knife4j.annotations.ApiSupport;
-import com.zd.alg.face.config.FaceProperties;
-import com.zd.alg.face.handle.FaceEngineFactory;
 import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.utils.IdUtils;
-import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.common.face.config.FaceEngineFactory;
+import com.zd.common.face.config.FaceProperties;
 import com.zd.model.domain.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -17,14 +15,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
-
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * @Author: zhoupan
@@ -32,10 +28,10 @@ import java.util.stream.Collectors;
  * @Description:
  */
 @Api(tags = "【人脸识别服务管理】")
-@ApiSupport(author = Knife4jConfiguration.Author.ZP)
 @RestController
 @RequestMapping("/faceManagerApi")
 public class FaceManagerApi {
+
     @Autowired
     FaceEngineFactory faceEngineFactory;
 
@@ -51,7 +47,6 @@ public class FaceManagerApi {
         libSet.add("libarcsoft_face.so");
         libSet.add("libarcsoft_face_engine.so");
         libSet.add("libarcsoft_face_engine_jni.so");
-
     }
 
 
@@ -122,10 +117,8 @@ public class FaceManagerApi {
             R.fail("没有找到符合的lib文件!");
         }
         return R.ok();
-
     }
 
-
     @PostMapping("/activation")
     @ApiOperation("激活")
     public R activation() {

+ 0 - 29
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/utils/FileUtil.java

@@ -1,29 +0,0 @@
-package com.zd.alg.face.utils;
-
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @Author: zhoupan
- * @Date: 2021/10/14/9:38
- * @Description:
- */
-public class FileUtil {
-
-    public static File multipartFileToFile(MultipartFile file) throws IOException {
-        File toFile = null;
-
-
-        String originalFilename = file.getOriginalFilename();
-        String[] filename = originalFilename.split("\\.");
-        toFile=File.createTempFile(filename[0], "." +filename[1]);
-        file.transferTo(toFile);
-//        toFile.deleteOnExit();//在jvm 退出时删除
-        return toFile;
-    }
-
-
-
-}

+ 0 - 26
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/valid/KeyNotNull.java

@@ -1,26 +0,0 @@
-package com.zd.alg.face.valid;
-
-import javax.validation.Constraint;
-import javax.validation.Payload;
-import java.lang.annotation.*;
-
-/**
- * 枚舉自定義驗證
- *
- * @Author: zhoupan
- * @Date: 2021/10/28/9:00
- * @Description:
- */
-@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Constraint(validatedBy = KeyValidator.class)//标明由哪个类执行校验逻辑
-public @interface KeyNotNull {
-
-    String message() default "值错误!";
-
-    Class<?>[] groups() default {};
-
-    Class<? extends Payload>[] payload() default {};
-
-}

+ 0 - 26
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/valid/KeyValidator.java

@@ -1,26 +0,0 @@
-package com.zd.alg.face.valid;
-
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-
-/**
- * 暂未使用,还未完成
- * @Author: zhoupan
- * @Date: 2021/10/28/9:07
- * @Description:
- */
-public class KeyValidator implements ConstraintValidator<KeyNotNull, Object> {
-
-
-    @Override
-    public boolean isValid(Object s, ConstraintValidatorContext constraintValidatorContext) {
-
-        if (s == null) return true;
-        return false;
-    }
-
-    @Override
-    public void initialize(KeyNotNull constraintAnnotation) {
-        ConstraintValidator.super.initialize(constraintAnnotation);
-    }
-}

+ 31 - 57
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/FireImageService.java

@@ -1,32 +1,18 @@
 package com.zd.alg.forward.serivce;
 
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.zd.alg.forward.config.AlgorithmYml;
 import com.zd.alg.forward.domain.AnalysisData;
-import com.zd.alg.forward.domain.AnalysisReturnData;
 import com.zd.alg.forward.domain.DataPostAnalysisRespDto;
 import com.zd.alg.forward.domain.ImgPostResponse;
 import com.zd.alg.forward.properties.FireProperties;
 import com.zd.alg.forward.utils.HttpUtils;
 import com.zd.alg.forward.utils.VideoUtils;
 import com.zd.common.core.exception.ServiceException;
-import com.zd.common.core.redis.RedisService;
-import com.zd.laboratory.api.entity.SensorFunctionStatus;
-import com.zd.laboratory.api.feign.RemoteLaboratoryService;
-import com.zd.laboratory.api.vo.SubFunction;
-import com.zd.model.domain.ResultData;
+import com.zd.common.core.utils.file.FileUtils;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.bytedeco.javacv.FFmpegFrameGrabber;
 import org.bytedeco.javacv.Frame;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
@@ -37,15 +23,13 @@ import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 
-import static com.zd.alg.face.utils.FileUtil.multipartFileToFile;
 import static com.zd.alg.forward.utils.HttpUtils.getHttpEntityMap;
 import static com.zd.alg.forward.utils.VideoUtils.frameToBufferedImage;
-import static com.zd.model.constant.BaseConstants.MAP_INIT_SIZE;
 
 /**
  * 火焰图片抓拍处理
@@ -61,14 +45,9 @@ public class FireImageService {
     @Resource
     private AlgorithmYml algorithmYml;
 
-    @Autowired
-    RedisService redisService;
-
-    @Autowired
-    private RemoteLaboratoryService remoteLaboratoryService;
-
     @Resource
     private RestTemplate restTemplate;
+
     @Resource
     private SendSginAccessLogService sendSginAccessLogService;
 
@@ -82,10 +61,9 @@ public class FireImageService {
      */
     private static final String IMAGE_FORMAT = "jpg";
 
-    @Scheduled(cron = "0/5 * * * * ?")
+    //@Scheduled(cron = "0/5 * * * * ?")
     public void camera(){
         try {
-            log.info("开始执行定时火焰检测!");
             String streamUrl = fireProperties.getStreamUrl();
             if (streamUrl != null && !"".equals(streamUrl)) {
                 catchImage(streamUrl);
@@ -98,16 +76,11 @@ public class FireImageService {
     }
 
     public void catchImage(String streamUrl) throws IOException {
-        log.info("获取视频流开始=================");
         try (FFmpegFrameGrabber grabber = VideoUtils.createGrabber(streamUrl)) {
             grabber.start();
-            String fileName = "huoyan-"+ DateUtil.format(new DateTime(), "yyyyMMddHHmmssSSS");;
+            String fileName = "huoyan";
             //文件储存对象
-            File file=new File("/img/"+fileName+"." + IMAGE_FORMAT);
-            if (!file.exists()) {
-                file.mkdirs();
-            }
-            log.info("获取第一帧");
+            File file=new File(fileName+"." + IMAGE_FORMAT);
             //获取第一帧
             Frame frame = grabber.grabFrame();
             if (frame != null) {
@@ -126,7 +99,7 @@ public class FireImageService {
 
     public boolean catchImage(MultipartFile file) {
         try {
-            File toFile = multipartFileToFile(file);
+            File toFile = FileUtils.multipartFileToFile(file);
             send(toFile);
             return true;
         } catch (IOException e) {
@@ -138,28 +111,29 @@ public class FireImageService {
         if (fireProperties.getAlgoId() == null) {
             throw new ServiceException("未配置火焰算法ID");
         }
-        HashMap<String, Object> paramMap = new HashMap<>();
-        paramMap.put("image", FileUtil.file(file.getAbsoluteFile()));
-        paramMap.put("aid",fireProperties.getAlgoId());
-        paramMap.put("cid",fireProperties.getCid());
-        paramMap.put("sync",1);
-        paramMap.put("timestamp", LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli() / 1000);
-        log.info("火焰算法请求参数={}", JSON.toJSONString(paramMap));
-        String resultStr= HttpUtil.post(algorithmYml.getImgPostUrl(), paramMap);
-        log.info("火焰算法响应参数status_code={}", JSON.parseObject(resultStr).get("status_code"));
-        log.info("火焰算法响应参数message={}", JSON.parseObject(resultStr).get("message"));
-        if (StringUtils.isBlank(resultStr) || SUCCESS_CODE != JSON.parseObject(resultStr).getIntValue("status_code")) {
-            log.info("火焰算法请求失败!响应参数={}",resultStr);
+        MultiValueMap<String, Object> params = HttpUtils.getMultiValueMap(fireProperties, null);
+        HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(file, params);
+        ImgPostResponse<DataPostAnalysisRespDto> send = HttpUtils.send(restTemplate, files, algorithmYml);
+        if (send == null || send.getStatus_code() != SUCCESS_CODE) {
+            assert send != null;
+            //log.error(send.getMessage());
             return;
         }
-        AnalysisReturnData data = JSON.parseObject(resultStr).getObject("data", AnalysisReturnData.class);
-        JSONObject resultJSON = JSON.parseObject(JSON.toJSONString(data.getResult()));
-        JSONObject algorithm_data = resultJSON.getJSONObject("algorithm_data");
-        Boolean is_alert = algorithm_data.getBoolean("is_alert");
-        log.info("火焰算法识别结果is_alert={}",is_alert);
-        if (is_alert) {
-            log.info("======火焰预案报警!!!======");
-            sendSginAccessLogService.saveAlarm(fireProperties);
+        DataPostAnalysisRespDto data = send.getData();
+        List<AnalysisData> analysisDatas = data.getAnalysisDatas();
+        AnalysisData analysisData = analysisDatas.get(0);
+        int code = analysisData.getCode();
+        if (code==-1){
+            log.error("==============请求失败:{}=================",analysisData.getMsg());
+        }else {
+            log.info("===============向算法服务发送数据完成====================");
+            Map<String, Object> result = (Map<String, Object>) Optional.ofNullable(analysisData.getResult()).orElse(Collections.emptyMap());
+            Map<String, Object> algorithmData = (Map<String, Object>) Optional.ofNullable(result.get("algorithm_data")).orElse(Collections.emptyMap());
+            boolean alert = "false".equals(algorithmData.getOrDefault("is_alert", "").toString());
+            if (!alert) {
+                log.info("===============返回告警信息====================");
+                sendSginAccessLogService.saveAlarm(fireProperties);
+            }
         }
     }
 }