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

253 lines
7.8 KiB
Bash
Executable File

#!/bin/bash
#
# run_mining_data.sh
#
# Script to run online inference-based bad case mining for data distillation.
# This runs step1_2_3_merged_extract.py with online inference enabled.
#
set -euo pipefail
# ============================================================================
# Configuration - Modify these variables as needed
# ============================================================================
# UUID list to process
UUID_LIST="${UUID_LIST:-./data_distillation/group_uuid_list_first_batch.txt}"
# Skip UUID file (previously extracted UUIDs)
SKIP_UUID_FILE="${SKIP_UUID_FILE:-./data_distillation/g1m3_pdcl_total_20260428.txt}"
# Output directory
# OUTPUT_ROOT="${OUTPUT_ROOT:-/mnt/pdcl/tmp/alg_results/Mono3d_Data/G1Q3-large-vehicle-first-batch}"
OUTPUT_ROOT="${OUTPUT_ROOT:-./test_online_output_new}"
# Vehicle name fallback (resolved per-UUID inside the Python script from gt_common metadata)
VEHICLE_NAME="${VEHICLE_NAME:-UNKNOWN}"
# Camera ID
CAMERA_ID="${CAMERA_ID:-camera4}"
# Product type
PRODUCT_TYPE="${PRODUCT_TYPE:-2d-3d-association}"
# ============================================================================
# Online Inference Configuration
# ============================================================================
# ROI model paths
ROI0_MODEL="${ROI0_MODEL:-./mono3d_roi0_20260427_epoch99.pt}"
ROI1_MODEL="${ROI1_MODEL:-./mono3d_roi1_20260427_epoch99.pt}"
# ROI crop sizes (W H)
ROI0_SIZE="${ROI0_SIZE:-1920 880}"
ROI1_SIZE="${ROI1_SIZE:-768 352}"
# Virtual focal lengths
ROI0_VIRTUAL_FX="${ROI0_VIRTUAL_FX:-537.0}"
ROI1_VIRTUAL_FX="${ROI1_VIRTUAL_FX:-537.0}"
# Crop center modes (cxvy or vxvy)
ROI0_CROP_CENTER_MODE="${ROI0_CROP_CENTER_MODE:-cxvy}"
ROI1_CROP_CENTER_MODE="${ROI1_CROP_CENTER_MODE:-vxvy}"
# Confidence thresholds
ROI0_CONF="${ROI0_CONF:-0.25}"
ROI1_CONF="${ROI1_CONF:-0.25}"
# Inference device (GPU ID or 'cpu')
INFERENCE_DEVICE="${INFERENCE_DEVICE:-0}"
# Use FP16 for inference (true/false)
INFERENCE_HALF="${INFERENCE_HALF:-true}"
# Inference batch size
INFERENCE_BATCH_SIZE="${INFERENCE_BATCH_SIZE:-4}"
# ============================================================================
# Mining Parameters
# ============================================================================
# Near bad case thresholds (lateral < 10m AND longitudinal < 50m)
NEAR_YAW_THRESHOLD_DEG="${NEAR_YAW_THRESHOLD_DEG:-3.0}"
NEAR_DISTANCE_THRESHOLD_PCT="${NEAR_DISTANCE_THRESHOLD_PCT:-3.0}"
# Far bad case thresholds (lateral < 5m AND longitudinal > 50m)
FAR_YAW_THRESHOLD_DEG="${FAR_YAW_THRESHOLD_DEG:-5.0}"
FAR_DISTANCE_THRESHOLD_PCT="${FAR_DISTANCE_THRESHOLD_PCT:-5.0}"
# Sequence-based mining parameters
SEQUENCE_LENGTH="${SEQUENCE_LENGTH:-10}"
MIN_BAD_FRAMES="${MIN_BAD_FRAMES:-3}"
# Edge yaw max lateral distance for edge yaw selection
EDGE_YAW_MAX_LATERAL_DIST="${EDGE_YAW_MAX_LATERAL_DIST:-30.0}"
# ============================================================================
# Processing Options
# ============================================================================
# Number of parallel workers (online inference requires 1)
WORKERS="${WORKERS:-1}"
# Max UUIDs to process (0 = all)
MAX_UUIDS="${MAX_UUIDS:-0}"
# Valid stride (keep every Nth annotation)
VALID_STRIDE="${VALID_STRIDE:-1}"
# JPEG quality for extracted images
IMAGE_JPEG_QUALITY="${IMAGE_JPEG_QUALITY:-95}"
# Visualization options
VIS_MODE="${VIS_MODE:-split}"
VIS_SCALE="${VIS_SCALE:-0.5}"
VIS_SAMPLES_PER_UUID="${VIS_SAMPLES_PER_UUID:-0}"
VIS_DIR_NAME="${VIS_DIR_NAME:-show_samples}"
# Skip options (set to "true" to enable)
NO_IMAGES="${NO_IMAGES:-false}"
NO_LABELS="${NO_LABELS:-false}"
NO_ANNOTATIONS="${NO_ANNOTATIONS:-false}"
NO_VIS_SAMPLES="${NO_VIS_SAMPLES:-false}"
# Overwrite existing files
OVERWRITE="${OVERWRITE:-false}"
# Dry run (scan only, don't write)
DRY_RUN="${DRY_RUN:-false}"
# ============================================================================
# Script - No need to modify below
# ============================================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
EXTRACT_SCRIPT="${SCRIPT_DIR}/data_distillation/step1_2_3_merged_extract.py"
# Check if extract script exists
if [ ! -f "${EXTRACT_SCRIPT}" ]; then
echo "ERROR: Extract script not found: ${EXTRACT_SCRIPT}"
exit 1
fi
# Check if UUID list exists
if [ ! -f "${UUID_LIST}" ]; then
echo "ERROR: UUID list not found: ${UUID_LIST}"
exit 1
fi
# Check if ROI models exist
if [ ! -f "${ROI0_MODEL}" ]; then
echo "ERROR: ROI0 model not found: ${ROI0_MODEL}"
exit 1
fi
if [ ! -f "${ROI1_MODEL}" ]; then
echo "ERROR: ROI1 model not found: ${ROI1_MODEL}"
exit 1
fi
# Build command
CMD=(
python "${EXTRACT_SCRIPT}"
--uuid-list "${UUID_LIST}"
--skip-uuid-file "${SKIP_UUID_FILE}"
--output-root "${OUTPUT_ROOT}"
--default-vehicle-name "${VEHICLE_NAME}"
--camera-id "${CAMERA_ID}"
--product-type "${PRODUCT_TYPE}"
--workers "${WORKERS}"
--max-uuids "${MAX_UUIDS}"
--valid-stride "${VALID_STRIDE}"
--image-jpeg-quality "${IMAGE_JPEG_QUALITY}"
--vis-mode "${VIS_MODE}"
--vis-scale "${VIS_SCALE}"
--vis-samples-per-uuid "${VIS_SAMPLES_PER_UUID}"
--vis-dir-name "${VIS_DIR_NAME}"
--sequence-length "${SEQUENCE_LENGTH}"
--min-bad-frames "${MIN_BAD_FRAMES}"
--edge-yaw-max-lateral-dist "${EDGE_YAW_MAX_LATERAL_DIST}"
--near-yaw-threshold "${NEAR_YAW_THRESHOLD_DEG}"
--near-distance-threshold "${NEAR_DISTANCE_THRESHOLD_PCT}"
--far-yaw-threshold "${FAR_YAW_THRESHOLD_DEG}"
--far-distance-threshold "${FAR_DISTANCE_THRESHOLD_PCT}"
--roi0-model "${ROI0_MODEL}"
--roi1-model "${ROI1_MODEL}"
--roi0-size ${ROI0_SIZE}
--roi1-size ${ROI1_SIZE}
--roi0-virtual-fx "${ROI0_VIRTUAL_FX}"
--roi1-virtual-fx "${ROI1_VIRTUAL_FX}"
--roi0-crop-center-mode "${ROI0_CROP_CENTER_MODE}"
--roi1-crop-center-mode "${ROI1_CROP_CENTER_MODE}"
--roi0-conf "${ROI0_CONF}"
--roi1-conf "${ROI1_CONF}"
--inference-device "${INFERENCE_DEVICE}"
--inference-batch-size "${INFERENCE_BATCH_SIZE}"
)
# Add optional flags
if [ "${NO_IMAGES}" = "true" ]; then
CMD+=(--no-images)
fi
if [ "${NO_LABELS}" = "true" ]; then
CMD+=(--no-labels)
fi
if [ "${NO_ANNOTATIONS}" = "true" ]; then
CMD+=(--no-annotations)
fi
if [ "${NO_VIS_SAMPLES}" = "true" ]; then
CMD+=(--no-vis-samples)
fi
if [ "${OVERWRITE}" = "true" ]; then
CMD+=(--overwrite)
fi
if [ "${INFERENCE_HALF}" = "true" ]; then
CMD+=(--inference-half)
else
CMD+=(--no-inference-half)
fi
if [ "${DRY_RUN}" = "true" ]; then
CMD+=(--dry-run)
fi
# Print configuration
echo "=========================================================================="
echo "Online Inference Bad Case Mining"
echo "=========================================================================="
echo "UUID List : ${UUID_LIST}"
echo "Skip UUID File : ${SKIP_UUID_FILE}"
echo "Output Root : ${OUTPUT_ROOT}"
echo "Vehicle Name : ${VEHICLE_NAME}"
echo "Camera ID : ${CAMERA_ID}"
echo ""
echo "ROI0 Model : ${ROI0_MODEL}"
echo "ROI1 Model : ${ROI1_MODEL}"
echo "Inference Device : ${INFERENCE_DEVICE}"
echo "Inference Half : ${INFERENCE_HALF}"
echo ""
echo "Sequence Length : ${SEQUENCE_LENGTH}"
echo "Min Bad Frames : ${MIN_BAD_FRAMES}"
echo "Near Yaw Threshold : ${NEAR_YAW_THRESHOLD_DEG}°"
echo "Near Distance Thres : ${NEAR_DISTANCE_THRESHOLD_PCT}%"
echo "Far Yaw Threshold : ${FAR_YAW_THRESHOLD_DEG}°"
echo "Far Distance Thres : ${FAR_DISTANCE_THRESHOLD_PCT}%"
echo ""
echo "Workers : ${WORKERS}"
echo "Max UUIDs : ${MAX_UUIDS} (0 = all)"
echo "Valid Stride : ${VALID_STRIDE}"
echo "=========================================================================="
echo ""
# Run the command
echo "Running: ${CMD[*]}"
echo ""
exec "${CMD[@]}"