실습일: 2026년 10월 6일 · QGIS 3.44.12 · NaGeoAI
1. 실습 목적과 확인 범위
본 실습에서는 Landsat 예제 영상과 기준 NDVI를 이용하여 GeoAI Lightning 체크포인트를 학습하고, NaGeoAI의 픽셀 회귀 패널에서 예측 GeoTIFF를 생성하였다. 자료의 좌표계와 격자 정합, 체크포인트 재로딩, QGIS 실제 실행 및 출력의 공간 범위 보존 여부를 확인하는 것을 목적으로 한다. 공개된 완성 체크포인트를 다운로드한 실습이 아니라, 공식 예제 자료를 이용하여 새 모델을 학습한 실습이다.
2. 플러그인 설치와 예제 자료 다운로드
NaGeoAI 1.9.1 배포 ZIP을 받은 뒤 QGIS의 플러그인 → 플러그인 관리 및 설치 → ZIP 파일에서 설치에서 해당 파일을 선택하고 설치한다. 설치 후 NaGeoAI 활성화 상태를 확인한다. 필요한 Python 환경은 NaGeoAI 메뉴의 ‘필수 환경·모델 설치’에서 확인한다. 본 회차에서는 기존 설치 환경을 사용했으므로 새 설치 화면을 촬영하거나 재설치했다고 표시하지 않는다. 설치 화면은 실습 1의 실제 과거 캡처를 참고한다. 해당 글 역시 ZIP 선택 화면과 재설치 완료 증거를 구분하고 있다.
자료의 출처는 GeoAI 공식 Pixel-Level Regression 예제이다. 아래 링크에서 입력 영상과 기준 NDVI를 별도 폴더에 다운로드한다. 본 글은 원본 래스터와 모델을 재배포하지 않으며, 자료의 외부 재배포에는 제공처의 최신 이용 조건을 별도로 확인해야 한다.
다운로드한 원본은 보존하고, 타일·모델·예측 결과는 별도 실습 폴더에 저장한다. 이 자료는 한국 현장 관측 자료가 아니라 공식 문서의 예제 자료이며, 배경지도만을 입력으로 분석한 것이 아니다.
3. 입력 자료와 모델 학습
두 원본 래스터는 EPSG:3857, 706×649 픽셀, 90m 격자로 확인되었다. 입력은 8밴드, 기준 NDVI는 1밴드이다. 밴드 설명이 없으므로 임의의 밴드 명칭을 붙이지 않고 원본의 8밴드 순서를 유지하였다. 입력과 기준 영상의 좌표 변환 및 격자 일치 여부를 확인하였다. 원본의 Y 방향 픽셀 간격은 +90m이며, 출력에서도 동일한 지리참조를 보존하였다.
128×128 픽셀의 중첩 없는 타일을 구성하였다. 왼쪽 2개 열의 10개 타일을 학습에 사용하고, 한 열을 비운 뒤 5개 타일을 검증, 별도 5개 타일을 최종 평가에 사용하였다. 경계 잔여 픽셀은 제외하였다. 최종 평가 타일은 모델 선택에 사용하지 않았다. 공식 문서의 무작위 분할 및 학습 설정을 그대로 복제한 것이 아니라, 본 회차의 작은 실습 범위에 맞추어 조정한 구성이다.
| 항목 | 실제 설정 |
|---|---|
| 구조 / 인코더 | U-Net / ResNet18 |
| 입력 채널 / 사전학습 가중치 | 8 / 사용하지 않음 |
| 학습 반복 / 배치 | 50 epochs / 2 |
| 학습률 / 손실 | 0.001 / MSE |
| seed / workers | 42 / 0 |
| 학습 장치 | NVIDIA GeForce RTX 3080 Ti |
| 최선 체크포인트 | resnet18_unet_epoch=48_val_loss=0.0043.ckpt |
학습과 추론에는 일관된 입력 정규화를 적용하였다. 이번 입력 값 범위에서 GeoAI 전처리는 입력을 0~1로 제한하므로 일부 음의 입력값은 0으로 처리된다. 원본 파일 자체는 변경하지 않았다. 체크포인트는 GeoAI PixelRegressionModel.load_from_checkpoint로 재로딩하여 검증하였다. 임의의 다른 모델 .ckpt 파일은 구조·입력 채널이 다를 수 있어 대체할 수 없다. 재학습은 공식 문서의 train_pixel_regressor 절차를 따르되 위 설정과 공간 분할을 동일하게 적용해야 한다.
4. QGIS 시작 프로젝트와 실습 입력
시작 프로젝트 QGIS_Play.qgz를 열고, 분석 레이어를 추가하기 전에 QGIS_Play_NaGeoAI_20261006_pixel_regression.qgz로 별도 저장하였다. 원본 프로젝트는 덮어쓰지 않았다. 최종 평가 영역 중 test_0_512_input.tif와 test_0_512_target.tif를 각각 입력 영상과 기준 NDVI 레이어로 추가하였다. QGIS에서 유효한 래스터임을 확인하고 실습 복사본의 프로젝트 CRS를 EPSG:3857로 설정하였다.
5. NaGeoAI 픽셀 회귀 설정
- NaGeoAI 도구 모음에서 ‘추가 분석’을 연다.
- 기능 목록에서 ‘픽셀 회귀’를 선택한다.
- 입력 래스터에 test_0_512_input.tif를 지정한다.
- 모델 체크포인트에 위에서 학습한 최선 .ckpt 파일을 지정한다.
- 타일 크기 128, 중첩 크기 0을 입력한다.
- 새 출력 파일 qgis_pixel_regression_20261006.tif를 지정하고 ‘공간 결과를 지도에 추가’를 선택한다.

6. 실행과 처리 로그 확인
‘실행’을 누른 뒤 시작 로그와 처리 완료를 확인하였다. 이번 입력은 128×128 픽셀의 한 타일이므로 로그에는 Total tiles: 1이 표시된다. 처리 중 동일 출력으로 다시 실행하거나 기존 결과를 덮어쓰지 않는다.


7. 출력 격자와 수치 검증
출력 레이어를 더블클릭하여 ‘정보’에서 너비·높이·자료형·범위를 확인하였다. 출력은 1밴드 Float32 GeoTIFF이며, EPSG:3857과 입력의 좌표 변환·공간 범위를 그대로 보존하였다. 별도 파일 검사에서 모든 출력값이 유한한 수임을 확인하였다.

| 검증 범위 | 결과 |
|---|---|
| 최종 평가 5타일 / 81,920픽셀 | RMSE 0.05297 / MAE 0.03715 / R² 0.60326 |
| 학습 평균값 기준선 RMSE | 0.15594 |
| QGIS 실제 실행 1타일 RMSE | 0.04544 |
| QGIS 1타일 예측 범위 | 0.11157~0.99660 |
| QGIS와 CPU 동일 타일 예측의 최대 절대 차이 | 0.0005221 |
5타일 평가는 체크포인트를 재로딩한 CPU 추론 결과이며, QGIS 실제 패널에서 실행한 것은 그중 1타일이다. 두 검증 범위를 혼동하지 않아야 한다. 동일 영상 내 공간 분리 평가이므로 다른 연도·지역에 대한 일반화 성능은 확인하지 않았다. 모든 평가 타일을 합친 예측 범위는 0.07456~1.07403으로, 일부 픽셀은 NDVI 상한 1을 초과하였다. 이번 출력에는 사후 값 제한을 적용하지 않았다.
8. 저장, 종료와 주의사항
처리 완료 후 출력 레이어 속성 창에서 QGIS가 일시적으로 ‘응답 없음’ 상태가 나타났다. 당시 강제 종료하지 않았으며, 후속 확인에서 실습 복사본에 입력·기준 NDVI·예측 결과 3개 레이어가 저장되어 있고 QGIS 창과 프로세스가 더 이상 실행 중이 아닌 것을 확인하였다. 자동 정리 시점에는 정상 종료를 확인하지 못했으므로, 이를 오류 없이 자동 저장·종료한 사례로 해석해서는 안 된다.
실습을 재현할 때는 모델 입력 채널 수, 밴드 순서, 전처리, CRS, 타일 크기를 함께 확인해야 한다. NDVI는 필요한 밴드가 있으면 산식으로 직접 계산할 수도 있으며, 본 실습은 딥러닝 회귀와 체크포인트 연결 과정의 검증을 위한 것이다. 실제 식생 상태 평가나 현장 의사결정에 사용하려면 별도의 지역·시기 자료와 독립 기준 자료를 이용한 추가 검증이 필요하다.
댓글 없음:
댓글 쓰기