| #!/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:-unisharp}" |
| 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/validation_depth}" |
| export RE10K_PSEUDO_DEPTH_ROOT="${RE10K_PSEUDO_DEPTH_ROOT:-/media/team_data/ML4_team/datasets/re10k_depth/test}" |
|
|
| export DATA_ROOT_RE10K="${DATA_ROOT_RE10K:-/media/team_data/ML4_team/datasets/re10k}" |
| export DATA_ROOT_DL3DV="${DATA_ROOT_DL3DV:-/media/team_data/ML4_team/datasets/DL3DV-ALL-960P}" |
| export DATA_ROOT_HM3D="${DATA_ROOT_HM3D:-/media/team_data/ML4_team/datasets/hm3d}" |
| export DATA_ROOT_REPLICA="${DATA_ROOT_REPLICA:-/media/team_data/ML4_team/datasets/replica}" |
| export DATA_ROOT_SIM="${DATA_ROOT_SIM:-/media/team_data/ML4_team/datasets/omnirooms}" |
| export SIM_POSE_ROOT="${SIM_POSE_ROOT:-/media/team_data/ML4_team/datasets/omnirooms/pose}" |
| 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/team_data/ML4_team/datasets/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,omnirooms,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}" ;; |
| omnirooms) echo "${DATA_ROOT_SIM}" ;; |
| wildrgbd) echo "${WILD_ROOTS_FILE}" ;; |
| scannetpp) echo "${DATA_ROOT_SCANNETPP}" ;; |
| scanetpp_fisheye) echo "${DATA_ROOT_SCANETPP_FISHEYE}" ;; |
| omnirooms_wide) 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}" ;; |
| omnirooms) 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}" |
|
|