TL;DR

  • TerrainSR는 100m 해상도 지형 고도 데이터를 10m 데이터로 업스케일링하며, 100m보다 고해상도인 입력에는 좋은 결과를 내지만 그보다 낮은 해상도에서는 성능이 무너짐.
  • 학습 데이터에서 시가지와 노천 광산 등 인간이 변형한 지형을 제외해 생성 결과에 관련 아티팩트가 나타나지 않도록 설계됨.
  • RTX 4070에서 모델 로딩 후 50×50km 지형 패치를 100m에서 10m로 변환하는 데 0.74초가 걸려 실시간 게임 등에 적용 가능함.
  • 대규모 지형에서는 전통적인 침식 시뮬레이터보다 빠르고 결과가 다양하며, 100m 데이터의 대형 건물 급경사 지형이 언덕으로 바뀌는 등 예상 밖의 결과가 나올 수 있음.
  • 모델 가중치와 추론 코드는 Apache 2.0 라이선스로 공개되며, 입력은 100m 고도 배열과 10m 물 마스크로 구성됨.

TerrainSR

  • TerrainSR는 낮은 상세도의 지형 고도 데이터에서 사실적인 고상세도 지형 고도 데이터를 생성하는 모델임.
  • 100m→10m 데이터 쌍으로 학습됐으며, 100m보다 높은 해상도의 데이터에 좋은 결과를 내고 10m보다 세밀한 수준까지 외삽할 수도 있음. 반면 100m보다 낮은 해상도의 입력에서는 결과가 무너짐.
  • 시가지, 노천 광산 등 건설되거나 인간이 변형한 지형은 학습 데이터에서 의도적으로 제외돼 해당 아티팩트가 생성 결과에 포함되지 않음.

활용 사례

  • 이 모델은 유럽의 100m 해상도 지도를 실규모 역사 전략 게임에 활용할 목적으로 제작됨.
  • 10m 데이터 세트는 수백 기가바이트에 달해 사용하기 어렵고, 오늘날 유럽의 도로·부두·건물 등 명백한 아티팩트를 제거하는 데도 매우 많은 수작업이 필요함.
  • 용량이 작고 현재의 세부 지형을 매끄럽게 처리하는 100m 데이터에 모델을 적용해 그럴듯한 지형 세부 정보를 추가할 수 있음.
  • 일부 경우에는 100m 데이터에 포함된 대형 건물의 급경사 지형이 언덕으로 변하는 등 특이한 결과가 나올 수 있음.
  • 넓은 지형에서는 전통적인 침식 시뮬레이터를 사용하는 것보다 빠르고 결과가 다양함.

속도

  • RTX 4070에서 모델을 로딩한 뒤 50×50km 패치를 100m에서 10m로 변환하는 데 0.74초가 걸림.
  • 이 속도는 게임과 같은 실시간 애플리케이션에 적용할 수 있는 수준임.

비교

사용 방법

  • 저장소와 Python 파일, 가중치 폴더를 내려받아야 함.
  • Python 3.10 이상과 PyTorch 2.6 이상이 필요하며, NVIDIA GPU를 사용하는 경우 시스템에 맞는 CUDA 빌드를 선택해야 함.
  • 모델 폴더에서 python -m pip install -r requirements.txt를 실행해 의존성을 설치하고, python terrainsr.py --input examples/synthetic_input.npz --output terrain_10m.npy --crop 32를 실행하면 포함된 예제가 처리됨.
  • 예제 실행 결과는 지형 고도 160×160 배열이며, --device cpu를 지정하면 CPU로도 실행할 수 있지만 속도는 느려짐.
  • 자체 지형 데이터는 미터 단위의 100m 격자 고도 2차원 배열과 10m 격자 물 마스크로 준비해야 함. 물 마스크는 물을 1, 육지를 0으로 표시하며 고도 배열보다 행과 열이 각각 10배 많아야 함.
  • 처리 대상 영역의 사방에 각각 3.2km의 주변 지형 데이터를 포함해야 함. crop=32는 결과의 각 가장자리에서 해당 문맥 셀 32개를 제거함.
  • 예를 들어 100m 해상도의 104×104 입력과 1040×1040 물 마스크를 사용하면, 크롭 후 10m 해상도의 400×400 출력, 즉 4×4km 패치를 얻음.
  • Python에서 자체 배열을 처리할 때는 coarse_100m.npy와 water_10m.npy를 불러와 TerrainSR(device="auto") 모델을 만들고, model.predict(coarse, water, seed=0, crop=32)로 고도를 생성해 terrain_10m.npy에 저장함.
  • 입력 배열의 각 차원은 짝수여야 하며 한 변은 최대 564셀임. 출력은 미터 단위 고도값을 담은 float32 배열임.
  • 명령줄로 자체 배열을 처리하려면 고도 배열과 물 마스크를 input.npz에 압축 저장한 뒤 python terrainsr.py --input input.npz --output terrain_10m.npy --crop 32 --seed 0을 실행함.

라이선스

  • 모델 가중치와 추론 코드는 Apache 2.0 라이선스로 공개됨. 라이선스 조건을 준수하고 재배포 사본에 필수 라이선스 및 저작자 표시를 유지하면 상업 프로젝트를 포함해 사용·수정·재배포할 수 있음.
  • 고도 및 토지 피복 데이터 세트에는 각각 별도의 이용 조건이 적용됨.
  • 학습 데이터는 swisstopo, Kartverket, IGN, USGS에서 제공되며, 입력 및 마스크에는 Copernicus DEM, ESA WorldCover, OpenStreetMap이 사용됨.
  • 모델의 다운로드 수는 추적되지 않으며, 현재 추론 제공업체에 배포되지 않음.