File size: 6,574 Bytes
7b03942
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"

CONDA_SH="${CONDA_SH:-/media/home/smx/miniconda3/bin/conda}"
CONDA_ENV="${CONDA_ENV:-sharp}"
if [[ -x "${CONDA_SH}" ]]; then
  eval "$("${CONDA_SH}" shell.bash hook)"
  conda activate "${CONDA_ENV}"
fi

export PYTHONPATH="${REPO_ROOT}:${PYTHONPATH:-}"
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION="${PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION:-python}"

CHECKPOINT="${CHECKPOINT:-${1:-}}"
if [[ -z "${CHECKPOINT}" || ! -f "${CHECKPOINT}" ]]; then
  echo "ERROR: pass a checkpoint as arg1 or set CHECKPOINT=/path/to/step_XXXXXXX.pt" >&2
  exit 1
fi

export OUT_ROOT="${OUT_ROOT:-${REPO_ROOT}/outputs/validation}"
export RUN_NAME="${RUN_NAME:-unisharp_validation_$(date +%Y%m%d_%H%M%S)}"
RUN_DIR="${OUT_ROOT}/${RUN_NAME}"
mkdir -p "${RUN_DIR}"

export GPU_IDS="${GPU_IDS:-0}"
export VALIDATION_JOBS_PER_GPU="${VALIDATION_JOBS_PER_GPU:-1}"
export VALIDATION_BATCH_SIZE="${VALIDATION_BATCH_SIZE:-1}"
export VALIDATION_FAST_METRICS="${VALIDATION_FAST_METRICS:-1}"
export VALIDATION_MAX_GROUPS="${VALIDATION_MAX_GROUPS:-0}"
export SEED="${SEED:-42}"
export MAX_INDEX_GAP="${MAX_INDEX_GAP:-10}"
export PAIR_MAX_TRANSLATION_M="${PAIR_MAX_TRANSLATION_M:-0.5}"
export PAIR_MIN_OVERLAP="${PAIR_MIN_OVERLAP:-0.6}"
export PANO_POSE_FLIP_CONVENTION="${PANO_POSE_FLIP_CONVENTION:-flip_yz_negate_rel_z}"

DEFAULT_VALIDATION_MANIFEST_DIR="${REPO_ROOT}/validation_manifests"
if [[ -d "${REPO_ROOT}/../validation_manifests" ]]; then
  DEFAULT_VALIDATION_MANIFEST_DIR="${REPO_ROOT}/../validation_manifests"
fi
export VALIDATION_MANIFEST_DIR="${VALIDATION_MANIFEST_DIR:-${DEFAULT_VALIDATION_MANIFEST_DIR}}"
export VALIDATION_PSEUDO_DEPTH_ROOT="${VALIDATION_PSEUDO_DEPTH_ROOT:-/media/team_data/ML4_team/datasets/sharp/validation_unik3d_pseudo_depth}"
export RE10K_PSEUDO_DEPTH_ROOT="${RE10K_PSEUDO_DEPTH_ROOT:-/media/team_data/ML4_team/datasets/nopose/re10k_unik3d_pseudo_depth/test}"

export DATA_ROOT_RE10K="${DATA_ROOT_RE10K:-/media/team_data/ML4_team/datasets/nopose/re10k}"
export DATA_ROOT_DL3DV="${DATA_ROOT_DL3DV:-/media/team_data/ML4_team/datasets/sharp/DL3DV-ALL-960P}"
export DATA_ROOT_HM3D="${DATA_ROOT_HM3D:-/media/team_data/ML4_team/datasets/panogs}"
export DATA_ROOT_REPLICA="${DATA_ROOT_REPLICA:-/media/team_data/ML4_team/datasets/sharp/replica}"
export DATA_ROOT_SIM="${DATA_ROOT_SIM:-/media/team_data/ML4_team/datasets/smx_sim}"
export SIM_POSE_ROOT="${SIM_POSE_ROOT:-/media/team_data/ML4_team/datasets/smx_sim/30cm}"
DEFAULT_DATASET_MANIFEST_DIR="${REPO_ROOT}/dataset_manifests"
if [[ -d "${REPO_ROOT}/../dataset_manifests" ]]; then
  DEFAULT_DATASET_MANIFEST_DIR="${REPO_ROOT}/../dataset_manifests"
fi
export WILD_ROOTS_FILE="${WILD_ROOTS_FILE:-${DEFAULT_DATASET_MANIFEST_DIR}/wildrgbd_roots.txt}"
export DATA_ROOT_SCANNETPP="${DATA_ROOT_SCANNETPP:-/media/home/songmeixi_insta360.com/sharpgs/scannetpp}"
export DATA_ROOT_SCANETPP_FISHEYE="${DATA_ROOT_SCANETPP_FISHEYE:-/media/team_data/ML4_team/datasets/scan}"
export DATA_ROOT_TAT="${DATA_ROOT_TAT:-/media/team_data/ML4_team/datasets/TAT/tanks_and_temples}"

DATASETS_CSV="${DATASETS:-re10k,dl3dv,hm3d,sim,wildrgbd}"
IFS=',' read -r -a DATASET_ARR <<< "${DATASETS_CSV}"
IFS=',' read -r -a GPU_ID_ARR <<< "${GPU_IDS}"
if [[ "${VALIDATION_JOBS_PER_GPU}" -lt 1 ]]; then
  echo "ERROR: VALIDATION_JOBS_PER_GPU must be >= 1" >&2
  exit 1
fi

data_root_for_dataset() {
  case "$1" in
    re10k) echo "${DATA_ROOT_RE10K}" ;;
    dl3dv) echo "${DATA_ROOT_DL3DV}" ;;
    hm3d)
      if [[ -d "${DATA_ROOT_HM3D}/test" ]]; then
        echo "${DATA_ROOT_HM3D}/test"
      else
        echo "${DATA_ROOT_HM3D}"
      fi
      ;;
    replica) echo "${DATA_ROOT_REPLICA}" ;;
    sim) echo "${DATA_ROOT_SIM}" ;;
    wildrgbd) echo "${WILD_ROOTS_FILE}" ;;
    scannetpp) echo "${DATA_ROOT_SCANNETPP}" ;;
    scanetpp_fisheye) echo "${DATA_ROOT_SCANETPP_FISHEYE}" ;;
    smx_sim_fisheye) echo "${DATA_ROOT_SIM}" ;;
    tat) echo "${DATA_ROOT_TAT}" ;;
    *) echo "Unknown dataset: $1" >&2; return 1 ;;
  esac
}

extra_args_for_dataset() {
  case "$1" in
    re10k) echo "--re10k-pseudo-depth-root ${RE10K_PSEUDO_DEPTH_ROOT}" ;;
    sim) echo "--sim-pose-root ${SIM_POSE_ROOT}" ;;
    *) echo "" ;;
  esac
}

run_dataset() {
  local gpu_id="$1"
  local dataset="$2"
  local data_root
  local out_dir
  local manifest

  data_root="$(data_root_for_dataset "${dataset}")"
  out_dir="${RUN_DIR}/${dataset}"
  manifest="${VALIDATION_MANIFEST_DIR}/${dataset}.txt"

  local cmd=(
    python -m unisharp.validation.run_validation
    --checkpoint "${CHECKPOINT}"
    --dataset "${dataset}"
    --data-root "${data_root}"
    --device "cuda:0"
    --out-dir "${out_dir}"
    --validation-batch-size "${VALIDATION_BATCH_SIZE}"
    --validation-pseudo-depth-root "${VALIDATION_PSEUDO_DEPTH_ROOT}"
    --max-index-gap "${MAX_INDEX_GAP}"
    --pair-max-translation-m "${PAIR_MAX_TRANSLATION_M}"
    --pair-min-overlap "${PAIR_MIN_OVERLAP}"
    --seed "${SEED}"
  )
  if [[ -f "${manifest}" ]]; then
    cmd+=(--manifest-file "${manifest}")
  fi
  if [[ "${VALIDATION_MAX_GROUPS}" != "0" ]]; then
    cmd+=(--manifest-max-groups "${VALIDATION_MAX_GROUPS}")
  fi
  if [[ "${VALIDATION_FAST_METRICS}" == "1" ]]; then
    cmd+=(--fast-metrics)
  fi
  read -r -a extra_args <<< "$(extra_args_for_dataset "${dataset}")"
  if [[ "${#extra_args[@]}" -gt 0 && -n "${extra_args[0]:-}" ]]; then
    cmd+=("${extra_args[@]}")
  fi

  echo "Validating ${dataset} on GPU ${gpu_id}"
  CUDA_VISIBLE_DEVICES="${gpu_id}" PANO_POSE_FLIP_CONVENTION="${PANO_POSE_FLIP_CONVENTION}" "${cmd[@]}"
}

worker() {
  local worker_id="$1"
  local gpu_index=$(( worker_id % ${#GPU_ID_ARR[@]} ))
  local gpu_id="${GPU_ID_ARR[${gpu_index}]}"
  local total_workers=$(( ${#GPU_ID_ARR[@]} * VALIDATION_JOBS_PER_GPU ))
  local idx
  for idx in "${!DATASET_ARR[@]}"; do
    if (( idx % total_workers == worker_id )); then
      run_dataset "${gpu_id}" "${DATASET_ARR[${idx}]}"
    fi
  done
}

echo "UniSharp validation"
echo "  CHECKPOINT=${CHECKPOINT}"
echo "  RUN_DIR=${RUN_DIR}"
echo "  DATASETS=${DATASETS_CSV}"
echo "  GPU_IDS=${GPU_IDS}"

TOTAL_WORKERS=$(( ${#GPU_ID_ARR[@]} * VALIDATION_JOBS_PER_GPU ))
PIDS=()
for worker_id in $(seq 0 $((TOTAL_WORKERS - 1))); do
  worker "${worker_id}" &
  PIDS+=("$!")
done

STATUS=0
for pid in "${PIDS[@]}"; do
  wait "${pid}" || STATUS=1
done

if [[ "${STATUS}" -ne 0 ]]; then
  echo "One or more validation workers failed." >&2
  exit "${STATUS}"
fi

echo "Validation finished."
echo "Outputs: ${RUN_DIR}"