deason 11 сар өмнө
parent
commit
59b76e8932

+ 6 - 5
examcloud-starters/examcloud-face-verify-starter/src/main/java/cn/com/qmth/examcloud/starters/face/verify/model/param/FaceApiParam.java

@@ -24,11 +24,12 @@ public class FaceApiParam implements Serializable {
      */
     private Double expectFaceCompareScore;
 
-    public FaceApiParam(FaceApiType apiType) {
-        if (apiType == null) {
-            throw new IllegalArgumentException("人脸API类型不能为空!");
-        }
-        this.apiType = apiType;
+    private FaceApiParam() {
+
+    }
+
+    public static FaceApiParam builder() {
+        return new FaceApiParam();
     }
 
     public FaceApiParam apiType(FaceApiType apiType) {

+ 17 - 1
examcloud-starters/examcloud-face-verify-starter/src/main/java/cn/com/qmth/examcloud/starters/face/verify/service/FaceVerifyService.java

@@ -1,10 +1,26 @@
 package cn.com.qmth.examcloud.starters.face.verify.service;
 
 import cn.com.qmth.examcloud.starters.face.verify.model.FaceResult;
+import cn.com.qmth.examcloud.starters.face.verify.model.param.FaceApiParam;
 import cn.com.qmth.examcloud.starters.face.verify.model.param.ImageParm;
 
 public interface FaceVerifyService {
 
+    /**
+     * 人脸真实性检测
+     */
+    FaceResult faceVerify(FaceApiParam apiParam);
+
+    /**
+     * 人脸识别
+     */
+    FaceResult faceDetect(FaceApiParam apiParam);
+
+    /**
+     * 人脸比对
+     */
+    FaceResult faceCompare(FaceApiParam apiParam);
+
     /**
      * 百度 人脸真实性检测(不支持陌生人检测)
      */
@@ -34,7 +50,7 @@ public interface FaceVerifyService {
     FaceResult faceCompareByBaidu(ImageParm image1, ImageParm image2, Double expectFaceCompareScore);
 
     FaceResult faceCompareByBaidu(ImageParm image1, ImageParm image2, Double expectFaceCompareScore,
-            boolean localEnabled);
+                                  boolean localEnabled);
 
     /**
      * Face++ 人脸检测(支持陌生人检测)

+ 94 - 1
examcloud-starters/examcloud-face-verify-starter/src/main/java/cn/com/qmth/examcloud/starters/face/verify/service/impl/FaceVerifyServiceImpl.java

@@ -6,9 +6,12 @@ import cn.com.qmth.examcloud.starters.face.verify.common.JsonHelper;
 import cn.com.qmth.examcloud.starters.face.verify.model.FaceResult;
 import cn.com.qmth.examcloud.starters.face.verify.model.baidu.BaiduApiHelper;
 import cn.com.qmth.examcloud.starters.face.verify.model.faceplus.FacePlusApiHelper;
+import cn.com.qmth.examcloud.starters.face.verify.model.param.FaceApiParam;
+import cn.com.qmth.examcloud.starters.face.verify.model.param.FaceApiType;
 import cn.com.qmth.examcloud.starters.face.verify.model.param.ImageParm;
 import cn.com.qmth.examcloud.starters.face.verify.model.param.ImageParmType;
 import cn.com.qmth.examcloud.starters.face.verify.service.FaceVerifyService;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,6 +28,96 @@ public class FaceVerifyServiceImpl implements FaceVerifyService {
 
     private FaceVerifyProperties properties;
 
+    /**
+     * 人脸真实性检测
+     */
+    @Override
+    public FaceResult faceVerify(FaceApiParam apiParam) {
+        if (ArrayUtils.getLength(apiParam.getImages()) < 1) {
+            throw new IllegalArgumentException("至少传一个图片参数!");
+        }
+
+        if (FaceApiType.FACE_PLUS == apiParam.getApiType()) {
+            throw new IllegalArgumentException("FacePlus暂不支持人脸真实性检测!");
+        }
+
+        Map<String, String> imageData = this.buildImageParmForBaidu(apiParam.getImages()[0]);
+        imageData.put("face_field", "spoofing");
+        List<Map<String, String>> images = new ArrayList<>();
+        images.add(imageData);
+        String params = new JsonHelper().toJson(images);
+
+        if (FaceApiType.BAIDU_API == apiParam.getApiType()) {
+            return BaiduApiHelper.faceVerify(properties, params);
+        }
+        // 默认:百度私有化部署API
+        return BaiduApiHelper.faceVerifyUseLocalApi(properties, params);
+    }
+
+    /**
+     * 人脸识别
+     */
+    @Override
+    public FaceResult faceDetect(FaceApiParam apiParam) {
+        if (ArrayUtils.getLength(apiParam.getImages()) < 1) {
+            throw new IllegalArgumentException("至少传一个图片参数!");
+        }
+
+        if (FaceApiType.FACE_PLUS == apiParam.getApiType()) {
+            Map<String, String> params = new HashMap<>();
+            this.buildImageParmForFacePlus(params, apiParam.getImages()[0], null);
+
+            return FacePlusApiHelper.faceDetect(properties, params);
+        }
+
+        Map<String, String> imageData = this.buildImageParmForBaidu(apiParam.getImages()[0]);
+        imageData.put("liveness_control", "NORMAL");
+        imageData.put("max_face_num", "2");
+        String params = new JsonHelper().toJson(imageData);
+
+        if (FaceApiType.BAIDU_API == apiParam.getApiType()) {
+            return BaiduApiHelper.faceDetect(properties, params);
+        }
+        // 默认:百度私有化部署API
+        return BaiduApiHelper.faceDetectUseLocalApi(properties, params);
+    }
+
+    /**
+     * 人脸比对
+     */
+    @Override
+    public FaceResult faceCompare(FaceApiParam apiParam) {
+        if (ArrayUtils.getLength(apiParam.getImages()) < 2) {
+            throw new IllegalArgumentException("至少传两个图片参数!");
+        }
+
+        if (FaceApiType.FACE_PLUS == apiParam.getApiType()) {
+            Map<String, String> params = new HashMap<>();
+            this.buildImageParmForFacePlus(params, apiParam.getImages()[0], "1");
+            this.buildImageParmForFacePlus(params, apiParam.getImages()[1], "2");
+
+            return FacePlusApiHelper.faceCompare(properties, params);
+        }
+
+        List<Map<String, String>> images = new ArrayList<>();
+        images.add(this.buildImageParmForBaidu(apiParam.getImages()[0]));
+        images.add(this.buildImageParmForBaidu(apiParam.getImages()[1]));
+        String params = new JsonHelper().toJson(images);
+
+        Double expectFaceCompareScore;
+        if (apiParam.getExpectFaceCompareScore() != null) {
+            expectFaceCompareScore = apiParam.getExpectFaceCompareScore();
+        } else {
+            expectFaceCompareScore = properties.getBaiduExpectFaceCompareScore();
+        }
+
+        if (FaceApiType.BAIDU_API == apiParam.getApiType()) {
+            return BaiduApiHelper.faceCompare(properties, params, expectFaceCompareScore);
+        }
+        // 默认:百度私有化部署API
+        return BaiduApiHelper.faceCompareUseLocalApi(properties, params, expectFaceCompareScore);
+    }
+
     @Override
     public FaceResult faceVerifyByBaidu(ImageParm image) {
         Map<String, String> imageData = this.buildImageParmForBaidu(image);
@@ -110,7 +203,7 @@ public class FaceVerifyServiceImpl implements FaceVerifyService {
 
     @Override
     public FaceResult faceCompareByBaidu(ImageParm image1, ImageParm image2, Double expectFaceCompareScore,
-            boolean localEnabled) {
+                                         boolean localEnabled) {
         List<Map<String, String>> images = new ArrayList<>();
         images.add(this.buildImageParmForBaidu(image1));
         images.add(this.buildImageParmForBaidu(image2));