Files
yolov26_3d/tools/feishu_project/run_issue_data_visualize_tracking.sh
2026-06-24 09:35:46 +08:00

261 lines
6.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
PROJECT_ROOT=$(cd "${SCRIPT_DIR}/../.." && pwd)
export PYTHONPATH="${PROJECT_ROOT}:${PYTHONPATH:-}"
RESULTS_ROOT=${RESULTS_ROOT:-/data1/dongying/Mono3d/G1Q3/feishu_project/inference_issue_data}
DOWNLOAD_ROOT=${DOWNLOAD_ROOT:-/data1/dongying/Mono3d/G1Q3/feishu_project/downloaded_issue_data}
OUTPUT_ROOT=${OUTPUT_ROOT:-}
OUTPUT_DIR_NAME=${OUTPUT_DIR_NAME:-tracking_vis_raw}
PYTHON_BIN=${PYTHON_BIN:-/deeplearning_team/ydong/dongying/miniconda/envs/dev/bin/python}
VISUALIZE_SCRIPT=${VISUALIZE_SCRIPT:-"${PROJECT_ROOT}/tools/temporal_analysis/visualize_tracking_boxes.py"}
TRACKING_JSON_NAME=${TRACKING_JSON_NAME:-merge.json}
VIS_MAX_FRAMES=${VIS_MAX_FRAMES:-}
VIS_CLASS_ID=${VIS_CLASS_ID:-}
VIS_TRACK_IDS=${VIS_TRACK_IDS:-}
VIS_SHOW_TRAJECTORY=${VIS_SHOW_TRAJECTORY:-0}
TARGET_PATH=""
ISSUE_IDS=()
while (($# > 0)); do
case "$1" in
--issue-id)
if (($# < 2)); then
echo "Error: --issue-id requires a value" >&2
exit 1
fi
ISSUE_IDS+=("$2")
shift 2
;;
--issue-id=*)
ISSUE_IDS+=("${1#*=}")
shift
;;
-*)
echo "Error: unsupported option: $1" >&2
exit 1
;;
*)
if [[ -n "${TARGET_PATH}" ]]; then
echo "Error: multiple target paths provided: ${TARGET_PATH} and $1" >&2
exit 1
fi
TARGET_PATH="$1"
shift
;;
esac
done
if [[ -z "${TARGET_PATH}" ]]; then
TARGET_PATH="${RESULTS_ROOT}"
fi
if [[ ! -e "${TARGET_PATH}" ]]; then
echo "Error: target path does not exist: ${TARGET_PATH}" >&2
exit 1
fi
resolve_abs_path() {
local target_path="$1"
if [[ -d "${target_path}" ]]; then
(
cd "${target_path}"
pwd -P
)
return 0
fi
local parent_dir
parent_dir=$(
cd "$(dirname "${target_path}")"
pwd -P
)
printf '%s/%s\n' "${parent_dir}" "$(basename "${target_path}")"
}
RESULTS_ROOT_ABS="$(resolve_abs_path "${RESULTS_ROOT}")"
DOWNLOAD_ROOT_ABS="$(resolve_abs_path "${DOWNLOAD_ROOT}")"
is_case_dir() {
local dir_path="$1"
[[ -d "${dir_path}" ]] && [[ -f "${dir_path}/${TRACKING_JSON_NAME}" ]]
}
derive_output_dir() {
local case_dir="$1"
local case_abs
local rel_case_dir
case_abs="$(resolve_abs_path "${case_dir}")"
if [[ -n "${OUTPUT_ROOT}" ]]; then
if [[ "${case_abs}" == "${RESULTS_ROOT_ABS}" ]]; then
printf '%s\n' "${OUTPUT_ROOT}"
return 0
fi
if [[ "${case_abs}" == "${RESULTS_ROOT_ABS}"/* ]]; then
rel_case_dir="${case_abs#"${RESULTS_ROOT_ABS}/"}"
printf '%s/%s\n' "${OUTPUT_ROOT%/}" "${rel_case_dir}"
return 0
fi
printf '%s/%s\n' "${OUTPUT_ROOT%/}" "$(basename "${case_abs}")"
return 0
fi
printf '%s/%s\n' "${case_abs}" "${OUTPUT_DIR_NAME}"
}
derive_raw_video_path() {
local case_dir="$1"
local case_abs
local rel_case_dir
case_abs="$(resolve_abs_path "${case_dir}")"
if [[ "${case_abs}" != "${RESULTS_ROOT_ABS}" && "${case_abs}" != "${RESULTS_ROOT_ABS}"/* ]]; then
echo "Error: case directory is not under RESULTS_ROOT: ${case_abs}" >&2
return 1
fi
if [[ "${case_abs}" == "${RESULTS_ROOT_ABS}" ]]; then
echo "Error: cannot derive a raw video path from the results root itself" >&2
return 1
fi
rel_case_dir="${case_abs#"${RESULTS_ROOT_ABS}/"}"
printf '%s/%s/sigmastar.1/camera4.bin\n' "${DOWNLOAD_ROOT_ABS}" "${rel_case_dir}"
}
run_single_case() {
local case_dir="$1"
local tracking_json="${case_dir}/${TRACKING_JSON_NAME}"
local raw_video_path
local output_dir
local cmd
if [[ ! -f "${tracking_json}" ]]; then
echo "[ERROR] ${TRACKING_JSON_NAME} not found in case directory: ${case_dir}" >&2
return 1
fi
raw_video_path="$(derive_raw_video_path "${case_dir}")"
if [[ ! -f "${raw_video_path}" ]]; then
echo "[ERROR] camera4.bin not found for case: ${case_dir}" >&2
echo " expected: ${raw_video_path}" >&2
return 1
fi
output_dir="$(derive_output_dir "${case_dir}")"
cmd=(
"${PYTHON_BIN}" "${VISUALIZE_SCRIPT}"
--tracking "${tracking_json}"
--images "${raw_video_path}"
--output "${output_dir}"
--align-by-frame-id
)
if [[ -n "${VIS_MAX_FRAMES}" ]]; then
cmd+=(--max-frames "${VIS_MAX_FRAMES}")
fi
if [[ -n "${VIS_CLASS_ID}" ]]; then
cmd+=(--class-id "${VIS_CLASS_ID}")
fi
if [[ -n "${VIS_TRACK_IDS}" ]]; then
# shellcheck disable=SC2206
local track_id_arr=(${VIS_TRACK_IDS})
cmd+=(--track-ids "${track_id_arr[@]}")
fi
if [[ "${VIS_SHOW_TRAJECTORY}" == "1" ]]; then
cmd+=(--show-trajectory)
fi
echo ""
echo "######################################################################"
echo "# Feishu issue-data raw-image visualization"
echo "######################################################################"
echo "Case : ${case_dir}"
echo "Track : ${tracking_json}"
echo "Video : ${raw_video_path}"
echo "Output : ${output_dir}"
"${cmd[@]}"
}
run_batch_root() {
local batch_root="$1"
local total_cases=0
local success_cases=0
local failed_cases=0
while IFS= read -r -d '' tracking_json; do
local case_dir
case_dir="$(dirname "${tracking_json}")"
((total_cases += 1))
if run_single_case "${case_dir}"; then
((success_cases += 1))
else
((failed_cases += 1))
printf '[FAIL] case=%s\n' "${case_dir}" >&2
fi
done < <(
find "${batch_root}" -type f -name "${TRACKING_JSON_NAME}" -print0 | sort -z
)
if [[ "${total_cases}" -eq 0 ]]; then
echo "[ERROR] No ${TRACKING_JSON_NAME} files were found under: ${batch_root}" >&2
return 1
fi
echo ""
printf '[DONE] cases=%d success=%d failed=%d\n' \
"${total_cases}" "${success_cases}" "${failed_cases}"
[[ "${failed_cases}" -eq 0 ]]
}
if [[ "${#ISSUE_IDS[@]}" -eq 0 ]]; then
if is_case_dir "${TARGET_PATH}"; then
run_single_case "${TARGET_PATH}"
elif [[ -d "${TARGET_PATH}" ]]; then
run_batch_root "${TARGET_PATH}"
else
echo "Error: unsupported target path: ${TARGET_PATH}" >&2
exit 1
fi
exit 0
fi
total_issues=0
success_issues=0
failed_issues=0
for issue_id in "${ISSUE_IDS[@]}"; do
issue_root="${TARGET_PATH}/issue_${issue_id}"
((total_issues += 1))
if [[ ! -d "${issue_root}" ]]; then
echo "[FAIL] issue_${issue_id}: not found under ${TARGET_PATH}" >&2
((failed_issues += 1))
continue
fi
if run_batch_root "${issue_root}"; then
((success_issues += 1))
else
((failed_issues += 1))
echo "[FAIL] issue_${issue_id}: visualization failed" >&2
fi
done
echo ""
printf '[DONE] issues=%d success=%d failed=%d\n' \
"${total_issues}" "${success_issues}" "${failed_issues}"
[[ "${failed_issues}" -eq 0 ]]