|
@@ -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 {
|