SplatAtlas / tools /eval_all_31.sh
KCBtheone's picture
Upload SplatAtlas benchmark pipeline code
23e73f9 verified
Raw
History Blame Contribute Delete
3.98 kB
#!/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