diff --git a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java index 0c305eb..0886ca2 100644 --- a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java +++ b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java @@ -14,4 +14,5 @@ public class MatchLocalRecord { private String idStr; private Date shotDate; private Boolean matched; + private Boolean accept; } diff --git a/src/main/java/com/ycwl/basic/repository/FaceRepository.java b/src/main/java/com/ycwl/basic/repository/FaceRepository.java index 2b2617f..b6b3061 100644 --- a/src/main/java/com/ycwl/basic/repository/FaceRepository.java +++ b/src/main/java/com/ycwl/basic/repository/FaceRepository.java @@ -26,7 +26,7 @@ public class FaceRepository { private FaceSampleMapper faceSampleMapper; public static final String FACE_CACHE_KEY = "face:%s"; - public static final String FACE_SAMPLE_CACHE_KEY = "face:%s:sample"; + public static final String FACE_SAMPLE_CACHE_KEY = "face:sample:%s"; public FaceEntity getFace(Long id) { if (redisTemplate.hasKey(String.format(FACE_CACHE_KEY, id))) { @@ -40,9 +40,6 @@ public class FaceRepository { } public List getFaceSampleList(Long faceId) { -// if (redisTemplate.hasKey(String.format(FACE_SAMPLE_CACHE_KEY, faceId))) { -// return JSONObject.parseArray(redisTemplate.opsForValue().get(String.format(FACE_SAMPLE_CACHE_KEY, faceId)), FaceSampleEntity.class); -// } FaceEntity face = getFace(faceId); if (face == null) { return Collections.emptyList(); @@ -51,9 +48,6 @@ public class FaceRepository { return Collections.emptyList(); } List list = faceSampleMapper.listByIds(Arrays.stream(face.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList())); -// if (!list.isEmpty()) { -// redisTemplate.opsForValue().set(String.format(FACE_SAMPLE_CACHE_KEY, faceId), JSONObject.toJSONString(list)); -// } return list; } diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java index 6c9e71b..1b29ba4 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java @@ -2,6 +2,7 @@ package com.ycwl.basic.service.task.impl; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.facebody.model.v20191230.AddFaceEntityRequest; import com.aliyuncs.facebody.model.v20191230.AddFaceRequest; @@ -64,6 +65,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Optional; import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -71,6 +73,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @@ -197,7 +200,7 @@ public class TaskFaceServiceImpl implements TaskFaceService { SearchFaceRequest request = new SearchFaceRequest(); request.setDbName(dbName); request.setImageUrl(faceUrl); - request.setLimit(100); + request.setLimit(200); // request.setQualityScoreThreshold(60f); FaceDetectLog log = FaceDetectLog.quickCreate(reason, request); try { @@ -205,15 +208,21 @@ public class TaskFaceServiceImpl implements TaskFaceService { } catch (InterruptedException ignored) { } float threshold = 0.525F; + int tourMinutes = -1; if (StringUtils.isNumeric(dbName)) { ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(Long.valueOf(dbName)); if (scenicConfig != null) { if (scenicConfig.getFaceScoreThreshold() != null) { threshold = scenicConfig.getFaceScoreThreshold() / 100F; } + if (scenicConfig.getTourTime() != null) { + tourMinutes = scenicConfig.getTourTime(); + } } } final float _threshold = threshold; + List reject = new ArrayList<>(); + List faceSampleIds = new ArrayList<>(); try { SearchFaceResponse response = client.getAcsResponse(request); log.fillResponse(response); @@ -229,12 +238,53 @@ public class TaskFaceServiceImpl implements TaskFaceService { } List records = matchList.get(0).getFaceItems(); log.setMatchRawRecord(records); - List faceSampleIds = records.stream() + faceSampleIds = records.stream() .filter(record -> record.getScore() > _threshold) .map(SearchFaceResponse.Data.MatchListItem.FaceItemsItem::getExtraData) .filter(StringUtils::isNumeric) .map(Long::valueOf) .collect(Collectors.toList()); + List faceSampleList = new ArrayList<>(); + if (StringUtils.isNumeric(dbName)) { + faceSampleList = faceSampleMapper.listByIds(faceSampleIds); + Long firstFaceSampleId = faceSampleIds.get(0); + Optional firstFaceSample = faceSampleList.stream().filter(faceSample -> faceSample.getId().equals(firstFaceSampleId)).findAny(); + if (firstFaceSample.isPresent()) { + if (tourMinutes > 0) { + Date startDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), -tourMinutes/2); + Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), tourMinutes/2); + faceSampleIds = faceSampleList.stream() + .filter(faceSample -> faceSample.getCreateAt().after(startDate) && faceSample.getCreateAt().before(endDate)) + .map(FaceSampleEntity::getId) + .collect(Collectors.toList()); + } + } + } + List collect = new ArrayList<>(); + for (SearchFaceResponse.Data.MatchListItem.FaceItemsItem item : records) { + MatchLocalRecord record = new MatchLocalRecord(); + record.setIdStr(item.getExtraData()); + record.setFaceSampleId(Long.parseLong(item.getExtraData())); + if (StringUtils.isNumeric(item.getDbName())) { + Optional optionalFse = faceSampleList.stream().filter(face -> face.getId().equals(Long.parseLong(item.getExtraData()))).findAny(); + if (optionalFse.isPresent()) { + DeviceEntity device = deviceRepository.getDevice(optionalFse.get().getDeviceId()); + if (device != null) { + record.setDeviceName(device.getName()); + } + record.setMatched(item.getScore() > _threshold); + record.setAccept(faceSampleIds.contains(optionalFse.get().getId())); + record.setFaceUrl(optionalFse.get().getFaceUrl()); + record.setShotDate(optionalFse.get().getCreateAt()); + } + } else { + record.setFaceUrl(getFaceUrl(record.getFaceSampleId())); + } + record.setScore(item.getScore()); + record.setConfidence(item.getConfidence()); + collect.add(record); + } + log.setMatchLocalRecord(JSONObject.toJSONString(collect)); respVo.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getScore()); respVo.setSampleListIds(faceSampleIds); return respVo; @@ -242,34 +292,7 @@ public class TaskFaceServiceImpl implements TaskFaceService { log.setMatchRawResult("识别错误,错误为:["+e.getLocalizedMessage()+"]"); throw new BaseException(e.getMessage()); } finally { - executor.execute(() -> { - if (log.getMatchRawRecord() != null) { - List collect = log.getMatchRawRecord().parallelStream().map(item -> { - MatchLocalRecord record = new MatchLocalRecord(); - record.setIdStr(item.getExtraData()); - record.setFaceSampleId(Long.parseLong(item.getExtraData())); - if (StringUtils.isNumeric(item.getDbName())) { - FaceSampleEntity faceSample = faceRepository.getFaceSample(record.getFaceSampleId()); - if (faceSample != null) { - DeviceEntity device = deviceRepository.getDevice(faceSample.getDeviceId()); - if (device != null) { - record.setDeviceName(device.getName()); - } - record.setMatched(item.getScore() > _threshold); - record.setFaceUrl(faceSample.getFaceUrl()); - record.setShotDate(faceSample.getCreateAt()); - } - } else { - record.setFaceUrl(getFaceUrl(record.getFaceSampleId())); - } - record.setScore(item.getScore()); - record.setConfidence(item.getConfidence()); - return record; - }).collect(Collectors.toList()); - log.setMatchLocalRecord(JSON.toJSONString(collect)); - } - logMapper.insert(log); - }); + logMapper.insert(log); } }