瀏覽代碼

优化识别

suntianwu 3 年之前
父節點
當前提交
dcb8567246
共有 32 個文件被更改,包括 525 次插入206 次删除
  1. 1 1
      src/main/java/com/iden/bms/controller/WarningPersonController.java
  2. 1 1
      src/main/java/com/iden/bms/init/FaceMonitorInit.java
  3. 41 0
      src/main/java/com/iden/bms/init/FaceMonitorPoolInit.java
  4. 95 114
      src/main/java/com/iden/bms/service/FaceIdenService.java
  5. 15 16
      src/main/java/com/iden/bms/service/PersonService.java
  6. 8 4
      src/main/java/com/iden/bms/service/TraceService.java
  7. 10 2
      src/main/java/com/iden/bms/service/WarningPersonService.java
  8. 12 0
      src/main/java/com/iden/common/cache/FaceMoniterCache.java
  9. 2 0
      src/main/java/com/iden/common/cache/RedisKeyConstant.java
  10. 13 2
      src/main/java/com/iden/common/cache/RedisUtil.java
  11. 3 3
      src/main/java/com/iden/common/constant/Constants.java
  12. 1 1
      src/main/java/com/iden/common/entity/IdenFaceImage.java
  13. 1 1
      src/main/java/com/iden/common/entity/IdenPerson.java
  14. 75 0
      src/main/java/com/iden/common/entity/IdenPersonStranger.java
  15. 1 1
      src/main/java/com/iden/common/entity/IdenWarningEvent.java
  16. 1 1
      src/main/java/com/iden/common/entity/IdenWarningPerson.java
  17. 1 1
      src/main/java/com/iden/common/entity/IdenWarningPersonHis.java
  18. 1 1
      src/main/java/com/iden/common/entity/IdenWarningPersonTrace.java
  19. 71 51
      src/main/java/com/iden/common/facetool/FaceIdenTool.java
  20. 28 0
      src/main/java/com/iden/common/facetool/pool/MyFaceMonitor.java
  21. 26 0
      src/main/java/com/iden/common/facetool/pool/ResourcePoolableObjectFactory.java
  22. 59 0
      src/main/java/com/iden/common/facetool/pool/Test.java
  23. 15 0
      src/main/java/com/iden/common/mapper/IdenPersonStrangerMapper.java
  24. 14 0
      src/main/java/com/iden/common/service/IdenPersonStrangerService.java
  25. 18 0
      src/main/java/com/iden/common/service/impl/IdenPersonStrangerServiceImpl.java
  26. 1 1
      src/main/java/com/iden/common/vo/FaceImageVO.java
  27. 1 1
      src/main/java/com/iden/common/vo/PersonVO.java
  28. 1 1
      src/main/java/com/iden/common/vo/TraceVO.java
  29. 1 1
      src/main/java/com/iden/common/vo/WarningEventVO.java
  30. 1 1
      src/main/java/com/iden/common/vo/WarningPersonVO.java
  31. 1 1
      src/main/resources/application-dev.properties
  32. 6 0
      src/main/resources/mybatis/IdenPersonStrangerMapper.xml

+ 1 - 1
src/main/java/com/iden/bms/controller/WarningPersonController.java

@@ -84,7 +84,7 @@ public class WarningPersonController {
 
     })
     public Result<List<TraceVO>> listTrace(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                                       @RequestParam(value = "uid", required = true) String uid,
+                                                       @RequestParam(value = "uid", required = true) Long uid,
                                                        @RequestParam(value = "beginDate", required = false) String beginDate,
                                                        @RequestParam(value = "endDate", required = false) String endDate){
         try {

+ 1 - 1
src/main/java/com/iden/bms/init/FaceMonitorInit.java

@@ -14,7 +14,7 @@ import javax.annotation.Resource;
 
 
 @Component
-@Order(2)
+@Order(3)
 public class FaceMonitorInit implements CommandLineRunner {
 
     private static final Logger logger = LogManager.getLogger(FaceMonitorInit.class);

+ 41 - 0
src/main/java/com/iden/bms/init/FaceMonitorPoolInit.java

@@ -0,0 +1,41 @@
+package com.iden.bms.init;
+
+
+
+import com.iden.bms.service.FaceIdenService;
+import com.iden.common.facetool.FaceIdenTool;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+
+@Component
+@Order(1)
+public class FaceMonitorPoolInit implements CommandLineRunner {
+
+    private static final Logger logger = LogManager.getLogger(FaceMonitorPoolInit.class);
+
+    @Resource
+    private FaceIdenService faceIdenService;
+
+    @Value("${init.face.dataset:#{null}}")
+    private String initFaceDataset;
+
+
+    @Override
+    public void run(String... args) throws Exception {
+        if("1".equals(initFaceDataset)){
+            logger.info("初始化人脸识别引擎池 start ...........................");
+            FaceIdenTool.initPool();
+            logger.info("初始化人脸识别引擎池 end ...........................");
+        }
+
+    }
+
+}
+

+ 95 - 114
src/main/java/com/iden/bms/service/FaceIdenService.java

@@ -3,6 +3,7 @@ package com.iden.bms.service;
 
 
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.face.monitor.FaceMonitor;
@@ -16,6 +17,7 @@ import com.iden.common.entity.*;
 
 import com.iden.common.enums.HandleWarningStatusEnum;
 import com.iden.common.enums.PersonTypeEnum;
+import com.iden.common.facetool.pool.MyFaceMonitor;
 import com.iden.common.service.*;
 
 import com.iden.common.util.ByteUtil;
@@ -49,7 +51,8 @@ public class FaceIdenService {
     private IdenCommunityService idenCommunityService;
     @Resource
     private IdenPersonService idenPersonService;
-
+    @Resource
+    private IdenPersonStrangerService idenPersonStrangerService;
 
     @Resource
     private RedisUtil redisUtil;
@@ -68,77 +71,67 @@ public class FaceIdenService {
      * 初始化人脸识别库
      */
     public void initFaceDataset() {
-        intPesontFaceDataset();
-        intStrangerFaceDataset();
-        intTmpFaceDataset();
-    }
 
-    private void intPesontFaceDataset() {
+      List<FaceModel> faceModelList = new ArrayList<>();
+        //注册人员
         QueryWrapper<IdenPerson> queryWrapper = new QueryWrapper<>();
-        queryWrapper.select("id","name","feat_ptr");
+        queryWrapper.select("uid","feat_ptr");
         queryWrapper.lambda().isNotNull(IdenPerson::getFeatPtr);
         List<IdenPerson> idenPersonList = idenPersonService.list(queryWrapper);
         if (CollUtil.isNotEmpty(idenPersonList)) {
-            FaceModel[] dataset = new FaceModel[idenPersonList.size()];
-            for(int i = 0; i < idenPersonList.size(); i++){
-                IdenPerson idenPerson = idenPersonList.get(i);
-                dataset[i] = new FaceModel();
-                dataset[i].setPersonId(idenPerson.getId().intValue());
-                dataset[i].setName(String.valueOf(i));
-                dataset[i].setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
-            }
 
-            FaceMonitor faceMonitorPerson = FaceIdenTool.initFaceMonitorWithDataset(idenRoot,dataset);
-            if(faceMonitorPerson != null){
-                FaceMoniterCache.setFaceMonitor(Constants.FACE_CACHE_PERSON_KEY,faceMonitorPerson);
+            for (int i = 0; i < idenPersonList.size(); i++) {
+                IdenPerson idenPerson = idenPersonList.get(i);
+                FaceModel faceModel = new FaceModel();
+                faceModel.setPersonId(idenPerson.getUid().intValue());
+                faceModel.setName(String.valueOf(idenPerson.getUid()));
+                faceModel.setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
+                faceModelList.add(faceModel);
             }
         }
-    }
 
-    private void intStrangerFaceDataset(){
-        //TODO 数据量大了需要考虑怎么办
-        QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(IdenFaceImage::getType, PersonTypeEnum.STRANGER.getValue())
-                .eq(IdenFaceImage::getHandleWarningStatus,HandleWarningStatusEnum.HANDLED.getValue())
-                .isNotNull(IdenFaceImage::getFeatPtr);
-        queryWrapper.select("id","uid","feat_ptr");
-        List<IdenFaceImage> idenFaceImageList = this.idenFaceImageService.list(queryWrapper);
-        if (CollUtil.isNotEmpty(idenFaceImageList)) {
-            FaceModel[] dataset = new FaceModel[idenFaceImageList.size()];
-            for(int i = 0; i < idenFaceImageList.size(); i++){
-                IdenFaceImage idenFaceImage = idenFaceImageList.get(i);
-                dataset[i] = new FaceModel();
-                dataset[i].setPersonId(idenFaceImage.getId().intValue());
-                dataset[i].setName(String.valueOf(i));
-                dataset[i].setFeatValue(ByteUtil.hex2Byte(idenFaceImage.getFeatPtr()));
+        //陌生人
+        QueryWrapper<IdenPersonStranger> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.select("uid","feat_ptr");
+        queryWrapper1.lambda().isNotNull(IdenPersonStranger::getFeatPtr);
+        List<IdenPersonStranger> idenPersonStrangerList = this.idenPersonStrangerService.list(queryWrapper1);
+        if (CollUtil.isNotEmpty(idenPersonStrangerList)) {
+
+            for(int i = 0; i < idenPersonStrangerList.size() ; i++){
+                IdenPersonStranger idenPersonStranger = idenPersonStrangerList.get(i);
+                FaceModel faceModel = new FaceModel();
+                faceModel.setPersonId(idenPersonStranger.getUid().intValue());
+                faceModel.setName(String.valueOf(idenPersonStranger.getUid()));
+                faceModel.setFeatValue(ByteUtil.hex2Byte(idenPersonStranger.getFeatPtr()));
+                faceModelList.add(faceModel);
             }
-
-            FaceMonitor faceMonitorStranger = FaceIdenTool.initFaceMonitorWithDataset(idenRoot,dataset);
-            if(faceMonitorStranger != null){
-                FaceMoniterCache.setFaceMonitor(Constants.FACE_CACHE_STRANGER_KEY,faceMonitorStranger);
-            }
-        }
+         }
+
+         if(CollUtil.isNotEmpty(faceModelList)){
+             FaceModel[] dataset = new FaceModel[faceModelList.size()];
+             faceModelList.toArray(dataset);
+
+             FaceMonitor faceMonitorOld = FaceMoniterCache.getFaceMonitor(Constants.FACE_FEAT_PTR_CACHE_KEY);
+             if(faceMonitorOld != null){
+                 faceMonitorOld.loadFaceDataset(dataset);
+             } else {
+                 MyFaceMonitor myFaceMonitor = FaceIdenTool.getMyFaceMonitor();
+                 FaceMonitor faceMonitor = myFaceMonitor.getFaceMonitor();
+                 if(faceMonitor != null){
+                     faceMonitor.loadFaceDataset(dataset);
+                     FaceMoniterCache.setFaceMonitor(Constants.FACE_FEAT_PTR_CACHE_KEY, faceMonitor);
+                 }
+             }
+         }
     }
 
-    private void intTmpFaceDataset(){
-        FaceMonitor faceMonitorTmp = FaceIdenTool.initFaceMonitor(idenRoot);
-        if(faceMonitorTmp != null){
-            FaceMoniterCache.setFaceMonitor(Constants.FACE_CACHE_CONTINUE_TMP_KEY,faceMonitorTmp);
-        }
-        FaceMonitor faceMonitorTmp2 = FaceIdenTool.initFaceMonitor(idenRoot);
-        if(faceMonitorTmp != null){
-            FaceMoniterCache.setFaceMonitor(Constants.FACE_CACHE_CONTINUE_TMP_KEY,faceMonitorTmp);
-        }
-    }
 
 
     /**
      * 销毁人脸识别库
      */
     public void destroyFaceDataset() {
-        FaceIdenTool.releaseEngine(FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_PERSON_KEY));
-        FaceIdenTool.releaseEngine(FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_STRANGER_KEY));
-        FaceIdenTool.releaseEngine(FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_CONTINUE_TMP_KEY));
+        FaceIdenTool.releaseEngine(FaceMoniterCache.getFaceMonitor(Constants.FACE_FEAT_PTR_CACHE_KEY));
     }
 
     /**
@@ -172,7 +165,7 @@ public class FaceIdenService {
 
                             logger.info("FaceIdenService.handleCameraImage 3...");
                             //获取特征码
-                            FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot, imgFiles);
+                            FaceModel[] faceModels = FaceIdenTool.extractFeature(imgFiles);
                             logger.info("FaceIdenService.handleCameraImage 4...");
                            // List<IdenFaceImage> idenFaceImageList = new ArrayList<>();
                             for (int i = 0; i < imgFiles.length; i++) {
@@ -237,17 +230,20 @@ public class FaceIdenService {
 
                                 idenFaceImage.setImage(fileUrl + "camera/image/" + cameraCode + "/" + finalImgFile.getName());
 
-                                //和人员图像库比对特征码,关联personId
-                                FaceMonitor faceMonitorPerson = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_PERSON_KEY);
-                                if (faceModels[i] != null && faceMonitorPerson != null) {
+                                //和人脸图特征缓存比对特征码,关联personId
+                                FaceMonitor faceMonitor = FaceMoniterCache.getFaceMonitor(Constants.FACE_FEAT_PTR_CACHE_KEY);
+                                if (faceModels[i] != null && faceMonitor != null) {
+
+                                    FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitor, faceModels[i]);
+                                    if (faceRetrieveResultVO != null) { //有命中,要么是注册人员,要么是以前的陌生人员
+                                        long hitUid = faceRetrieveResultVO.getIndex();
+                                        idenFaceImage.setUid(hitUid);
 
-                                    FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorPerson, faceModels[i],false);
-                                    if (faceRetrieveResultVO != null) {
-                                        long hitIndex = faceRetrieveResultVO.getIndex();
-                                        IdenPerson idenPerson = idenPersonService.getById(hitIndex);
+                                        QueryWrapper<IdenPerson> idenPersonQueryWrapper = new QueryWrapper<>();
+                                        idenPersonQueryWrapper.lambda().eq(IdenPerson::getUid,hitUid);
+                                        IdenPerson idenPerson = idenPersonService.getOne(idenPersonQueryWrapper);
                                         if (idenPerson != null) {
                                             idenFaceImage.setPersonId(idenPerson.getId());
-                                            idenFaceImage.setUid(idenPerson.getUid());
                                             idenFaceImage.setType(idenPerson.getType());
                                             idenFaceImage.setGender(idenPerson.getGender());
                                             float score = faceRetrieveResultVO.getScore();
@@ -255,32 +251,43 @@ public class FaceIdenService {
                                             double similarity = b.divide(new BigDecimal(100)).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
 
                                             idenFaceImage.setSimilarity(similarity);
+                                        } else {
+                                            QueryWrapper<IdenPersonStranger> idenPersonStrangerQueryWrapper = new QueryWrapper<>();
+                                            idenPersonStrangerQueryWrapper.lambda().eq(IdenPersonStranger::getUid,hitUid);
+                                            IdenPersonStranger idenPersonStranger = idenPersonStrangerService.getOne(idenPersonStrangerQueryWrapper);
+                                            if(idenPersonStranger != null) {
+                                                idenFaceImage.setPersonId(idenPersonStranger.getId());
+
+                                                idenFaceImage.setType(PersonTypeEnum.STRANGER.getValue());
+                                                float score = faceRetrieveResultVO.getScore();
+                                                BigDecimal b = new BigDecimal(score);
+                                                double similarity = b.divide(new BigDecimal(100)).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+                                                idenFaceImage.setSimilarity(similarity);
+                                            }
                                         }
+                                    }  else { //没有命中,肯定是新增陌生人
+                                        idenFaceImage.setType(PersonTypeEnum.STRANGER.getValue());
+                                        idenFaceImage.setUid(redisUtil.generate(RedisKeyConstant.UID_KEY));
+                                        //添加陌生人员表数据
+                                        IdenPersonStranger idenPersonStranger = new IdenPersonStranger();
+                                        BeanUtil.copyProperties(idenFaceImage,idenPersonStranger);
+                                        idenPersonStranger.setCreateTime(new Date());
+                                        this.idenPersonStrangerService.save(idenPersonStranger);
+
+                                        //追加人脸库缓存
+                                        FaceModel[] dataset = new FaceModel[1];
+                                        dataset[0] = new FaceModel();
+                                        dataset[0].setPersonId(idenFaceImage.getUid().intValue());
+                                        dataset[0].setName(String.valueOf(idenFaceImage.getUid()));
+                                        dataset[0].setFeatValue(ByteUtil.hex2Byte(idenFaceImage.getFeatPtr()));
+                                        faceMonitor.appendFaceDataset(dataset);
                                     }
                                 }
                                 logger.info("FaceIdenService.handleCameraImage 6...");
-                                if (idenFaceImage.getPersonId() == null) { //没有关联上,是陌生人
-                                    idenFaceImage.setType(PersonTypeEnum.STRANGER.getValue());
 
-                                    //查询以前的陌生人图库,进行人脸识别,若是同一个人,得到uid, 设置为一样
-                                    String uid = relevanceBeforeFace(idenFaceImage.getFeatPtr());
-                                    if (StringUtils.isEmpty(uid)) {
-                                        uid = UUID.randomUUID().toString();
-                                    }
-                                    idenFaceImage.setUid(uid);
-                                }
                                 idenFaceImage.setCreateTime(new Date());
                                 idenFaceImageService.save(idenFaceImage);
-                                //追加陌生人脸库缓存
-                                if(PersonTypeEnum.STRANGER.getValue().equals(idenFaceImage.getType())) {
-                                    FaceMonitor faceMonitorStranger = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_STRANGER_KEY);
-                                    FaceModel[] dataset = new FaceModel[1];
-                                    dataset[0] = new FaceModel();
-                                    dataset[0].setPersonId(idenFaceImage.getId().intValue());
-                                    dataset[0].setName(String.valueOf(0));
-                                    dataset[0].setFeatValue(ByteUtil.hex2Byte(idenFaceImage.getFeatPtr()));
-                                    faceMonitorStranger.appendFaceDataset(dataset);
-                                }
+
                             }
                             logger.info("FaceIdenService.handleCameraImage 7...");
 
@@ -293,19 +300,7 @@ public class FaceIdenService {
         logger.info("FaceIdenService.handleCameraImage end");
     }
 
-    //查询以前的陌生人图库,进行人脸识别,若是同一个人,得到uid
-    private String relevanceBeforeFace(String featPtrVisitor){
-        FaceMonitor faceMonitorStranger = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_STRANGER_KEY);
-        FaceRetrieveResultVO vo = FaceIdenTool.getHitResult(faceMonitorStranger,featPtrVisitor,false);
-        if(vo != null) {
-            long index = vo.getIndex();
-            IdenFaceImage idenFaceImage = this.idenFaceImageService.getById(index);
-            if(idenFaceImage != null){
-                return idenFaceImage.getUid();
-            }
-        }
-      return null;
-    }
+
 
 
    //是否连拍
@@ -336,7 +331,8 @@ public class FaceIdenService {
             logger.info("FaceIdenService.isContinuation ...4 featPtrList =" + featPtrList);
 
             if(CollUtil.isNotEmpty(featPtrList)){
-                FaceMonitor faceMonitorTmp = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_CONTINUE_TMP_KEY);
+                MyFaceMonitor myFaceMonitorTmp = FaceIdenTool.getMyFaceMonitor();
+                FaceMonitor faceMonitorTmp = myFaceMonitorTmp.getFaceMonitor();
                 FaceModel[] dataset = new FaceModel[featPtrList.size()];
                 for(int i = 0; i< featPtrList.size(); i++) {
                     dataset[i] = new FaceModel();
@@ -346,8 +342,9 @@ public class FaceIdenService {
                 }
                 faceMonitorTmp.loadFaceDataset(dataset);
 
-                FaceRetrieveResultVO vo = FaceIdenTool.getHitResult(faceMonitorTmp,featPtr,false);
+                FaceRetrieveResultVO vo = FaceIdenTool.getHitResult(faceMonitorTmp,featPtr);
                 logger.info("FaceIdenService.isContinuation ... 5==" + vo);
+                FaceIdenTool.returnObjectToPool(myFaceMonitorTmp);
                 return vo != null;
             } else {
                 return false;
@@ -361,22 +358,6 @@ public class FaceIdenService {
 
     public void reloadFaceDataset(){
         //重新加载人脸库缓存
-        FaceMonitor faceMonitorPerson = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_PERSON_KEY);
-
-        QueryWrapper<IdenPerson> queryWrapper = new QueryWrapper();
-        queryWrapper.select("id","name","feat_ptr");
-        queryWrapper.lambda().isNotNull(IdenPerson::getFeatPtr);
-        List<IdenPerson> idenPersonList = idenPersonService.list(queryWrapper);
-        if (CollUtil.isNotEmpty(idenPersonList)) {
-            FaceModel[] dataset = new FaceModel[idenPersonList.size()];
-            for(int i = 0; i < idenPersonList.size(); i++){
-                IdenPerson idenPerson = idenPersonList.get(i);
-                dataset[i] = new FaceModel();
-                dataset[i].setPersonId(idenPerson.getId().intValue());
-                dataset[i].setName(String.valueOf(i));
-                dataset[i].setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
-            }
-            faceMonitorPerson.loadFaceDataset(dataset);
-        }
+         initFaceDataset();
     }
 }

+ 15 - 16
src/main/java/com/iden/bms/service/PersonService.java

@@ -532,7 +532,7 @@ public class PersonService {
                     personVOList.forEach(item->{
                         IdenPerson idenPerson = new IdenPerson();
                         BeanUtil.copyProperties(item,idenPerson);
-                        idenPerson.setUid(UUID.randomUUID().toString());
+                        idenPerson.setUid(redisUtil.generate(RedisKeyConstant.UID_KEY));
 
                         idenPerson.setCreateTime(new Date());
                         idenPersonService.save(idenPerson);
@@ -745,7 +745,7 @@ public class PersonService {
         //保存人员
         IdenPerson idenPerson = new IdenPerson();
         BeanUtil.copyProperties(vo,idenPerson);
-        idenPerson.setUid(UUID.randomUUID().toString());
+        idenPerson.setUid(redisUtil.generate(RedisKeyConstant.UID_KEY));
         idenPerson.setCreateTime(new Date());
         //识别
         String image = idenPerson.getImage();
@@ -763,18 +763,6 @@ public class PersonService {
         appendFaceDataset(idenPerson);
     }
 
-    private void appendFaceDataset(IdenPerson idenPerson){
-        //追加陌生人脸库缓存
-        FaceMonitor faceMonitorPerson = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_PERSON_KEY);
-        FaceModel[] dataset = new FaceModel[1];
-        dataset[0] = new FaceModel();
-        dataset[0].setPersonId(idenPerson.getId().intValue());
-        dataset[0].setName(String.valueOf(0));
-        dataset[0].setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
-        faceMonitorPerson.appendFaceDataset(dataset);
-    }
-
-
 
     /**
      * 修改人员
@@ -801,7 +789,7 @@ public class PersonService {
                     //识别
                     String fileNameNew = newImage.substring(newImage.lastIndexOf("/") + 1);
                     File imgFileNew = new File(idenRoot + "data/final/person/image/" + idenCommunity.getCode() + "/" + fileNameNew);
-                    String featPtr = FaceIdenTool.getFeatPtr(idenRoot,imgFileNew);
+                    String featPtr = FaceIdenTool.getFeatPtr(imgFileNew);
                     if (FaceIdenTool.isBad(featPtr)){
                         File discardDir = new File(imgFileNew.getParentFile().getAbsolutePath().replace("final","discard"));
                         if(!discardDir.exists()){
@@ -855,7 +843,7 @@ public class PersonService {
 
         String fileName = image.substring(image.lastIndexOf("/") + 1);
         File imgFile = new File(idenRoot + "data/final/person/image/"+ communityCode + "/"  + fileName);
-        String featPtr = FaceIdenTool.getFeatPtr(idenRoot,imgFile);
+        String featPtr = FaceIdenTool.getFeatPtr(imgFile);
         if (FaceIdenTool.isBad(featPtr)) {
             File discardDir = new File(imgFile.getParentFile().getAbsolutePath().replace("final","discard"));
             if(!discardDir.exists()){
@@ -869,4 +857,15 @@ public class PersonService {
 
     }
 
+    private void appendFaceDataset(IdenPerson idenPerson){
+        //追加人脸库缓存
+        FaceMonitor faceMonitorPerson = FaceMoniterCache.getFaceMonitor(Constants.FACE_FEAT_PTR_CACHE_KEY);
+        FaceModel[] dataset = new FaceModel[1];
+        dataset[0] = new FaceModel();
+        dataset[0].setPersonId(idenPerson.getUid().intValue());
+        dataset[0].setName(String.valueOf(idenPerson.getUid()));
+        dataset[0].setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
+        faceMonitorPerson.appendFaceDataset(dataset);
+    }
+
 }

+ 8 - 4
src/main/java/com/iden/bms/service/TraceService.java

@@ -17,6 +17,7 @@ import com.iden.common.entity.IdenCommunity;
 import com.iden.common.entity.IdenFaceImage;
 import com.iden.common.exception.BDException;
 
+import com.iden.common.facetool.pool.MyFaceMonitor;
 import com.iden.common.service.IdenCameraService;
 import com.iden.common.service.IdenCameraVideoService;
 import com.iden.common.service.IdenCommunityService;
@@ -136,7 +137,7 @@ public class TraceService {
         }
 
         //上传的图像的特征码结构体数组
-        FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot,imgFiles);
+        FaceModel[] faceModels = FaceIdenTool.extractFeature(imgFiles);
 
         //初始化引擎,加载摄像头上传的在时间段内的图像人脸特征库
         QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
@@ -158,12 +159,13 @@ public class TraceService {
             dataset[i].setName(String.valueOf(i));
             dataset[i].setFeatValue(ByteUtil.hex2Byte(idenFaceImage.getFeatPtr()));
         }
-
-        FaceMonitor faceMonitorFaceImag = FaceIdenTool.initFaceMonitorWithDataset(idenRoot,dataset);
+        MyFaceMonitor myFaceMonitor = FaceIdenTool.getMyFaceMonitor();
+        FaceMonitor faceMonitorFaceImag = myFaceMonitor.getFaceMonitor();
+        faceMonitorFaceImag.loadFaceDataset(dataset);
         for(int i = 0; i < faceModels.length; i++) {
             FaceModel faceModel = faceModels[i];
             List<TraceVO> traceVOList = new ArrayList<>();
-            FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorFaceImag,faceModel,true);
+            FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorFaceImag,faceModel);
            if (faceRetrieveResultVO != null) {
                long hitIndex = faceRetrieveResultVO.getIndex();
                IdenFaceImage idenFaceImage = idenFaceImageService.getById(hitIndex);
@@ -196,6 +198,8 @@ public class TraceService {
            }
             result.put(imageNameArr[i],traceVOList);
         }
+
+        FaceIdenTool.returnObjectToPool(myFaceMonitor);
         return result;
     }
 

+ 10 - 2
src/main/java/com/iden/bms/service/WarningPersonService.java

@@ -48,6 +48,9 @@ public class WarningPersonService {
     private IdenWarningPersonTraceService idenWarningPersonTraceService;
     @Resource
     private IdenCameraService idenCameraService;
+    @Resource
+    private IdenPersonStrangerService idenPersonStrangerService;
+
     /**
      * 根据小区查询预警人员列表分页
      * @return
@@ -137,7 +140,7 @@ public class WarningPersonService {
      *  查询轨迹列表
      * @return
      */
-    public List<TraceVO> listTrace(String uid, String beginDate, String endDate, UserLoginedConvertVO loginUser) {
+    public List<TraceVO> listTrace(Long uid, String beginDate, String endDate, UserLoginedConvertVO loginUser) {
         List<TraceVO> vos = new ArrayList<>();
         QueryWrapper<IdenWarningPersonTrace> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(IdenWarningPersonTrace::getUid,uid)
@@ -181,7 +184,7 @@ public class WarningPersonService {
 
         if(WarningTypeEnum.STRANGER.getValue().equals(vo.getType())) {
             if (1 == vo.getObtainPersonInfo()){ //已经获得本人信息
-                //生成人员数据
+                //生成注册人员数据
                 IdenPerson idenPerson = new IdenPerson();
                 idenPerson.setName(vo.getPersonName());
                 idenPerson.setUid(idenWarningPerson.getUid());
@@ -193,6 +196,11 @@ public class WarningPersonService {
                 idenPerson.setCreateTime(new Date());
                 idenPerson.setType(PersonTypeEnum.COMMUNITY.getValue());
                 this.idenPersonService.save(idenPerson);
+
+                //删除陌生人员数据
+                QueryWrapper<IdenPersonStranger> idenPersonStrangerQueryWrapper = new QueryWrapper<>();
+                idenPersonStrangerQueryWrapper.lambda().eq(IdenPersonStranger::getUid,vo.getUid());
+                idenPersonStrangerService.remove(idenPersonStrangerQueryWrapper);
             }
         }
         MyBeanUtils.copyProperties(vo,idenWarningPerson);

+ 12 - 0
src/main/java/com/iden/common/cache/FaceMoniterCache.java

@@ -2,11 +2,15 @@ package com.iden.common.cache;
 
 
 import com.face.monitor.FaceMonitor;
+import com.iden.common.facetool.pool.MyFaceMonitor;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+
 import java.util.HashMap;
 import java.util.Map;
 
 public class FaceMoniterCache {
     private static Map<String, FaceMonitor> faceMonitorHashMap = new HashMap<>();
+    private static Map<String, GenericObjectPool<MyFaceMonitor>> genericObjectPoolHashMap = new HashMap<>();
 
     public static FaceMonitor getFaceMonitor(String key){
       return faceMonitorHashMap.get(key);
@@ -15,4 +19,12 @@ public class FaceMoniterCache {
     public static void setFaceMonitor(String key,FaceMonitor faceMonitor){
          faceMonitorHashMap.put(key,faceMonitor);
     }
+
+    public static GenericObjectPool<MyFaceMonitor> getGenericObjectPool(String key){
+        return genericObjectPoolHashMap.get(key);
+    }
+
+    public static void setGenericObjectPool(String key,GenericObjectPool<MyFaceMonitor> genericObjectPool){
+        genericObjectPoolHashMap.put(key,genericObjectPool);
+    }
 }

+ 2 - 0
src/main/java/com/iden/common/cache/RedisKeyConstant.java

@@ -30,4 +30,6 @@ public class RedisKeyConstant {
 
     public static final String PERSON_DELETE = "PERSON:DELETE";
     public static final String PERSON_UPDATE = "PERSON:UPDATE";
+
+    public static final String UID_KEY = "UID_KEY";
 }

+ 13 - 2
src/main/java/com/iden/common/cache/RedisUtil.java

@@ -1,6 +1,7 @@
 package com.iden.common.cache;
 
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.support.atomic.RedisAtomicLong;
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
@@ -137,7 +138,15 @@ public class RedisUtil {
             e.printStackTrace();  
             return false;  
         }  
-    }  
+    }
+
+    /**
+     *     使用Redis生成全局唯一自增ID
+     */
+    public long generate(String key) {
+        RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
+        return redisAtomicLong.incrementAndGet();
+    }
 
     /** 
      * 递增 
@@ -221,7 +230,9 @@ public class RedisUtil {
             e.printStackTrace();  
             return false;  
         }  
-    }  
+    }
+
+
 
     /** 
      * 向一张hash表中放入数据,如果不存在将创建 

+ 3 - 3
src/main/java/com/iden/common/constant/Constants.java

@@ -16,8 +16,8 @@ public interface Constants {
      */
     String LOGIN_TOKEN_KEY = "token";
 
-   String FACE_CACHE_PERSON_KEY = "person";
-   String FACE_CACHE_STRANGER_KEY = "stranger";
-   String FACE_CACHE_CONTINUE_TMP_KEY = "continue_tmp";
+    String FACE_MONITOR_POOL_KEY = "FACE_MONITOR_POOL";
+
+   String FACE_FEAT_PTR_CACHE_KEY = "FACE_FEAT_PTR_CACHE";
 
 }

+ 1 - 1
src/main/java/com/iden/common/entity/IdenFaceImage.java

@@ -36,7 +36,7 @@ public class IdenFaceImage implements Serializable {
 
     @ApiModelProperty("唯一生物学标识")
     @TableField("UID")
-    private String uid;
+    private Long uid;
 
 
     @ApiModelProperty("数据日期(yyyyMMdd)")

+ 1 - 1
src/main/java/com/iden/common/entity/IdenPerson.java

@@ -36,7 +36,7 @@ public class IdenPerson implements Serializable {
 
     @ApiModelProperty("唯一生物学标识")
     @TableField("UID")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("人员编码(人员ID)")
     @TableField("CODE")

+ 75 - 0
src/main/java/com/iden/common/entity/IdenPersonStranger.java

@@ -0,0 +1,75 @@
+package com.iden.common.entity;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 陌生人员表(IdenPersonStranger)实体类
+ *
+ * @author makejava
+ * @since 2022-01-11 15:44:04
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("iden_person_stranger")
+@ApiModel(value = "陌生人员表", description = "")
+public class IdenPersonStranger implements Serializable {
+    private static final long serialVersionUID = -60106599043831937L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("唯一生物学标识")
+    @TableField("UID")
+    private Long uid;
+
+
+    @ApiModelProperty("人脸特征码")
+    @TableField("FEAT_PTR")
+    private String featPtr;
+
+
+    @ApiModelProperty("图像")
+    @TableField("IMAGE")
+    private String image;
+
+
+    @ApiModelProperty("出现小区id")
+    @TableField("COMMUNITY_ID")
+    private Long communityId;
+
+
+    @ApiModelProperty("备注")
+    @TableField("REMARK")
+    private String remark;
+
+
+    @ApiModelProperty("createTime")
+    @TableField("CREATE_TIME")
+    private Date createTime;
+
+
+    @ApiModelProperty("modifyTime")
+    @TableField("MODIFY_TIME")
+    private Date modifyTime;
+
+
+}

+ 1 - 1
src/main/java/com/iden/common/entity/IdenWarningEvent.java

@@ -36,7 +36,7 @@ public class IdenWarningEvent implements Serializable {
 
     @ApiModelProperty("唯一生物学标识")
     @TableField("UID")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("预警人员表ID")
     @TableField("WARNING_PERSON_ID")

+ 1 - 1
src/main/java/com/iden/common/entity/IdenWarningPerson.java

@@ -36,7 +36,7 @@ public class IdenWarningPerson implements Serializable {
 
     @ApiModelProperty("唯一生物学标识")
     @TableField("UID")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("数据日期(yyyyMMdd)")
     @TableField("DATA_DATE")

+ 1 - 1
src/main/java/com/iden/common/entity/IdenWarningPersonHis.java

@@ -39,7 +39,7 @@ public class IdenWarningPersonHis implements Serializable {
 
     @ApiModelProperty("唯一生物学标识")
     @TableField("UID")
-    private String uid;
+    private Long uid;
 
 
     @ApiModelProperty("数据日期(yyyyMMdd)")

+ 1 - 1
src/main/java/com/iden/common/entity/IdenWarningPersonTrace.java

@@ -37,7 +37,7 @@ public class IdenWarningPersonTrace implements Serializable {
 
     @ApiModelProperty("唯一生物学标识")
     @TableField("UID")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("数据日期(yyyyMMdd)")
     @TableField("DATA_DATE")

+ 71 - 51
src/main/java/com/iden/common/facetool/FaceIdenTool.java

@@ -3,11 +3,16 @@ package com.iden.common.facetool;
 import com.face.monitor.FaceMonitor;
 import com.face.monitor.model.FaceModel;
 import com.face.monitor.model.FaceRecogRetrieveResult;
-import com.face.monitor.model.Image;
-import com.face.monitor.model.RecogResult;
+import com.iden.common.cache.FaceMoniterCache;
+import com.iden.common.constant.Constants;
+import com.iden.common.facetool.pool.MyFaceMonitor;
+import com.iden.common.facetool.pool.ResourcePoolableObjectFactory;
 import com.iden.common.util.ByteUtil;
 import com.iden.common.vo.FaceRetrieveResultVO;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.pool2.PooledObjectFactory;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
@@ -18,46 +23,66 @@ import java.util.List;
 public class FaceIdenTool {
     private static final Logger logger = LogManager.getLogger(FaceIdenTool.class);
 
-    /**
-     * 初始化引擎
-     * @param idenRoot
-     * @return
-     */
-    public static FaceMonitor initFaceMonitor(String idenRoot) {
-        //初始化引擎
-        FaceMonitor faceMonitor = new FaceMonitor();
-        faceMonitor.init(idenRoot + "face/model", 0);
-        return faceMonitor;
+    public static void initPool() {
+        // 创建池对象工厂
+        PooledObjectFactory<MyFaceMonitor> factory = new ResourcePoolableObjectFactory();
+
+        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
+        // 最大空闲数
+        poolConfig.setMaxIdle(5);
+        // 最小空闲数, 池中只有一个空闲对象的时候,池会在创建一个对象,并借出一个对象,从而保证池中最小空闲数为1
+        poolConfig.setMinIdle(1);
+        // 最大池对象总数
+        poolConfig.setMaxTotal(50);
+        // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
+        poolConfig.setMinEvictableIdleTimeMillis(1800000);
+        // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
+        poolConfig.setTimeBetweenEvictionRunsMillis(1800000 * 2L);
+        // 在获取对象的时候检查有效性, 默认false
+        poolConfig.setTestOnBorrow(true);
+        // 在归还对象的时候检查有效性, 默认false
+        poolConfig.setTestOnReturn(false);
+        // 在空闲时检查有效性, 默认false
+        poolConfig.setTestWhileIdle(false);
+        // 最大等待时间, 默认的值为-1,表示无限等待。
+        poolConfig.setMaxWaitMillis(5000);
+        // 是否启用后进先出, 默认true
+        poolConfig.setLifo(true);
+        // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
+        poolConfig.setBlockWhenExhausted(true);
+        // 每次逐出检查时 逐出的最大数目 默认3
+        poolConfig.setNumTestsPerEvictionRun(3);
+
+        // 创建对象池
+        final GenericObjectPool<MyFaceMonitor> pool = new GenericObjectPool<MyFaceMonitor>(factory, poolConfig);
+        FaceMoniterCache.setGenericObjectPool(Constants.FACE_MONITOR_POOL_KEY, pool);
     }
 
     /**
-     * 初始化引擎,加载图像人脸特征库
-     * @param idenRoot
-     * @param dataset
+     * 获取引擎
      * @return
      */
-    public static FaceMonitor initFaceMonitorWithDataset(String idenRoot, FaceModel[] dataset) {
-        if(dataset == null || dataset.length == 0){
-            return null;
+    public static MyFaceMonitor getMyFaceMonitor() {
+        try {
+            // 对象池
+            final GenericObjectPool<MyFaceMonitor> pool = FaceMoniterCache.getGenericObjectPool(Constants.FACE_MONITOR_POOL_KEY);
+            MyFaceMonitor myFaceMonitor = pool.borrowObject();
+            return myFaceMonitor;
+        } catch (Exception e){
+            e.printStackTrace();
         }
-        //初始化引擎
-        FaceMonitor faceMonitor = initFaceMonitor(idenRoot);
-        faceMonitor.loadFaceDataset(dataset);
-
-        return faceMonitor;
+        return null;
     }
 
 
     /**
      * 批量获取人脸特征码结构体
-     * @param idenRoot
      * @param imgFiles
      * @return
      */
-    public static FaceModel[] extractFeature(String idenRoot, File[] imgFiles){
-        //初始化引擎
-        FaceMonitor faceMonitor = new FaceMonitor();
-        faceMonitor.init(idenRoot + "face/model", 0);
+    public static FaceModel[] extractFeature(File[] imgFiles){
+        //获取引擎
+        FaceMonitor faceMonitor = getMyFaceMonitor().getFaceMonitor();
 
         List<byte[]> faceImageList = new ArrayList<>();
         if(imgFiles != null && imgFiles.length > 0){
@@ -66,24 +91,21 @@ public class FaceIdenTool {
             }
         }
         FaceModel[] faceModels = faceMonitor.extractFeature(faceImageList);
-        //释放人脸引擎
-        releaseEngine(faceMonitor);
         return faceModels;
     }
 
 
     /**
      * 得到单个特征码
-     * @param idenRoot
      * @param imgFile
      * @return
      */
-    public static String getFeatPtr(String idenRoot, File imgFile) {
+    public static String getFeatPtr(File imgFile) {
         if(imgFile == null || !imgFile.isFile()){
             return null;
         }
         File[] imgFiles = new File[]{imgFile};
-        FaceModel[] faceModels = extractFeature(idenRoot,imgFiles);
+        FaceModel[] faceModels = extractFeature(imgFiles);
 
         if(faceModels != null && faceModels.length > 0) {
             FaceModel faceModel = faceModels[0];
@@ -110,19 +132,16 @@ public class FaceIdenTool {
     }
 
     /**
-     * faceModel在faceMonitor的人脸特征库中检索命中的index
+     * faceModel在faceMonitor的人脸特征库中检索命中的底库的index
      * @param faceMonitor
      * @param faceModel
      * @return
      */
-    public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor, FaceModel faceModel,boolean isReleaseEngine) {
+    public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor, FaceModel faceModel) {
         if (faceMonitor == null){
             return null;
         }
         FaceRecogRetrieveResult faceRecogRetrieveResult = faceMonitor.faceRecogRetrieveFaceDataset(faceModel);
-        if(isReleaseEngine){
-            releaseEngine(faceMonitor);
-        }
         if(faceRecogRetrieveResult != null) {
             int index = faceRecogRetrieveResult.getOnePredictIds()[0];
             float score = faceRecogRetrieveResult.getOnePredictScores()[0];
@@ -135,33 +154,34 @@ public class FaceIdenTool {
         }
         return null;
     }
-    public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor,String featPtrVisitor,boolean isReleaseEngine){
+    public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor,String featPtrVisitor){
         FaceModel faceModelPtrVisitor = new FaceModel();
         faceModelPtrVisitor.setName(String.valueOf(0));
         faceModelPtrVisitor.setPersonId(0);
         logger.info("FaceIdenTool getHitResult2 3...");
         faceModelPtrVisitor.setFeatValue(ByteUtil.hex2Byte(featPtrVisitor));
         logger.info("FaceIdenTool getHitResult2 4..");
-        FaceRetrieveResultVO vo = getHitResult(faceMonitor,faceModelPtrVisitor,isReleaseEngine);
+        FaceRetrieveResultVO vo = getHitResult(faceMonitor,faceModelPtrVisitor);
         logger.info("FaceIdenTool getHitResult2 5..");
         return vo;
     }
 
     /**
-     * 使用dataPath的图片去库里查找,返回命中结果
-     * @param idenRoot
-     * @param dataPath
-     * @return
+     * 归还人脸引擎到池子里
+     * @param myFaceMonitor
      */
-    public static RecogResult watchFrame(String idenRoot,  String dataPath) {
-        //初始化引擎
-        FaceMonitor faceMonitor = new FaceMonitor();
-        faceMonitor.init(idenRoot + "face/model", 0);
-        Image image = faceMonitor.readImage(dataPath);
-        return faceMonitor.faceRecogMonitor(image);
+    public static void returnObjectToPool(MyFaceMonitor myFaceMonitor) {
+        // 对象池
+        final GenericObjectPool<MyFaceMonitor> pool = FaceMoniterCache.getGenericObjectPool(Constants.FACE_MONITOR_POOL_KEY);
+
+        pool.returnObject(myFaceMonitor);// 申请的资源用完了记得归还,不然其他人要申请时可能就没有资源用了
+
     }
 
-    //释放人脸引擎
+    /**
+     * 释放人脸引擎
+     * @param faceMonitor
+     */
     public static void releaseEngine(FaceMonitor faceMonitor) {
         if(faceMonitor != null){
             faceMonitor.releaseEngine();

+ 28 - 0
src/main/java/com/iden/common/facetool/pool/MyFaceMonitor.java

@@ -0,0 +1,28 @@
+package com.iden.common.facetool.pool;
+
+import com.face.monitor.FaceMonitor;
+import org.springframework.beans.factory.annotation.Value;
+
+
+public class MyFaceMonitor {
+
+    private FaceMonitor faceMonitor;
+
+    @Value("${iden.root:#{null}}")
+    private String idenRoot;
+
+    public MyFaceMonitor() {
+        synchronized (this) {
+            if( this.faceMonitor == null) {
+                //初始化引擎
+                this.faceMonitor = new FaceMonitor();
+                faceMonitor.init(idenRoot + "face/model", 0);
+            }
+        }
+    }
+
+    public FaceMonitor getFaceMonitor() {
+        return this.faceMonitor;
+    }
+
+}

+ 26 - 0
src/main/java/com/iden/common/facetool/pool/ResourcePoolableObjectFactory.java

@@ -0,0 +1,26 @@
+package com.iden.common.facetool.pool;
+
+import org.apache.commons.pool2.BasePooledObjectFactory;
+import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.impl.DefaultPooledObject;
+
+// 工厂类
+public class ResourcePoolableObjectFactory extends BasePooledObjectFactory<MyFaceMonitor>{
+
+    /**
+     * 创建一个对象实例
+     */
+    @Override
+    public MyFaceMonitor create() throws Exception {
+        return new MyFaceMonitor();
+    }
+
+    /**
+     * 包裹创建的对象实例,返回一个pooledobject
+     */
+    @Override
+    public PooledObject<MyFaceMonitor> wrap(MyFaceMonitor obj) {
+        return new DefaultPooledObject<MyFaceMonitor>(obj);
+    }
+
+}

+ 59 - 0
src/main/java/com/iden/common/facetool/pool/Test.java

@@ -0,0 +1,59 @@
+package com.iden.common.facetool.pool;
+
+import org.apache.commons.pool2.PooledObjectFactory;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+
+public class Test {
+
+    public static void main(String[] args) {
+        // 创建池对象工厂
+        PooledObjectFactory<MyFaceMonitor> factory = new ResourcePoolableObjectFactory();
+
+        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
+        // 最大空闲数
+        poolConfig.setMaxIdle(5);
+        // 最小空闲数, 池中只有一个空闲对象的时候,池会在创建一个对象,并借出一个对象,从而保证池中最小空闲数为1
+        poolConfig.setMinIdle(1);
+        // 最大池对象总数
+        poolConfig.setMaxTotal(50);
+        // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
+        poolConfig.setMinEvictableIdleTimeMillis(1800000);
+        // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
+        poolConfig.setTimeBetweenEvictionRunsMillis(1800000 * 2L);
+        // 在获取对象的时候检查有效性, 默认false
+        poolConfig.setTestOnBorrow(true);
+        // 在归还对象的时候检查有效性, 默认false
+        poolConfig.setTestOnReturn(false);
+        // 在空闲时检查有效性, 默认false
+        poolConfig.setTestWhileIdle(false);
+        // 最大等待时间, 默认的值为-1,表示无限等待。
+        poolConfig.setMaxWaitMillis(5000);
+        // 是否启用后进先出, 默认true
+        poolConfig.setLifo(true);
+        // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
+        poolConfig.setBlockWhenExhausted(true);
+        // 每次逐出检查时 逐出的最大数目 默认3
+        poolConfig.setNumTestsPerEvictionRun(3);
+
+        // 创建对象池
+        final GenericObjectPool<MyFaceMonitor> pool = new GenericObjectPool<MyFaceMonitor>(factory, poolConfig);
+
+        for (int i = 0; i < 40; i++) {
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        MyFaceMonitor myFaceMonitor = pool.borrowObject();// 注意,如果对象池没有空余的对象,那么这里会block,可以设置block的超时时间
+                        System.out.println(myFaceMonitor);
+                        Thread.sleep(1000);
+                        pool.returnObject(myFaceMonitor);// 申请的资源用完了记得归还,不然其他人要申请时可能就没有资源用了
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }).start();
+        }
+    }
+
+}

+ 15 - 0
src/main/java/com/iden/common/mapper/IdenPersonStrangerMapper.java

@@ -0,0 +1,15 @@
+package com.iden.common.mapper;
+
+import com.iden.common.entity.IdenPersonStranger;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 陌生人员表(IdenPersonStranger)表数据库访问层
+ *
+ * @author makejava
+ * @since 2022-01-11 15:44:04
+ */
+public interface IdenPersonStrangerMapper extends BaseMapper<IdenPersonStranger> {
+
+}

+ 14 - 0
src/main/java/com/iden/common/service/IdenPersonStrangerService.java

@@ -0,0 +1,14 @@
+package com.iden.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.iden.common.entity.IdenPersonStranger;
+
+/**
+ * 陌生人员表(IdenPersonStranger)表服务接口
+ *
+ * @author makejava
+ * @since 2022-01-11 15:44:05
+ */
+public interface IdenPersonStrangerService extends IService<IdenPersonStranger> {
+
+}

+ 18 - 0
src/main/java/com/iden/common/service/impl/IdenPersonStrangerServiceImpl.java

@@ -0,0 +1,18 @@
+package com.iden.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.iden.common.mapper.IdenPersonStrangerMapper;
+import com.iden.common.entity.IdenPersonStranger;
+import com.iden.common.service.IdenPersonStrangerService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 陌生人员表(IdenPersonStranger)表服务实现类
+ *
+ * @author makejava
+ * @since 2022-01-11 15:44:05
+ */
+@Service
+public class IdenPersonStrangerServiceImpl extends ServiceImpl<IdenPersonStrangerMapper, IdenPersonStranger> implements IdenPersonStrangerService {
+
+}

+ 1 - 1
src/main/java/com/iden/common/vo/FaceImageVO.java

@@ -25,7 +25,7 @@ public class FaceImageVO implements Serializable {
     private Long id;
 
     @ApiModelProperty("唯一生物学标识")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("人脸特征码")
     private String featPtr;

+ 1 - 1
src/main/java/com/iden/common/vo/PersonVO.java

@@ -26,7 +26,7 @@ public class PersonVO implements Serializable {
     private Long id;
 
     @ApiModelProperty("唯一生物学标识")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("人员编码(人员ID)")
     private String code;

+ 1 - 1
src/main/java/com/iden/common/vo/TraceVO.java

@@ -22,7 +22,7 @@ public class TraceVO implements Serializable {
     private static final long serialVersionUID = -44732106174401548L;
 
     @ApiModelProperty("唯一生物学标识")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("数据日期(yyyyMMdd)")
     private String dataDate;

+ 1 - 1
src/main/java/com/iden/common/vo/WarningEventVO.java

@@ -30,7 +30,7 @@ public class WarningEventVO implements Serializable {
     private Long id;
 
     @ApiModelProperty("唯一生物学标识")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("预警人员表ID")
     private Long warningPersonId;

+ 1 - 1
src/main/java/com/iden/common/vo/WarningPersonVO.java

@@ -24,7 +24,7 @@ public class WarningPersonVO implements Serializable {
     private Long id;
 
     @ApiModelProperty("唯一生物学标识")
-    private String uid;
+    private Long uid;
 
     @ApiModelProperty("数据日期(yyyyMMdd)")
     private String dataDate;

+ 1 - 1
src/main/resources/application-dev.properties

@@ -35,7 +35,7 @@ iden.root=/data/iden/
 file.url=http://124.70.58.209:17778/
 
 ##是否初始化加载人脸识别库,是:1,不:0
-init.face.dataset=0
+init.face.dataset=1
 
 #视频编辑程序所在路径
 ffmpeg.path=/data/iden/ffmpeg/ffmpeg-git-20211217-amd64-static/ffmpeg

+ 6 - 0
src/main/resources/mybatis/IdenPersonStrangerMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.iden.common.mapper.IdenPersonStrangerMapper">
+
+
+</mapper>