소스 검색

fix: 消费服务
1.人脸算法升级到4.1

luoyb 1 년 전
부모
커밋
e2a839e7ca

+ 117 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FaceErrorCodeEnum.java

@@ -0,0 +1,117 @@
+package org.dromara.common.core.enums;
+
+/**
+ * name: ErrorCodeEnum
+ * package: org.dromara.common.core.enums
+ * description: 人脸算法错误码枚举
+ * date: 2025-03-25 15:32:33 15:32
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public enum FaceErrorCodeEnum {
+    MOK(0, "成功"),
+    UNKNOWN(1, "错误原因不明"),
+    INVALID_PARAM(2, "无效参数"),
+    UNSUPPORTED(3, "引擎不支持"),
+    NO_MEMORY(4, "内存不足"),
+    BAD_STATE(5, "状态错误"),
+    USER_CANCEL(6, "用户取消相关操作"),
+    EXPIRED(7, "操作时间过期"),
+    USER_PAUSE(8, "用户暂停操作"),
+    BUFFER_OVERFLOW(9, "缓冲上溢"),
+    BUFFER_UNDERFLOW(10, "缓冲下溢"),
+    NO_DISKSPACE(11, "存贮空间不足"),
+    COMPONENT_NOT_EXIST(12, "组件不存在"),
+    GLOBAL_DATA_NOT_EXIST(13, "全局数据不存在"),
+    SYSTEM_ERROR(14, "系统错误"),
+    INVALID_APP_ID(28673, "无效的AppId"),
+    INVALID_SDK_ID(28674, "无效的SdkKey"),
+    INVALID_ID_PAIR(28675, "AppId和SdkKey不匹配"),
+    MISMATCH_ID_AND_SDK(28676, "SdkKey 和使用的SDK 不匹配"),
+    SYSTEM_VERSION_UNSUPPORTED(28677, "系统版本不被当前SDK所支持"),
+    LICENCE_EXPIRED(28678, "SDK有效期过期,需要重新下载更新"),
+    FR_INVALID_MEMORY_INFO(73729, "无效的输入内存"),
+    FR_INVALID_IMAGE_INFO(73730, "无效的输入图像参数"),
+    FR_INVALID_FACE_INFO(73731, "无效的脸部信息"),
+    FR_NO_GPU_AVAILABLE(73732, "当前设备无GPU可用"),
+    FR_MISMATCHED_FEATURE_LEVEL(73733, "待比较的两个人脸特征的版本不一致"),
+    FACEFEATURE_UNKNOWN(81921, "人脸特征检测错误未知"),
+    FACEFEATURE_MEMORY(81922, "人脸特征检测内存错误"),
+    FACEFEATURE_INVALID_FORMAT(81923, "人脸特征检测格式错误"),
+    FACEFEATURE_INVALID_PARAM(81924, "人脸特征检测参数错误"),
+    FACEFEATURE_LOW_CONFIDENCE_LEVEL(81925, "人脸特征检测结果置信度低"),
+    ASF_EX_BASE_FEATURE_UNSUPPORTED_ON_INIT(86017, "Engine不支持的检测属性"),
+    ASF_EX_BASE_FEATURE_UNINITED(86018, "需要检测的属性未初始化"),
+    ASF_EX_BASE_FEATURE_UNPROCESSED(86019, "待获取的属性未在process中处理过"),
+    ASF_EX_BASE_FEATURE_UNSUPPORTED_ON_PROCESS(86020, "PROCESS不支持的检测属性,例如FR,有自己独立的处理函数"),
+    ASF_EX_BASE_INVALID_IMAGE_INFO(86021, "无效的输入图像"),
+    ASF_EX_BASE_INVALID_FACE_INFO(86022, "无效的脸部信息"),
+    ASF_BASE_ACTIVATION_FAIL(90113, "SDK激活失败,请打开读写权限"),
+    ASF_BASE_ALREADY_ACTIVATED(90114, "SDK已激活"),
+    ASF_BASE_NOT_ACTIVATED(90115, "SDK未激活"),
+    ASF_BASE_SCALE_NOT_SUPPORT(90116, "detectFaceScaleVal 不支持"),
+    ASF_BASE_VERION_MISMATCH(90117, "激活文件与SDK类型不匹配,请确认使用的sdk"),
+    ASF_BASE_DEVICE_MISMATCH(90118, "设备不匹配"),
+    ASF_BASE_UNIQUE_IDENTIFIER_MISMATCH(90119, "唯一标识不合法"),
+    ASF_BASE_PARAM_NULL(90120, "参数为空"),
+    ASF_BASE_SDK_EXPIRED(90121, "活体已过期"),
+    ASF_BASE_VERSION_NOT_SUPPORT(90122, "版本不支持"),
+    ASF_BASE_SIGN_ERROR(90123, "签名错误"),
+    ASF_BASE_DATABASE_ERROR(90124, "激活信息保存异常"),
+    ASF_BASE_UNIQUE_CHECKOUT_FAIL(90125, "唯一标识符校验失败"),
+    ASF_BASE_COLOR_SPACE_NOT_SUPPORT(90126, "颜色空间不支持"),
+    ASF_BASE_IMAGE_WIDTH_NOT_SUPPORT(90127, "图片宽高不支持,宽度需四字节对齐"),
+    ASF_READ_PHONE_STATE_DENIED(90128, "android.permission.READ_PHONE_STATE权限被拒绝"),
+    ASF_ACTIVATION_DATA_DESTROYED(90129, "激活数据被破坏,请删除激活文件,重新进行激活"),
+    ASF_SERVER_UNKNOWN_ERROR(90130, "服务端未知错误"),
+    ASF_INTERNET_DENIED(90131, "INTERNET权限被拒绝"),
+    ASF_ACTIVEFILE_SDK_MISMATCH(90132, "激活文件与SDK版本不匹配,请重新激活"),
+    ASF_DEVICEINFO_LESS(90133, "设备信息太少,不足以生成设备指纹"),
+    ASF_LOCAL_TIME_NOT_CALIBRATED(90134, "客户端时间与服务器时间(即北京时间)前后相差在30分钟以上"),
+    ASF_APPID_DATA_DECRYPT(90135, "数据校验异常"),
+    ASF_APPID_APPKEY_SDK_MISMATCH(90136, "传入的AppId和AppKey与使用的SDK版本不一致"),
+    ASF_NO_REQUEST(90137, "短时间大量请求会被禁止请求,30分钟之后解封"),
+    MERR_ASF_ACTIVE_FILE_NO_EXIST(90138, "激活文件不存在"),
+    ASF_IMAGE_FORMAT_UNSUPPORT(90139, "图像格式不支持,请查看对应接口注释,使用当前支持"),
+    ASF_CURRENT_DEVICE_TIME_INCORRECT(90140, "当前设备时间不正确,请调整设备时间"),
+    ASF_NETWORK_BASE_COULDNT_RESOLVE_HOST(94209, "无法解析主机地址"),
+    ASF_NETWORK_BASE_COULDNT_CONNECT_SERVER(94210, "无法连接服务器"),
+    ASF_NETWORK_BASE_CONNECT_TIMEOUT(94211, "网络连接超时"),
+    ASF_NETWORK_BASE_UNKNOWN_ERROR(94212, "网络未知错误");
+
+    private Integer code;
+    private String description;
+
+    FaceErrorCodeEnum(Integer code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public Integer getCode() {
+        return this.code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getDescription() {
+        return this.description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public static FaceErrorCodeEnum getDescriptionByCode(Integer code) {
+        for(FaceErrorCodeEnum errorCodeEnum : values()) {
+            if (code.equals(errorCodeEnum.getCode())) {
+                return errorCodeEnum;
+            }
+        }
+
+        return UNKNOWN;
+    }
+}

+ 10 - 6
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/config/ArcFaceConfig.java

@@ -16,17 +16,21 @@ import org.springframework.context.annotation.Configuration;
 @ConfigurationProperties(prefix = "arcconfig.arcface-sdk")
 public class ArcFaceConfig {
     // 获取配置参数
-    public String sdkLibPath = "";
+    private String sdkLibPath = "";
 
-    public String appId = "";
+    private String appId = "";
 
-    public String sdkKey = "";
+    private String sdkKey = "";
 
-    public Integer detectPooSize = 5;
+    private Integer detectPooSize = 5;
 
-    public Integer comparePooSize = 5;
+    private Integer comparePooSize = 5;
 
+    private Float faceQuality = 0.6F;
     // 离线激活文件
-    public String activeFile = "";
+    private String activeFile = "";
 
+    private boolean faceMask = false;
+
+    private String activeKey = "";
 }

+ 7 - 9
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/config/FaceEngineFactory.java

@@ -19,31 +19,29 @@ public class FaceEngineFactory extends BasePooledObjectFactory<FaceEngine> {
     private final String libPath;
     private final String appId;
     private final String sdkKey;
+    private final String activeKey;
     private final EngineConfiguration engineConfiguration;
-    private String activeKey;
-    private String activeFile;
+
 
     public FaceEngineFactory(String libPath, String appId, String sdkKey, String activeKey,
-                             EngineConfiguration engineConfiguration, String activeFile) {
+                             EngineConfiguration engineConfiguration) {
         this.appId = appId;
         this.sdkKey = sdkKey;
         this.activeKey = activeKey;
         this.libPath = libPath;
         this.engineConfiguration = engineConfiguration;
-        this.activeFile = activeFile;
     }
 
     @Override
     public FaceEngine create() {
-
-        FaceEngine faceEngine = new FaceEngine(libPath);
-        //int activeCode = faceEngine.activeOnline(appId, sdkKey);
-        int activeCode = faceEngine.activeOffline(activeKey);
+        FaceEngine faceEngine = new FaceEngine(this.libPath);
+        //sdk4.0以上的激活方式
+        int activeCode = faceEngine.activeOnline(this.appId, this.sdkKey, this.activeKey);
         if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
             log.error("引擎激活失败{}", activeCode);
             throw new ServiceException("引擎激活失败: " + activeCode);
         }
-        int initCode = faceEngine.init(engineConfiguration);
+        int initCode = faceEngine.init(this.engineConfiguration);
         if (initCode != ErrorInfo.MOK.getValue()) {
             log.error("引擎初始化失败{}", initCode);
             throw new ServiceException("引擎初始化失败: " + initCode);

+ 15 - 21
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/FaceEngineServiceImpl.java

@@ -40,25 +40,20 @@ public class FaceEngineServiceImpl implements FaceEngineService {
     @PostConstruct
     public void init() {
         GenericObjectPoolConfig detectPoolConfig = new GenericObjectPoolConfig();
-        detectPoolConfig.setMaxIdle(arcFaceConfig.getDetectPooSize());
-        detectPoolConfig.setMaxTotal(arcFaceConfig.getDetectPooSize());
-        detectPoolConfig.setMinIdle(arcFaceConfig.getDetectPooSize());
+        detectPoolConfig.setMaxIdle(this.arcFaceConfig.getDetectPooSize());
+        detectPoolConfig.setMaxTotal(this.arcFaceConfig.getDetectPooSize());
+        detectPoolConfig.setMinIdle(this.arcFaceConfig.getDetectPooSize());
         detectPoolConfig.setLifo(false);
         EngineConfiguration detectCfg = new EngineConfiguration();
         FunctionConfiguration detectFunctionCfg = new FunctionConfiguration();
-        detectFunctionCfg.setSupportFaceDetect(true);// 开启人脸检测功能
-        detectFunctionCfg.setSupportFaceRecognition(true);// 开启人脸识别功能
-        detectFunctionCfg.setSupportAge(true);// 开启年龄检测功能
-        detectFunctionCfg.setSupportGender(true);// 开启性别检测功能
-        detectFunctionCfg.setSupportLiveness(true);// 开启活体检测功能
-
+        detectFunctionCfg.setSupportFaceDetect(true);
+        detectFunctionCfg.setSupportFaceRecognition(true);
+        detectFunctionCfg.setSupportImageQuality(true);
+        detectFunctionCfg.setSupportLiveness(true);
         detectCfg.setFunctionConfiguration(detectFunctionCfg);
-        detectCfg.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);// 图片检测模式,如果是连续帧的视频流图片,那么改成VIDEO模式
-        detectCfg.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);// 人脸旋转角度
-        faceEngineGeneralPool = new GenericObjectPool(new FaceEngineFactory(arcFaceConfig.getSdkLibPath(),
-                                                                            arcFaceConfig.getAppId(), arcFaceConfig.getSdkKey(), null, detectCfg,
-                                                                            arcFaceConfig.activeFile), detectPoolConfig);// 底层库算法对象池
-
+        detectCfg.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
+        detectCfg.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
+        this.faceEngineGeneralPool = new GenericObjectPool(new FaceEngineFactory(this.arcFaceConfig.getSdkLibPath(), this.arcFaceConfig.getAppId(), this.arcFaceConfig.getSdkKey(), this.arcFaceConfig.getActiveKey(), detectCfg), detectPoolConfig);
     }
 
     // 人脸检测
@@ -69,17 +64,16 @@ public class FaceEngineServiceImpl implements FaceEngineService {
             return null;
         // FaceEngine人脸引擎类
         FaceEngine faceEngine = null;
+        List<FaceInfo> faceInfoList = new ArrayList<>();
         try {
             // 这里进行获取
             faceEngine = faceEngineGeneralPool.borrowObject();
             if (faceEngine == null) {
                 return null;
             }
-            List<FaceInfo> faceInfoList = new ArrayList<>();
             // 我们进行人脸检测
-
             int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(),
-                                                   imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
+                imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
             if (errorCode == 0) {
                 return faceInfoList;
             }
@@ -105,15 +99,15 @@ public class FaceEngineServiceImpl implements FaceEngineService {
         try {
             // 这里进行获取人脸引擎
             faceEngine = faceEngineGeneralPool.borrowObject();
-            List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
+            List<FaceInfo> faceInfoList = new ArrayList<>();
             // 人脸检测返回值
             int code = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
-                                              imageInfo.getImageFormat(), faceInfoList);
+                imageInfo.getImageFormat(), faceInfoList);
             if (code == 0 && !faceInfoList.isEmpty()) {
                 FaceFeature faceFeature = new FaceFeature();
                 //faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
                 //                              imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
-                faceEngine.extractFaceFeature(imageInfo,faceInfoList.get(0), ExtractType.REGISTER,0, faceFeature);
+                faceEngine.extractFaceFeature(imageInfo, faceInfoList.get(0), ExtractType.REGISTER, 0, faceFeature);
                 return Base64.encode(faceFeature.getFeatureData());
             }
         } catch (Exception e) {