Files
chill_notes/专业领域/ByteTrack/YOLO+ByteTrack水流速度检测.md
2026-04-23 18:50:48 +08:00

7.3 KiB
Executable File
Raw Blame History

YOLO + ByteTrack 水流速度检测模型

基于 YOLO 目标检测 + ByteTrack 多目标追踪的水流速度检测方案

归档2026-04-23


🎯 项目概述

核心思路

  • 用 YOLO 检测水流中的物体(如漂浮物、示踪粒子等)
  • 用 ByteTrack 追踪每个物体的运动轨迹
  • 通过轨迹位移和时间计算流速

🏗️ 技术架构

视频输入 → YOLO 检测 → 边界框 + 置信度
              ↓
    ByteTrack 追踪关联
              ↓
      物体 ID + 轨迹
              ↓
    位移 / 时间 = 流速

📦 核心组件

1. YOLO 检测器

选项 说明
YOLOX ByteTrack 原生检测器anchor-free推荐
YOLOv7 性能更强,训练更灵活
YOLOv8 最新 Ultralytics 版本,生态最好
YOLOv5 最流行,社区支持广

推荐YOLOX 或 YOLOv8与 ByteTrack 集成好)

2. ByteTrack 追踪器

项目 数据
论文 ECCV 2022
GitHub ifzhang/ByteTrack
原理 关联所有检测框(不只是高分框)
速度 30 FPS (V100)
性能 MOT17: 80.3 MOTA, 77.3 IDF1

🔧 训练自定义模型

Step 1: 数据准备

需要

  • 水流场景视频/图像
  • 标注目标物体(如漂浮物、示踪粒子)
  • COCO 格式标注

标注工具

  • LabelImg
  • CVAT
  • Roboflow
  • Label Studio

COCO 格式

{
  "images": [{"id": 1, "file_name": "frame_001.jpg", "width": 1920, "height": 1080}],
  "annotations": [{"id": 1, "image_id": 1, "category_id": 1, "bbox": [x, y, w, h]}],
  "categories": [{"id": 1, "name": "floating_object"}]
}

Step 2: YOLO 训练

以 YOLOX 为例

# 1. 克隆仓库
git clone https://github.com/Megvii-BaseDetection/YOLOX.git
cd YOLOX
pip3 install -v -e .

# 2. 准备数据集COCO 格式)
ln -s /path/to/your/data ./datasets/water_flow

# 3. 创建配置文件
# 复制 exps/example/yolox_voc/yolox_voc_s.py 并修改

# 4. 训练
python tools/train.py -f exps/example/water_flow/yolox_s_water.py \
  -d 1 -b 8 --fp16 -o -c pretrained/yolox_s.pth

以 YOLOv7 为例

# 1. 克隆仓库
git clone https://github.com/WongKinYiu/yolov7.git
cd yolov7

# 2. 准备数据YOLO 格式)
# 创建 data/custom.yaml

# 3. 微调训练
python train.py --device 0 --batch-size 32 \
  --data data/custom.yaml --img 640 640 \
  --cfg cfg/training/yolov7-custom.yaml \
  --weights 'yolov7_training.pt' --name custom

Step 3: ByteTrack 集成

# 1. 克隆 ByteTrack
git clone https://github.com/ifzhang/ByteTrack.git
cd ByteTrack
pip3 install -r requirements.txt
python3 setup.py develop

# 2. 训练 ByteTrack 模型(使用自定义数据)
python3 tools/train.py -f exps/example/mot/your_exp_file.py \
  -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth

# 3. 追踪推理
python3 tools/track.py -f exps/example/mot/your_exp_file.py \
  -c pretrained/bytetrack_custom.pth.tar -b 1 -d 1 --fp16 --fuse

📐 流速计算算法

基本原理

v = d / t
  • v = 流速 (m/s)
  • d = 实际位移 (m)
  • t = 时间间隔 (s)

像素到实际距离转换

需要相机标定

  1. 在场景中放置已知尺寸的参考物
  2. 计算像素到实际距离的比例因子
  3. 考虑透视变形(如果需要)

实现代码

import cv2
import numpy as np
from collections import defaultdict

class FlowVelocityCalculator:
    def __init__(self, pixels_per_meter, fps):
        self.ppm = pixels_per_meter  # 像素/米 比例
        self.fps = fps  # 帧率
        self.trajectories = defaultdict(list)
        
    def update(self, tracks, frame_idx):
        """更新轨迹"""
        for track in tracks:
            track_id = track.track_id
            bbox = track.tlbr  # [x1, y1, x2, y2]
            center = ((bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2)
            self.trajectories[track_id].append((frame_idx, center))
            
    def calculate_velocity(self, track_id, min_frames=5):
        """计算单个物体的流速"""
        traj = self.trajectories.get(track_id, [])
        if len(traj) < min_frames:
            return None
            
        # 取首尾帧
        start_frame, start_pos = traj[0]
        end_frame, end_pos = traj[-1]
        
        # 计算像素位移
        dx = end_pos[0] - start_pos[0]
        dy = end_pos[1] - start_pos[1]
        pixel_dist = np.sqrt(dx**2 + dy**2)
        
        # 转换为实际距离
        real_dist = pixel_dist / self.ppm
        
        # 计算时间
        time_sec = (end_frame - start_frame) / self.fps
        
        # 流速
        velocity = real_dist / time_sec
        return velocity
    
    def get_all_velocities(self):
        """获取所有物体的流速"""
        velocities = {}
        for track_id in self.trajectories:
            v = self.calculate_velocity(track_id)
            if v is not None:
                velocities[track_id] = v
        return velocities

📊 完整工作流程

1. 数据采集
   ↓
2. 数据标注COCO 格式)
   ↓
3. YOLO 训练检测器
   ↓
4. ByteTrack 训练追踪器(可选)
   ↓
5. 相机标定(像素→实际距离)
   ↓
6. 视频推理(检测 + 追踪)
   ↓
7. 轨迹提取与流速计算
   ↓
8. 结果可视化与输出

🛠️ 环境配置

# Python 3.8+
conda create -n waterflow python=3.8
conda activate waterflow

# 安装 PyTorch
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

# 安装 YOLOX
git clone https://github.com/Megvii-BaseDetection/YOLOX.git
cd YOLOX && pip install -v -e .

# 安装 ByteTrack
cd .. && git clone https://github.com/ifzhang/ByteTrack.git
cd ByteTrack && pip install -r requirements.txt && python setup.py develop

# 其他依赖
pip install opencv-python numpy scipy lap motmetrics

📈 模型选择建议

场景 推荐模型 原因
边缘部署 YOLOX-Nano + ByteTrack 参数 0.9M,速度快
平衡性能 YOLOX-S + ByteTrack 精度速度均衡
高精度 YOLOX-X + ByteTrack 精度最高
快速验证 YOLOv8n + ByteTrack 生态好,易用

💡 优化技巧

1. 数据增强

  • 运动模糊模拟
  • 光照变化
  • 水面反射

2. 追踪优化

  • 调整检测阈值(低阈值可能更好)
  • 调整追踪关联阈值
  • 使用卡尔曼滤波

3. 流速计算

  • 多物体平均流速
  • 异常值过滤
  • 轨迹平滑处理

🔗 相关资源

资源 链接
ByteTrack https://github.com/ifzhang/ByteTrack
YOLOX https://github.com/Megvii-BaseDetection/YOLOX
YOLOv7 https://github.com/WongKinYiu/yolov7
YOLOv8 https://github.com/ultralytics/ultralytics
ByteTrack 论文 https://arxiv.org/abs/2110.06864

AI工程索引

相关笔记:


整理:知识库管理员 | 归档2026-04-23