feat(task):优化人脸识别任务中的样本排序逻辑

- 引入HashMap以支持按ID顺序排序人脸样本列表
- 在筛选前对搜索结果按分数降序排序
- 简化设备照片限制逻辑,去除冗余的时间排序步骤
- 提升匹配准确性和处理效率
This commit is contained in:
2025-09-27 13:45:05 +08:00
parent f885f734ad
commit 4b01e4cf82

View File

@@ -49,6 +49,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -251,11 +252,18 @@ public class TaskFaceServiceImpl implements TaskFaceService {
.anyMatch(record -> record.getScore() > _lowThreshold);
respVo.setLowThreshold(isLowThreshold);
allFaceSampleIds = records.stream()
.sorted(Comparator.comparing(SearchFaceResultItem::getScore).reversed())
.map(SearchFaceResultItem::getExtData)
.filter(StringUtils::isNumeric)
.map(Long::valueOf)
.collect(Collectors.toList());
List<FaceSampleEntity> allFaceSampleList = faceSampleMapper.listByIds(allFaceSampleIds);
// 按照allFaceSampleIds的顺序对allFaceSampleList进行排序
Map<Long, Integer> idIndexMap = new HashMap<>();
for (int i = 0; i < allFaceSampleIds.size(); i++) {
idIndexMap.put(allFaceSampleIds.get(i), i);
}
allFaceSampleList.sort(Comparator.comparing(sample -> idIndexMap.get(sample.getId())));
acceptFaceSampleIds = applySampleFilters(acceptFaceSampleIds, allFaceSampleList, scenicConfig);
List<MatchLocalRecord> collect = new ArrayList<>();
for (SearchFaceResultItem item : records) {
@@ -515,9 +523,8 @@ public class TaskFaceServiceImpl implements TaskFaceService {
log.debug("设备照片限制:设备ID={}, 无限制,保留{}张照片",
deviceId, deviceSampleIds.size());
} else {
// 按创建时间倒序排序,取前N张
// 取前N张
List<FaceSampleEntity> limitedSamples = deviceSamples.stream()
.sorted(Comparator.comparing(FaceSampleEntity::getCreateAt).reversed())
.limit(limitPhoto)
.collect(Collectors.toList());