时间线兜底逻辑
This commit is contained in:
parent
a0703e48c9
commit
a08f4adf2d
@ -14,4 +14,5 @@ public class MatchLocalRecord {
|
|||||||
private String idStr;
|
private String idStr;
|
||||||
private Date shotDate;
|
private Date shotDate;
|
||||||
private Boolean matched;
|
private Boolean matched;
|
||||||
|
private Boolean accept;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ public class FaceRepository {
|
|||||||
private FaceSampleMapper faceSampleMapper;
|
private FaceSampleMapper faceSampleMapper;
|
||||||
|
|
||||||
public static final String FACE_CACHE_KEY = "face:%s";
|
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) {
|
public FaceEntity getFace(Long id) {
|
||||||
if (redisTemplate.hasKey(String.format(FACE_CACHE_KEY, id))) {
|
if (redisTemplate.hasKey(String.format(FACE_CACHE_KEY, id))) {
|
||||||
@ -40,9 +40,6 @@ public class FaceRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<FaceSampleEntity> getFaceSampleList(Long faceId) {
|
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);
|
FaceEntity face = getFace(faceId);
|
||||||
if (face == null) {
|
if (face == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
@ -51,9 +48,6 @@ public class FaceRepository {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
List<FaceSampleEntity> list = faceSampleMapper.listByIds(Arrays.stream(face.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
|
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;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package com.ycwl.basic.service.task.impl;
|
|||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.aliyuncs.exceptions.ClientException;
|
import com.aliyuncs.exceptions.ClientException;
|
||||||
import com.aliyuncs.facebody.model.v20191230.AddFaceEntityRequest;
|
import com.aliyuncs.facebody.model.v20191230.AddFaceEntityRequest;
|
||||||
import com.aliyuncs.facebody.model.v20191230.AddFaceRequest;
|
import com.aliyuncs.facebody.model.v20191230.AddFaceRequest;
|
||||||
@ -64,6 +65,7 @@ import java.text.SimpleDateFormat;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
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.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
||||||
|
|
||||||
@ -197,7 +200,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
SearchFaceRequest request = new SearchFaceRequest();
|
SearchFaceRequest request = new SearchFaceRequest();
|
||||||
request.setDbName(dbName);
|
request.setDbName(dbName);
|
||||||
request.setImageUrl(faceUrl);
|
request.setImageUrl(faceUrl);
|
||||||
request.setLimit(100);
|
request.setLimit(200);
|
||||||
// request.setQualityScoreThreshold(60f);
|
// request.setQualityScoreThreshold(60f);
|
||||||
FaceDetectLog log = FaceDetectLog.quickCreate(reason, request);
|
FaceDetectLog log = FaceDetectLog.quickCreate(reason, request);
|
||||||
try {
|
try {
|
||||||
@ -205,15 +208,21 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
} catch (InterruptedException ignored) {
|
} catch (InterruptedException ignored) {
|
||||||
}
|
}
|
||||||
float threshold = 0.525F;
|
float threshold = 0.525F;
|
||||||
|
int tourMinutes = -1;
|
||||||
if (StringUtils.isNumeric(dbName)) {
|
if (StringUtils.isNumeric(dbName)) {
|
||||||
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(Long.valueOf(dbName));
|
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(Long.valueOf(dbName));
|
||||||
if (scenicConfig != null) {
|
if (scenicConfig != null) {
|
||||||
if (scenicConfig.getFaceScoreThreshold() != null) {
|
if (scenicConfig.getFaceScoreThreshold() != null) {
|
||||||
threshold = scenicConfig.getFaceScoreThreshold() / 100F;
|
threshold = scenicConfig.getFaceScoreThreshold() / 100F;
|
||||||
}
|
}
|
||||||
|
if (scenicConfig.getTourTime() != null) {
|
||||||
|
tourMinutes = scenicConfig.getTourTime();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final float _threshold = threshold;
|
final float _threshold = threshold;
|
||||||
|
List<Long> reject = new ArrayList<>();
|
||||||
|
List<Long> faceSampleIds = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
SearchFaceResponse response = client.getAcsResponse(request);
|
SearchFaceResponse response = client.getAcsResponse(request);
|
||||||
log.fillResponse(response);
|
log.fillResponse(response);
|
||||||
@ -229,12 +238,53 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
}
|
}
|
||||||
List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> records = matchList.get(0).getFaceItems();
|
List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> records = matchList.get(0).getFaceItems();
|
||||||
log.setMatchRawRecord(records);
|
log.setMatchRawRecord(records);
|
||||||
List<Long> faceSampleIds = records.stream()
|
faceSampleIds = records.stream()
|
||||||
.filter(record -> record.getScore() > _threshold)
|
.filter(record -> record.getScore() > _threshold)
|
||||||
.map(SearchFaceResponse.Data.MatchListItem.FaceItemsItem::getExtraData)
|
.map(SearchFaceResponse.Data.MatchListItem.FaceItemsItem::getExtraData)
|
||||||
.filter(StringUtils::isNumeric)
|
.filter(StringUtils::isNumeric)
|
||||||
.map(Long::valueOf)
|
.map(Long::valueOf)
|
||||||
.collect(Collectors.toList());
|
.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.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getScore());
|
||||||
respVo.setSampleListIds(faceSampleIds);
|
respVo.setSampleListIds(faceSampleIds);
|
||||||
return respVo;
|
return respVo;
|
||||||
@ -242,34 +292,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
log.setMatchRawResult("识别错误,错误为:["+e.getLocalizedMessage()+"]");
|
log.setMatchRawResult("识别错误,错误为:["+e.getLocalizedMessage()+"]");
|
||||||
throw new BaseException(e.getMessage());
|
throw new BaseException(e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
executor.execute(() -> {
|
logMapper.insert(log);
|
||||||
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