#!/bin/bash source /root/miniconda3/etc/profile.d/conda.sh ROOT=/root/autodl-tmp/SplatAtlas ITER=30000 # 环境及源码路径 declare -A ENV_MAP CODE_MAP ENV_MAP[coadaptgs]="/root/autodl-tmp/envs/co_adaptation_3dgs" CODE_MAP[coadaptgs]="/root/autodl-tmp/CoAdaptGS" ENV_MAP[lod_gs]="/root/autodl-tmp/envs/lod_gs" CODE_MAP[lod_gs]="/root/autodl-tmp/LOD_GS" # 场景→数据集映射(仅需用来拼 colmap_dir,eval 不需要 source_path) get_dataset_path() { case "$1" in auditorium|ballroom|barn|caterpillar|courtroom|lighthouse|museum|palace|playground|temple|train|truck) echo "/root/autodl-tmp/dataset/tnt/$1" ;; bicycle|flowers|garden|stump|treehill) echo "/root/autodl-tmp/dataset/360/$1" ;; bonsai|counter|kitchen|room) echo "/root/autodl-tmp/dataset/360/$1" ;; Chair|Drums|Ficus|Hotdog|Lego|Materials|Mic|Ship) echo "/root/autodl-tmp/dataset/Synthetic_NeRF_Verified/Synthetic_NeRF/$1" ;; DrJohnson|Playroom) echo "/root/autodl-tmp/dataset/deepblending_clean/$1" ;; *) echo "" ;; esac } # 全部 31 个 cell (method scene) CELLS=( "coadaptgs auditorium" "coadaptgs ballroom" "coadaptgs barn" "coadaptgs caterpillar" "coadaptgs courtroom" "coadaptgs lighthouse" "coadaptgs museum" "coadaptgs palace" "coadaptgs playground" "coadaptgs temple" "coadaptgs train" "coadaptgs truck" "coadaptgs bicycle" "coadaptgs bonsai" "coadaptgs counter" "coadaptgs flowers" "coadaptgs garden" "coadaptgs kitchen" "coadaptgs room" "coadaptgs stump" "coadaptgs treehill" "coadaptgs DrJohnson" "coadaptgs Playroom" "lod_gs Chair" "lod_gs Drums" "lod_gs Ficus" "lod_gs Hotdog" "lod_gs Lego" "lod_gs Materials" "lod_gs Mic" "lod_gs Ship" ) printf "%-18s %-20s %8s %8s %8s\n" "Method" "Scene" "PSNR" "SSIM" "LPIPS" echo "--------------------------------------------------------------------" for entry in "${CELLS[@]}"; do read -r method scene <<< "$entry" env_path="${ENV_MAP[$method]}" code_path="${CODE_MAP[$method]}" if [ -z "$env_path" ] || [ -z "$code_path" ]; then echo "Skipping $method/$scene (no env/code)" continue fi model_path="$ROOT/outputs/${method}_${scene}" renders_dir="$model_path/renders_test_${ITER}" gt_dir="$model_path/gt_test_${ITER}" ply_path="$model_path/point_cloud/iteration_${ITER}/point_cloud.ply" metrics_json="$model_path/metrics_test_iter${ITER}.json" colmap_dir=$(get_dataset_path "$scene") # 跳过完全不存在渲染的 if [ ! -d "$renders_dir" ] || [ $(ls "$renders_dir"/*.png 2>/dev/null | wc -l) -eq 0 ]; then printf "%-18s %-20s %8s %8s %8s\n" "$method" "$scene" "NO_RENDER" "" "" continue fi # 激活环境 conda activate "$env_path" export PYTHONPATH="${code_path}:${ROOT}:${PYTHONPATH}" # 若 metrics json 不存在则计算 if [ ! -f "$metrics_json" ]; then python "$ROOT/ufd_evalkit/run_eval.py" \ --method "$method" \ --scene "$scene" \ --render_dir "$renders_dir" \ --gt_dir "$gt_dir" \ --ply_path "$ply_path" \ --output_json "$metrics_json" \ --colmap_dir "$colmap_dir" 2>/dev/null fi # 解析并打印 if [ -f "$metrics_json" ]; then read -r psnr ssim lpips < <( python -c " import json with open('$metrics_json') as f: d = json.load(f) psnr = d['photometric'].get('PSNR', float('nan')) ssim = d['photometric'].get('SSIM', float('nan')) lpips = d['photometric'].get('LPIPS', float('nan')) print(f'{psnr:.4f} {ssim:.4f} {lpips:.4f}') " ) printf "%-18s %-20s %8s %8s %8s\n" "$method" "$scene" "$psnr" "$ssim" "$lpips" else printf "%-18s %-20s %8s %8s %8s\n" "$method" "$scene" "FAILED" "" "" fi conda deactivate done