feat(face):优化视频重切任务的样本选择逻辑

- 根据设备配置限制视频样本数量
- 实现按设备分组并应用数量限制- 更新视频重切任务中的样本ID列表
- 保留原有照片与视频数量比较逻辑
This commit is contained in:
2025-09-26 15:51:15 +08:00
parent 1b2793215f
commit d860996f6d
3 changed files with 46 additions and 5 deletions

View File

@@ -627,13 +627,30 @@ public class FaceServiceImpl implements FaceService {
.filter(item -> Integer.valueOf(2).equals(item.getType())) .filter(item -> Integer.valueOf(2).equals(item.getType()))
.count(); .count();
List<FaceSampleEntity> faceSampleList = faceRepository.getFaceSampleList(faceId);
if (faceSampleList.isEmpty()) {
log.info("faceId:{} sample list not exist", faceId);
return;
}
List<Long> faceSampleIds = faceSampleList.stream()
.collect(Collectors.groupingBy(FaceSampleEntity::getDeviceId))
.entrySet()
.stream().flatMap(entry -> {
DeviceConfigManager configManager = deviceRepository.getDeviceConfigManager(entry.getKey());
if (configManager.getInteger("limit_video", 0) > 0) {
return entry.getValue().subList(0, Math.min(entry.getValue().size(), configManager.getInteger("limit_video", 0))).stream();
}
return entry.getValue().stream();
}).toList()
.stream().map(FaceSampleEntity::getId).toList();
log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, sampleListIds.size(), faceSampleIds.size());
log.debug("视频重切逻辑:视频数量 {}, 照片数量 {}", videoCount, photoCount); log.debug("视频重切逻辑:视频数量 {}, 照片数量 {}", videoCount, photoCount);
// 只有照片数量大于视频数量时才创建重切任务 // 只有照片数量大于视频数量时才创建重切任务
if (photoCount > videoCount) { if (photoCount > videoCount) {
VideoPieceGetter.Task task = new VideoPieceGetter.Task(); VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceId; task.faceId = faceId;
task.faceSampleIds = sampleListIds; task.faceSampleIds = faceSampleIds;
task.templateId = null; task.templateId = null;
task.memberId = memberId; task.memberId = memberId;
task.callback = () -> { task.callback = () -> {

View File

@@ -164,9 +164,22 @@ public class TaskFaceServiceImpl implements TaskFaceService {
log.warn("没有有效的关联关系可创建: faceId={}, 原始数量={}", faceId, memberSourceEntityList.size()); log.warn("没有有效的关联关系可创建: faceId={}, 原始数量={}", faceId, memberSourceEntityList.size());
} }
memberRelationRepository.clearSCacheByFace(faceId); memberRelationRepository.clearSCacheByFace(faceId);
List<FaceSampleEntity> faceSampleList = faceRepository.getFaceSampleList(faceId);
List<Long> faceSampleIds = faceSampleList.stream()
.collect(Collectors.groupingBy(FaceSampleEntity::getDeviceId))
.entrySet()
.stream().flatMap(entry -> {
DeviceConfigManager configManager = deviceRepository.getDeviceConfigManager(entry.getKey());
if (configManager.getInteger("limit_video", 0) > 0) {
return entry.getValue().subList(0, Math.min(entry.getValue().size(), configManager.getInteger("limit_video", 0))).stream();
}
return entry.getValue().stream();
}).toList()
.stream().map(FaceSampleEntity::getId).toList();
log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, sampleListIds.size(), faceSampleIds.size());
VideoPieceGetter.Task task = new VideoPieceGetter.Task(); VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceEntity.getId(); task.faceId = faceEntity.getId();
task.faceSampleIds = sampleListIds; task.faceSampleIds = faceSampleIds;
task.memberId = face.getMemberId(); task.memberId = face.getMemberId();
VideoPieceGetter.addTask(task); VideoPieceGetter.addTask(task);
} }

View File

@@ -255,7 +255,7 @@ public class TaskTaskServiceImpl implements TaskService {
@Override @Override
public void autoCreateTaskByFaceId(Long faceId) { public void autoCreateTaskByFaceId(Long faceId) {
FaceRespVO faceRespVO = faceMapper.getById(faceId); FaceEntity faceRespVO = faceRepository.getFace(faceId);
if (faceRespVO == null) { if (faceRespVO == null) {
log.info("faceId:{} is not exist", faceId); log.info("faceId:{} is not exist", faceId);
return; return;
@@ -264,18 +264,28 @@ public class TaskTaskServiceImpl implements TaskService {
log.info("faceId:{} matchSampleIds is empty", faceId); log.info("faceId:{} matchSampleIds is empty", faceId);
return; return;
} }
List<FaceSampleEntity> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).filter(StringUtils::isNumeric).map(Long::valueOf).collect(Collectors.toList())); List<FaceSampleEntity> faceSampleList = faceRepository.getFaceSampleList(faceId);
if (faceSampleList.isEmpty()) { if (faceSampleList.isEmpty()) {
log.info("faceId:{} faceSampleList is empty", faceId); log.info("faceId:{} faceSampleList is empty", faceId);
return; return;
} }
List<Long> faceSampleIds = faceSampleList.stream().collect(Collectors.groupingBy(FaceSampleEntity::getDeviceId)).entrySet()
.stream().flatMap(entry -> {
DeviceConfigManager configManager = deviceRepository.getDeviceConfigManager(entry.getKey());
if (configManager.getInteger("limit_video", 0) > 0) {
return entry.getValue().subList(0, Math.min(entry.getValue().size(), configManager.getInteger("limit_video", 0))).stream();
}
return entry.getValue().stream();
}).toList()
.stream().map(FaceSampleEntity::getId).toList();
log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, faceSampleList.size(), faceSampleIds.size());
ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(faceRespVO.getScenicId()); ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(faceRespVO.getScenicId());
List<TemplateRespVO> templateList = templateRepository.getTemplateListByScenicId(faceRespVO.getScenicId()); List<TemplateRespVO> templateList = templateRepository.getTemplateListByScenicId(faceRespVO.getScenicId());
if (templateList == null || templateList.isEmpty()) { if (templateList == null || templateList.isEmpty()) {
// 没有vlog视频的情况下 // 没有vlog视频的情况下
VideoPieceGetter.Task task = new VideoPieceGetter.Task(); VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceId; task.faceId = faceId;
task.faceSampleIds = faceSampleList.stream().map(FaceSampleEntity::getId).toList(); task.faceSampleIds = faceSampleIds;
task.templateId = null; task.templateId = null;
task.memberId = faceRespVO.getMemberId(); task.memberId = faceRespVO.getMemberId();
task.callback = () -> { task.callback = () -> {
@@ -343,6 +353,7 @@ public class TaskTaskServiceImpl implements TaskService {
return entry.getValue().stream(); return entry.getValue().stream();
}).toList() }).toList()
.stream().map(FaceSampleEntity::getId).collect(Collectors.toList()); .stream().map(FaceSampleEntity::getId).collect(Collectors.toList());
log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, faceSampleList.size(), faceSampleIds.size());
List<SourceEntity> sourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); List<SourceEntity> sourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
VideoPieceGetter.Task task = new VideoPieceGetter.Task(); VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceId; task.faceId = faceId;