diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java index c199f84e..764b1b75 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java @@ -151,7 +151,7 @@ public class InferenceResultApiController { @RequestBody @Valid InferenceResultDto.RegReq req) { - UUID uuid = inferenceResultService.saveInferenceInfo(req); + UUID uuid = inferenceResultService.run(req); return ApiResponseDto.ok(uuid); } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java index ed092166..412e2133 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java @@ -45,6 +45,7 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -116,6 +117,124 @@ public class InferenceResultService { return dto.getUuid(); } + @Transactional + public UUID run(InferenceResultDto.RegReq req) { + List targetDtoList = mapSheetMngCoreService.getHstMapSheetList(req); + List compareList = mapSheetMngCoreService.getMapSheetMngHst(req.getCompareYyyy()); + List targetList = + mapSheetMngCoreService.getHstMapSheetList(req).stream() + .map(MngListDto::getMapSheetNum) + .filter(Objects::nonNull) + .distinct() + .toList(); + + log.info( + "hst list count compareList = {}, targetList = {}", compareList.size(), targetList.size()); + + Set compareSet = new HashSet<>(compareList); + Set targetSet = new HashSet<>(targetList); + + long intersectionCount = + targetSet.stream() + .distinct() + .filter(compareSet::contains) + .count(); // compare와 target에 공통으로 존재하는 도협 수 + + long excludedTargetCount = + targetSet.stream() + .distinct() + .filter(s -> !compareSet.contains(s)) + .count(); // target 에만 존재하는 도협 수 (compare 에는 없음) + + long onlyCompareCount = + compareSet.stream() + .distinct() + .filter(s -> !targetSet.contains(s)) + .count(); // compare 에만 존재하는 도협 수 (target 에는 없음) + + log.info( + """ + ===== MapSheet Year Comparison ===== + target Total: {} + compare Total: {} + Intersection: {} + target Only (Excluded from compare): {} + compare Only: {} + ==================================== + """, + targetSet.size(), + compareSet.size(), + intersectionCount, + excludedTargetCount, + onlyCompareCount); + + List filteredTargetList = + targetSet.stream() // target 기준으로 + .filter(compareSet::contains) // compare에 있는 도협만 남김 + .toList(); + + Scene modelComparePath = + getSceneInference(req.getCompareYyyy().toString(), filteredTargetList, "", ""); + + Scene modelTargetPath = + getSceneInference(req.getTargetYyyy().toString(), filteredTargetList, "", ""); + + // 작은 쪽 기준으로 탐지건수/파일생성 리스트 결정 + List imageFeatureList; + if (modelComparePath.getFeatures().size() <= modelTargetPath.getFeatures().size()) { + imageFeatureList = modelComparePath.getFeatures(); + } else { + imageFeatureList = modelTargetPath.getFeatures(); + } + + // imageFeatureList 기준 sceneId Set + Set sceneIdSet = + imageFeatureList.stream() + .map(ImageFeature::getSceneId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // targetList(List) 리턴용으로 필터링 + List newTargetList = + targetDtoList.stream() + .filter(m -> m.getMapSheetNum() != null) + .filter(m -> sceneIdSet.contains(m.getMapSheetNum())) + .toList(); + + // 목록 및 추론 대상 도엽정보 저장 + UUID uuid = inferenceResultCoreService.saveInferenceInfo(req, newTargetList); + + // ai 서버에 전달할 파라미터 생성 + pred_requests_areas predRequestsAreas = new pred_requests_areas(); + predRequestsAreas.setInput1_year(req.getCompareYyyy()); + predRequestsAreas.setInput2_year(req.getTargetYyyy()); + predRequestsAreas.setInput1_scene_path(modelComparePath.getFilePath()); + predRequestsAreas.setInput2_scene_path(modelTargetPath.getFilePath()); + + InferenceSendDto m1 = this.getModelInfo(req.getModel1Uuid()); + m1.setPred_requests_areas(predRequestsAreas); + + log.info("[INFERENCE] Start m1 = {}", m1); + m1.setPred_requests_areas(predRequestsAreas); + + // ai 추론 실행 api 호출 + Long batchId = ensureAccepted(m1); + + // ai 추론 실행후 응답값 update + SaveInferenceAiDto saveInferenceAiDto = new SaveInferenceAiDto(); + saveInferenceAiDto.setUuid(uuid); + saveInferenceAiDto.setBatchId(batchId); + saveInferenceAiDto.setStatus(Status.IN_PROGRESS.getId()); + saveInferenceAiDto.setType(ModelType.G1.getId()); + saveInferenceAiDto.setInferStartDttm(ZonedDateTime.now()); + saveInferenceAiDto.setModelComparePath(modelComparePath.getFilePath()); + saveInferenceAiDto.setModelTargetPath(modelTargetPath.getFilePath()); + saveInferenceAiDto.setModelStartDttm(ZonedDateTime.now()); + inferenceResultCoreService.update(saveInferenceAiDto); + + return uuid; + } + /** * 변화탐지 실행 정보 생성 * @@ -146,31 +265,31 @@ public class InferenceResultService { List totalNumList = new ArrayList<>(); - if (DetectOption.EXCL.getId().equals(req.getDetectOption())) { - // "추론제외" 일때 전년도 이전 값이 있어도 전년도 도엽이 없으면 비교 안함 - for (MngListCompareDto dto : compareList) { - if (Objects.equals(dto.getBeforeYear(), req.getCompareYyyy())) { - TotalListDto totalDto = new TotalListDto(); - totalDto.setBeforeYear(dto.getBeforeYear() == null ? 0 : dto.getBeforeYear()); - totalDto.setMapSheetNum(dto.getMapSheetNum()); - totalNumList.add(totalDto); - } - } - } else if (DetectOption.PREV.getId().equals(req.getDetectOption())) { - // "이전 년도 도엽 사용" 이면 전년도 이전 도엽도 사용 - for (MngListCompareDto dto : compareList) { - if (dto.getBeforeYear() != 0) { - TotalListDto totalDto = new TotalListDto(); - totalDto.setBeforeYear(dto.getBeforeYear() == null ? 0 : dto.getBeforeYear()); - totalDto.setMapSheetNum(dto.getMapSheetNum()); - totalNumList.add(totalDto); - } - } - } - - if (totalNumList.isEmpty()) { - throw new CustomApiException("NOT_FOUND_COMPARE_YEAR", HttpStatus.NOT_FOUND); - } + // if (DetectOption.EXCL.getId().equals(req.getDetectOption())) { + // // "추론제외" 일때 전년도 이전 값이 있어도 전년도 도엽이 없으면 비교 안함 + // for (MngListCompareDto dto : compareList) { + // if (Objects.equals(dto.getBeforeYear(), req.getCompareYyyy())) { + // TotalListDto totalDto = new TotalListDto(); + // totalDto.setBeforeYear(dto.getBeforeYear() == null ? 0 : dto.getBeforeYear()); + // totalDto.setMapSheetNum(dto.getMapSheetNum()); + // totalNumList.add(totalDto); + // } + // } + // } else if (DetectOption.PREV.getId().equals(req.getDetectOption())) { + // // "이전 년도 도엽 사용" 이면 전년도 이전 도엽도 사용 + // for (MngListCompareDto dto : compareList) { + // if (dto.getBeforeYear() != 0) { + // TotalListDto totalDto = new TotalListDto(); + // totalDto.setBeforeYear(dto.getBeforeYear() == null ? 0 : dto.getBeforeYear()); + // totalDto.setMapSheetNum(dto.getMapSheetNum()); + // totalNumList.add(totalDto); + // } + // } + // } + // + // if (totalNumList.isEmpty()) { + // throw new CustomApiException("NOT_FOUND_COMPARE_YEAR", HttpStatus.NOT_FOUND); + // } // 사용할 영상파일 년도 기록 및 추론에 포함되는지 설정 for (MngListDto target : targetList) {