suntianwu 3 éve
szülő
commit
d69281a3c0

+ 1 - 1
pom.xml

@@ -14,7 +14,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.2.2.RELEASE</version>
+        <version>2.3.2.RELEASE</version>
         <relativePath/>
     </parent>
 

+ 0 - 4
src/main/java/com/iden/IdenSpringStart.java

@@ -37,9 +37,5 @@ public class IdenSpringStart {
         return factory;
     }
 
-    @Bean
-    public DictInit sictInit() {
-        return new DictInit();
-    }
 }
 

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

@@ -7,10 +7,11 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 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 DictInit implements CommandLineRunner {
 

+ 35 - 0
src/main/java/com/iden/bms/init/FaceMonitorDestroy.java

@@ -0,0 +1,35 @@
+package com.iden.bms.init;
+
+
+
+import com.iden.bms.service.FaceIdenService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+
+@Component
+public class FaceMonitorDestroy  implements DisposableBean {
+
+    private static final Logger logger = LogManager.getLogger(FaceMonitorDestroy.class);
+
+    @Resource
+    private FaceIdenService faceIdenService;
+    @Value("${init.face.dataset:#{null}}")
+    private String initFaceDataset;
+
+    @Override
+    public void destroy() throws Exception {
+        if("1".equals(initFaceDataset)) {
+            logger.info("销毁人脸识别库 start ...........................");
+            faceIdenService.destroyFaceDataset();
+            logger.info("销毁人脸识别库 end ...........................");
+        }
+    }
+
+}
+

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

@@ -2,29 +2,38 @@ package com.iden.bms.init;
 
 
 
-import com.iden.bms.service.SysDictService;
+import com.iden.bms.service.FaceIdenService;
 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;
 
 
-@Order(1)
+@Component
+@Order(2)
 public class FaceMonitorInit implements CommandLineRunner {
 
     private static final Logger logger = LogManager.getLogger(FaceMonitorInit.class);
 
     @Resource
-    private SysDictService sysDictService;
+    private FaceIdenService faceIdenService;
+
+    @Value("${init.face.dataset:#{null}}")
+    private String initFaceDataset;
 
 
     @Override
     public void run(String... args) throws Exception {
-        logger.info("初始化字典 start ...........................");
-        sysDictService.initDictCache();
-        logger.info("初始化字典 end ...........................");
+        if("1".equals(initFaceDataset)){
+            logger.info("初始化人脸识别库 start ...........................");
+            faceIdenService.initFaceDataset();
+            logger.info("初始化人脸识别库 end ...........................");
+        }
+
     }
 
 }

+ 210 - 145
src/main/java/com/iden/bms/service/FaceIdenService.java

@@ -8,16 +8,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.face.monitor.FaceMonitor;
 import com.face.monitor.model.FaceModel;
 import com.iden.bms.tool.FaceIdenTool;
+import com.iden.common.cache.FaceMoniterCache;
 import com.iden.common.cache.RedisKeyConstant;
 import com.iden.common.cache.RedisUtil;
+import com.iden.common.constant.Constants;
 import com.iden.common.entity.*;
 
 import com.iden.common.enums.HandleWarningStatusEnum;
 import com.iden.common.enums.PersonTypeEnum;
-import com.iden.common.service.IdenCameraService;
-import com.iden.common.service.IdenCameraVideoService;
-import com.iden.common.service.IdenCommunityService;
-import com.iden.common.service.IdenFaceImageService;
+import com.iden.common.service.*;
 
 import com.iden.common.util.ByteUtil;
 import com.iden.common.util.DateUtils;
@@ -53,6 +52,9 @@ public class FaceIdenService {
     private PersonService personService;
     @Resource
     private IdenCameraVideoService idenCameraVideoService;
+    @Resource
+    private IdenPersonService idenPersonService;
+
 
     @Resource
     private RedisUtil redisUtil;
@@ -62,8 +64,80 @@ public class FaceIdenService {
     @Value("${file.url:#{null}}")
     private String fileUrl;
 
+
     private static final Logger logger = LogManager.getLogger(FaceIdenService.class);
 
+    /**
+     * 初始化人脸识别库
+     */
+    public void initFaceDataset() {
+        intPesontFaceDataset();
+        intStrangerFaceDataset();
+        intTmprFaceDataset();
+    }
+
+    private void intPesontFaceDataset() {
+        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].setPersonId(idenPerson.getId().intValue());
+                dataset[i].setName(idenPerson.getUid());
+                dataset[i].setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
+            }
+
+            FaceMonitor faceMonitorPerson = FaceIdenTool.initFaceMonitorWithDataset(idenRoot,dataset);
+            if(faceMonitorPerson != null){
+                FaceMoniterCache.setFaceMonitor(Constants.FACE_CACHE_PERSON_KEY,faceMonitorPerson);
+            }
+        }
+    }
+
+    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].setPersonId(idenFaceImage.getId().intValue());
+                dataset[i].setName(idenFaceImage.getUid());
+                dataset[i].setFeatValue(ByteUtil.hex2Byte(idenFaceImage.getFeatPtr()));
+            }
+
+            FaceMonitor faceMonitorStranger = FaceIdenTool.initFaceMonitorWithDataset(idenRoot,dataset);
+            if(faceMonitorStranger != null){
+                FaceMoniterCache.setFaceMonitor(Constants.FACE_CACHE_STRANGER_KEY,faceMonitorStranger);
+            }
+        }
+    }
+
+    private void intTmprFaceDataset(){
+        FaceMonitor faceMonitorTmp = FaceIdenTool.initFaceMonitor(idenRoot);
+        if(faceMonitorTmp != null){
+            FaceMoniterCache.setFaceMonitor(Constants.FACE_CACHE_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_TMP_KEY));
+    }
+
     /**
      *  处理各摄像头上传的图像,去除没有人脸的、不是正面的、不符合标准的、连拍的图像
      * @throws Exception
@@ -79,146 +153,135 @@ public class FaceIdenService {
             File[] cameraCodeDirs = originImageDirFile.listFiles();
             if(cameraCodeDirs != null && cameraCodeDirs.length > 0){
                 logger.info("FaceIdenService.handleCameraImage 1...");
-                //初始化引擎,加载人员图像人脸特征库
-                String personImageDir = idenRoot + "data/final/person/image";
-
-                //递归获取人员图像目录下的图像文件
-                File[] imgPersonFiles = FileUtil.getFiles(personImageDir);
 
-                logger.info("FaceIdenService.handleCameraImage 2...imgPersonFiles==" + imgPersonFiles);
-                FaceMonitor faceMonitorPerson = null;
-                if(imgPersonFiles != null && imgPersonFiles.length > 0){
-                    faceMonitorPerson = FaceIdenTool.initFaceMonitor(idenRoot,imgPersonFiles);
-                }
+                for (File cameraCodedir : cameraCodeDirs) {
+                    if (cameraCodedir.isDirectory()) {
+                        File[] imgFiles = FileUtil.sortByName(cameraCodedir.listFiles());
+                        if (imgFiles != null && imgFiles.length > 0) {
 
-                try {
-                    for (File cameraCodedir : cameraCodeDirs) {
-                        if (cameraCodedir.isDirectory()) {
-                            File[] imgFiles = FileUtil.sortByName(cameraCodedir.listFiles());
-                            if (imgFiles != null && imgFiles.length > 0) {
-
-                                String cameraCode = cameraCodedir.getName();
-                                QueryWrapper<IdenCamera> queryWrapper = new QueryWrapper<>();
-                                queryWrapper.lambda().eq(IdenCamera::getCode, cameraCode);
-                                IdenCamera idenCamera = idenCameraService.getOne(queryWrapper);
-                                if (idenCamera == null) {
-                                    continue;
-                                }
+                            String cameraCode = cameraCodedir.getName();
+                            QueryWrapper<IdenCamera> queryWrapper = new QueryWrapper<>();
+                            queryWrapper.lambda().eq(IdenCamera::getCode, cameraCode);
+                            IdenCamera idenCamera = idenCameraService.getOne(queryWrapper);
+                            if (idenCamera == null) {
+                                continue;
+                            }
 
-                                logger.info("FaceIdenService.handleCameraImage 3...");
-                                //获取特征码
-                                FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot, imgFiles);
-                                logger.info("FaceIdenService.handleCameraImage 4...");
-                                List<IdenFaceImage> idenFaceImageList = new ArrayList<>();
-                                for (int i = 0; i < imgFiles.length; i++) {
-                                    logger.info("FaceIdenService.handleCameraImage 41...");
-                                    File imgFile = imgFiles[i];
-                                    String imgFileName = imgFile.getName();
-                                    IdenFaceImage idenFaceImage = new IdenFaceImage();
-                                    //识别特征码
-                                    if (faceModels[i] != null) {
-                                        logger.info("FaceIdenService.handleCameraImage 42...");
-                                        String featPtr = ByteUtil.byte2Hex(faceModels[i].getFeatValue());
-                                        logger.info("FaceIdenService.handleCameraImage 42...featPtr=="+featPtr);
-                                        //没有人脸的、不是正面的、不符合标准的,连拍的图片
-                                        if (FaceIdenTool.isBad(featPtr) || isContinuation(cameraCode, imgFileName, featPtr)) {
-                                            logger.info("FaceIdenService.handleCameraImage 43...");
-                                            File discardDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin", "discard"));
-                                            if (!discardDir.exists()) {
-                                                discardDir.mkdirs();
-                                            }
-                                            File finalImgFile = new File(discardDir, imgFileName);
-                                            imgFile.renameTo(finalImgFile);//移动到废弃目录
-                                            continue;
-                                        } else {
-                                            logger.info("FaceIdenService.handleCameraImage 44...");
-                                            idenFaceImage.setFeatPtr(featPtr);
-                                            //存到redis
-                                            redisUtil.hset(RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST + "_" + cameraCode, imgFileName, featPtr, RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST_TIME);
+                            logger.info("FaceIdenService.handleCameraImage 3...");
+                            //获取特征码
+                            FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot, imgFiles);
+                            logger.info("FaceIdenService.handleCameraImage 4...");
+                           // List<IdenFaceImage> idenFaceImageList = new ArrayList<>();
+                            for (int i = 0; i < imgFiles.length; i++) {
+                                logger.info("FaceIdenService.handleCameraImage 41...");
+                                File imgFile = imgFiles[i];
+                                String imgFileName = imgFile.getName();
+                                IdenFaceImage idenFaceImage = new IdenFaceImage();
+                                //识别特征码
+                                if (faceModels[i] != null) {
+                                    logger.info("FaceIdenService.handleCameraImage 42...");
+                                    String featPtr = ByteUtil.byte2Hex(faceModels[i].getFeatValue());
+                                    logger.info("FaceIdenService.handleCameraImage 42...featPtr=="+featPtr);
+                                    //没有人脸的、不是正面的、不符合标准的,连拍的图片
+                                    if (FaceIdenTool.isBad(featPtr) || isContinuation(cameraCode, imgFileName, featPtr)) {
+                                        logger.info("FaceIdenService.handleCameraImage 43...");
+                                        File discardDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin", "discard"));
+                                        if (!discardDir.exists()) {
+                                            discardDir.mkdirs();
                                         }
-
+                                        File finalImgFile = new File(discardDir, imgFileName);
+                                        imgFile.renameTo(finalImgFile);//移动到废弃目录
+                                        continue;
+                                    } else {
+                                        logger.info("FaceIdenService.handleCameraImage 44...");
+                                        idenFaceImage.setFeatPtr(featPtr);
+                                        //存到redis
+                                        redisUtil.hset(RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST + "_" + cameraCode, imgFileName, featPtr, RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST_TIME);
                                     }
-                                    logger.info("FaceIdenService.handleCameraImage 5...");
-                                    idenFaceImage.setCameraId(idenCamera.getId());
-                                    idenFaceImage.setCommunityId(idenCamera.getCommunityId());
-                                    String photographPlace = idenCamera.getPlace();
-                                    if (StringUtils.isEmpty(photographPlace)) {
-                                        IdenCommunity idenCommunity = idenCommunityService.getById(idenCamera.getCommunityId());
-                                        if (idenCommunity != null) {
-                                            photographPlace = idenCommunity.getName() + "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")";
-                                        } else {
-                                            photographPlace = "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")";
-                                        }
+
+                                }
+                                logger.info("FaceIdenService.handleCameraImage 5...");
+                                idenFaceImage.setCameraId(idenCamera.getId());
+                                idenFaceImage.setCommunityId(idenCamera.getCommunityId());
+                                String photographPlace = idenCamera.getPlace();
+                                if (StringUtils.isEmpty(photographPlace)) {
+                                    IdenCommunity idenCommunity = idenCommunityService.getById(idenCamera.getCommunityId());
+                                    if (idenCommunity != null) {
+                                        photographPlace = idenCommunity.getName() + "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")";
+                                    } else {
+                                        photographPlace = "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")";
                                     }
-                                    idenFaceImage.setPhotographPlace(photographPlace);
-                                    idenFaceImage.setLongitude(idenCamera.getLongitude());
-                                    idenFaceImage.setLatitude(idenCamera.getLatitude());
+                                }
+                                idenFaceImage.setPhotographPlace(photographPlace);
+                                idenFaceImage.setLongitude(idenCamera.getLongitude());
+                                idenFaceImage.setLatitude(idenCamera.getLatitude());
 
-                                    String photographTime = imgFileName.substring(0, imgFileName.indexOf("_"));
-                                    idenFaceImage.setPhotographTime(DateUtils.strToDate(photographTime, "yyyyMMddHHmmss"));
-                                    idenFaceImage.setDataDate(photographTime.substring(0, 8));
+                                String photographTime = imgFileName.substring(0, imgFileName.indexOf("_"));
+                                idenFaceImage.setPhotographTime(DateUtils.strToDate(photographTime, "yyyyMMddHHmmss"));
+                                idenFaceImage.setDataDate(photographTime.substring(0, 8));
 
-                                    File finalDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin", "final"));
-                                    if (!finalDir.exists()) {
-                                        finalDir.mkdirs();
-                                    }
-                                    logger.info("FaceIdenService.handleCameraImage ...finalDir == " + finalDir.getAbsolutePath());
-                                    logger.info("FaceIdenService.handleCameraImage ...imgFile.getName() == " + imgFileName);
-                                    File finalImgFile = new File(finalDir, imgFileName);
-
-                                    logger.info("FaceIdenService.handleCameraImage ...finalImgFile == " + finalImgFile.getAbsolutePath());
-
-                                    imgFile.renameTo(finalImgFile);//移动到最终目录
-
-                                    idenFaceImage.setImage(fileUrl + "camera/image/" + cameraCode + "/" + finalImgFile.getName());
-
-                                    //和人员图像库比对特征码,关联personId
-                                    if (faceModels[i] != null && faceMonitorPerson != null) {
-
-                                        FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorPerson, faceModels[i]);
-                                        if (faceRetrieveResultVO != null) {
-                                            int hitIndex = faceRetrieveResultVO.getIndex();
-                                            IdenPerson idenPerson = personService.getPersonIdByImageFileName(imgPersonFiles[hitIndex].getName());
-                                            if (idenPerson != null) {
-                                                idenFaceImage.setPersonId(idenPerson.getId());
-                                                idenFaceImage.setUid(idenPerson.getUid());
-                                                idenFaceImage.setType(idenPerson.getType());
-                                                idenFaceImage.setGender(idenPerson.getGender());
-                                                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);
-                                            }
+                                File finalDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin", "final"));
+                                if (!finalDir.exists()) {
+                                    finalDir.mkdirs();
+                                }
+                                logger.info("FaceIdenService.handleCameraImage ...finalDir == " + finalDir.getAbsolutePath());
+                                logger.info("FaceIdenService.handleCameraImage ...imgFile.getName() == " + imgFileName);
+                                File finalImgFile = new File(finalDir, imgFileName);
+
+                                logger.info("FaceIdenService.handleCameraImage ...finalImgFile == " + finalImgFile.getAbsolutePath());
+
+                                imgFile.renameTo(finalImgFile);//移动到最终目录
+
+                                idenFaceImage.setImage(fileUrl + "camera/image/" + cameraCode + "/" + finalImgFile.getName());
+
+                                //和人员图像库比对特征码,关联personId
+                                FaceMonitor faceMonitorPerson = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_PERSON_KEY);
+                                if (faceModels[i] != null && faceMonitorPerson != null) {
+
+                                    FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorPerson, faceModels[i]);
+                                    if (faceRetrieveResultVO != null) {
+                                        long hitIndex = faceRetrieveResultVO.getIndex();
+                                        IdenPerson idenPerson = idenPersonService.getById(hitIndex);
+                                        if (idenPerson != null) {
+                                            idenFaceImage.setPersonId(idenPerson.getId());
+                                            idenFaceImage.setUid(idenPerson.getUid());
+                                            idenFaceImage.setType(idenPerson.getType());
+                                            idenFaceImage.setGender(idenPerson.getGender());
+                                            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);
                                         }
                                     }
-                                    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);
+                                }
+                                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.setCreateTime(new Date());
-                                    idenFaceImageList.add(idenFaceImage);
+                                    idenFaceImage.setUid(uid);
                                 }
-                                logger.info("FaceIdenService.handleCameraImage 7...");
-                                //把图像存到图库中
-                                if (CollUtil.isNotEmpty(idenFaceImageList)) {
-                                    logger.info("FaceIdenService.handleCameraImage 8...");
-                                    idenFaceImageService.saveBatch(idenFaceImageList);
-                                    logger.info("FaceIdenService.handleCameraImage 9...");
+                                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].setPersonId(idenFaceImage.getId().intValue());
+                                    dataset[0].setName(idenFaceImage.getUid());
+                                    dataset[0].setFeatValue(ByteUtil.hex2Byte(idenFaceImage.getFeatPtr()));
+                                    faceMonitorStranger.appendFaceDataset(dataset);
                                 }
                             }
+                            logger.info("FaceIdenService.handleCameraImage 7...");
+
                         }
                     }
-                } finally {
-                    //释放人脸引擎
-                    FaceIdenTool.releaseEngine(faceMonitorPerson);
                 }
 
             }
@@ -228,24 +291,16 @@ public class FaceIdenService {
 
     //查询以前的陌生人图库,进行人脸识别,若是同一个人,得到uid
     private String relevanceBeforeFace(String featPtrVisitor){
-        QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(IdenFaceImage::getType, PersonTypeEnum.STRANGER.getValue())
-                .eq(IdenFaceImage::getHandleWarningStatus,HandleWarningStatusEnum.HANDLED.getValue());
-        //queryWrapper.last("limit 500"); //TODO 数据量大了需要分批处理 优化,以及是否区分小区
-        List<IdenFaceImage> list = this.idenFaceImageService.list(queryWrapper);
-        if (CollUtil.isNotEmpty(list)) {
-            List<String> featPtrList = new ArrayList<>();
-            for(IdenFaceImage idenFaceImage : list) {
-                String featPtr = idenFaceImage.getFeatPtr();
-                featPtrList.add(featPtr);
-            }
-
-            FaceRetrieveResultVO vo = FaceIdenTool.isHit(idenRoot,featPtrVisitor,featPtrList);
-            if(vo != null) {
-                return list.get(vo.getIndex()).getUid();
+        FaceMonitor faceMonitorStranger = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_STRANGER_KEY);
+        FaceRetrieveResultVO vo = FaceIdenTool.isHit(idenRoot,featPtrVisitor,faceMonitorStranger);
+        if(vo != null) {
+            long index = vo.getIndex();
+            IdenFaceImage idenFaceImage = this.idenFaceImageService.getById(index);
+            if(idenFaceImage != null){
+                return idenFaceImage.getUid();
             }
         }
-        return null;
+      return null;
     }
 
 
@@ -275,8 +330,18 @@ public class FaceIdenService {
                 }
             }
             logger.info("FaceIdenService.isContinuation ...4 featPtrList =" + featPtrList);
+
             if(CollUtil.isNotEmpty(featPtrList)){
-                FaceRetrieveResultVO vo = FaceIdenTool.isHit(idenRoot,featPtr,featPtrList);
+                FaceMonitor faceMonitorTmp = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_TMP_KEY);
+                FaceModel[] dataset = new FaceModel[featPtrList.size()];
+                for(int i = 0; i< featPtrList.size(); i++) {
+                    dataset[i].setPersonId(i);
+                    dataset[i].setName(String.valueOf(i));
+                    dataset[i].setFeatValue(ByteUtil.hex2Byte(featPtrList.get(i)));
+                }
+                faceMonitorTmp.loadFaceDataset(dataset);
+
+                FaceRetrieveResultVO vo = FaceIdenTool.isHit(idenRoot,featPtr,faceMonitorTmp);
                 logger.info("FaceIdenService.isContinuation ... 5==" + vo);
                 return vo != null;
             } else {

+ 43 - 1
src/main/java/com/iden/bms/service/PersonService.java

@@ -8,8 +8,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.face.monitor.FaceMonitor;
+import com.face.monitor.model.FaceModel;
 import com.iden.bms.tool.FaceIdenTool;
 import com.iden.common.cache.DictCache;
+import com.iden.common.cache.FaceMoniterCache;
+import com.iden.common.constant.Constants;
 import com.iden.common.entity.IdenCommunity;
 import com.iden.common.entity.IdenCrowd;
 import com.iden.common.entity.IdenPerson;
@@ -25,6 +29,7 @@ import com.iden.common.service.IdenCommunityService;
 import com.iden.common.service.IdenCrowdService;
 import com.iden.common.service.IdenPersonCrowdRefService;
 import com.iden.common.service.IdenPersonService;
+import com.iden.common.util.ByteUtil;
 import com.iden.common.util.DateUtils;
 import com.iden.common.util.ImgUtil;
 import com.iden.common.vo.*;
@@ -561,6 +566,7 @@ public class PersonService {
      * @param id
      * @return
      */
+    @Transactional(rollbackFor = Exception.class)
     public boolean deleteById(Long id){
         IdenPerson idenPerson = this.idenPersonService.getById(id);
 
@@ -576,7 +582,9 @@ public class PersonService {
                 imageFile.delete();
             }
         }
-        return this.idenPersonService.removeById(id);
+        this.idenPersonService.removeById(id);
+        reloadFaceDataset();
+        return true;
     }
 
     /**
@@ -697,6 +705,37 @@ public class PersonService {
 
         this.idenPersonService.save(idenPerson);
 
+        appendFaceDataset(idenPerson);
+    }
+
+    private void appendFaceDataset(IdenPerson idenPerson){
+        //追加陌生人脸库缓存
+        FaceMonitor faceMonitorPerson = FaceMoniterCache.getFaceMonitor(Constants.FACE_CACHE_PERSON_KEY);
+        FaceModel[] dataset = new FaceModel[1];
+        dataset[0].setPersonId(idenPerson.getId().intValue());
+        dataset[0].setName(idenPerson.getUid());
+        dataset[0].setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
+        faceMonitorPerson.appendFaceDataset(dataset);
+    }
+
+    private 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].setPersonId(idenPerson.getId().intValue());
+                dataset[i].setName(idenPerson.getUid());
+                dataset[i].setFeatValue(ByteUtil.hex2Byte(idenPerson.getFeatPtr()));
+            }
+            faceMonitorPerson.loadFaceDataset(dataset);
+        }
     }
 
     /**
@@ -744,6 +783,9 @@ public class PersonService {
         idenPerson.setModifyTime(new Date());
 
         this.idenPersonService.updateById(idenPerson);
+
+        reloadFaceDataset();
+
     }
 
     /**

+ 41 - 0
src/main/java/com/iden/bms/tool/FaceIdenTool.java

@@ -1,5 +1,6 @@
 package com.iden.bms.tool;
 
+import cn.hutool.core.collection.CollUtil;
 import com.face.monitor.FaceMonitor;
 import com.face.monitor.model.FaceModel;
 import com.face.monitor.model.FaceRecogRetrieveResult;
@@ -18,6 +19,35 @@ 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;
+    }
+
+    /**
+     * 初始化引擎,加载图像人脸特征库
+     * @param idenRoot
+     * @param dataset
+     * @return
+     */
+    public static FaceMonitor initFaceMonitorWithDataset(String idenRoot, FaceModel[] dataset) {
+        if(dataset == null || dataset.length == 0){
+            return null;
+        }
+        //初始化引擎
+        FaceMonitor faceMonitor = initFaceMonitor(idenRoot);
+        faceMonitor.loadFaceDataset(dataset);
+
+        return faceMonitor;
+    }
+
     /**
      * 初始化引擎,加载图像人脸特征库
      * @param idenRoot
@@ -135,6 +165,17 @@ public class FaceIdenTool {
         }
         return null;
     }
+    public static FaceRetrieveResultVO isHit(String idenRoot, String featPtrVisitor, FaceMonitor faceMonitor){
+        FaceModel faceModelPtrVisitor = new FaceModel();
+        faceModelPtrVisitor.setName(String.valueOf(0));
+        faceModelPtrVisitor.setPersonId(0);
+        logger.info("FaceIdenTool isHit 3...");
+        faceModelPtrVisitor.setFeatValue(ByteUtil.hex2Byte(featPtrVisitor));
+        logger.info("FaceIdenTool isHit 4..");
+        FaceRetrieveResultVO vo = getHitResult(faceMonitor,faceModelPtrVisitor);
+        logger.info("FaceIdenTool isHit 5..");
+        return vo;
+    }
 
     public static FaceRetrieveResultVO isHit(String idenRoot, String featPtrVisitor, List<String> featPtrList){
         //初始化引擎

+ 5 - 5
src/main/java/com/iden/common/cache/DictCache.java

@@ -8,18 +8,18 @@ import java.util.List;
 import java.util.Map;
 
 public class DictCache {
-    private static Map<String, List<SysDictItemVO>> ListSysDictItemVOMap = new HashMap<>();
+    private static Map<String, List<SysDictItemVO>> listSysDictItemVOMap = new HashMap<>();
 
     public static Map<String, List<SysDictItemVO>> getListSysDictItemVOMap() {
-        return ListSysDictItemVOMap;
+        return listSysDictItemVOMap;
     }
 
     public static void setListSysDictItemVOMap(Map<String, List<SysDictItemVO>> listSysDictItemVOMap) {
-        ListSysDictItemVOMap = listSysDictItemVOMap;
+        DictCache.listSysDictItemVOMap = listSysDictItemVOMap;
     }
 
     public static String getNameByValue(String dictType,String value){
-        List<SysDictItemVO> listSysDictItemVO = ListSysDictItemVOMap.get(dictType);
+        List<SysDictItemVO> listSysDictItemVO = listSysDictItemVOMap.get(dictType);
         if(CollUtil.isEmpty(listSysDictItemVO)){
             return null;
         }
@@ -32,7 +32,7 @@ public class DictCache {
     }
 
     public static String getValueByName(String dictType,String name){
-        List<SysDictItemVO> listSysDictItemVO = ListSysDictItemVOMap.get(dictType);
+        List<SysDictItemVO> listSysDictItemVO = listSysDictItemVOMap.get(dictType);
         if(CollUtil.isEmpty(listSysDictItemVO)){
             return null;
         }

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

@@ -0,0 +1,18 @@
+package com.iden.common.cache;
+
+
+import com.face.monitor.FaceMonitor;
+import java.util.HashMap;
+import java.util.Map;
+
+public class FaceMoniterCache {
+    private static Map<String, FaceMonitor> faceMonitorHashMap = new HashMap<>();
+
+    public static FaceMonitor getFaceMonitor(String key){
+      return faceMonitorHashMap.get(key);
+    }
+
+    public static void setFaceMonitor(String key,FaceMonitor faceMonitor){
+         faceMonitorHashMap.put(key,faceMonitor);
+    }
+}

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

@@ -16,6 +16,7 @@ public interface Constants {
      */
     String LOGIN_TOKEN_KEY = "token";
 
-
-
+   String FACE_CACHE_PERSON_KEY = "person";
+   String FACE_CACHE_STRANGER_KEY = "stranger";
+   String FACE_CACHE_TMP_KEY = "tmp";
 }

+ 3 - 1
src/main/java/com/iden/common/mapper/IdenPersonMapper.java

@@ -3,6 +3,8 @@ package com.iden.common.mapper;
 import com.iden.common.entity.IdenPerson;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 
 /**
  * 人员表(IdenPerson)表数据库访问层
@@ -11,5 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2021-12-22 17:23:47
  */
 public interface IdenPersonMapper extends BaseMapper<IdenPerson> {
-
+    List<String> getFeatPtrList();
 }

+ 3 - 1
src/main/java/com/iden/common/service/IdenPersonService.java

@@ -3,6 +3,8 @@ package com.iden.common.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.iden.common.entity.IdenPerson;
 
+import java.util.List;
+
 /**
  * 人员表(IdenPerson)表服务接口
  *
@@ -10,5 +12,5 @@ import com.iden.common.entity.IdenPerson;
  * @since 2021-12-22 17:23:47
  */
 public interface IdenPersonService extends IService<IdenPerson> {
-
+   List<String> getFeatPtrList();
 }

+ 5 - 1
src/main/java/com/iden/common/service/impl/IdenPersonServiceImpl.java

@@ -6,6 +6,8 @@ import com.iden.common.entity.IdenPerson;
 import com.iden.common.service.IdenPersonService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 人员表(IdenPerson)表服务实现类
  *
@@ -14,5 +16,7 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class IdenPersonServiceImpl extends ServiceImpl<IdenPersonMapper, IdenPerson> implements IdenPersonService {
-
+    public List<String> getFeatPtrList(){
+        return this.baseMapper.getFeatPtrList();
+    }
 }

+ 2 - 0
src/main/resources/application-dev.properties

@@ -34,3 +34,5 @@ iden.root=/data/iden/
 #文件访问http前缀
 file.url=http://124.70.58.209:17778/
 
+##是否初始化加载人脸识别库,是:1,不:0
+init.face.dataset=0

+ 4 - 1
src/main/resources/application-prod.properties

@@ -35,4 +35,7 @@ spring.redis.jedis.pool.min-idle=5
 #服务部署根目录
 iden.root=/data/iden/
 #图像访问http前缀
-image.url=http://124.70.58.209:17778/
+image.url=http://124.70.58.209:17778/
+
+##是否初始化加载人脸识别库,是:1,不:0
+init.face.dataset=0

+ 3 - 0
src/main/resources/application.properties

@@ -4,6 +4,9 @@ spring.profiles.active=dev
 # 配置服务端口号
 server.port=13456
 
+#优雅关闭
+server.shutdown=graceful
+
 ### spring配置
 # 配置服务名称
 spring.application.name=iden-service

+ 3 - 0
src/main/resources/mybatis/IdenPersonMapper.xml

@@ -2,5 +2,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.IdenPersonMapper">
 
+    <select id="getFeatPtrList" resultType="java.lang.String">
+        select feat_ptr from iden_person
+    </select>
 
 </mapper>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 4 - 2
src/test/java/com/face/monitor/FaceTest.java