基於論文《Geo2SigMap: High-Fidelity RF Signal Mapping Using Geographic Databases》的完整實作,支援稀疏RSSI地圖補全。
- 兩階段U-Net架構:Stage-1學習各向性路徑增益,Stage-2結合稀疏量測補全信號地圖
- 無線上Sionna依賴:推論時只需3GPP UMa/Friis模型,不用射線追蹤
- 靈活稀疏採樣:支援1-200個稀疏點,多種採樣模式(隨機/蛇形/聚類)
- 端到端訓練:完整的資料生成→訓練→推論流水線
geo/
├── data_generation.py # 離線資料生成(用Sionna)
├── channel_models.py # 3GPP UMa/Friis通道模型
├── dataset.py # PyTorch Dataset和DataLoader
├── models.py # 兩階段U-Net模型
├── train.py # 訓練腳本
├── inference.py # 推論腳本(不用Sionna)
├── config.json # 訓練配置
└── README.md # 使用說明
# 安裝依賴
pip install torch torchvision numpy matplotlib scikit-learn tensorboard
pip install sionna tensorflow # 僅資料生成階段需要
# 修改data_generation.py中的場景路徑,然後執行
python data_generation.py
# 這會生成 ./geo2sigmap_dataset/ 目錄包含:
# - sample_000000.npz (B, Piso, Pdir, S, P_uma, tx_position)
# - sample_000001.npz
# - ...
# Stage 1: [B, P_UMa] -> Piso
python train.py --stage 1 --epochs 100
# Stage 2: [B, Piso, S_sparse, mask] -> S
python train.py --stage 2 --epochs 100
# 或一次執行兩階段
python train.py
# 示範模式
python inference.py \
--stage1_model ./outputs/checkpoints/stage1_best.pth \
--stage2_model ./outputs/checkpoints/stage2_best.pth \
--norm_stats ./geo2sigmap_dataset/normalization_stats.pkl \
--demo
# 自定義基地台位置
python inference.py \
--stage1_model ./outputs/checkpoints/stage1_best.pth \
--stage2_model ./outputs/checkpoints/stage2_best.pth \
--tx_pos 100 -50 25 \
--demo
- 輸入: [建築高度圖 B, UMa路徑增益 P_UMa] (2通道)
- 輸出: 各向性路徑增益 Piso (1通道)
- 作用: 學習從地理環境到基礎傳播特性的映射
- 輸入: [B, Piso, 稀疏RSSI, mask] (4通道)
- 輸出: 完整RSSI地圖 S (1通道)
- 作用: 利用稀疏量測和環境先驗補全信號地圖
SCENE_SIZE = 512 # 場景大小 512m×512m
GRID_SIZE = 128 # 網格解析度 128×128
RESOLUTION = 4 # 4m/pixel
FREQUENCY = 3.66e9 # 3.66 GHz
{
"batch_size": 16,
"learning_rate": 0.001,
"stage1_epochs": 100,
"stage2_epochs": 100,
"base_features": 64
}
inference_config = {
"channel_model": "3gpp_uma", # 或 "friis"
"grid_size": 128,
"scene_size": 512
}
# 在inference.py中修改generate_building_height_map()
def generate_building_height_map(self, method="file", **kwargs):
if method == "file":
# 載入你的建築高度資料
height_map = np.load(kwargs["file_path"])
# ... 其他方法
# 你的UAV量測資料
rssi_measurements = [-65.2, -72.1, -68.9, ...] # dBm
coordinates = [(10, 20), (50, 30), ...] # (x,y) 座標
# 執行預測
predicted_map, _ = inferencer.predict_from_measurements(
tx_position=[0, 0, 30],
rssi_measurements=rssi_measurements,
coordinates=coordinates
)
# 在dataset.py的generate_sparse_mask()中
# 支援 "random", "snake", "cluster" 三種模式
mask = dataset.generate_sparse_mask(
shape=(128, 128),
n_sparse=50,
pattern="snake"
)
# 可選:加入天線增益作為額外通道
from channel_models import compute_antenna_gain_map
gain_map = compute_antenna_gain_map(
tx_pos=[0, 0, 30],
tx_orientation=[np.deg2rad(-10), 0, 0], # 下傾10度
antenna_pattern="3gpp_macro"
)
# 在models.py的LossFunction類中
# 支援MSE、MAE、組合損失、一致性損失
loss = LossFunction.combined_loss(
pred, target, mask,
mse_weight=1.0, mae_weight=0.1
)
訓練完成後會自動計算:
- RMSE: 均方根誤差
- MAE: 平均絕對誤差
- 一致性損失: 稀疏點預測vs實際的誤差
# 模型評估
python train.py --eval --stage 1 # 評估Stage 1
python train.py --eval --stage 2 # 評估Stage 2
- 資料生成階段需要Sionna:只有在創建訓練資料時需要,推論時不用
- 標準化很重要:確保載入正確的normalization_stats.pkl
- GPU記憶體:128×128網格約需4GB顯存,可調整batch_size
- 場景適應:不同環境可能需要微調超參數
# 1. 生成資料(需要Sionna環境)
python data_generation.py
# 2. 訓練兩階段模型
python train.py --stage 1 --epochs 50
python train.py --stage 2 --epochs 50
# 3. 推論測試
python inference.py \
--stage1_model ./outputs/checkpoints/stage1_best.pth \
--stage2_model ./outputs/checkpoints/stage2_best.pth \
--norm_stats ./geo2sigmap_dataset/normalization_stats.pkl \
--demo
# 4. 可視化結果會自動顯示6個子圖:
# - 建築高度圖、P_UMa、Stage1預測、稀疏輸入、最終預測、採樣覆蓋
這個實作對應論文中的:
- Table I: Sionna射線追蹤參數 →
data_generation.py
- Figure 2: 兩階段架構 →
models.py
- Section III-B: 稀疏採樣策略 →
dataset.py
- Section IV: 訓練程序 →
train.py
- 加入更多通道模型(mmWave、室內等)
- 支援多基地台場景
- 整合真實OSM建築資料
- 加入時域變化建模
- 支援不同頻段和天線配置
如果遇到問題,請檢查:
- 資料路徑是否正確
- 模型檔案是否存在
- GPU記憶體是否足夠
- 標準化統計量是否載入正確