2026-10-13

NaGeoAI 실제 QGIS 실습 16 — 의미론적 분할 모델 학습과 새 영상 건물 추론

본 실습에서는 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개 파일이 생성되었으며 완료 후 학습 탭으로 자동 전환되고 경로가 채워졌다.

naip-train 영상과 건물 라벨로 학습 타일을 내보낸 후 성공 메시지가 표시된 QGIS 화면
그림 1. 타일 내보내기 성공 메시지와 자동 전환된 학습 탭. 노란 폴리곤이 학습 라벨이다. 그림을 클릭하면 원본 크기로 확인할 수 있다.

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분이 걸렸다.

학습 완료 후 best_model.pth 저장 메시지와 검증 지표 로그가 보이는 QGIS 화면
그림 2. 학습 완료 후 모델 저장 메시지와 추론 탭 자동 전환. 하단 로그에 최종 검증 지표가 표시된다. 그림을 클릭하면 원본 크기로 확인할 수 있다.
검증 지표(타일 20% 검증 분할)값
최고 IoU0.9249
최종 IoU0.9234
F1 / Precision / Recall0.9594 / 0.9596 / 0.9592
최종 검증 손실0.0528

이 지표는 같은 학습 영상에서 잘라낸 타일 일부(약 7개)로 계산한 값이다. 이동 간격 256으로 타일이 서로 겹치므로 검증 타일과 학습 타일이 같은 지역을 공유할 수 있어 실제 일반화 성능보다 높게 나올 수 있다. 독립 영상에 대한 정확도 평가는 이번 회차에서 수행하지 않았다.

에폭별 학습·검증 손실, 검증 IoU, 검증 F1 곡선
그림 3. 플러그인이 저장한 training_curves.png. 초기와 28에폭 부근에 검증 손실이 일시적으로 튀었다가 회복되었으며, 이는 작은 검증 집합에서 흔히 나타나는 변동이다. 그림을 클릭하면 원본 크기로 확인할 수 있다.

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 레이어로 지도에 추가되었다.

naip-test 영상에 대한 건물 분할 결과가 흑백 마스크로 지도에 추가된 QGIS 화면
그림 4. 학습에 쓰지 않은 naip-test 영상의 추론 결과. 흰색이 건물(1), 검은색이 배경(0)이다. 왼쪽 아래는 비교를 위해 남겨 둔 학습 영상과 라벨이다. 그림을 클릭하면 원본 크기로 확인할 수 있다.

6. 출력 래스터 검증

출력 파일은 QGIS 화면 확인과 별도로 rasterio 읽기 전용 검사로 확인하였다.

항목검증 결과
CRS·크기EPSG:26911, 3382×1347
밴드·자료형·NoData1밴드, 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 프로세스가 남아 있지 않은 것을 확인하였다. 강제 종료하지 않았다.

실습 복사본 저장 후 창 제목에 미저장 표시가 없는 QGIS 화면
그림 5. 저장 후 창 제목과 하단 상태 표시줄의 저장 메시지를 확인한 화면. 종료 확인은 이후 프로세스 점검으로 별도 수행하였다. 그림을 클릭하면 원본 크기로 확인할 수 있다.

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

댓글 없음:

댓글 쓰기

NaGeoAI 실제 QGIS 실습 16 — 의미론적 분할 모델 학습과 새 영상 건물 추론

본 실습에서는 NaGeoAI의 의미론적 분할 패널을 이용하여 건물 라벨로 학습 타일을 만들고, U-Net 모델을 직접 학습한 뒤, 학습에 쓰지 않은 다른 영상에 추론하여 건물 마스크를 생성하였다. 2026년 10월 13일 QGIS 데스크톱에서 실제 입...