基于PaddleDetection本地实现PP-Human行为识别模块(RTSP协议视频流实时检测)
- 项目介绍
- 环境准备
-
- [1. Anaconda 创建环境](#1. Anaconda 创建环境)
- [2. 获取 PaddleDetection](#2. 获取 PaddleDetection)
- [3. 获取 [MediaMTX](https://github.com/bluenviron/mediamtx/releases/tag/v1.8.4)](#3. 获取 MediaMTX)
- [4. FFmpeg 获取](#4. FFmpeg 获取)
- [5. VLC 获取](#5. VLC 获取)
- 项目准备
-
- [1. PP-Human行为识别模块](#1. PP-Human行为识别模块)
-
- [1.1 依赖列表参考](#1.1 依赖列表参考)
- [1.2 代码修改](#1.2 代码修改)
- [1.3 配置说明](#1.3 配置说明)
- [2. FFmpeg 安装](#2. FFmpeg 安装)
- [3. VLC 安装](#3. VLC 安装)
- 启动
-
- [1. MediaMTX 启动](#1. MediaMTX 启动)
- [2. FFmpeg 推流](#2. FFmpeg 推流)
-
- [2.1 查看设备列表](#2.1 查看设备列表)
- [2.2 推流](#2.2 推流)
- [3. PP-Human 启动](#3. PP-Human 启动)
- 推理成果
项目介绍
用本地电脑的摄像头摄像并推流到RTSP服务器然后拉取视频流,利用PP-Human行为识别模块本地推理并将推理结果推流到RTSP服务器,最终通过 VLC 打开网络串流播放实时画面。
环境准备
- Windows 11
- Anaconda
- PyCharm
- Python 3.10.10
- Paddlepaddle-gpu 2.5.0
- cudatoolkit 11.2
- cudnn 8.2
- PaddleDetection relase/2.7
- MediaMTX 1.8.4
- FFmpeg 7.0.1
- VLC
1. Anaconda 创建环境
- 打开 Anaconda Prompt
bash
# 创建环境
conda create --name myenv python=3.10.10
# 启动环境
conda activate myenv
2. 获取 PaddleDetection
- 采用的 Git 的方式获取的代码,使用的是 relase/2.7 分支
- 使用 PyCharm 打开代码,并选择 Anaconda 创建的环境
3. 获取 MediaMTX
- MediaMTX(以前称为rtsp-simple-server)是一个随时可用的零依赖实时媒体服务器和媒体代理,允许发布,读取,代理,记录和回放视频和音频流。它被认为是一个"媒体路由器",将媒体流从一端路由到另一端。
- 超链接直达 MediaMTX ,如果网络不好也可直接使用文章关联的资源
4. FFmpeg 获取
- FFmpeg 是一个非常强大的多媒体框架,它能够解码、编码、转码、复用、解复用、过滤和处理几乎所有格式的音频和视频数据
- 超链接直达 FFmpeg
5. VLC 获取
- VLC(VideoLAN Client)是一款开源的多媒体播放器,由 VideoLAN 组织开发。它能够播放大多数多媒体文件格式,并且可以作为流媒体服务器。
- 超链接直达 VLC
项目准备
1. PP-Human行为识别模块
- 这里我们主要用到了 PaddleDetection 项目中的 PP-Human,相对路径如下:
deploy/pipeline/pipeline.py
- 可参考
deploy/pipeline/docs/tutorials/pphuman_action.md
启动行为识别模块 - 本文选择 -
吸烟识别
,相关预训练模型如下:
1.1 依赖列表参考
- 代码中的所需要的依赖,我们本地环境肯定不是全部都有的,可以根据代码启动的报错信息,逐步添加。
- 以下是我本地环境的依赖可正常启动,仅供参考。
bash
aiofiles 23.2.1 pypi_0 pypi
altair 5.3.0 pypi_0 pypi
annotated-types 0.7.0 pypi_0 pypi
anyio 4.4.0 pypi_0 pypi
astor 0.8.1 pypi_0 pypi
attrs 23.2.0 pypi_0 pypi
bzip2 1.0.8 h2bbff1b_6 defaults
ca-certificates 2024.7.4 h56e8100_0 conda-forge
cattrs 23.2.3 pypi_0 pypi
certifi 2024.7.4 pypi_0 pypi
charset-normalizer 3.3.2 pypi_0 pypi
click 8.1.7 pypi_0 pypi
colorama 0.4.6 pypi_0 pypi
contourpy 1.2.1 pypi_0 pypi
cudatoolkit 11.2.2 h933977f_10 conda-forge
cudnn 8.2.1.32 h754d62a_0 conda-forge
cycler 0.12.1 pypi_0 pypi
decorator 5.1.1 pypi_0 pypi
dnspython 2.6.1 pypi_0 pypi
email-validator 2.2.0 pypi_0 pypi
exceptiongroup 1.2.1 pypi_0 pypi
fastapi 0.111.0 pypi_0 pypi
fastapi-cli 0.0.4 pypi_0 pypi
ffmpeg 1.4 pypi_0 pypi
ffmpy 0.3.2 pypi_0 pypi
filelock 3.15.4 pypi_0 pypi
fonttools 4.53.1 pypi_0 pypi
fsspec 2024.6.1 pypi_0 pypi
gradio 4.37.2 pypi_0 pypi
gradio-client 1.0.2 pypi_0 pypi
h11 0.14.0 pypi_0 pypi
httpcore 1.0.5 pypi_0 pypi
httptools 0.6.1 pypi_0 pypi
httpx 0.27.0 pypi_0 pypi
huggingface-hub 0.23.4 pypi_0 pypi
idna 3.7 pypi_0 pypi
imageio 2.34.2 pypi_0 pypi
imgaug 0.4.0 pypi_0 pypi
importlib-resources 6.4.0 pypi_0 pypi
incant 23.2.0 pypi_0 pypi
itsdangerous 2.2.0 pypi_0 pypi
jinja2 3.1.4 pypi_0 pypi
joblib 1.4.2 pypi_0 pypi
jsonschema 4.23.0 pypi_0 pypi
jsonschema-specifications 2023.12.1 pypi_0 pypi
kiwisolver 1.4.5 pypi_0 pypi
lap 0.4.0 pypi_0 pypi
lazy-loader 0.4 pypi_0 pypi
libffi 3.4.4 hd77b12b_1 defaults
llvmlite 0.39.1 pypi_0 pypi
markdown-it-py 3.0.0 pypi_0 pypi
markupsafe 2.1.5 pypi_0 pypi
matplotlib 3.9.1 pypi_0 pypi
mdurl 0.1.2 pypi_0 pypi
motmetrics 1.4.0 pypi_0 pypi
networkx 3.3 pypi_0 pypi
numba 0.56.4 pypi_0 pypi
numpy 1.23.5 pypi_0 pypi
opencv-python 4.10.0.84 pypi_0 pypi
openssl 1.1.1w h2bbff1b_0 defaults
opt-einsum 3.3.0 pypi_0 pypi
orjson 3.10.6 pypi_0 pypi
packaging 24.1 pypi_0 pypi
paddle-bfloat 0.1.7 pypi_0 pypi
paddlepaddle 2.5.0 pypi_0 pypi
paddlepaddle-gpu 2.5.0 pypi_0 pypi
pandas 2.2.2 pypi_0 pypi
pillow 10.4.0 pypi_0 pypi
pip 24.0 py310haa95532_0 defaults
protobuf 3.20.2 pypi_0 pypi
psutil 6.0.0 pypi_0 pypi
pycocotools 2.0.8 pypi_0 pypi
pydantic 2.8.2 pypi_0 pypi
pydantic-core 2.20.1 pypi_0 pypi
pydub 0.25.1 pypi_0 pypi
pygments 2.18.0 pypi_0 pypi
pyparsing 3.1.2 pypi_0 pypi
python 3.10.10 h966fe2a_2 defaults
python-dateutil 2.9.0.post0 pypi_0 pypi
python-dotenv 1.0.1 pypi_0 pypi
python-multipart 0.0.9 pypi_0 pypi
pytz 2024.1 pypi_0 pypi
pyyaml 6.0.1 pypi_0 pypi
referencing 0.35.1 pypi_0 pypi
requests 2.32.3 pypi_0 pypi
rich 13.7.1 pypi_0 pypi
rpds-py 0.19.0 pypi_0 pypi
ruff 0.5.1 pypi_0 pypi
scikit-image 0.24.0 pypi_0 pypi
scikit-learn 1.5.1 pypi_0 pypi
scipy 1.14.0 pypi_0 pypi
semantic-version 2.10.0 pypi_0 pypi
setuptools 69.5.1 py310haa95532_0 defaults
shapely 2.0.5 pypi_0 pypi
shellingham 1.5.4 pypi_0 pypi
six 1.16.0 pypi_0 pypi
sniffio 1.3.1 pypi_0 pypi
sqlite 3.45.3 h2bbff1b_0 defaults
starlette 0.37.2 pypi_0 pypi
threadpoolctl 3.5.0 pypi_0 pypi
tifffile 2024.7.2 pypi_0 pypi
tk 8.6.14 h0416ee5_0 defaults
tomark 0.1.4 pypi_0 pypi
tomlkit 0.12.0 pypi_0 pypi
toolz 0.12.1 pypi_0 pypi
tqdm 4.66.4 pypi_0 pypi
typer 0.12.3 pypi_0 pypi
typing-extensions 4.12.2 pypi_0 pypi
tzdata 2024.1 pypi_0 pypi
ujson 5.10.0 pypi_0 pypi
urllib3 2.2.2 pypi_0 pypi
uvicorn 0.30.1 pypi_0 pypi
vc 14.2 h2eaa2aa_4 defaults
vs2015_runtime 14.29.30133 h43f2093_4 defaults
watchfiles 0.22.0 pypi_0 pypi
websockets 11.0.3 pypi_0 pypi
wheel 0.43.0 py310haa95532_0 defaults
xmltodict 0.13.0 pypi_0 pypi
xz 5.4.6 h8cc25b3_1 defaults
zlib 1.2.13 h8cc25b3_1 defaults
1.2 代码修改
- 为适配本地的运行环境,本文示例项目对代码做了一定的修改。
- 原文通过命令行启动,指定配置文件及输入输出等各种参数。每次都需要手输,非常麻烦。因为我们是是用 Pycharm 调试,所以修改为在代码中写入参数,省的每次都在命令行输入。部分代码修改如下:
deploy/pipeline/pipeline.py
python
if __name__ == '__main__':
params_list = [
'--config', 'D:\\code\\fastdeploy\\PaddleDetection\\deploy\\pipeline\\config\\infer_cfg_pphuman.yml',
'--rtsp', 'rtsp://127.0.0.1:8554/stream',
'--device', 'gpu',
'--pushurl', 'rtsp://127.0.0.1:8554/test'
]
paddle.enable_static()
# parse params from command
parser = argsparser()
FLAGS = parser.parse_args(params_list)
FLAGS.device = FLAGS.device.upper()
assert FLAGS.device in ['CPU', 'GPU', 'XPU', 'NPU'
], "device should be CPU, GPU, XPU or NPU"
main()
- 由于我们使用的windows系统,代码中的
os.path.join
函数会考虑操作系统的路径分隔符,对于 Unix 和 Linux 系统,分隔符是 /,而对于 Windows 系统,分隔符是 \ 。拼接出来的内容会变成rtsp://127.0.0.1:8554\test
,造成路径错误系统抛错。部分代码修改如下:deploy/pipeline/pipeline.py
python
if len(self.pushurl) > 0:
video_out_name = 'output' if self.file_name is None else self.file_name
# pushurl = os.path.join(self.pushurl, video_out_name)
# print("the result will push stream to url:{}".format(pushurl))
pushstream = PushStream(self.pushurl)
pushstream.initcmd(fps, width, height)
- 读取配置文件所遇到的编码问题
deploy/pipeline/cfg_utils.py:178
python
with open(file=args.config, encoding='utf-8') as f:
1.3 配置说明
- 从模型库中下载行人检测/跟踪、抽烟行为识别两个预测部署模型并解压到./output_inference路径下;默认自动下载模型,如果手动下载,需要修改模型文件夹为模型存放路径。本人采用的手动下载,解压后修改名称如下
- 修改配置文件
deploy/pipeline/config/infer_cfg_pphuman.ym
l中ID_BASED_DETACTION下的enable为True; - 示例配置,引用的话可修改为实际路径:
yaml
crop_thresh: 0.5
attr_thresh: 0.5
kpt_thresh: 0.2
visual: True
warmup_frame: 50
DET:
model_dir: D:\file\ai\models\paddle\pphuman\track\mot_ppyoloe_l_36e_pipeline
batch_size: 1
MOT:
model_dir: D:\file\ai\models\paddle\pphuman\track\mot_ppyoloe_l_36e_pipeline
tracker_config: D:\code\fastdeploy\PaddleDetection\deploy\pipeline\config\tracker_config.yml
batch_size: 1
skip_frame_num: -1 # preferably no more than 3
enable: False
ID_BASED_DETACTION:
model_dir: D:\file\ai\models\paddle\ppyoloe\infer_model
batch_size: 8
threshold: 0.6
display_frames: 30
skip_frame_num: 2
enable: true
2. FFmpeg 安装
- 解压下载的安装包
- 配置环境变量,可自行百度。最终需要将解压后的bin目录的绝对路径添加。
3. VLC 安装
- 此处略过10个字...
启动
- 一切准备就绪,开始启动... ...
1. MediaMTX 启动
- 双击
2. FFmpeg 推流
- 将本地摄像编码并推送到 RTSP 服务器
2.1 查看设备列表
- HP 5MP Camera 就是我的笔记本摄像头
bash
ffmpeg -list_devices true -f dshow -i dummy
2.2 推流
- 警告信息可以忽略,提示
Output #0, rtsp, to 'rtsp://127.0.0.1:8554/stream'
表示推流成功。
bash
ffmpeg -f dshow -i video="HP 5MP Camera" -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream
3. PP-Human 启动
推理成果
- 使用 VLC 打开实时视频流