
2026/10/07 10:24
Show HN:TerrainSR – 高速かつ現実的な高低差マップアップスケールモデル
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
TerrainSR は、低解像度の地形図を高解像度な高度データ(例:100m から 10m)にアップスケールするために設計された AI モデルであり、都市部や人工改変地を除外して訓練することで自然な出力を確保し、集積エリアでアーティファクトを発生させずに現実的なシミュレーションおよびリアルタイムゲームアプリケーションを可能にします。本モデルは、特に都市や人為的に改変された土地をトレーニングから除外して学習されており、広大な地形の従来の侵食シミュレーターよりも優れています。もともと歴史戦略ゲームが数百ギバイトの高解像度データではなく、コンパクトな 100m のヨーロッパ地図を使用できるようにするために開発されました。RTX 4070 で 50x50km パッチをわずか 0.74 秒で生成するなど、高いパフォーマンスを提供します。TerrainSR を利用するには、PyTorch 2.6 以降(Python 3.10+)のインストールが必要であり、水マスケットの提供、3.2km の周辺地形バッファ、側面あたり最大 564 セルという偶数グリッドなどの入力要件を処理する必要があります。より低速な CPU モードも利用可能ですが、NVIDIA GPU が推奨されます。Apache 2.0 ライセンスの下でリリースされた TerrainSR は、商業およびオープンソースプロジェクトの両方で自由な改変と再配布を許可しており、大規模な地形生成における技術的な障壁とストレージコストを大幅に削減します。
本文
TerrainSR: 低解像度地形データの高解像度化モデル
概要
TerrainSR は、低解像度の地形標高データからリアルな高解像度なデータを生成する深層学習モデルです。
- 学習ペア: 100 メートル間隔のデータ ⇔ 10 メートル間隔のデータ
- 性能範囲:
- 100 メートル未満の高解像度データに対して良好な結果を出力
- 10 メートルの詳細さよりもさらに高い解像度への外挿も可能
- 制約事項:
- 低い解像度のデータ(学習範囲以下)では機能しない
- 都市部や開放式鉱山などの人工的な改変を受けた地域は学習除外済み
- その結果、生成された出力には人工アーティファクトが含まれない
用途
本モデルは、低解像度の欧州地形図を実尺度の戦略シミュレーションゲームに活用することを目的として開発されました。
- データサイズの問題: 10 メートル間隔のデータセットは数百ギガバイト規模となり実用的でないため、滑らかな統合が必要。
- 人工アーティファクトの処理: 道路や港湾、建物などを除去するには莫大な人手作業が必要だが、本モデルではこれを自動化。
- 地形の詳細追加: ベースデータ(100 メートル間隔)の上に説得的な地形詳細を追加可能。
- 侵食シミュレーターとの比較:
- 大規模地形に対する従来の侵食シミュレーターより高速かつ多様な結果を提供
- 場合によっては奇妙な結果が生じることも(例:急峻な勾配が山丘へと変換される)
処理速度
NVIDIA GeForce RTX 4070 を使用した場合のベンチマーク:
- 処理時間: モデル読み込み後、100 メートルデータを 10 メートルへ変換し、50 キロメートル四方のパッチを生成するまで約 0.74 秒
- 応用可能性: この性能により、ゲーム用途などのリアルタイムアプリケーションでの利用が可能
使用方法
環境構築手順
- リポジトリ(Python スクリプトおよび
フォルダ)をダウンロードweights - PyTorch のインストール
- 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
- オプション:
を追加すれば CPU 実行も可能だが、処理速度は低下する--device cpu - 付属例では 160×160 のグリッドで地形標高を保存
Python スクリプトでの実行
ご自身のデータを使用したい場合は以下のコードを実行:
import numpy as np from terrainsr import TerrainSR # データの読み込み coarse = np.load("coarse_100m.npy") water = np.load("water_10m.npy") # モデルの初期化(自動 GPU 検出) model = TerrainSR(device="auto") # 推論実行 heights = model.predict(coarse, water, seed=0, crop=32) # 結果の保存 np.save("terrain_10m.npy", heights)
データ準備と制約事項
ご自身の地形データを利用する場合、以下の手順を遵守してください。
データ確保(周辺領域)
- 処理したいエリアの周囲に3.2 キロメートル分の地形データを確保必須
の役割: 結果の各エッジからそれぞれ 32 セルのコンテキスト情報を切り離す処理--crop 32- 例: 100 メートル間隔で 104×104 セル(10.4 km 四方)を入力すると、出力は 10 メートル間隔で 400×400 セル(4 km 四方)になる
入力データの形式
- 標高データ: メートル単位の値を記した、100 メートル間隔の 2 次元配列
- 水没マスク:
- 10 メートル間隔の水没領域を示す配列
- 水没領域:「1」
- 陸地:「0」
- サイズ:標高配列の行・列数をそれぞれ10 倍にしたもの
データ制約
- 形状: 入力データは両辺ともに偶数サイズである必要がある
- 最大サイズ: 各辺が564 セル未満(または 564 セル以下)であること
- 出力形式: メートル単位の標高値を表す
タイプの配列float32
コマンドラインでのデータ保存と処理
データを圧縮して保存し、コマンドラインから処理する場合:
-
データの保存:
np.savez_compressed("input.npz", coarse=coarse, water=water) -
推論実行:
python terrainsr.py --input input.npz --output terrain_10m.npy --crop 32 --seed 0
ライセンス情報
- モデル重み・推論コード: Apache License 2.0 に基づいて公開
- 再配布時にライセンス表記および出典表示を保持すれば、使用・改変・再配布(商業プロジェクト含む)が可能
- 地形データ・土地利用カバーデータ: 別途独自の利用条件あり
- 学習データの来源: swisstopo, Kartverket, IGN, USGS
- 入力データ・マスクの来源: Copernicus DEM, ESA WorldCover, OpenStreetMap