PythonYOLO 是一个面向视频中小目标/无人机数据处理的 Python 工作流。整体流程包括:从原始视频中提取运动点、根据候选点追踪目标、结合 IMU/姿态数据生成观测角和 YOLO-OBB 标注,最后使用 Ultralytics YOLO-OBB 进行训练。
PythonYOLO/
├── config.yaml # 主配置文件
├── config_record.txt # 多组 step2_trace 测试参数记录
├── yolo11n.pt # 示例/预置权重
├── python_file/
│ ├── step1_moving_points.py # 提取运动点
│ ├── step2_trace.py # 目标轨迹追踪与视频裁剪
│ ├── step3_observed_angle.py # 生成观测角可视化与 YOLO-OBB 数据集
│ └── step4_yolo_train.py # 训练 YOLO-OBB 模型
└── local_file/
├── raw_file/ # 原始视频和 IMU CSV
├── step1_file/ # step1 输出
├── step2_file/ # step2 输出
├── step3_file/ # step3 输出及 dataset
└── step4_file/ # step4 训练输出
建议使用 Python 3,并安装以下依赖:
pip install opencv-python pandas numpy pyyaml tqdm requests ultralytics
脚本中会调用 ffmpeg 进行视频重封装/转码,请确保系统已安装:
sudo apt install ffmpeg
如果运行时报错 ModuleNotFoundError: No module named 'pandas',说明当前 Python 环境缺少 pandas,需要在实际运行脚本的同一个 Python 环境中安装依赖。
原始数据放在 local_file/raw_file/ 下,默认按以下格式命名:
Camera_<timestamp>.mp4 # 原始视频
Msg_<timestamp>.csv # 对应 IMU/姿态数据
例如:
Camera_20250719_104640.mp4
Msg_20250719_104640.csv
所有参数主要在根目录 config.yaml 中配置。每一步运行前,请先确认对应配置块中的输入目录、输出目录和 file_name 是否正确。
python python_file/step1_moving_points.py
该步骤读取 local_file/raw_file/ 中的视频,通过背景差分、形态学处理和轮廓筛选提取每帧候选运动目标,输出:
local_file/step1_file/Camera_<timestamp>_Trace.mp4
local_file/step1_file/Trace_<timestamp>.csv
Trace_<timestamp>.csv 中包含每帧最多 max_points 个候选目标的像素坐标和面积,例如 x_1, y_1, area_1 ...。
python python_file/step2_trace.py
该步骤读取 step1 生成的 Trace_<timestamp>.csv,根据 ref_x/ref_y 指定的初始位置或最大运动目标进行跟踪,并将结果同步写入 IMU CSV。输出包括:
local_file/step2_file/Msg_<timestamp>_Track.csv
local_file/step2_file/Cut_<timestamp>.mp4
local_file/step2_file/Target_<timestamp>.mp4
其中:
Msg_<timestamp>_Track.csv:在原始 IMU 数据基础上新增track_x / track_y / track_area。Cut_<timestamp>.mp4:按start_frame/end_frame裁剪后的视频。Target_<timestamp>.mp4:带目标追踪点和面积标注的可视化视频。
测试提示:测试不同样例时,请从 config_record.txt 中复制对应的一整段 step2_trace: 配置,替换 config.yaml 中原有的 step2_trace: 部分。一次只保留一个 step2_trace: 块,不要把整个 config_record.txt 直接粘到 config.yaml 中。
如果后续继续运行 step3,请同时确认 step3_observed_angle.file_name 与 step2 当前处理的视频一致,或者将其设置为 ALL。
python python_file/step3_observed_angle.py
该步骤读取:
local_file/step2_file/Cut_<timestamp>.mp4
local_file/step2_file/Msg_<timestamp>_Track.csv
local_file/raw_file/Msg_<timestamp>.csv
结合追踪点、相机视场角和 IMU 姿态数据,生成旋转框标注、方向箭头可视化和 YOLO-OBB 训练数据。输出包括:
local_file/step3_file/Observed_<timestamp>.mp4
local_file/step3_file/dataset/images/*.jpg
local_file/step3_file/dataset/labels/*.txt
可通过 min_track_area 和 max_track_area 过滤过小或过大的目标,仅保留合适的帧写入训练集。
python python_file/step4_yolo_train.py
该步骤读取 local_file/step3_file/dataset/,自动生成训练/验证划分和 data.yaml,并使用 Ultralytics YOLO-OBB 进行训练。训练输出默认保存到:
local_file/step4_file/drone_finetune/
常用训练参数包括:
step4_yolo_train: dataset_dir: "local_file/step3_file/dataset" model: "local_file/step4_file/models/yolo11l-obb.yaml" epochs: 2000 imgsz: 640 batch: 16 freeze: 20 project: "local_file/step4_file" name: "drone_finetune" resume: false
如果没有 GPU,可以在配置或命令行参数中将 device 改为 cpu。
config.yaml 按步骤划分为四个配置块:
step1_moving_points:控制运动目标提取参数,如max_points、min_area、max_area_ratio、speed_thresh。step2_trace:控制目标追踪参数,如start_frame、end_frame、init_radius、ref_x/ref_y、radius_growth、target_fps。step3_observed_angle:控制姿态字段映射、相机视场角、箭头长度和面积过滤阈值。step4_yolo_train:控制数据集路径、模型、训练轮数、输入尺寸、batch 和输出目录。
file_name 可以设置为:
file_name: "ALL"
表示处理目录下所有 .mp4 文件;也可以设置为单个视频文件名:
file_name: "Camera_20250719_104640.mp4"
config.yaml必须保持合法 YAML 格式。如果出现 YAML 解析错误,请检查缩进、引号和字段名,例如resume: false不要误写成resume": false。- step2 会根据
target_fps对视频和 CSV 同步下采样,使Msg_<timestamp>_Track.csv的行数与输出视频帧数对应。 - step3 当前生成的是 YOLO-OBB 旋转框标签。如果只训练单类
drone,请确认标签类别 id 与data.yaml中的nc/names一致。 ref_x/ref_y用于指定目标初始位置;如果设置为0, 0,则会退化为选择最大运动目标作为初始目标。- 建议按 step1 → step2 → step3 → step4 顺序运行,并在每一步检查输出视频,确认目标检测和跟踪结果正确后再进入下一步。