Files
yolov26_3d/tools/temporal_analysis/track_objects.sh

135 lines
5.3 KiB
Bash
Raw Normal View History

2026-06-24 09:35:46 +08:00
#!/bin/bash
# 用法说明:
# 批量对 test_merged_model.sh 推理结果进行跟踪后处理,覆盖三路输入:
# 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}/combined_tracking.json
#
# 支持两种模式:
# 1) 批量模式(默认):处理 RESULTS_ROOT/MODEL_NAME 下所有 case
# bash track_objects.sh
# 2) 单 case 模式:指定 case 目录路径作为第一个参数
# bash track_objects.sh /data1/dongying/Mono3d/G1M3/cases_regular/model_20260228/some_case
# Set PYTHONPATH to project root for module imports
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
export PYTHONPATH="${PROJECT_ROOT}:${PYTHONPATH}"
# -----------------------------------------------------------------------
# 配置区:与 test_merged_model.sh 保持一致
# -----------------------------------------------------------------------
# RESULTS_ROOT="/data1/dongying/Mono3d/G1M3/cases_feishu_results"
# MODEL_NAME="torchscript_python_300w_newdata-cncap-v6-ego"
# /data1/dongying/Mono3d/G1Q3/tmp/20251018215336_results/predictions
RESULTS_ROOT="/data1/dongying/Mono3d/G1M3/cases_regular"
RESULTS_ROOT="/data1/dongying/Mono3d/G1M3/pdcl_batch_infer/cases_aeb_v2/CBNA/"
MODEL_NAME="50_15_60"
NUM_WORKERS=16
# 公共跟踪参数
TRACK_CLASSES="${TRACK_CLASSES:-0 1 2 3 4 5 6 7 8 9 10 11 12}"
IOU_THRESH=0.3
MAX_AGE=5
DIST_THRESH=100
MAX_FRAMES="${MAX_FRAMES:-200}"
MODEL_VERSION="${MODEL_VERSION:-model_20260403}"
echo ""
echo "######################################################################"
echo "# Batch tracking and merge: single scan + case-level parallel execution"
echo "######################################################################"
FRAME_LIMIT_ARGS=()
if [[ -n "${MAX_FRAMES}" ]]; then
FRAME_LIMIT_ARGS+=(--max-frames "${MAX_FRAMES}")
fi
MODEL_VERSION_ARGS=()
if [[ -n "${MODEL_VERSION}" ]]; then
MODEL_VERSION_ARGS+=(--model-version "${MODEL_VERSION}")
fi
if [[ -n "$1" ]]; then
# ===================================================================
# 单 case 模式:对指定 case 目录进行跟踪 + 合并
# ===================================================================
CASE_DIR="$1"
if [[ ! -d "${CASE_DIR}" ]]; then
echo "Error: case directory does not exist: ${CASE_DIR}"
exit 1
fi
echo "Single-case mode: ${CASE_DIR}"
# 逐源跟踪
for SOURCE in roi0 roi1 merge; do
INPUT_DIR="${CASE_DIR}/${SOURCE}"
if [[ "${SOURCE}" == "merge" ]]; then
OUTPUT_FILE="${CASE_DIR}/merge.json"
else
OUTPUT_FILE="${CASE_DIR}/${SOURCE}.json"
fi
if [[ -d "${INPUT_DIR}" ]]; then
echo ""
echo "--- Tracking ${SOURCE} ---"
python "${PROJECT_ROOT}/tools/temporal_analysis/track_objects.py" \
--input-dir "${INPUT_DIR}" \
--output "${OUTPUT_FILE}" \
--file-pattern "*.json" \
--classes ${TRACK_CLASSES} \
--iou-threshold ${IOU_THRESH} \
--max-age ${MAX_AGE} \
--distance-threshold ${DIST_THRESH} \
"${FRAME_LIMIT_ARGS[@]}" \
"${MODEL_VERSION_ARGS[@]}"
else
echo "Warning: ${INPUT_DIR} not found, skipping ${SOURCE}"
fi
done
# 合并三路跟踪结果
echo ""
echo "--- Merging tracking results ---"
python "${PROJECT_ROOT}/tools/temporal_analysis/merge_tracking_results.py" \
--roi0 "${CASE_DIR}/roi0.json" \
--roi1 "${CASE_DIR}/roi1.json" \
--merge "${CASE_DIR}/merge.json" \
--output "${CASE_DIR}/combined_tracking.json"
else
# ===================================================================
# 批量模式:扫描 RESULTS_ROOT/MODEL_NAME 下所有 case
# ===================================================================
python "${PROJECT_ROOT}/tools/temporal_analysis/track_objects.py" \
--results-root "${RESULTS_ROOT}" \
--model-name "${MODEL_NAME}" \
--num-workers "${NUM_WORKERS}" \
--file-pattern "*.json" \
--classes ${TRACK_CLASSES} \
--iou-threshold ${IOU_THRESH} \
--max-age ${MAX_AGE} \
--distance-threshold ${DIST_THRESH} \
"${FRAME_LIMIT_ARGS[@]}" \
"${MODEL_VERSION_ARGS[@]}"
fi
# -----------------------------------------------------------------------
# 附加3D距离增强匹配注释状态按需启用
# -----------------------------------------------------------------------
# while IFS= read -r -d '' merge_json_dir; do
# case_dir=$(dirname "$merge_json_dir")
# output_file="${case_dir}/merge_tracking_3d.json"
# python "${PROJECT_ROOT}/tools/temporal_analysis/track_objects.py" \
# --input-dir "$merge_json_dir" \
# --output "$output_file" \
# --classes 0 1 2 3 4 5 6 7 8 9 10 11 12 \
# --iou-threshold 0.3 \
# --max-age 5 \
# --distance-threshold 100 \
# --use-3d \
# --max-3d-distance 2.0
# done < <(find "${RESULTS_ROOT}/${MODEL_NAME}" -type d -name "merge_json" -print0 | sort -z)