🎯 YOLO 实时目标检测笔记:Windows 摄像头推流 + WSL YOLO 识别

环境声明

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.6 LTS
Release:        20.04
Codename:       focal

🎯 YOLO 实时目标检测笔记:Windows 摄像头推流 + WSL YOLO 识别

🧩 场景说明

  • Windows 端摄像头(如 HP 5MP Camera)
  • 使用 ffmpeg 推流至本地 RTSP 服务器
  • WSL 中运行 Ultralytics YOLO,读取 RTSP 流进行目标检测

⚙️ 环境配置(WSL 中)

✅ 安装依赖

pip install -U pip
pip install opencv-python
pip install torch torchvision torchaudio

✅ 安装 Ultralytics(源码模式)

# 克隆仓库
git clone https://github.com/ultralytics/ultralytics

# 进入目录
cd ultralytics

# 以开发模式安装(editable)
# pip install -e .

python3 -m pip install -e .

✅ 优势:你可以随时修改 YOLO 源码,调试/开发更灵活。


✅ 步骤一:安装并运行 RTSP 服务器(mediamtx)

推荐使用轻量开源 RTSP 服务器 mediamtx(原 rtsp-simple-server)

安装(WSL 中):

wget https://github.com/bluenviron/mediamtx/releases/download/v1.12.3/mediamtx_v1.12.3_linux_amd64.tar.gz
tar -xvzf mediamtx_linux_amd64.tar.gz
cd mediamtx
./mediamtx

✅ 步骤二:Windows 端摄像头推流(FFmpeg)

推荐推流命令如下:

ffmpeg -f dshow -i video="HP 5MP Camera" -vf "yadif,format=yuv420p" -vcodec libx264 -preset ultrafast -tune zerolatency -color_primaries bt709 -colorspace bt709 -color_trc bt709 -r 30 -g 30 -threads 2 -pix_fmt yuv420p -f rtsp rtsp://172.20.24.196:8554/live.sdp

✅ 步骤三:WSL 中运行 YOLO 目标检测

yolo detect predict \
    model=yolov8n.pt \
    source="rtsp://127.0.0.1:8554/live.sdp" \
    show=True \
    device=cpu

✅ 可选:调试 RTSP 流

ffplay rtsp://127.0.0.1:8554/live.sdp

💡 常见问题排查

问题 原因或解决方案
udp:// 无法打开 YOLO 不完全支持,推荐使用 rtsp:// 转发
YOLO 无法连接 RTSP 确保 RTSP 服务在运行,FFmpeg 正常推送
无法显示窗口 确保你用的是支持 GUI 的 WSL(如 WSLg 或 X11 桥接)
torch.cuda.is_available(): False 使用 device=cpu

✅ 总结流程图

Windows 摄像头
     └───▶ FFmpeg(推送) ───▶ RTSP Server(Mediamtx)
                            WSL YOLO(读取 RTSP 流识别)

问题说明 1

➜  python3 --version
Python 3.8.10
➜  pip --version
/usr/bin/pip:6: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  from pkg_resources import load_entry_point
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
➜  git clone https://github.com/ultralytics/ultralytics
Cloning into 'ultralytics'...
remote: Enumerating objects: 61803, done.
remote: Counting objects: 100% (201/201), done.
remote: Compressing objects: 100% (140/140), done.
remote: Total 61803 (delta 139), reused 78 (delta 61), pack-reused 61602 (from 3)
Receiving objects: 100% (61803/61803), 33.73 MiB | 11.33 MiB/s, done.
Resolving deltas: 100% (45988/45988), done.

➜  cd ultralytics

➜  pip install -e .
ERROR: File "setup.py" not found. Directory cannot be installed in editable mode: /home/ultralytics
(A "pyproject.toml" file was found, but editable mode currently requires a setup.py based build.)

➜  ls
CITATION.cff  CONTRIBUTING.md  LICENSE  README.md  README.zh-CN.md  docker  docs  examples  mkdocs.yml  pyproject.toml  tests  ultralytics

说明

Ultralytics 现在是基于 pyproject.toml 的现代构建系统,而 pip install -e . 旧的可编辑模式要求有 setup.py,所以直接用会失败。

解决方案

用新的 PEP 660 可编辑模式

Python 3.8+ + pip 21.3+ 才支持。

python -m pip install --upgrade pip setuptools wheel

python3 -m pip --version
pip 25.0.1 from /home/luyang/.local/lib/python3.8/site-packages/pip (python 3.8)

cd ultralytics

python3 -m pip install -e '.[dev]'

问题说明 2

第一次运行 yolo 时由于权重文件不存在,会先下载权重文件。如果下载过程中 ctrl c 异常结束后,再次运行就会报错。

yolo detect predict model=yolo11n.pt source=./demo.mp4
Traceback (most recent call last):
  File "/home/max/.local/bin//yolo", line 8, in <module>
    sys.exit(entrypoint())
  File "/home/ultralytics/ultralytics/cfg/__init__.py", line 956, in entrypoint
    model = YOLO(model, task=task)
  File "/home/ultralytics/ultralytics/models/yolo/model.py", line 81, in __init__
    super().__init__(model=model, task=task, verbose=verbose)
  File "/home/ultralytics/ultralytics/engine/model.py", line 151, in __init__
    self._load(model, task=task)
  File "/home/ultralytics/ultralytics/engine/model.py", line 295, in _load
    self.model, self.ckpt = attempt_load_one_weight(weights)
  File "/home/ultralytics/ultralytics/nn/tasks.py", line 1549, in attempt_load_one_weight
    ckpt, weight = torch_safe_load(weight)  # load ckpt
  File "/home/ultralytics/ultralytics/nn/tasks.py", line 1447, in torch_safe_load
    ckpt = torch_load(file, map_location="cpu")
  File "/home/ultralytics/ultralytics/utils/patches.py", line 118, in torch_load
    return torch.load(*args, **kwargs)
  File "/home/max/.local/lib/python3.8/site-packages/torch/serialization.py", line 1072, in load
    with _open_zipfile_reader(opened_file) as opened_zipfile:
  File "/home/max/.local/lib/python3.8/site-packages/torch/serialization.py", line 480, in __init__
    super().__init__(torch._C.PyTorchFileReader(name_or_buffer))
RuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory

说明

关键日志:

RuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory

意思是 PyTorch 在加载权重文件时发现文件不是一个有效的 .pt zip 格式,通常有几种原因:

  1. yolo11n.pt 文件损坏或下载不完整
    • Ultralytics 会在第一次运行时自动下载权重,如果网络中断或下载被墙,文件可能是空的或部分内容缺失。
  2. 路径错误,加载到了一个错误的文件
    • 例如你目录下可能有一个同名空文件。
  3. Python / PyTorch 版本和权重文件格式不兼容(概率小,但存在)

解决方案

手动下载权重再运行

从官方仓库下载:

wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt -O yolo11n.pt

然后:

yolo detect predict model=yolo11n.pt source=./demo.mp4