119 lines
3.8 KiB
Bash
Executable File
119 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# 用法说明:
|
|
# 分析原始逐帧检测结果与跟踪结果之间是否存在检测框丢失。
|
|
#
|
|
# 默认对每个 case 的三路输入分别分析:
|
|
# ROI0: {case_dir}/roi0/ ↔ {case_dir}/roi0.json
|
|
# ROI1: {case_dir}/roi1/ ↔ {case_dir}/roi1.json
|
|
# Merge: {case_dir}/merge_json/ ↔ {case_dir}/merge.json
|
|
#
|
|
# 输出报告:
|
|
# {case_dir}/roi0_loss_report.json
|
|
# {case_dir}/roi1_loss_report.json
|
|
# {case_dir}/merge_loss_report.json
|
|
#
|
|
# 支持两种模式:
|
|
# 1) 批量模式(默认):处理 RESULTS_ROOT/MODEL_NAME 下所有 case
|
|
# bash analyze_tracking_loss.sh
|
|
# 2) 单 case 模式:指定 case 目录路径作为第一个参数
|
|
# bash analyze_tracking_loss.sh /path/to/case
|
|
|
|
set -u
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
export PYTHONPATH="${PROJECT_ROOT}:${PYTHONPATH:-}"
|
|
|
|
# -----------------------------------------------------------------------
|
|
# 配置区:与 track_objects.sh 保持一致
|
|
# -----------------------------------------------------------------------
|
|
RESULTS_ROOT="/data1/dongying/Mono3d/G1M3/cases_regular"
|
|
MODEL_NAME="model_20260228"
|
|
|
|
TOP_K_FRAMES=20
|
|
TOP_K_SAMPLES=200
|
|
RAW_FILE_PATTERN="*.json"
|
|
|
|
analyze_one_source() {
|
|
local case_dir="$1"
|
|
local raw_subdir="$2"
|
|
local tracking_name="$3"
|
|
local report_name="$4"
|
|
local source_label="$5"
|
|
|
|
local raw_dir="${case_dir}/${raw_subdir}"
|
|
local tracking_json="${case_dir}/${tracking_name}"
|
|
local report_json="${case_dir}/${report_name}"
|
|
|
|
if [[ ! -d "${raw_dir}" ]]; then
|
|
echo "Warning: raw directory not found, skipping ${source_label}: ${raw_dir}"
|
|
return 0
|
|
fi
|
|
if [[ ! -f "${tracking_json}" ]]; then
|
|
echo "Warning: tracking json not found, skipping ${source_label}: ${tracking_json}"
|
|
return 0
|
|
fi
|
|
|
|
echo ""
|
|
echo "--- Analyze ${source_label} ---"
|
|
python3 "${PROJECT_ROOT}/tools/temporal_analysis/analyze_tracking_loss.py" \
|
|
--raw-dir "${raw_dir}" \
|
|
--tracking "${tracking_json}" \
|
|
--output "${report_json}" \
|
|
--file-pattern "${RAW_FILE_PATTERN}" \
|
|
--top-k-frames "${TOP_K_FRAMES}" \
|
|
--top-k-samples "${TOP_K_SAMPLES}"
|
|
}
|
|
|
|
analyze_one_case() {
|
|
local case_dir="$1"
|
|
|
|
if [[ ! -d "${case_dir}" ]]; then
|
|
echo "Error: case directory does not exist: ${case_dir}"
|
|
return 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "======================================================================"
|
|
echo "Analyze tracking loss: ${case_dir}"
|
|
echo "======================================================================"
|
|
|
|
analyze_one_source "${case_dir}" "roi0" "roi0.json" "roi0_loss_report.json" "roi0"
|
|
analyze_one_source "${case_dir}" "roi1" "roi1.json" "roi1_loss_report.json" "roi1"
|
|
analyze_one_source "${case_dir}" "merge_json" "merge.json" "merge_loss_report.json" "merge"
|
|
}
|
|
|
|
echo ""
|
|
echo "######################################################################"
|
|
echo "# Analyze detection loss between raw per-frame JSON and tracking JSON"
|
|
echo "######################################################################"
|
|
|
|
if [[ -n "${1:-}" ]]; then
|
|
CASE_DIR="$1"
|
|
echo "Single-case mode: ${CASE_DIR}"
|
|
analyze_one_case "${CASE_DIR}"
|
|
exit $?
|
|
fi
|
|
|
|
MODEL_DIR="${RESULTS_ROOT}/${MODEL_NAME}"
|
|
if [[ ! -d "${MODEL_DIR}" ]]; then
|
|
echo "Error: model directory not found: ${MODEL_DIR}"
|
|
exit 1
|
|
fi
|
|
|
|
mapfile -t CASE_DIRS < <(find "${MODEL_DIR}" -mindepth 1 -maxdepth 1 -type d | sort)
|
|
|
|
if [[ ${#CASE_DIRS[@]} -eq 0 ]]; then
|
|
echo "Warning: no case directories found under ${MODEL_DIR}"
|
|
exit 0
|
|
fi
|
|
|
|
echo "Batch mode: found ${#CASE_DIRS[@]} case(s) under ${MODEL_DIR}"
|
|
|
|
for case_dir in "${CASE_DIRS[@]}"; do
|
|
analyze_one_case "${case_dir}" || exit 1
|
|
done
|
|
|
|
echo ""
|
|
echo "Tracking loss analysis complete."
|