面向海上目标场景的检测与跟踪项目,当前仓库主要提供两条链路:
- 图片检测 API:通过 HTTP 上传图片或提交本地路径,执行检测、生成结果图并发送 MQ
- 视频检测:从 RTSP 或本地 MP4 读取视频,逐帧检测、目标跟踪、可视化输出并发送 MQ
当前主实现基于 ONNX Runtime,检测入口统一收敛到 target_module/image_detect_module/target_detection.py。
image_main.py:正式图片检测 API 入口video_main.py:正式视频检测与多目标跟踪入口image_main copy.py:调试/手工测试副本,不建议作为正式部署入口
- 图片检测 HTTP API,支持文件上传和本地路径
- 图片检测默认启用离散图片跟踪,检测框可能包含
track_id - RTSP / 本地 MP4 视频逐帧检测
- ByteTrack / OC-SORT / BoT-SORT / Dist-Tracker FLIT 多算法跟踪
- 检测框、类别、置信度、跟踪 ID、轨迹线可视化
- RTSP 推流与本地 MP4 保存
- RabbitMQ 检测结果上报
- 入口层
image_main.py:图片检测 HTTP 服务video_main.py:视频检测、跟踪、推流与落盘
- 检测引擎层
target_module/image_detect_module/target_detection.py:统一检测入口detect_targets(...)target_module/image_detect_module/image_processor.py:图片类型判断、检测调度、结果封装target_module/image_detect_module/detectors.py:OnnxDetector推理与后处理
- 跟踪引擎层
target_module/image_detect_module/utils/tracker.py:多算法跟踪器统一封装target_module/image_detect_module/utils/dist_tracker.py:Dist-Tracker FLIT 轻量适配层target_module/image_detect_module/utils/kalman_bbox.py:Kalman 跟踪基础实现target_module/image_detect_module/utils/gmc.py:全局运动补偿,供 BoT-SORT 使用
- 输出与集成层
visualization.py:检测框、类别、ID、轨迹线绘制messaging/mq_publisher.py:图片/视频检测结果 MQ 发送output_rtsp_video/video_output_manager.py:RTSP 输出与本地视频保存
flowchart LR
A[图片请求 image_main.py] --> C[detect_targets]
B[RTSP/MP4 video_main.py] --> C
C --> D[TargetDetector]
D --> E[ImageProcessor.process / process_frame]
E --> F[OnnxDetector]
F --> G[统一检测结果]
G --> H[MultiObjectTracker]
H --> I[visualization.py]
G --> J[RabbitMQ]
I --> K[results / RTSP 输出]
- Python 3.11+
- Windows / PowerShell
- 可选:RabbitMQ
- 可选:mediamtx(RTSP 服务)
- 可选:FFmpeg
仓库内依赖文件:files/requirements.txt
当前文件中列出的主要依赖包括:
numpyopencv_pythonpikaPillowpsutilRequeststorchtorchvisiontransformersultralytics
主服务实际运行还依赖下列组件,若本地环境未安装,需要额外补齐:
FlaskFlask-CORSonnxruntimepytest(运行测试时需要)
安装示例:
pip install -r files\requirements.txt
pip install flask flask-cors onnxruntime pytestpython image_main.py默认监听地址:
http://0.0.0.0:8080
# RTSP 模式(默认)
python video_main.py
# 本地 MP4 输入
python video_main.py --input "D:\path\to\video.mp4"
# 指定追踪算法
python video_main.py --input "video.mp4" --tracker ocsort
python video_main.py --input "video.mp4" --tracker dist_tracker
# 自定义输出路径 + 无窗口模式
python video_main.py --input "video.mp4" --output results\out.mp4 --no-display| 参数 | 说明 | 默认值 |
|---|---|---|
--input |
本地视频文件路径;为空时使用 RTSP 输入 | 空 |
--tracker |
bytetrack / ocsort / botsort / dist_tracker / official_ocsort / official_botsort |
配置默认值 |
--output |
输出视频路径 | Config.VIDEO_OUTPUT_PATH(默认 results/output.mp4) |
--no-display |
不显示预览窗口 | 关闭 |
- 输入:
Config.VIDEO_RTSP_INPUT(默认rtsp://localhost:8554/video) - 输出:
Config.VIDEO_RTSP_OUTPUT(默认rtsp://localhost:8554/output) - 本地保存:
Config.VIDEO_OUTPUT_PATH(默认results/output.mp4)
配置文件:target_module/image_detect_module/config.py
- 可见光模型:
target_module/models/A_S_F_rgb_FFCA.onnx - 红外模型:
target_module/models/A_S_F_ir_FFCA.onnx - 附加模型:
target_module/models/yolov5n.onnx,用于轻量 YOLOv5n ONNX 兼容性或实验验证;当前默认检测链路仍使用上述 FFCA ONNX 模型 - 模型路径由
Config使用跨平台os.path.join(...)生成,可在 Windows 和 Linux/WSL 下直接解析
- 可见光置信度阈值:
0.5 - 红外置信度阈值:
0.65 - NMS IoU 阈值:
0.5
- 默认跟踪器:
botsort - 可选跟踪器:
bytetrack、ocsort、botsort、dist_tracker、official_ocsort、official_botsort dist_tracker是 Dist-Tracker 后端跟踪思想的轻量适配层,使用 FLIT 的 L2-IoU 融合匹配代价、检测置信度融合和现有 GMC;不引入 Dist-Tracker 的 YOLO/Ultralytics 检测链路。official_ocsort/official_botsort是 vendored 官方源码适配层;默认botsort仍是项目轻量 baseline,official_botsort第一版不启用 ReID。DIST_TRACKER_GAMMA = 0.25DIST_TRACKER_MATCH_THRESH = 0.8DIST_TRACKER_FUSE_SCORE = TrueIMAGE_TRACKER_MIN_HITS = 1IMAGE_TRACKER_FRAME_RATE = 1.0VIDEO_RTSP_INPUT = rtsp://localhost:8554/videoVIDEO_RTSP_OUTPUT = rtsp://localhost:8554/outputVIDEO_OUTPUT_PATH = results/output.mp4
说明:
- 当前 README 以
config.py里的实际默认值为准 - 目前默认红外模型不是
A_S_F_ir_FFCA_v2.onnx
POST /api/v1/detect/imagePOST /api/detect/image:兼容路径GET /api/v1/results/<result_id>:获取结果图
POST /api/v1/detect/image 支持两种输入:
multipart/form-data
- 字段:
file
application/json
- 字段:
image_path
上传文件:
curl -X POST "http://127.0.0.1:8080/api/v1/detect/image" \
-F "file=@./test.jpg"提交本地路径:
curl -X POST "http://127.0.0.1:8080/api/v1/detect/image" \
-H "Content-Type: application/json" \
-d "{\"image_path\": \"D:/data/test.jpg\"}"image_main.py 当前主流程如下:
- 接收上传文件或
image_path - 调用
td.detect_targets(filepath, "./", enable_tracking=True) - 如 MQ 可用,则发送图片检测结果到 RabbitMQ
- 生成带标注结果图并保存到
results/ - 将
result_image_path和result_id回写到检测结果
检测引擎返回的标准结构以 target_detection.py 为准,典型字段包括:
successmessagetimestamptypedata.countdata.boxesdata.result_image_path
在 enable_tracking=True 时,data.boxes 中的目标可能包含:
track_id:跟踪 IDid:兼容字段,等于track_id
示例结构:
{
"success": true,
"message": "Success",
"timestamp": 1753774440304,
"type": "visible",
"data": {
"count": 1,
"result_image_path": "D:/project/results/result_xxx.jpg",
"boxes": [
{
"x": 120,
"y": 88,
"w": 65,
"h": 44,
"confidence": 0.91,
"class": "USV",
"track_id": 7,
"id": 7
}
]
}
}注意:
- 当前
image_main.py的 HTTP 主流程偏向“接收请求并处理/MQ 上报” APIResponse.success(...)在现代码里并未完整实现,HTTP 实际返回体不能按 README 中的检测结构做强依赖- 如需消费完整检测结果,建议以检测模块返回结构或 MQ 消息结构为准
image_main.py 当前会将结果图保存为:
results/result_<result_id>.jpg
查询接口:
GET /api/v1/results/<result_id>
如果文件存在,将直接返回对应 JPEG 图片。
400:参数错误、文件不存在、文件类型非法413:文件过大,默认 100MB503:检测模块不可用500:服务内部错误
video_main.py 支持两种输入方式:
- RTSP 流
- 本地 MP4 文件
当前流程:
- 打开 RTSP 或本地视频
- 逐帧写入临时图片供检测器读取
- 调用
detect_from_image_file(...)执行检测 - 使用
MultiObjectTracker做多目标跟踪 - 用
visualization.py绘制检测框、ID 与轨迹 - 输出到 RTSP 和/或本地 MP4
- 通过后台队列线程约每 2 秒发送一次 MQ 消息
配置文件:messaging/mq_config.py
当前默认配置:
- host:
168.1.3.100 - port:
5672 - username:
admin - password:
admin - exchange:
uavExchange - 图片队列:
analyzeImageQueue - 无人船视频队列:
analyzeVideoQueue1 - 无人机视频队列:
analyzeVideoQueue2
本地快速启动示例:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management管理台:
http://127.0.0.1:15672
配置文件:
output_rtsp_video/mediamtx/mediamtx.yml
启动示例:
cd output_rtsp_video\mediamtx
.\mediamtx.exe .\mediamtx.yml离线单图 ONNX 推理验证脚本,用于快速验证模型和后处理逻辑。
image_main.py 的调试副本,包含手工测试模式 TEST_MODE。适合本地排查问题,不建议作为正式服务入口。
本地 MP4 跟踪测试脚本,支持低帧率模拟、指定跟踪器和最大处理帧数。
示例:
conda run -n ship_detect python tools/validation/video_test_tracking.py --input "D:\path\to\video.mp4"
conda run -n ship_detect python tools/validation/video_test_tracking.py --input "D:\path\to\video.mp4" --tracker botsort --fps-override 5
conda run -n ship_detect python tools/validation/video_test_tracking.py --input "D:\path\to\video.mp4" --tracker dist_tracker --max-frames 100将某个 tracker 在完整视频上的输出导出为 MOTChallenge tracker result 文件,目录形式为 <output-root>/<tracker>/data/<seq>.txt。正式评测时不要使用抽帧或低帧率模式,结果帧号必须与 GT 的 seqinfo.ini / gt/gt.txt 对齐。
示例:
conda run -n ship_detect python tools/evaluation/export_mot_results.py --input "D:\path\to\video.mp4" --tracker official_botsort --seq-name "seq01" --output-root "results\motchallenge_trackers"
conda run -n ship_detect python tools/evaluation/export_mot_results.py --input "D:\path\to\video.mp4" --tracker dist_tracker --seq-name "seq01" --output-root "results\motchallenge_trackers"调用 vendored TrackEval 计算正式 MOTChallenge 风格指标:HOTA、MOTA、IDF1。输入必须包含真实跨帧身份标注,GT 目录结构为 <gt-root>/<seq>/seqinfo.ini 和 <gt-root>/<seq>/gt/gt.txt。
示例:
conda run -n ship_detect python tools/evaluation/motchallenge_eval.py --gt-root "D:\path\to\mot_gt" --trackers-root "results\motchallenge_trackers" --trackers official_botsort --sequences seq01 --output-root "results\motchallenge_eval"批量抽帧脚本,递归扫描 _V/_T 视频,复用 ONNX 检测与可配置跟踪器(默认 botsort),按位移、目标自身姿态角、面积变化和图像相似度导出训练帧、空标签文件与清单 CSV。
示例:
conda run -n ship_detect python tools/dataset/extract_tracking_frames.py
conda run -n ship_detect python tools/dataset/extract_tracking_frames.py --input-root "D:\Desktop\烟台项目数据\原始数据集\视频" --output-root "D:\Desktop\烟台项目数据\原始数据集\external_frames" --resume验证 detect_targets(..., enable_tracking=True) 的跨帧跟踪行为、延迟和回归项。
对同一组 RGB / IR 视频执行一次检测,并将同一帧检测结果同时喂给多个跟踪器,输出带 track_id 的标注视频和逐帧框数据,用于人工对比跟踪效果。
默认输入:
- IR:
/mnt/d/Desktop/UAV_USV标注数据集/multi_target_source_videos/USV/IR/DJI_20250916100639_0001_T.MP4 - RGB:
/mnt/d/Desktop/UAV_USV标注数据集/multi_target_source_videos/USV/RGB/DJI_20250916100639_0001_V.MP4
默认输出:
results/tracker_effect_test/DJI_20250916100639_0001/IR/<tracker>/results/tracker_effect_test/DJI_20250916100639_0001/RGB/<tracker>/
每个 tracker 目录包含:
annotated.mp4annotated_part_*.mp4(使用--resume续跑时生成,表示从中断帧之后继续写出的标注视频段)tracks.csvframes.jsonlsummary.jsonerror.txt(仅失败时生成)
示例:
conda run -n ship_detect python tools/validation/tracker_effect_test.py --max-frames 5
conda run -n ship_detect python tools/validation/tracker_effect_test.py
conda run -n ship_detect python tools/validation/tracker_effect_test.py --resume
conda run -n ship_detect python tools/validation/tracker_effect_test.py --trackers botsort dist_tracker official_botsort
conda run -n ship_detect python tools/validation/tracker_effect_test.py --modalities IR --trackers dist_tracker --progress-interval 25--resume 会读取每个 tracker 目录下已有 frames.jsonl 的行数,并只从下一帧开始追加 frames.jsonl / tracks.csv。由于 MP4 容器不能可靠原地追加,续跑时不会覆盖已有 annotated.mp4,而是写入新的 annotated_part_<起始帧>.mp4;脚本仍会从视频开头重放已处理帧来恢复各 tracker 的内部状态,但不会重复写出这些帧的数据。
对本地视频逐帧执行当前 ONNX 检测模型,只绘制检测框与类别置信度,不初始化跟踪器、不输出 track_id。适合快速检查检测模型在外部视频上的召回和误检情况。
示例:
conda run -n ship_detect python tools/validation/video_detect_only.py --file-type visible --input "D:\path\video1.mp4" --input "D:\path\video2.mp4" --output-dir results/detection_only
conda run -n ship_detect python tools/validation/video_detect_only.py --file-type visible --input "D:\path\video.mp4" --max-frames 5
conda run -n ship_detect python tools/validation/video_detect_only.py --file-type visible --conf-threshold 0.1 --input "D:\path\video.mp4"每个输入视频会输出:
<视频名>_detected.mp4<视频名>_summary.json<视频名>_detections.csv:每个检测框一行,字段为frame_index,timestamp_sec,detection_id,x,y,w,h,confidence,class,class_confidence<视频名>_frames.jsonl:每帧一行,包含frame_index,timestamp_sec,boxes;无目标帧也写入boxes: []<视频名>_analysis.md:单视频检测覆盖率、类别、置信度和框面积统计detection_analysis.md:批量汇总报告
用于比较两版红外模型:
A_S_F_ir_FFCA.onnxA_S_F_ir_FFCA_v2.onnx
示例:
conda run -n ship_detect python tools/experiments/run_compare_ir_models.py输出示例:
results/ir_cmp_<视频标签>_<模型标记>.mp4
安装:
pip install pytest运行:
pytest -q仓库中还包含以下测试或验证入口:
test/test_extract_tracking_frames.pytest/test_video_dataset_classify.pytools/validation/test_image_tracking_api.pyoutput_rtsp_video/test_output_rtsp_video.pytools/experiments/run_all_tests.py
说明:
- 部分测试依赖 RTSP、FFmpeg、RabbitMQ 或本地数据文件
tools/validation/和tools/experiments/是人工验证/实验脚本,不等同于 pytest 单元测试- 运行前请先确认外部服务和测试数据已准备好
image_main.py:图片检测 APIimage_main copy.py:图片检测调试副本video_main.py:视频检测与跟踪入口visualization.py:可视化绘制tools/README.md:离线工具目录说明tools/dataset/:数据集整理、抽帧、批量分析和 YOLO 标签可视化工具tools/validation/:人工验证、调试和本地效果检查脚本tools/experiments/:跟踪器、模型和帧率实验编排脚本target_module/:检测核心模块与模型messaging/:RabbitMQ 配置与发布output_rtsp_video/:RTSP 输出与推流管理results/:结果图与输出视频目录uploads/:上传文件临时目录
新增 tools/dataset/video_dataset_classify.py 作为目录级离线批处理入口,用于对 _V / _T 视频做全量解码、时间窗场景分类、目标统计、双模态校准和报表导出。
conda run -n ship_detect python tools/dataset/video_dataset_classify.py
conda run -n ship_detect python tools/dataset/video_dataset_classify.py --input-root "D:\Desktop\烟台项目数据\原始数据集\视频"
conda run -n ship_detect python tools/dataset/video_dataset_classify.py --input-root "D:\Desktop\烟台项目数据\原始数据集\视频" --resume
conda run -n ship_detect python tools/dataset/video_dataset_classify.py --input-root "D:\Desktop\烟台项目数据\原始数据集\视频" --resume --workers 2配置位于 target_module/image_detect_module/config.py,新增:
DATASET_INPUT_ROOTDATASET_OUTPUT_ROOTDATASET_MAX_WORKERSDATASET_WINDOW_SECONDSDATASET_MIN_FRAMES_PER_WINDOWDATASET_LOW_FPS_WINDOW_MAX_SECONDSDATASET_SCENE_SKY_THRESHOLDDATASET_SCENE_SHORELINE_LOW_THRESHOLDDATASET_SCENE_SHORELINE_HIGH_THRESHOLDDATASET_T_SCENE_DOMINANT_RATIO_MINDATASET_T_SCENE_MIN_INTENSITY_VARIANCEDATASET_T_SCENE_MIN_HORIZON_CONFIDENCEDATASET_T_SCALE_DEFAULTDATASET_T_CALIB_MIN_OVERLAP_COUNTDATASET_ALIGNMENT_MIN_OVERLAP_RATIODATASET_USABLE_WINDOW_RATIO_THRESHOLDDATASET_MAX_CONSECUTIVE_UNUSABLE_WINDOWS
- 场景类别固定为
pure_sea、pure_sky、nearshore_sea、sea_sky、nearshore_sea_sky、shoreline_mixed - 场景优先级固定为
shoreline_mixed > nearshore_sea_sky > nearshore_sea > sea_sky > pure_sea > pure_sky _V使用颜色、亮度、边缘、地平线等可见光启发式特征_T使用亮度分层、局部对比、边界复杂度、水平分界稳定性和纹理粗糙度等红外适配特征,不使用颜色/饱和度作为主特征_T低置信度显式触发条件:max(sea_ratio, sky_ratio, shoreline_land_ratio) < DATASET_T_SCENE_DOMINANT_RATIO_MINframe_intensity_variance < DATASET_T_SCENE_MIN_INTENSITY_VARIANCEhorizon_confidence < DATASET_T_SCENE_MIN_HORIZON_CONFIDENCE且shoreline_land_ratio落在近岸区间
- 若
paired单元中_T低置信度且存在满足重叠条件的_V同窗结果,则primary_scene使用_V结果并将scene_source标记为paired_visible_proxy
- 时间窗级
usable=false条件:frame_count < 4scene_classification_failed=truedetector_not_run=truedecode_error=true
- 视频级只有同时满足以下条件才为
usable=trueusable_window_ratio >= DATASET_USABLE_WINDOW_RATIO_THRESHOLDmax_consecutive_unusable_windows <= DATASET_MAX_CONSECUTIVE_UNUSABLE_WINDOWS
默认输出到 results/video_dataset_analysis/<run_id>/,包含:
precheck_by_date.csvwindow_results.csvvideo_results.csvreport_all_units.csvreport_paired_only.csvgap_report.csvrun_summary.json
window_results.csv 固定列:
unit_iddate_batchmodalitypair_statuswindow_startwindow_endframe_countlow_fps_windowduration_from_metadatadecode_errorprimary_scenesea_ratiosky_ratioshoreline_land_ratioscene_classification_failedscene_classification_low_confidencescene_sourcetarget_presencetarget_counttrack_countbbox_area_ratio_statsscale_bin_countssmall_target_countdetector_not_runusable
feat: 新增dist_tracker跟踪器,按 Dist-Tracker/FLIT 思路实现 L2-IoU 融合匹配、检测置信度融合和 GMC,保持项目检测框输入输出契约feat:video_main.py、video_test_tracking.py、export_mot_results.py和extract_tracking_frames.py支持--tracker dist_trackerfeat: 新增tools/validation/tracker_effect_test.py,同一帧检测结果可同时喂给多个跟踪器并输出标注视频、tracks.csv、frames.jsonl和summary.jsonfeat: 新增tools/validation/video_detect_only.py,用于本地视频纯检测可视化与检测统计导出,不初始化跟踪器refactor: ONNX 模型默认路径改为基于Config.BASE_DIR和os.path.join(...)构造,避免 Windows 路径分隔符在 Linux/WSL 下失效test: 新增dist_tracker合成检测框单元测试、tracker effect 导出 helper 测试和默认模型路径测试docs: README、抽帧说明和 AGENTS 规则同步更新,明确 Dist-Tracker 配置、工具用法和修改代码后更新 README 的要求docs: 新增docs/MSDC_ELT_IMPLEMENTATION_PLAN.md,记录 MS-DC-ELT 生命周期跟踪方案的后续实现计划chore: 新增target_module/models/yolov5n.onnx附加模型文件,默认运行配置未切换到该模型
refactor: 将video_main.py的 RTSP 输入、RTSP 输出和默认输出视频路径迁移到Configfeat: 新增tools/dataset/video_dataset_classify.py,支持递归遍历_V/_T视频,输出预检查、时间窗级结果、视频级汇总和缺口报表feat:config.py新增数据集批处理配置,包括时间窗退化、红外低置信度规则、双模态重叠对齐、usable阈值和T小目标校准参数test: 新增test/test_video_dataset_classify.py,覆盖场景分类、低置信度、窗口退化、重叠对齐、usable规则和汇总字段docs: README 补充离线批处理入口、输出文件、窗口级列定义与规则说明
feat: 新增tools/dataset/extract_tracking_frames.py,支持递归遍历_V/_T视频、基于检测/跟踪事件抽帧、导出 YOLO 标签与训练清单feat:ImageProcessor新增process_frame(frame, file_type),支持内存帧直接推理fix:detectors.py放宽对torch的依赖,缺少torch时仍可导入并使用 ONNX Runtime
feat:video_main.py集成多目标跟踪器,支持ByteTrack、OC-SORT、BoT-SORTfeat:video_main.py新增本地 MP4 输入模式和--input、--tracker、--output、--no-display参数fix: MQ 发送改为队列 + 后台线程,避免逐帧创建线程refactor: 视频检测入口重构为argparse + main()形式
feat: 增加tracker.py、kalman_bbox.py、gmc.py,形成多算法跟踪基础能力feat: 增加tools/validation/video_test_tracking.py、tools/experiments/run_all_tests.pyrefactor: 调整配置与可视化逻辑,强化低帧率场景下的跟踪验证能力
feat: 检测结果图路径回写到返回结果fix: 修复 Windows 中文路径下图片读写问题fix: 修正目标类别与图片类型识别相关问题