본 실습에서는 NaGeoAI의 의미론적 분할 패널을 이용하여 건물 라벨로 학습 타일을 만들고, U-Net 모델을 직접 학습한 뒤, 학습에 쓰지 않은 다른 영상에 추론하여 건물 마스크를 생성하였다. 2026년 10월 13일 QGIS 데스크톱에서 실제 입력·타일 생성·학습·추론·결과 확인과 프로젝트 저장·정상 종료를 수행하였다. 실습 13~15의 SAM3가 이미 학습된 범용 모델에 프롬프트를 주는 방식이었다면, 이번 회차는 사용자가 가진 라벨로 모델을 새로 학습하는 절차를 확인하는 것이 목적이다.
1. 플러그인 설치와 예제 다운로드
현재 설치 환경은 QGIS 3.44.15-Solothurn과 NaGeoAI 1.9.1이다. NaGeoAI 배포 페이지에서 설치용 ZIP을 확인한 뒤 플러그인 → 플러그인 관리 및 설치 → ZIP에서 설치로 설치하고 플러그인을 활성화한다. 최초 환경 설정에서는 이미 설치된 항목을 건너뛰고 누락된 의존성만 준비한다. 이번 실행에서는 재설치하지 않았다.
입력 자료는 naip-train.tif, naip-train-buildings.geojson, naip-test.tif 원본 다운로드로 준비한다. Source Cooperative의 Open Geospatial Solutions 자료 페이지는 GeoAI 모델 학습용 공개 접근 자료로 안내하고 있다. 개별 파일의 재배포 라이선스를 별도로 확인한 것으로 간주하지 않으며, 원본 영상·라벨과 학습된 모델 파일은 재배포하지 않는다.
원본 QGIS_Play.qgz를 열고 프로젝트 → 다른 이름으로 저장으로 QGIS_Play_NaGeoAI_20261013_semseg16_buildings.qgz 복사본을 만든다. 이번에는 QGIS 시작 보조 코드로 원본을 연 후 고유 복사본 저장과 현재 파일명을 확인하였다. 복사본 최초 크기는 5,702바이트이며 레이어 0개 상태에서 생성하였다. 원본 파일은 변경하지 않았다.
2. 입력 자료
| 파일 | 용도 | 구성 |
|---|---|---|
| naip-train.tif | 학습 영상 | EPSG:26911, 2503×1126, 4밴드 uint8, 0.6 m |
| naip-train-buildings.geojson | 학습 라벨 | 건물 폴리곤 735개 |
| naip-test.tif | 추론 영상(학습 미사용) | EPSG:26911, 3382×1347, 4밴드 uint8, 0.6 m |
레이어 → 레이어 추가로 세 파일을 지도에 불러온다. 프로젝트 표시 좌표계는 원본 프로젝트의 EPSG:5187을 유지했으므로 화면의 회전된 모습은 표시 변환에 따른 것이며 원본 영상을 재투영한 것은 아니다. NAIP 영상은 4밴드(R,G,B,NIR)이지만 이번 학습은 기본값 Channels 3을 사용하였으므로 앞의 3개 밴드(RGB)만 모델 입력으로 사용된다.
3. 학습 타일 생성
NaGeoAI → 의미론적 분할 → 1. 데이터 생성 탭에서 래스터에 naip-train, Labels에 naip-train-buildings를 선택한다. 타일 크기 512, 이동 간격 256, Buffer 0, 형식 PASCAL_VOC 기본값을 유지하고 출력 폴더를 지정한 뒤 타일 내보내기를 누른다. 라벨 폴리곤은 영상 좌표계로 변환되어 512×512 1밴드 uint8 마스크로 래스터화된다. 이번 실행에서는 images·labels·annotations 폴더에 각각 36개 파일이 생성되었으며 완료 후 학습 탭으로 자동 전환되고 경로가 채워졌다.

4. U-Net 모델 학습
2. 학습 탭에서 형식 directory, Architecture unet, Encoder resnet34, Weights imagenet, Channels 3, Classes 2(배경·건물)를 사용한다. 배치 크기 8, Epochs 50, LR 0.001, Val Split 0.2 기본값을 유지하고 학습 곡선 그래프 저장을 선택한 뒤 학습 시작을 누른다. 이 PC(RTX 3080 Ti)에서는 작업자 프로세스 시작 시간을 포함하여 약 4분이 걸렸다.

| 검증 지표(타일 20% 검증 분할) | 값 |
|---|---|
| 최고 IoU | 0.9249 |
| 최종 IoU | 0.9234 |
| F1 / Precision / Recall | 0.9594 / 0.9596 / 0.9592 |
| 최종 검증 손실 | 0.0528 |
이 지표는 같은 학습 영상에서 잘라낸 타일 일부(약 7개)로 계산한 값이다. 이동 간격 256으로 타일이 서로 겹치므로 검증 타일과 학습 타일이 같은 지역을 공유할 수 있어 실제 일반화 성능보다 높게 나올 수 있다. 독립 영상에 대한 정확도 평가는 이번 회차에서 수행하지 않았다.

5. 새 영상 추론
3. 추론 탭에서 래스터를 naip-test로 바꾼다. 모델 경로에는 학습 직후 best_model.pth가 자동 입력되어 있다. Arch unet, Encoder resnet34, Channels 3, Classes 2가 학습 설정과 같은지 확인한다. Window 512, Overlap 256, Batch 4 기본값을 사용하고 범위는 전체 래스터(Full raster)로 둔다. 출력 파일을 별도 폴더에 지정하고 추론 실행을 누른다. 이번 실행에서는 65개 창을 처리하여 약 2초 만에 추론이 끝났고, 결과가 Semantic Segmentation Result 레이어로 지도에 추가되었다.

6. 출력 래스터 검증
출력 파일은 QGIS 화면 확인과 별도로 rasterio 읽기 전용 검사로 확인하였다.
| 항목 | 검증 결과 |
|---|---|
| CRS·크기 | EPSG:26911, 3382×1347 |
| 밴드·자료형·NoData | 1밴드, uint8, 미지정 |
| 입력 대비 격자 | CRS·너비·높이·affine transform 일치 |
| 값별 픽셀 수 | 0: 4,050,231 / 1: 505,323 (건물 약 11.1%) |
| 파일 크기 | 4,559,956바이트 |
출력 SHA-256은 c66b625f13d0fdd41824d8805f3cc801b91933364ecc366fec94d068e81c30d8이며 입력 naip-test.tif의 SHA-256은 9cde03b5e8ed5188ef4ef454786c1695946f83cff53e611d5881ce98bc19696a이다. 픽셀 수와 격자 일치는 자료 구성 확인이며 위치·면적·분할 정확도를 뜻하지 않는다. 결과를 폴리곤으로 쓰려면 같은 탭의 벡터화 기능을 사용할 수 있으나 이번 회차에서는 실행하지 않았다.
7. 프로젝트 저장과 정상 종료
실습 복사본을 Ctrl+S로 최종 저장하였다. 저장 후 파일 크기는 12,161바이트로 갱신되었고 창 제목의 미저장 표시(*)가 사라졌으며 상태 표시줄에 저장 경로가 표시된 것을 확인하였다. 원본 QGIS_Play.qgz의 SHA-256은 실행 전후 동일하였다. 이후 프로젝트 → QGIS 종료로 정상 종료하였고 QGIS 프로세스가 남아 있지 않은 것을 확인하였다. 강제 종료하지 않았다.

본 실습은 한 장의 학습 영상과 공개 라벨로 소규모 모델을 학습하는 절차를 보여 주며, 측량 성과 검증이나 독립 자료 기반 정확도 평가는 포함하지 않는다. 실제 업무에 적용하려면 지역이 분리된 검증 영상과 현장·수치지도 기반 참값으로 별도 평가해야 한다. 개별 객체 분할(field-boundaries) 학습은 다음 회차로 남겨 둔다.
댓글 없음:
댓글 쓰기