135 lines
5.3 KiB
Bash
Executable File
135 lines
5.3 KiB
Bash
Executable File
#!/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)
|