본 실습에서는 NaGeoAI의 DeepForest 수목 탐지 기능을 이용하여 RGB 예제 영상에서 수목 후보를 생성하고, 출력 도형의 좌표계와 영상 정합 상태를 검증하고자 한다. 2026년 10월 5일 QGIS 데스크톱에서 모델 불러오기 → 입력 설정 → 새 추론 → GeoPackage 저장 → 지도 및 속성 검증을 실제 수행하였다.
결과 요약: 점수 임계값 0.3에서 탐지 후보 55개를 생성하였다. 저장 도형은 EPSG:32617이며 모두 유효하고 입력 영상 범위 안에 위치하였다. 이 수치는 실제 나무 수 또는 탐지 정확도를 검증한 결과가 아니다.
1. 플러그인 설치 및 실행 환경
실행 환경은 Windows, QGIS 3.44.12, NaGeoAI 1.9.1 좌표 변환 수정판, DeepForest 2.1.0, PyTorch 2.14.0+cu126이다. 이번 모델 실행 장치는 cpu로 지정하였다. PyTorch 배포에 CUDA 지원이 포함되어 있다는 사실과 이번 실습에서 GPU를 사용했다는 주장은 구분해야 한다.
- NaGeoAI-1.9.1-coordinate-fix-20261005.zip 수정판 다운로드를 눌러 ZIP을 내려받는다. 압축을 풀지 않는다.
- QGIS의 플러그인 → 플러그인 관리 및 설치 → ZIP에서 설치에서 다운로드한 ZIP을 선택하고 설치한다. 기존 설치가 있으면 프로젝트를 저장하고 QGIS를 종료한 뒤 업데이트한다.
- QGIS를 다시 실행하고 NaGeoAI가 활성화되어 있는지 확인한다. NaGeoAI → 필수 환경·모델 설치...에서 필요한 실행 환경을 점검한다. 이미 설치된 항목은 다시 설치하지 않고, 누락된 항목만 준비한다.
- 수목 분할 패널의 모델 불러오기를 이용해 DeepForest 모델을 준비한다. 최초에는 인터넷 연결과 모델 다운로드가 필요하며, 캐시가 있어도 모델 설정 확인을 위한 네트워크 요청이 발생할 수 있다.
수정판 ZIP의 SHA256은 D2ED20F65B56ACD74D92C86401F86264D0637EF2BAC564DCBC6499B040B0187C이다. 메타데이터 버전은 1.9.1을 유지하고 파일명으로 좌표 수정판을 구분하였다. 기존 공개 v1.9.1 ZIP과 동일한 파일이 아니므로, 이번 실습에는 위 수정판을 사용한다. 원본 GeoAI의 MIT 라이선스 및 저작권 고지는 ZIP 안에 유지되어 있다.
이번 실행에서는 설치된 수정본을 사용했으며 플러그인을 재설치하는 화면은 새로 촬영하지 않았다. 설치 화면은 이전 설치 실습 1편을 참조한다. 아래 8개 그림은 이번 새 QGIS 실습에서 확보한 실제 화면이다.
2. 예제 영상 다운로드와 입력 자료 확인
- OSBS-029.tif 다운로드 링크에서 파일을 내려받는다. 브라우저에서 파일이 표시되면 다운로드 기능으로 TIFF를 저장한다. 확장자가 .tif인지 확인한다.
- 예제를 별도 폴더에 보관한다. 본 실습에서는
D:/QGIS_Plugin/SampleData/NaGeoAI/OSBS-029.tif를 사용하였다. 자료를 변경하거나 원본을 덮어쓰지 않는다. - 시작 프로젝트
QGIS_Play.qgz를 연 뒤 레이어를 추가하기 전에 프로젝트 → 다른 이름으로 저장을 선택한다. 본 실습 복사본은QGIS_Play_NaGeoAI_20261005_trees_verified.qgz이다. 같은 파일명이 있으면 고유 접미사를 붙인다. - TIFF를 QGIS 지도 창에 끌어놓거나 레이어 → 레이어 추가 → 래스터 레이어 추가로 불러온다. 본 실습 레이어 이름은
OSBS-029 RGB이다. - 레이어 속성의 정보에서 400×400 픽셀, RGB 3밴드, 0.1 m 격자, EPSG:32617을 확인한다. 프로젝트 CRS는 이 영상의 EPSG:32617로 설정하였다. 이는 표시 CRS 설정이며 입력 영상을 재투영한 것이 아니다.
영상 범위는 X 404211.9~404251.9 m, Y 3285102.9~3285142.9 m이며 약 40×40 m 영역이다. 시작 프로젝트의 배경지도만으로 분석한 것이 아니라 별도의 분석용 RGB 영상을 사용하였다.
자료 제공 및 다운로드 경로는 DeepForest 배포 예제와 opengeos GeoAI 예제 자료이다. 파일은 설치된 DeepForest의 OSBS_029.tif와 SHA256이 일치하였다: 8521DBB5E8063D37D61895867DFCCA7476491D1345103DC1B3FD96F71B186353. DeepForest 배포의 MIT 라이선스와 공식 샘플 자료 안내를 확인하였다. 본 게시물은 해당 예제의 출처를 표시한 실습 화면을 사용하며, 원본 영상이나 모델 가중치를 GitHub에 재업로드하지 않았다. 자체 자료를 사용할 때에는 별도로 공개·이용 조건을 확인해야 한다.

3. 모델과 입력 영상 설정
NaGeoAI 도구 모음의 나무 아이콘 수목 분할을 눌러 DeepForest 패널을 연다. 패널 이름은 수목 분할이지만, 이번 모델의 결과는 수관의 정밀한 픽셀 경계가 아니라 수목 후보를 둘러싼 사각형 탐지 상자이다. DeepForest 공식 설명도 RGB 영상에서의 bounding box 탐지를 설명한다.
- 모델 탭에서 모델을
weecology/deepforest-tree로 선택한다. - 리비전에
cc21436bc5d572dde8ff5f93c1e71a32f563cace를 입력한다. 본 실습은 main 대신 모델 커밋을 고정하였다. - 장치를
cpu로 선택하고 모델 불러오기를 누른다. 상태가Model: weecology/deepforest-tree loaded로 바뀐 것을 확인한다. - 입력 레이어에서
OSBS-029 RGB를 선택한 뒤 레이어에서 영상 설정을 누른다. 아래 상태에 영상 이름과 400×400 픽셀이 표시되는지 확인한다.
모델의 공개 정보와 MIT 라이선스는 Hugging Face 모델 카드에서 확인할 수 있다. 모델의 학습 자료나 다른 지역에서의 성능 설명을 이번 영상의 검증 정확도로 대체하지 않는다.

4. 예측 입력값과 실행
- 예측 탭에서 모드를
Single Image로 선택한다. 400×400의 소형 예제에 적용하였다. - 점수 임계값을
0.30으로 지정한다. 점수가 임계값 이상인 후보를 남기는 기준이며, 실제 나무 여부를 보증하는 값은 아니다. - 예측 실행을 누른 뒤 실행 상태와 완료 메시지를 확인한다. 실행 중 반복해서 버튼을 누르거나 QGIS를 종료하지 않는다.



5. GeoPackage 저장과 좌표 검증
- 출력 탭에서 형식을
Vector (GeoPackage)로 지정한다. 지도에 추가를 선택한다. - 출력 경로에
D:/QGIS_Plugin/SampleData/NaGeoAI/verification/trees_osbs_20261005_gui_verified.gpkg를 입력한다. 저장 폴더를 먼저 만들고 같은 파일이 있으면 다른 이름을 사용한다. - 결과 저장을 누르고 영구 출력 레이어가 추가되는지 확인한다. 자동 표시된 임시 결과와 영구 파일은 구분한다.
- 출력 레이어의 속성에서 EPSG:32617과 좌표 범위를 확인한다. 범위는 X 404211.9~404251.9 m, Y 3285102.9~3285142.9 m로 입력 범위 안에 포함되어야 한다. 좌표가 0~400인데 EPSG:32617만 붙어 있으면 올바른 지도 좌표 결과가 아니다.
- 출력 레이어를 오른쪽 클릭하여 속성 테이블 열기를 선택한다. 총 피처 55개, label=Tree, score 및 xmin/ymin/xmax/ymax 필드를 확인한다. xmin 등 속성은 모델의 원래 픽셀 상자 값이고, 도형 geometry는 변환된 지도 좌표이므로 구분한다.
실제 QGIS API와 별도의 파일 읽기 검증을 병행한 결과, 55개 도형 모두 유효하고 입력 영상 범위 안에 위치하였다. score의 최소값은 0.303308, 최대값은 0.798669였다. 화면에 반올림되어 표시된 0.303~0.799와 일치한다.


6. 좌표 오류 원인과 이번 수정의 범위
앞선 실행에서는 QGIS 자체 Python에 rasterio가 없는데도 저장 코드가 예외를 무시하였다. 그 결과 지도 좌표로 변환하지 않은 픽셀 상자에 EPSG:32617을 지정하여 입력 영상과 겹치지 않는 파일을 생성하였다. 모델 실행용 별도 Python 환경에 rasterio가 있다는 사실만으로 QGIS 호스트에도 설치되어 있다고 판단할 수 없었다.
이번 수정판은 QGIS에 포함된 GDAL로 입력 영상의 공간 변환 계수와 CRS를 함께 읽는다. 네 꼭짓점을 지도 좌표로 변환하며, 변환 또는 CRS를 확인할 수 없으면 저장을 중단한다. GDAL의 픽셀→지도 좌표 변환 기준은 공식 GeoTransform 문서를 따른다. 이번 기능의 벡터 출력에서는 rasterio 누락으로 인한 픽셀 좌표 저장을 방지하였지만, 별도 래스터 출력 기능의 의존성까지 모두 제거한 것은 아니다.
코드 수정 후 QGIS Python 런타임의 7개 회귀 테스트를 통과하였고, 본 게시물의 화면은 그 후 QGIS 데스크톱을 새로 열어 모델을 다시 실행한 결과이다. 테스트 통과와 실제 GUI 실행 검증을 구분하여 기록하였다.
7. 프로젝트 저장과 종료
분석 완료 후 임시 자동 표시 레이어의 자료 참조를 영구 GeoPackage로 변경하였다. 프로젝트 → 저장으로 실습 복사본을 저장하고 QGIS의 정상 종료 명령을 실행하였다. 실습 창이 실제로 닫힌 것을 확인했으며 강제 종료하지 않았다. 원본 QGIS_Play.qgz의 SHA256도 유지되었다.

8. 적용 시 주의사항
본 실습은 한 장의 공식 예제 영상에 대한 실행과 출력 정합 검증이다. 현장 정답 자료와 비교하지 않았으므로 탐지 정확도, 재현율, 실제 수목 개체 수 또는 수관 면적을 확정할 수 없다. 그림자·수종·촬영 조건·해상도가 달라지면 후보의 오탐과 누락을 별도로 검토해야 한다. 겹치는 사각형을 단순 합산하여 수관 면적을 산출해서도 안 된다.
큰 영상은 Large Tile 및 타일 조건을 별도로 검증해야 한다. 본 실습의 Single Image 결과를 대용량 처리 성능으로 일반화하지 않는다. 출력 좌표가 영상과 겹치는지, 파일 CRS가 올바른지, 도형과 속성이 일관되는지 확인한 후 후속 분석에 적용할 필요가 있다.
모든 그림은 실제 QGIS 화면이며 GitHub 업로드 커밋에 고정한 주소를 사용하였다. 그림을 클릭하면 원본 크기로 확인할 수 있다. 원본 예제 영상·모델 가중치·개인정보가 포함된 로그는 공개 업로드 대상에서 제외하였다.
댓글 없음:
댓글 쓰기