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

216 lines
7.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
shopt -s nullglob
# 用法说明:
# 批量对 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) 批量模式(默认):遍历 BATCH_ROOT 下所有 场景/模型 目录
# bash track_objects_cncap.sh
# 2) 批量模式(指定根目录):第一个参数传场景根目录
# bash track_objects_cncap.sh /data1/dongying/Mono3d/G1M3/pdcl_batch_infer/cases_aeb_v2
# 3) 单 case 模式:第一个参数传具体 case 目录路径
# bash track_objects_cncap.sh /path/to/one_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:-}"
PYTHON_BIN="${PYTHON_BIN:-/deeplearning_team/ydong/dongying/miniconda/envs/yolov5/bin/python}"
# -----------------------------------------------------------------------
# 配置区
# -----------------------------------------------------------------------
# 批量根目录,目录结构约定为:
# BATCH_ROOT/<scene_name>/<model_name>/<case_name>/{roi0,roi1,merge_json}
BATCH_ROOT="${BATCH_ROOT:-/data1/dongying/Mono3d/G1M3/pdcl_batch_infer/cases_aeb_v2}"
# 可选过滤,留空表示不过滤:
# SCENE_FILTER="CBNA"
# MODEL_FILTER="50_15_60"
SCENE_FILTER="${SCENE_FILTER:-}"
MODEL_FILTER="${MODEL_FILTER:-}"
NUM_WORKERS="${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
MODEL_VERSION="${MODEL_VERSION:-}"
MERGE_OUTPUT_NAME="${MERGE_OUTPUT_NAME:-combined_tracking.json}"
echo ""
echo "######################################################################"
echo "# Batch tracking and merge: auto scene/model traversal"
echo "######################################################################"
MODEL_VERSION_ARGS=()
if [[ -n "${MODEL_VERSION}" ]]; then
MODEL_VERSION_ARGS+=(--model-version "${MODEL_VERSION}")
fi
is_case_dir() {
local dir_path="$1"
[[ -d "${dir_path}/roi0" || -d "${dir_path}/roi1" || -d "${dir_path}/merge_json" ]]
}
run_single_case() {
local case_dir="$1"
echo "Single-case mode: ${case_dir}"
for source in roi0 roi1 merge; do
local input_dir="${case_dir}/${source}"
local output_file
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_BIN}" "${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} \
"${MODEL_VERSION_ARGS[@]}"
else
echo "Warning: ${input_dir} not found, skipping ${source}"
fi
done
echo ""
echo "--- Merging tracking results ---"
"${PYTHON_BIN}" "${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}/${MERGE_OUTPUT_NAME}"
}
run_one_model() {
local results_root="$1"
local model_name="$2"
echo ""
printf '[RUN] scene=%s model=%s\n' "$(basename "${results_root}")" "${model_name}"
"${PYTHON_BIN}" "${PROJECT_ROOT}/tools/temporal_analysis/track_objects.py" \
--results-root "${results_root}" \
--model-name "${model_name}" \
--num-workers "${NUM_WORKERS}" \
--merge-output-name "${MERGE_OUTPUT_NAME}" \
--file-pattern "*.json" \
--classes ${TRACK_CLASSES} \
--iou-threshold ${IOU_THRESH} \
--max-age ${MAX_AGE} \
--distance-threshold ${DIST_THRESH} \
"${MODEL_VERSION_ARGS[@]}"
}
run_batch_root() {
local batch_root="$1"
local total_models=0
local success_models=0
local failed_models=0
local matched_scenes=0
echo "Batch-root mode: ${batch_root}"
[[ -n "${SCENE_FILTER}" ]] && echo "Scene filter: ${SCENE_FILTER}"
[[ -n "${MODEL_FILTER}" ]] && echo "Model filter: ${MODEL_FILTER}"
for scene_dir in "${batch_root}"/*; do
[[ -d "${scene_dir}" ]] || continue
local scene_name
scene_name="$(basename "${scene_dir}")"
if [[ -n "${SCENE_FILTER}" ]] && [[ ! "${scene_name}" =~ ${SCENE_FILTER} ]]; then
continue
fi
((matched_scenes+=1))
local found_model=0
for model_dir in "${scene_dir}"/*; do
[[ -d "${model_dir}" ]] || continue
local model_name
model_name="$(basename "${model_dir}")"
if [[ -n "${MODEL_FILTER}" ]] && [[ ! "${model_name}" =~ ${MODEL_FILTER} ]]; then
continue
fi
found_model=1
((total_models+=1))
if run_one_model "${scene_dir}" "${model_name}"; then
((success_models+=1))
else
((failed_models+=1))
printf '[FAIL] scene=%s model=%s\n' "${scene_name}" "${model_name}" >&2
fi
done
if [[ "${found_model}" == "0" ]]; then
printf '[SKIP] empty scene dir or no matched model: %s\n' "${scene_name}"
fi
done
if [[ "${matched_scenes}" -eq 0 ]]; then
echo "[ERROR] No matched scene directories found under: ${batch_root}" >&2
return 1
fi
if [[ "${total_models}" -eq 0 ]]; then
echo "[ERROR] No matched model directories found under: ${batch_root}" >&2
return 1
fi
echo ""
printf '[DONE] models=%d success=%d failed=%d\n' \
"${total_models}" "${success_models}" "${failed_models}"
[[ "${failed_models}" -eq 0 ]]
}
TARGET_PATH="${1:-${BATCH_ROOT}}"
if [[ ! -d "${TARGET_PATH}" ]]; then
echo "Error: target directory does not exist: ${TARGET_PATH}" >&2
exit 1
fi
if is_case_dir "${TARGET_PATH}"; then
run_single_case "${TARGET_PATH}"
else
run_batch_root "${TARGET_PATH}"
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_BIN}" "${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 "${BATCH_ROOT}" -mindepth 3 -maxdepth 3 -type d -name "merge_json" -print0 | sort -z)