suntianwu 3 år sedan
förälder
incheckning
8e6f8d1cc1

+ 2 - 0
src/main/java/com/iden/bms/face/FaceIdenService.java

@@ -128,6 +128,8 @@ public class FaceIdenService {
                                     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);

+ 52 - 13
src/main/java/com/iden/bms/service/WarningService.java

@@ -4,21 +4,21 @@ 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.iden.common.entity.IdenFaceImage;
-import com.iden.common.entity.IdenWarningEvent;
-import com.iden.common.entity.IdenWarningPerson;
-import com.iden.common.entity.IdenWarningPersonTrace;
+import com.iden.common.entity.*;
 import com.iden.common.enums.HandleWarningStatusEnum;
+import com.iden.common.enums.WarningTypeEnum;
 import com.iden.common.exception.BDException;
 
 
 import com.iden.common.service.*;
+import com.iden.common.util.DateUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -32,6 +32,10 @@ public class WarningService {
     @Resource
     private IdenFaceImageService idenFaceImageService;
     @Resource
+    private IdenCameraService idenCameraService;
+    @Resource
+    private IdenCommunityService idenCommunityService;
+    @Resource
     private IdenWarningEventService idenWarningEventService;
     @Resource
     private IdenWarningPersonService idenWarningPersonService;
@@ -55,26 +59,61 @@ public class WarningService {
         }
 
         for (IdenFaceImage idenFaceImage : idenFaceImageList) {
-            //去除同一个摄像头下2分钟内同一个人的人脸图像
-            if(true){
-               continue;
-            }
-            //重点人员识别预警
+
             String type = idenFaceImage.getType();
-            if (StringUtils.isNotEmpty(type) && type.indexOf("1") != -1) {
-                IdenWarningPerson idenWarningPerson = new IdenWarningPerson();
+            if (StringUtils.isNotEmpty(type) && type.contains("0")) { //陌生人员
 
+            }
+            else if (StringUtils.isNotEmpty(type) && type.contains("1")) { //重点人员
+                IdenWarningPerson idenWarningPerson = new IdenWarningPerson();
+                idenWarningPerson.setImage(idenFaceImage.getImage());
+                idenWarningPerson.setDataDate(DateUtils.strToDate(DateUtils.formatToDateStr(idenFaceImage.getPhotographTime(),"yyyy-MM-dd"),"yyyy-MM-dd"));
+                Long cameraId = idenFaceImage.getCameraId();
+                if(cameraId != null) {
+                    IdenCamera idenCamera = this.idenCameraService.getById(cameraId);
+                    idenWarningPerson.setCommunityName(idenCamera.getDistrict());
+                    idenWarningPerson.setSubdistrict(idenCamera.getSubdistrict());
+                }
+                Long communityId = idenFaceImage.getCommunityId();
+                if(communityId != null) {
+                    IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId);
+                    if (idenCommunity != null) {
+                        idenWarningPerson.setCommunityId(communityId);
+                        idenWarningPerson.setCommunityCode(idenCommunity.getCode());
+                        idenWarningPerson.setCommunityName(idenCommunity.getName());
+                    }
+                }
+                idenWarningPerson.setAppearFrequency(1);
+                idenWarningPerson.setEarliestAppearTime(idenFaceImage.getPhotographTime());
+                idenWarningPerson.setType(WarningTypeEnum.KEYNOTE.getValue());
+                idenWarningPerson.setPersonId(idenFaceImage.getPersonId());
+                idenWarningPerson.setCreateTime(idenFaceImage.getCreateTime());
                 this.idenWarningPersonService.save(idenWarningPerson);
 
                 IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
                 idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
+                idenWarningEvent.setDataTime(idenFaceImage.getPhotographTime());
+                idenWarningEvent.setImage(idenFaceImage.getImage());
+                idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
+                idenWarningEvent.setCommunityCode(idenWarningPerson.getCommunityCode());
+                idenWarningEvent.setCommunityName(idenWarningPerson.getCommunityName());
+                idenWarningEvent.setCommunityName(idenWarningPerson.getDistrict());
+                idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
+                idenWarningEvent.setAppearTime(idenFaceImage.getPhotographTime());
+                idenWarningEvent.setType(WarningTypeEnum.KEYNOTE.getValue());
+                idenWarningEvent.setPersonId(idenFaceImage.getPersonId());
+                idenWarningEvent.setCreateTime(idenFaceImage.getCreateTime());
                 this.idenWarningEventService.save(idenWarningEvent);
 
                 IdenWarningPersonTrace idenWarningPersonTrace = new IdenWarningPersonTrace();
-                BeanUtil.copyProperties(idenFaceImage,idenWarningPersonTrace);
-                idenWarningPersonTrace.setId(null);
+                BeanUtil.copyProperties(idenFaceImage,idenWarningPersonTrace,"id");
                 idenWarningPersonTrace.setWarningPersonId(idenWarningPerson.getId());
                 this.idenWarningPersonTraceService.save(idenWarningPersonTrace);
+            }
+            else if (StringUtils.isNotEmpty(type) && type.contains("2")) { //小区人员
+
+            }
+            else if (StringUtils.isNotEmpty(type) && type.contains("3")) { //昼伏夜出人员
 
             }
         }

+ 205 - 0
src/test/java/com/face/monitor/FaceIdenTool.java

@@ -0,0 +1,205 @@
+package com.face.monitor;
+
+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 java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FaceIdenTool {
+
+    /**
+     * 初始化引擎,加载图像人脸特征库
+     * @param idenRoot
+     * @param imgFiles
+     * @return
+     */
+    public static FaceMonitor initFaceMonitor(String idenRoot, File[] imgFiles) {
+        //初始化引擎
+        FaceMonitor faceMonitor = new FaceMonitor();
+        faceMonitor.init(idenRoot + "face/model", 0);
+
+        List<byte[]> faceTestImageList = new ArrayList<>();
+        if(imgFiles != null && imgFiles.length > 0){
+            for(File imgFile : imgFiles) {
+                if(imgFile!= null && imgFile.isFile())
+                faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
+            }
+        }
+
+        FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList);
+        //加载人脸特征库
+        if (faceModels != null && faceModels.length > 0) {
+            faceMonitor.loadFaceDataset(faceModels);
+        }
+
+        return faceMonitor;
+    }
+
+    /**
+     * 批量获取人脸特征码结构体
+     * @param idenRoot
+     * @param imgFiles
+     * @return
+     */
+    public static FaceModel[] extractFeature(String idenRoot, File[] imgFiles){
+        //初始化引擎
+        FaceMonitor faceMonitor = new FaceMonitor();
+        faceMonitor.init(idenRoot + "face/model", 0);
+
+        List<byte[]> faceTestImageList = new ArrayList<>();
+        if(imgFiles != null && imgFiles.length > 0){
+            for(File imgFile : imgFiles) {
+                faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
+            }
+        }
+        FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList);
+        //释放人脸引擎
+        faceMonitor.releaseEngine();
+        return faceModels;
+    }
+
+
+    /**
+     * 得到单个特征码
+     * @param idenRoot
+     * @param imgFile
+     * @return
+     */
+    public static String getFeatPtr(String idenRoot, File imgFile) {
+        if(imgFile == null || !imgFile.isFile()){
+            return null;
+        }
+        File[] imgFiles = new File[]{imgFile};
+        FaceModel[] faceModels = extractFeature(idenRoot,imgFiles);
+
+        if(faceModels != null && faceModels.length > 0) {
+            FaceModel faceModel = faceModels[0];
+
+            return ByteUtil.byte2Hex(faceModel.getFeatValue());
+        }
+        return null;
+    }
+
+
+    /**
+     * faceModel在faceMonitor的人脸特征库中检索命中的index
+     * @param faceMonitor
+     * @param faceModel
+     * @return
+     */
+    public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor, FaceModel faceModel) {
+        if (faceMonitor == null){
+            return null;
+        }
+        FaceRecogRetrieveResult faceRecogRetrieveResult = faceMonitor.faceRecogRetrieveFaceDataset(faceModel);
+        if(faceRecogRetrieveResult != null) {
+            int index = faceRecogRetrieveResult.getOnePredictIds()[0];
+            float score = faceRecogRetrieveResult.getOnePredictScores()[0];
+            System.out.println("score888888==" + score);
+            if (score >= 65) {
+                FaceRetrieveResultVO faceRetrieveResultVO = new FaceRetrieveResultVO();
+                faceRetrieveResultVO.setIndex(index);
+                faceRetrieveResultVO.setScore(score);
+                return faceRetrieveResultVO;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isHit(String idenRoot, String featPtrVisitor, List<String> featPtrList){
+        //初始化引擎
+        FaceMonitor faceMonitor = new FaceMonitor();
+        faceMonitor.init(idenRoot + "face/model", 0);
+        FaceModel[] dataset = new FaceModel[featPtrList.size()];
+        for (int i = 0; i < featPtrList.size(); i++) {
+            String featPtr = featPtrList.get(i);
+            FaceModel faceModel = new FaceModel();
+            faceModel.setName(String.valueOf(i));
+            faceModel.setPersonId(i);
+            faceModel.setFeatValue(ByteUtil.hex2Byte(featPtr));
+        }
+        faceMonitor.loadFaceDataset(dataset);
+        FaceModel faceModelPtrVisitor = new FaceModel();
+        faceModelPtrVisitor.setName(String.valueOf(0));
+        faceModelPtrVisitor.setPersonId(0);
+        faceModelPtrVisitor.setFeatValue(ByteUtil.hex2Byte(featPtrVisitor));
+        FaceRetrieveResultVO vo = getHitResult(faceMonitor,faceModelPtrVisitor);
+        if(vo != null) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 使用dataPath的图片去库里查找,返回命中结果
+     * @param idenRoot
+     * @param dataPath
+     * @return
+     */
+    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 releaseEngine(FaceMonitor faceMonitor) {
+        if(faceMonitor != null){
+            faceMonitor.releaseEngine();
+        }
+    }
+    /**
+     * read file
+     *
+     * @param filePath
+     * @return if file not exist, return null, else return content of file
+     * @throws RuntimeException if an error occurs while operator BufferedReader
+     */
+    private static byte[] readFileBytes(String filePath) {
+        File file = new File(filePath);
+        if (file == null || !file.isFile()) {
+            return null;
+        }
+
+        InputStream inputStream = null;
+        ByteArrayOutputStream baos = null;
+        try {
+            inputStream = new FileInputStream(file);
+            baos = new ByteArrayOutputStream();
+
+            byte[] buffer = new byte[1024];
+            int byteCount = 0;
+            while ((byteCount = inputStream.read(buffer)) != -1) {// 循环从输入流读取
+                // buffer字节
+                baos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流
+            }
+            baos.flush();// 刷新缓冲区
+            return baos.toByteArray();
+        } catch (IOException e) {
+            return null;
+            //throw new RuntimeException("IOException occurred. ", e);
+        } finally {
+            close(inputStream);
+            close(baos);
+        }
+    }
+
+    private static void close(Closeable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (IOException e) {
+                throw new RuntimeException("IOException occurred. ", e);
+            }
+        }
+    }
+}

+ 13 - 0
src/test/java/com/face/monitor/FaceRetrieveResultVO.java

@@ -0,0 +1,13 @@
+package com.face.monitor;
+
+import lombok.Data;
+
+
+@Data
+public class FaceRetrieveResultVO {
+
+    private int index;
+
+    private float score;
+
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 46 - 37
src/test/java/com/face/monitor/FaceTest.java