阅读量:0
基于PaddleDetection本地实现PP-Human行为识别模块(RTSP协议视频流实时检测)
项目介绍
用本地电脑的摄像头摄像并推流到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
# 创建环境 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 依赖列表参考
- 代码中的所需要的依赖,我们本地环境肯定不是全部都有的,可以根据代码启动的报错信息,逐步添加。
- 以下是我本地环境的依赖可正常启动,仅供参考。
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
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
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
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; - 示例配置,引用的话可修改为实际路径:
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 就是我的笔记本摄像头
ffmpeg -list_devices true -f dshow -i dummy
2.2 推流
- 警告信息可以忽略,提示
Output #0, rtsp, to 'rtsp://127.0.0.1:8554/stream'
表示推流成功。
ffmpeg -f dshow -i video="HP 5MP Camera" -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream
3. PP-Human 启动
推理成果
- 使用 VLC 打开实时视频流