|
@@ -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();
|
|
|
}
|
|
|
}
|