From 745943fc236ff55ebd4e10a76c45bcd8743151d1 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 29 Oct 2025 19:26:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor(face):=20=E7=A7=BB=E9=99=A4=E6=A0=B7?= =?UTF-8?q?=E6=9C=AC=E7=AD=9B=E9=80=89=E8=BD=A8=E8=BF=B9=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=8A=E7=9B=B8=E5=85=B3=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 FaceRecognitionFilterReason 枚举类 - 移除 SampleFilterTrace 类及其相关逻辑 - 简化样本筛选方法,去除轨迹记录功能- 更新 FaceServiceImpl 和 TaskFaceServiceImpl 中的调用逻辑 - 移除 SearchFaceRespVo 中的 filterTrace 字段- 清理无用的 import语句和相关代码引用 --- .../mobile/face/FaceRecognitionSampleVO.java | 1 - .../mobile/face/FaceRecognitionUpdateReq.java | 5 +- .../enums/FaceRecognitionFilterReason.java | 22 ------ .../model/task/resp/SampleFilterTrace.java | 34 ---------- .../model/task/resp/SearchFaceRespVo.java | 1 - .../service/pc/impl/FaceServiceImpl.java | 13 +--- .../basic/service/task/TaskFaceService.java | 13 ---- .../task/impl/TaskFaceServiceImpl.java | 68 ++++--------------- 8 files changed, 19 insertions(+), 138 deletions(-) delete mode 100644 src/main/java/com/ycwl/basic/model/pc/face/enums/FaceRecognitionFilterReason.java delete mode 100644 src/main/java/com/ycwl/basic/model/task/resp/SampleFilterTrace.java diff --git a/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java b/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java index a81bdea1..dc59533e 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionSampleVO.java @@ -1,7 +1,6 @@ package com.ycwl.basic.model.mobile.face; import com.fasterxml.jackson.annotation.JsonFormat; -import com.ycwl.basic.model.pc.face.enums.FaceRecognitionFilterReason; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionUpdateReq.java b/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionUpdateReq.java index 86f362ac..b3a9f8ef 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionUpdateReq.java +++ b/src/main/java/com/ycwl/basic/model/mobile/face/FaceRecognitionUpdateReq.java @@ -19,10 +19,7 @@ public class FaceRecognitionUpdateReq { */ private List manualAcceptedSampleIds; - /** - * 用户主动排除的样本ID列表。 - */ - private List manualRejectedSampleIds; + /** * 是否强制重新走一次识别流程。 diff --git a/src/main/java/com/ycwl/basic/model/pc/face/enums/FaceRecognitionFilterReason.java b/src/main/java/com/ycwl/basic/model/pc/face/enums/FaceRecognitionFilterReason.java deleted file mode 100644 index d45e1665..00000000 --- a/src/main/java/com/ycwl/basic/model/pc/face/enums/FaceRecognitionFilterReason.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ycwl.basic.model.pc.face.enums; - -import lombok.Getter; - -/** - * 标识系统在过滤识别样本时的原因,便于前端渲染提示。 - */ -@Getter -public enum FaceRecognitionFilterReason { - SCORE_BELOW_THRESHOLD("score_below_threshold", "置信度低于阈值"), - OUT_OF_TIME_RANGE("out_of_time_range", "超出景区时间范围限制"), - DEVICE_PHOTO_LIMIT("device_photo_limit", "超过设备照片数量限制"), - MANUAL_REJECTED("manual_rejected", "已被手动排除"); - - private final String code; - private final String description; - - FaceRecognitionFilterReason(String code, String description) { - this.code = code; - this.description = description; - } -} diff --git a/src/main/java/com/ycwl/basic/model/task/resp/SampleFilterTrace.java b/src/main/java/com/ycwl/basic/model/task/resp/SampleFilterTrace.java deleted file mode 100644 index d134a729..00000000 --- a/src/main/java/com/ycwl/basic/model/task/resp/SampleFilterTrace.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.ycwl.basic.model.task.resp; - -import com.ycwl.basic.model.pc.face.enums.FaceRecognitionFilterReason; -import lombok.Data; - -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 样本筛选的轨迹信息,记录最终样本集合及各过滤原因。 - */ -@Data -public class SampleFilterTrace { - private List acceptedSampleIds; - private Map> filteredReasonMap = new HashMap<>(); - - public void addReason(Long sampleId, FaceRecognitionFilterReason reason) { - if (sampleId == null || reason == null) { - return; - } - filteredReasonMap.computeIfAbsent(sampleId, key -> EnumSet.noneOf(FaceRecognitionFilterReason.class)) - .add(reason); - } - - public Map> getFilteredReasonMap() { - if (filteredReasonMap == null) { - return Collections.emptyMap(); - } - return filteredReasonMap; - } -} diff --git a/src/main/java/com/ycwl/basic/model/task/resp/SearchFaceRespVo.java b/src/main/java/com/ycwl/basic/model/task/resp/SearchFaceRespVo.java index 1dd8f351..d590f119 100644 --- a/src/main/java/com/ycwl/basic/model/task/resp/SearchFaceRespVo.java +++ b/src/main/java/com/ycwl/basic/model/task/resp/SearchFaceRespVo.java @@ -11,5 +11,4 @@ public class SearchFaceRespVo { private String searchResultJson; private Float firstMatchRate; private boolean lowThreshold; - private SampleFilterTrace filterTrace; } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java index cb1d42f9..38cb83c7 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java @@ -46,7 +46,7 @@ import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity; import com.ycwl.basic.model.pc.video.entity.VideoEntity; import com.ycwl.basic.model.repository.TaskUpdateResult; -import com.ycwl.basic.model.task.resp.SampleFilterTrace; + import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.repository.DeviceRepository; import com.ycwl.basic.repository.FaceRepository; @@ -1196,13 +1196,9 @@ public class FaceServiceImpl implements FaceService { // 3. 应用后置筛选逻辑 if (mergedResult.getSampleListIds() != null && !mergedResult.getSampleListIds().isEmpty()) { List allFaceSampleList = faceSampleMapper.listByIds(mergedResult.getSampleListIds()); - SampleFilterTrace filterTrace = faceService.applySampleFiltersWithTrace( + List filteredSampleIds = faceService.applySampleFilters( mergedResult.getSampleListIds(), allFaceSampleList, scenicConfig); - List filteredSampleIds = filterTrace.getAcceptedSampleIds() == null - ? Collections.emptyList() - : filterTrace.getAcceptedSampleIds(); mergedResult.setSampleListIds(filteredSampleIds); - mergedResult.setFilterTrace(filterTrace); log.debug("应用后置筛选:原始样本数={}, 筛选后样本数={}", allFaceSampleList.size(), filteredSampleIds.size()); } @@ -1280,8 +1276,6 @@ public class FaceServiceImpl implements FaceService { List currentAccepted = parseMatchSampleIds(face.getMatchSampleIds()); List manualAccepted = Optional.ofNullable(req.getManualAcceptedSampleIds()).orElse(Collections.emptyList()); - List manualRejected = Optional.ofNullable(req.getManualRejectedSampleIds()).orElse(Collections.emptyList()); - Set manualRejectedSet = new HashSet<>(manualRejected); LinkedHashSet finalSampleSet = new LinkedHashSet<>(); manualAccepted.stream() @@ -1289,10 +1283,9 @@ public class FaceServiceImpl implements FaceService { .forEach(finalSampleSet::add); currentAccepted.stream() .filter(Objects::nonNull) - .filter(id -> !manualRejectedSet.contains(id)) .forEach(finalSampleSet::add); - boolean hasManualChange = !manualAccepted.isEmpty() || !manualRejectedSet.isEmpty(); + boolean hasManualChange = !manualAccepted.isEmpty(); List finalSampleList = new ArrayList<>(finalSampleSet); boolean needsUpdate = hasManualChange && !finalSampleList.equals(currentAccepted); diff --git a/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java b/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java index 6887251a..c90f2693 100644 --- a/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java +++ b/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java @@ -3,7 +3,6 @@ package com.ycwl.basic.service.task; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.integration.common.manager.ScenicConfigManager; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; -import com.ycwl.basic.model.task.resp.SampleFilterTrace; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import org.springframework.web.multipart.MultipartFile; @@ -29,16 +28,4 @@ public interface TaskFaceService { List applySampleFilters(List acceptedSampleIds, List allFaceSampleList, ScenicConfigManager scenicConfig); - - /** - * 带过滤轨迹的样本筛选逻辑。 - * - * @param acceptedSampleIds 已接受的样本ID列表 - * @param allFaceSampleList 所有人脸样本实体列表 - * @param scenicConfig 景区配置 - * @return 包含最终样本及过滤原因的轨迹对象 - */ - SampleFilterTrace applySampleFiltersWithTrace(List acceptedSampleIds, - List allFaceSampleList, - ScenicConfigManager scenicConfig); } 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 1ccc896d..16623b9c 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 @@ -23,7 +23,7 @@ import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.face.resp.FaceRespVO; -import com.ycwl.basic.model.pc.face.enums.FaceRecognitionFilterReason; + import com.ycwl.basic.model.pc.faceDetectLog.entity.FaceDetectLog; import com.ycwl.basic.model.pc.faceDetectLog.resp.MatchLocalRecord; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; @@ -31,7 +31,7 @@ import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; -import com.ycwl.basic.model.task.resp.SampleFilterTrace; + import com.ycwl.basic.repository.DeviceRepository; import com.ycwl.basic.repository.FaceRepository; import com.ycwl.basic.repository.ScenicRepository; @@ -271,18 +271,8 @@ public class TaskFaceServiceImpl implements TaskFaceService { idIndexMap.put(allFaceSampleIds.get(i), i); } allFaceSampleList.sort(Comparator.comparing(sample -> idIndexMap.get(sample.getId()))); - SampleFilterTrace filterTrace = applySampleFiltersWithTrace(acceptFaceSampleIds, allFaceSampleList, scenicConfig); - List finalAcceptedSampleIds = filterTrace.getAcceptedSampleIds() == null - ? Collections.emptyList() - : filterTrace.getAcceptedSampleIds(); - Set initialAcceptedSet = acceptFaceSampleIds == null - ? Collections.emptySet() - : new HashSet<>(acceptFaceSampleIds); - for (Long sampleId : allFaceSampleIds) { - if (!finalAcceptedSampleIds.contains(sampleId) && !initialAcceptedSet.contains(sampleId)) { - filterTrace.addReason(sampleId, FaceRecognitionFilterReason.SCORE_BELOW_THRESHOLD); - } - } + List finalAcceptedSampleIds = applySampleFilters(acceptFaceSampleIds, allFaceSampleList, scenicConfig); + List collect = new ArrayList<>(); for (SearchFaceResultItem item : records) { MatchLocalRecord record = new MatchLocalRecord(); @@ -314,7 +304,6 @@ public class TaskFaceServiceImpl implements TaskFaceService { } respVo.setFirstMatchRate(response.getFirstMatchRate()); respVo.setSampleListIds(finalAcceptedSampleIds); - respVo.setFilterTrace(filterTrace); return respVo; } catch (Exception e) { logEntity.setMatchRawResult("识别错误,错误为:["+e.getLocalizedMessage()+"]"); @@ -410,23 +399,11 @@ public class TaskFaceServiceImpl implements TaskFaceService { public List applySampleFilters(List acceptedSampleIds, List allFaceSampleList, ScenicConfigManager scenicConfig) { - SampleFilterTrace trace = applySampleFiltersWithTrace(acceptedSampleIds, allFaceSampleList, scenicConfig); - List result = trace.getAcceptedSampleIds(); - return result == null ? Collections.emptyList() : result; - } - - @Override - public SampleFilterTrace applySampleFiltersWithTrace(List acceptedSampleIds, - List allFaceSampleList, - ScenicConfigManager scenicConfig) { - SampleFilterTrace trace = new SampleFilterTrace(); if (acceptedSampleIds == null || acceptedSampleIds.isEmpty()) { - trace.setAcceptedSampleIds(acceptedSampleIds == null ? Collections.emptyList() : new ArrayList<>(acceptedSampleIds)); - return trace; + return acceptedSampleIds == null ? Collections.emptyList() : new ArrayList<>(acceptedSampleIds); } if (allFaceSampleList == null || allFaceSampleList.isEmpty()) { - trace.setAcceptedSampleIds(new ArrayList<>(acceptedSampleIds)); - return trace; + return new ArrayList<>(acceptedSampleIds); } Map sampleMap = allFaceSampleList.stream() @@ -437,29 +414,26 @@ public class TaskFaceServiceImpl implements TaskFaceService { .collect(Collectors.toCollection(ArrayList::new)); if (workingList.isEmpty()) { - trace.setAcceptedSampleIds(Collections.emptyList()); - return trace; + return Collections.emptyList(); } Integer tourMinutes = scenicConfig != null ? scenicConfig.getInteger("tour_time") : null; if (tourMinutes != null && tourMinutes > 0) { - workingList = filterSampleIdsByTimeRangeWithTrace(workingList, sampleMap, tourMinutes, trace); + workingList = filterSampleIdsByTimeRange(workingList, sampleMap, tourMinutes); log.debug("应用时间范围筛选:游览时间限制={}分钟,过滤后数量={}", tourMinutes, workingList.size()); } else { log.debug("时间范围逻辑:景区未设置游览时间限制"); } - workingList = applyDevicePhotoLimitWithTrace(workingList, sampleMap, trace); - trace.setAcceptedSampleIds(new ArrayList<>(workingList)); + workingList = applyDevicePhotoLimit(workingList, sampleMap); log.debug("样本筛选完成:原始数量={}, 最终数量={}", acceptedSampleIds.size(), workingList.size()); - return trace; + return new ArrayList<>(workingList); } - private List filterSampleIdsByTimeRangeWithTrace(List acceptedSampleIds, - Map sampleMap, - int tourMinutes, - SampleFilterTrace trace) { + private List filterSampleIdsByTimeRange(List acceptedSampleIds, + Map sampleMap, + int tourMinutes) { if (acceptedSampleIds == null || acceptedSampleIds.isEmpty()) { return Collections.emptyList(); } @@ -486,8 +460,6 @@ public class TaskFaceServiceImpl implements TaskFaceService { Date createAt = sample.getCreateAt(); if (createAt.after(startDate) && createAt.before(endDate)) { result.add(sampleId); - } else { - trace.addReason(sampleId, FaceRecognitionFilterReason.OUT_OF_TIME_RANGE); } } @@ -496,9 +468,8 @@ public class TaskFaceServiceImpl implements TaskFaceService { return result; } - private List applyDevicePhotoLimitWithTrace(List acceptedSampleIds, - Map sampleMap, - SampleFilterTrace trace) { + private List applyDevicePhotoLimit(List acceptedSampleIds, + Map sampleMap) { if (acceptedSampleIds == null || acceptedSampleIds.isEmpty()) { return Collections.emptyList(); } @@ -557,15 +528,6 @@ public class TaskFaceServiceImpl implements TaskFaceService { } retainedSampleIds.addAll(retainedForDevice); - - if (trace != null) { - Set retainedSet = new HashSet<>(retainedForDevice); - for (Long sampleId : deviceSampleIds) { - if (!retainedSet.contains(sampleId)) { - trace.addReason(sampleId, FaceRecognitionFilterReason.DEVICE_PHOTO_LIMIT); - } - } - } } List resultIds = new ArrayList<>(acceptedSampleIds.size());