时间线兜底逻辑
This commit is contained in:
parent
a0703e48c9
commit
a08f4adf2d
@ -14,4 +14,5 @@ public class MatchLocalRecord {
|
||||
private String idStr;
|
||||
private Date shotDate;
|
||||
private Boolean matched;
|
||||
private Boolean accept;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user