时间线兜底逻辑

This commit is contained in:
Jerry Yan 2025-03-25 12:43:27 +08:00
parent a0703e48c9
commit a08f4adf2d
3 changed files with 55 additions and 37 deletions

View File

@ -14,4 +14,5 @@ public class MatchLocalRecord {
private String idStr;
private Date shotDate;
private Boolean matched;
private Boolean accept;
}

View File

@ -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<FaceSampleEntity> 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<FaceSampleEntity> 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;
}

View File

@ -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<Long> reject = new ArrayList<>();
List<Long> faceSampleIds = new ArrayList<>();
try {
SearchFaceResponse response = client.getAcsResponse(request);
log.fillResponse(response);
@ -229,12 +238,53 @@ public class TaskFaceServiceImpl implements TaskFaceService {
}
List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> records = matchList.get(0).getFaceItems();
log.setMatchRawRecord(records);
List<Long> 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<FaceSampleEntity> faceSampleList = new ArrayList<>();
if (StringUtils.isNumeric(dbName)) {
faceSampleList = faceSampleMapper.listByIds(faceSampleIds);
Long firstFaceSampleId = faceSampleIds.get(0);
Optional<FaceSampleEntity> 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<MatchLocalRecord> 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<FaceSampleEntity> 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<MatchLocalRecord> 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);
}
}