실습 목적과 검증 범위
본 실습에서는 NaGeoAI의 Moondream 패널을 이용하여 항공영상의 설명 생성(Caption)과 영상 질의응답(Query)을 실행하고, 출력된 문장을 입력 영상과 비교하였다. 2026년 10월 8일 QGIS 데스크톱에서 실제 모델 로딩, 영상 입력, 두 가지 추론 및 결과 확인을 수행하였다. 이번 실습은 텍스트 출력 기능을 대상으로 하며 객체탐지, 분할, 학습 또는 정확도 평가를 수행한 결과가 아니다.
1. 플러그인 설치와 실행 환경
QGIS의 플러그인 → 플러그인 관리 및 설치 → ZIP에서 설치에서 NaGeoAI 배포 ZIP을 선택하고 설치한다. 공개 배포본은 NaGeoAI v1.9.1 ZIP에서 내려받을 수 있다. 실습 1의 설치 안내도 함께 참고한다. 이번 실행에서는 설치된 플러그인을 사용했으므로 재설치 화면을 새로 촬영한 것으로 제시하지 않는다.
실제 실행 환경은 QGIS 3.44.15, NaGeoAI 1.9.1의 로컬 작업자 환경 수정본, GeoAI 0.43.0, PyTorch 2.14.0+cu126, Transformers 5.12.1이다. 모델의 실행 장치는 cpu로 지정하였다. 공개 v1.9.1 ZIP과 이번 로컬 수정본은 동일한 파일이 아니다. QGIS가 넘기는 PYTHONEXECUTABLE 및 __PYVENV_LAUNCHER__ 환경변수가 별도 Python 작업자의 실행 환경을 오염시키는 문제를 수정한 뒤 검증하였다. 같은 오류가 발생하면 공개 ZIP만 설치하여 문제가 해결된 것으로 간주하지 말고 작업자 환경 수정 여부를 확인할 필요가 있다.
2. 예제 영상 다운로드와 자료 확인
GeoAI 공식 예제 배포 주소인 parking-lot.tif 다운로드를 열어 TIFF 파일을 저장한다. QGIS의 레이어 → 레이어 추가 → 래스터 레이어 추가에서 저장한 파일을 선택한다. 파일은 별도 예제 폴더에 보존하고 원본을 덮어쓰지 않는다. 자료의 개별 재배포 조건은 별도 확인 대상이므로 여기서는 원본 TIFF를 재배포하지 않고 공식 다운로드 주소만 제공한다. 공개 승인된 실습 화면만 게시하였다.
사용 자료는 1,659 × 938 픽셀의 3밴드 uint8 RGB 래스터이며 좌표계는 EPSG:3857, NoData는 지정되어 있지 않다. 파일 크기는 4,674,429바이트이다. 픽셀 간격은 X 약 0.149279, Y 약 0.149320 투영좌표 단위이며, Web Mercator상의 간격을 지상 해상도와 동일하게 해석해서는 안 된다. 파일 SHA-256은 CA8F112FAE10A919F4F55C3F658B9BB893F748FF45E3921DD0AA4C50D69D23C5이다.
3. 원본 프로젝트 보존과 영상 입력
시작 프로젝트를 확인한 뒤 프로젝트 → 다른 이름으로 저장을 이용하여 실습용 복사본을 만든다. 이번 실습에서는 QGIS_Play_NaGeoAI_20261008_moondream_retry.qgz를 사용하였다. 시작 프로젝트에는 분석용 래스터가 없었으므로 배경지도만으로 모델을 실행했다고 간주하지 않고 예제 래스터를 별도로 추가하였다.

입력 레이어 이름은 Parking lot RGB example으로 지정하였다. 프로젝트 표시 좌표계를 입력 자료와 같은 EPSG:3857로 설정하고 레이어 전체 범위로 이동하여 RGB 영상이 정상적으로 표시되는지 확인하였다. 이번 추론은 영상 내용을 텍스트로 설명하므로 새로운 지리참조 래스터가 생성되는 작업은 아니다.

4. Moondream2 모델 불러오기
NaGeoAI의 Moondream 패널을 열고 모델 vikhyatk/moondream2, 장치 cpu를 선택한 뒤 모델 불러오기를 누른다. 모델은 공식 Hugging Face 저장소에서 제공되며, 최초 사용 시에는 모델 파일을 받을 수 있는 네트워크와 저장 공간이 필요하다. 이미 내려받은 파일은 로컬 캐시를 활용할 수 있다. 이번 실행은 기존에 준비한 모델 캐시를 이용하여 로딩하였으며 새 다운로드 화면으로 표시하지 않는다.
Moondream2 공식 모델 카드에서 제공 기능과 Apache-2.0 라이선스를 확인할 수 있다. CPU에서는 로딩과 추론에 시간이 필요하므로 실행 중 진행 표시가 지속된다는 이유만으로 실패로 판단하지 않는다. 패널의 Loaded (worker): moondream2 표시와 실제 추론 완료를 함께 확인하였다.

5. Caption: 항공영상 설명 생성
영상 입력에서 Parking lot RGB example을 선택하고 영상 불러오기를 누른다. Loaded: parking-lot.tif를 확인한 뒤 모드를 Caption, 설명 길이를 normal로 설정하고 실행을 누른다. Caption에서는 별도 질문을 입력하지 않았다.


완료 후 진행 표시가 Complete로 바뀌고 결과 영역에 다음 문장이 출력되었다.
An aerial view shows a parking lot flanked by two buildings. The building on the left has a white roof and is situated slightly behind the other building. The building on the right also has a white roof and is positioned further back in the lot. The parking lot is filled with cars, and there are several trees scattered throughout. A strip of grass separates the parking lot from a roadway in the foreground. The image does not show the sky.

두 건물의 밝은 지붕, 주차된 차량, 수목과 하단 도로는 화면에서 확인할 수 있었다. 다만 건물의 앞뒤 관계와 같은 문장은 모델의 해석이며, 촬영 기하나 현장조사로 검증한 사실이 아니다. 생성 문장을 조사 결과나 시설물 속성으로 그대로 확정할 수는 없다.
6. Query: 지붕 색 질의응답
같은 영상을 유지한 상태에서 모드를 Query로 변경하였다. Prompt에는 What color are the roofs of the two large buildings?를 입력하고 실행을 누른다. 이 질문은 화면에서 직접 대조할 수 있는 지붕 색을 대상으로 한다.

완료 후 결과는 The two large buildings have white roofs.였다. 입력 영상의 두 큰 건물 지붕이 흰색 계열로 표시되는 것을 확인하여 이 질문에 대한 응답을 시각적으로 대조하였다.

7. 결과 검증, 저장 및 주의사항
두 모드 모두 QGIS 데스크톱 패널에서 실제 실행하여 완료 상태와 텍스트 출력을 확인하였다. 검증 범위는 단일 예제 영상의 설명 생성과 한 가지 질의응답이다. 정량 정확도, 객체 수, 좌표 정확도, 현장 시설물 속성 또는 다른 영상에 대한 일반화 성능을 평가한 것은 아니다. 학습 데이터 내보내기와 객체 검출 기능도 이번 실습에서 수행하지 않았다.
작업 후 실습용 프로젝트 복사본을 다시 저장하여 파일 갱신을 확인하고 QGIS를 정상 종료하였다. 원본 QGIS_Play.qgz의 SHA-256이 실행 전후 동일함을 확인하였다. 모델 출력 문장은 프로젝트 저장만으로 영구 보존되는 것으로 가정하지 말고 별도 기록이 필요하다. 이 글과 단계별 실제 화면에 실행 결과를 기록하였다.
이미지는 공개 승인 및 민감정보 점검을 거친 실제 QGIS 화면이다. GitHub 업로드 커밋에 고정된 주소를 사용하였으며 각 이미지는 클릭하여 원본 크기로 확인할 수 있다. 원본 예제 영상과 모델 파일은 이 게시 절차로 재배포하지 않았다.
댓글 없음:
댓글 쓰기