Merge pull request 'feat/infer_dev_260107' (#336) from feat/infer_dev_260107 into develop

Reviewed-on: https://kamco.gitea.gs.dabeeo.com/dabeeo/kamco-dabeeo-backoffice/pulls/336
This commit is contained in:
2026-01-23 20:35:14 +09:00
3 changed files with 209 additions and 22 deletions

View File

@@ -13,14 +13,19 @@ public class MapSheetMngFileJobController {
private final MapSheetMngFileJobService mapSheetMngFileJobService; private final MapSheetMngFileJobService mapSheetMngFileJobService;
// 현재 상태 확인용 Getter // 현재 상태 확인용 Getter
@Getter private boolean isSchedulerEnabled = false; @Getter
@Getter private boolean isFileSyncSchedulerEnabled = false; private boolean isSchedulerEnabled = false;
@Getter private int mngSyncPageSize = 20; @Getter
private boolean isFileSyncSchedulerEnabled = false;
@Getter
private int mngSyncPageSize = 20;
// 파일싱크 진행여부 확인하기 // 파일싱크 진행여부 확인하기
@Scheduled(fixedDelay = 1000 * 10) @Scheduled(fixedDelay = 1000 * 10)
public void checkMngFileSync() { public void checkMngFileSync() {
if (!isSchedulerEnabled) return; if (!isSchedulerEnabled) {
return;
}
Integer mng = 0; Integer mng = 0;
// isFileSyncSchedulerEnabled = false; // isFileSyncSchedulerEnabled = false;
@@ -28,14 +33,14 @@ public class MapSheetMngFileJobController {
mng = mapSheetMngFileJobService.checkMngFileSync(); mng = mapSheetMngFileJobService.checkMngFileSync();
this.isFileSyncSchedulerEnabled = true; this.isFileSyncSchedulerEnabled = true;
System.out.println( System.out.println(
"MngFileSyncJob ON --> mngYyyy : " "MngFileSyncJob --> mngYyyy : "
+ mng + mng
+ ", currentTime : " + ", currentTime : "
+ System.currentTimeMillis()); + System.currentTimeMillis());
} else { } else {
this.isFileSyncSchedulerEnabled = false; this.isFileSyncSchedulerEnabled = false;
System.out.println( System.out.println(
"MngFileSyncJob OFF --> mngYyyy : " "MngFileSyncJob --> mngYyyy : "
+ mng + mng
+ ", currentTime : " + ", currentTime : "
+ System.currentTimeMillis()); + System.currentTimeMillis());
@@ -44,7 +49,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 10) @Scheduled(fixedDelay = 1000 * 10)
public void mngFileSyncJob00() { public void mngFileSyncJob00() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 00 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 00 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(0, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(0, mngSyncPageSize);
@@ -52,7 +59,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob01() { public void mngFileSyncJob01() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 01 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 01 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(1, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(1, mngSyncPageSize);
@@ -60,7 +69,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob02() { public void mngFileSyncJob02() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 02 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 02 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(2, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(2, mngSyncPageSize);
@@ -68,7 +79,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob03() { public void mngFileSyncJob03() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 03 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 03 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(3, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(3, mngSyncPageSize);
@@ -76,7 +89,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob04() { public void mngFileSyncJob04() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 04 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 04 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(4, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(4, mngSyncPageSize);
@@ -84,7 +99,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob05() { public void mngFileSyncJob05() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 05 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 05 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(5, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(5, mngSyncPageSize);
@@ -92,7 +109,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob06() { public void mngFileSyncJob06() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 06 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 06 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(6, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(6, mngSyncPageSize);
@@ -100,7 +119,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob07() { public void mngFileSyncJob07() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 07 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 07 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(7, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(7, mngSyncPageSize);
@@ -108,7 +129,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob08() { public void mngFileSyncJob08() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 08 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 08 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(8, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(8, mngSyncPageSize);
@@ -116,7 +139,9 @@ public class MapSheetMngFileJobController {
@Scheduled(fixedDelay = 1000 * 5) @Scheduled(fixedDelay = 1000 * 5)
public void mngFileSyncJob09() { public void mngFileSyncJob09() {
if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) {
return;
}
System.out.println("mngFileSyncJob 09 Processing currentTime : " + System.currentTimeMillis()); System.out.println("mngFileSyncJob 09 Processing currentTime : " + System.currentTimeMillis());
mapSheetMngFileJobService.checkMapSheetFileProcess(9, mngSyncPageSize); mapSheetMngFileJobService.checkMapSheetFileProcess(9, mngSyncPageSize);

View File

@@ -0,0 +1,77 @@
## 📌 학습데이터 라벨링 geojson 생성
### 🧩 사용하는 테이블 목록
- inference_results_testing : AI 수행 이후 변화탐지된 polygon insert 됨
- tb_map_sheet_anal_inference : 추론 실행 완료 후, 추론 마스터 값 insert
- anal_state : 학습데이터 제작 상태 -> (enum) `LabelMngState`
- 💡 tb_map_sheet_anal_data_inference_geom 💡 : 추론 실행 완료 후, testing 값 insert
- tb_labeling_inspector : 라벨링 할당 시 선택한 검수자 insert
- 라벨링 할당 시 해당 회차별 검수자를 insert
- 매일 0시 스케줄링, 어제 라벨링 완료한 데이터 기준 검수 할당 진행
- 💡 tb_labeling_assignment 💡 : 라벨링 할당 테이블 (polygon 수만큼)
- worker_uid : 라벨러 사번
- inspector_uid : 검수자 사번
- work_state : 라벨 진행 상태 -> (enum) `LabelState`
- inspect_state : 검수 진행 상태 -> (enum) `InspectState`
- work_stat_dttm : 라벨 상태 변경일시
- inspect_stat_dttm : 검수 상태 변경일시
- 💡 tb_map_sheet_learn_data_geom 💡 : 라벨링 툴에서 그린 polygon insert/update
- file_create_yn : geojson 파일 생성 후 true 로 업데이트
**💡표기된 테이블은 geo_uid (Long) 값으로 연결됨**
### 🧩 스케줄링 로직
✅ 파일 위치 : TrainingDataReviewJobService.java
#### 1. 라벨링 완료 건 검수 할당
- Method : assignReviewerYesterdayLabelComplete
- 매일 00시 00분 수행 (시간 변경 가능)
- 라벨링 상태 `work_state = DONE`
- 라벨링 상태 변경일시(work_stat_dttm) 기준 어제인 건 조회하여 할당
- 실패 시, 수동 호출 API : `/api/training-data/review/run-schedule`
#### 2. 학습데이터 geojson 생성
- Method : exportGeojsonLabelingGeom
- 매일 02시 00분 수행 (시간 변경 가능)
- 학습데이터 제작 상태가 `ING`인 회차
- 어제까지 검수 상태 업데이트 된 polygon (`inspect_stat_dttm`)
- geojson 제작 대상은 누적으로 조회함
- `inspect_state = 'COMPLETE'`
- `inspect_stat_dttm < 오늘 이전 모두`
- 파일 생성 후 polygon별 `file_create_yn = true` 로 업데이트
- 회차에 할당된 polygon 총 개수(제외상태 빼고) = `file_create_yn = true` 인 개수가 맞을 때까지 스케줄링 진행
- 실패 시, 수동 호출 API : `/api/training-data/review/run-label-geojson`
- 파일 생성 위치: `/kamco-nfs/model_output/labeling/`
- ️📚 생성 규칙
```
/kamco-nfs/model_output/labeling/
└─ {RESULT_UID}
└─{RESULT_UID 8자리}_{비교년도}_{기준년도}_{도엽번호}_D15.geojson
```
### 🧩 사용 쿼리
- 📄 TRAINING_DATA_GEOJSON_QUERY.sql 참고
### 🧩 라벨링 툴 접속 가능한 계정
`* password : qwe123!@#`
1. 라벨러
- 010222297501
- 98765432
- 20202020
- 123456
- 01022223333
2. 검수자
- 01022225555
- 125511
- K20251212001

View File

@@ -0,0 +1,85 @@
--1.
select lae1_0.anal_uid,
msle1_0.uid,
sum(case
when (lae1_0.inspect_state = 'UNCONFIRM'
or lae1_0.inspect_state = 'COMPLETE'
or lae1_0.inspect_state is null)
then 1
else 0
end), --allCnt
sum(case
when (lae1_0.inspect_state = 'COMPLETE')
then 1
else 0
end), --completeCnt
sum(case
when (msldge1_0.file_create_yn = true)
then 1
else 0
end) --fileCnt
from tb_labeling_assignment lae1_0
join
tb_map_sheet_anal_inference msaie1_0
on lae1_0.anal_uid = msaie1_0.anal_uid
and msaie1_0.anal_state = 'ING' --
left join
tb_map_sheet_learn msle1_0
on msaie1_0.learn_id = msle1_0.id
left join
tb_map_sheet_learn_data_geom msldge1_0
on lae1_0.inference_geom_uid = msldge1_0.geo_uid -- geo_uid
group by lae1_0.anal_uid,
msle1_0.uid
having sum(case
when (lae1_0.inspect_state = 'COMPLETE')
then 1
else 0
end) > 0 -- COMPLETE
;
--2. +
select msaie1_0.compare_yyyy,
msaie1_0.target_yyyy,
lae1_0.assign_group_id
from tb_labeling_assignment lae1_0
join
tb_map_sheet_anal_inference msaie1_0
on lae1_0.anal_uid = msaie1_0.anal_uid
where lae1_0.anal_uid = 52 --
and lae1_0.inspect_state = 'COMPLETE' --
and lae1_0.inspect_stat_dttm < '2026-01-23T00:00+09:00' --
group by msaie1_0.compare_yyyy,
msaie1_0.target_yyyy,
lae1_0.assign_group_id
;
-- 3. 회차 + 도엽에 검수 완료된 polygon 조회
select msldge1_0.geo_uid,
cast('Feature' as varchar),
st_asgeojson(msldge1_0.geom),
case
when (msldge1_0.class_after_cd in ('building', 'container'))
then cast('M1' as varchar)
when (msldge1_0.class_after_cd = 'waste')
then cast('M2' as varchar)
else 'M3'
end,
msldge1_0.class_before_cd,
msldge1_0.class_after_cd
from tb_labeling_assignment lae1_0
left join
tb_map_sheet_learn_data_geom msldge1_0 -- polygon
on lae1_0.inference_geom_uid = msldge1_0.geo_uid
where lae1_0.anal_uid = 52
and lae1_0.assign_group_id = '34602060'
and lae1_0.inspect_state = 'COMPLETE'
and lae1_0.inspect_stat_dttm < '2026-01-23T00:00+09:00'
;
--4. learn_data_geom file_create_yn = true
update tb_map_sheet_learn_data_geom msldge1_0
set file_create_yn= true,
updated_dttm='2026-01-23T19:27:28.623677700+09:00'
where msldge1_0.geo_uid = 390913
;