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