YOLOV5_TensorRT_C++部署
1 安装环境和yolov5代码
1.1 安装GPU驱动、CUDA、CUDNN、GPU版Pytorch。
(方法一)到官网下载GPU版Pytorch.
方法二:用docker安装。
(1)安装docker(到官网https://docs.docker.com/engine/install/ubuntu/,按照指令安装) 、
(2)安装nvida-container-tookit、
(3)拉取pytorch镜像进行测试(找nvida中合适的pytorch容器,https://catalog.ngc.nvida.com/containers)。
通过VsCode插件可以容器内部:ms-vscode-remote.remote-containers
docker imagesdocker run --gpus all -it --name env_pyt_1.12 -v $(pwd):/app nvcr.io/nvida/pytorch:22.03-py3# 如何打开新的终端# 在容器内部检验pytorch是否可用,(以命令行的方式操作docker)pythonimport torchtorch.__version__torch.cuda.is_available()# 进入docker内部,而非命令行操作docker?在vscode中搜素ms-vscode-remote.remote-containers插件,出现Dev Containers ,点击安装,# 菜单栏 查看--> 命令面板--> 在搜索栏输入 Dev Containers:attach to Running Container# 会弹出现在电脑正在运行的docker,选择目标docker,弹出新的窗口。输入远程主机密码,窗口显示远程主机的文件。
1.2 安装yolov5依赖。
git clone https://github.com/ultralytics/yolov5.git ## 克隆yolov5
cd yolov5
git checkout a80dd66efe0bc7fe3772f259260d5b7278aab42f ## 选择特定版本的yolov5
pip3 install -r reqiurments.txt# 到yolov5官网下载权重,并将权重放在weights文件夹下
## 测试安装是否成功
python detect.py --source ./data/images/ --weights weights/yolov5s.pt --conf-thres 0.4
## 如果运行上述命令报错,‘cv2 has no attrabutes ’,则执行 pip3 install "opencv-python-headless<4.3"
2 yolov5训练自定义数据
2.1 安装labelImg
conda create -n label
conda activate label
pip install labelImg
labelImg
2.2 数据集
–datasets
–data
–images
–train
–vail
–test
–labels
–train
–vail
–test
–yolov5
2.3 创建datasets.yaml,yolov5s.yaml里的类别也需要修改nc:。
2.4 训练
python /train.py --data ./data/mydata.yaml --cfg ./model/myyolov5s.yaml --weights ./weights/yolov5s.pt --batch-size 64 --epoch 600 --workers 0 --name myyolo --project My_project
2.5 可视化wandb/Tensorboard
(方法一)到https://wandb.ai/注册,–>获取密匙key(https://wandb.ai/authorize)–> pip install wandb --> wandb login + key --> 打开网页即可观看。
(方法二) tensorboard --ligdir=./yolov5s
2.6 测试
python detect.py --source ./xx.jpg --weights ./yolo_person_s/s_120/weights/best.pt --conf-thres 0.3
python detect.py --source ./c1.mp4 --weights ./yolo_person_s/s_120/weights/best.pt --conf-thres 0.3
2.7 评估
python val.py ./data/coco_persion.yaml --weights ./yolo_person_s/s_120/weights/best.pt --batch-size 128
3 yolov5模型倒出ONNX
原始没有修改过的yolov5.onnx
python export.py --weights weights/yolov5s.pt --include onnx --simplify --dynamic
pip install netron # 安装netron
netron ./weights/yolov5s_person.onnx
删除yolov5的detect部分–> 把bast.pt模型转换成best.onnx --> simplify ONNX --> 用graph surgeon给上一步的到的ONNX添加decoder operator–> 输出ONNX
执行/export.path 批量修改代码
## 将export.path复制到yolov5/文件夹下
cp export.path yolov5/
cd yolov5/
git am export.path ## 修改yolov5中export.py的代码
安装导出ONNX的依赖库
pip install seaborn
pip install onnx-graphsurgen
pip install opencv-python==4.5.5.64
pip install onnx-simplifier==0.3.10apt updata
apt install -y libgll-mesa-glx## 执行以上操作后,可以导出新的yolov5.onnx模型
python export.py --weights weights/yolov5s.pt --include onnx --simplify --dynamic
4 TensorRT部署
用docker容器部署TensorRT
docker run --gpus -it --name env_trt -v $(pwd):/app nvcr.io/nvidia/tensorrt:22.08-py3
4.1 模型构建/tensorrt_cpp/build.cu
4.2 模型推理/tensorrt_cpp/runtime.cu
4.3 运行代码生成yolov5.engine
rm -fr build
# 把处理后的yolov5_person.onnx放到第1节/1.代码/tensorrt_cpp/weights中
cmake -S . -B build # 配置
cmake --build build/ # 构建
./build/build ./weights/yolov5_person.onnx # 生成yolov5.engine,结果为: ./weights/yolov5.engine
./build/runtime ./weights/yolov5.engine ./media/c3.mp4 # 推理,结果在output文件夹下
4.4 int8量化、预处理、后处理
要把校准图片放入./tensorrt_cpp/media中
ffmpeg -i c3.pm4 sample%04d.png # 进入media目录,在视频中随机挑选200帧画面做为校准图片
ls *.png | shuf -n 200 > filelist.txt # 随机挑选200帧画面保存在filelist.txt中
# 量化。参数为权重 media文件夹 文件列表路径
rm -fr build
cmake -S . -B build # 配置
cmake --build build/ # 构建
./build/build weights/yolov5s_person.onnx ./media ./media/filelist.txt ## 量化
./build/runtime ./weights/yolov5.engine ./media/c3.mp4 2 # 推理,结果在output文件夹下,mode=2# 选择mode=1
cmake --build build/ # 构建
./build/runtime ./weights/yolov5.engine ./media/c3.mp4 1
5 应用 人员闯入、聚众
5.1 RTMP推流演示
模型推理部署在docker或者云端,为了看到模型处理视频画面,用推流工具展示画面
步骤: (1)启动rtsp-simple-sever,开启RTMP服务器。
(2)使用ffmpeg将视频流推送到RTMP服务器中。
(3)通过vlc等客户端读取rtmp://127.0.0.1:1935/live/mystream,即可显示视频流。
ffmpeg推理工具 --> RTMP服务器 -->vlc客户端
RTMP服务器:rtsp-simple-sever/MediaMTX是一个服务器和代理,允许客户发布、读取和代理实时视频和音频流。
ffmpeg推理工具: opencv_ffmpeg_streaming
如果在docker内运行,需要将端口映射出去。
## 为了利用之前的容器(已配置好环境),启动之前的容器,未映射端口
docker run --gpus all -it --name env_trt -v $(pwd):/app nvcr.io/nvidia/tensorrt:22.08-py3
# 停止容器
docker stop env_trt
# 创建自定义镜像 ,把env_trt变成env_trt_img
docker commit env_trt env_trt_img
# 重启## 映射端口并启动(注意和主机端口不一样)
# 1935 RTMP端口
# 8554 RTSP端口
docker run --gpus all -it --name env_trt -p 1936:1935 -p 8556:8554 -v $(pwd):/app env_trt_img## 进入DEV container
code /1.opencv_rtmp
## ffmpeg推理工具 --> 启动RTMP服务器 -->vlc客户端
## 右击 ./1.opencv_rtmp/rtmp_server/rtsp-simple-server ,选择“在集成终端中打开”
./rtsp-simple-server # 开启RTMP服务器,打开1935 RTMP端口、8554 RTSP端口## 在bash终端执行以下代码,第3节/PC代码/pc/1.opencv_rtmp/main.cpp
rm -fr build/
cmake . -B build # 配置
cmake --build build/ # 构建
## 推流
./build/opencv_rtmp ./media/c3_1080.mp4 8000000 # parameter: vedio_file,bitrate
## 显示 在vsCode的终端窗口有端口菜单栏,找出本地地址并复制(假设是“localhost:1935”),打开vlc media player,菜单栏file-->在窗口opensource 的URL填写“rtmp://localhost:1935/live/mystream”
## 重新执行
./build/opencv_rtmp ./media/c3_1080.mp4 8000000
## 桌面弹出窗口,点击“rtmp://localhost:1935/live/mystream”,可以显示检测画面## 在项目中会用主机的端口,
ifconfig # 检查主机地址,假设是192.168.1.241
## 新打开vlc media player的open source窗口,输入“rtmp://192.168.1.241:1936/live/mystream”
5.2 把yolov5检测结果推流出去
code ./2.yolo_trt_rtmp
## 1 启动RTMP服务器.右击 ./2.yolo_trt_rtmp/rtmp_server/rtsp-simple-server ,选择“在集成终端中打开”
./rtsp-simple-server ## 2 点击bash端口
# 编译
rm -fr build/
cmake . -B build # 配置
cmake --build build/ # 构建
# 运行程序 TensorRT_YoloV5
./build/runtime ./weights/yolov5.engine ./media/c3_1080.mp4 2 3000000
## 3 新打开vlc media player的open source窗口,输入“rtmp://192.168.1.241:1936/live/mystream”
5.3 处理实时视频流 ./2.yolo_trt_rtmp/rtmp_server/start_server.sh # start_server.sh 是把c3_720.mp4 推流到RTSP端口
./start_server.sh
## 打开vlc media player的open source窗口,输入“rtmp://192.168.1.241:8556/live1.sdp“ # 这个画面是不间断的,可以反复播放。
## 在bash终端运行
./build/runtime ./weights/yolov5.engine rtsp 2 5000000
## 打开vlc media player的open source窗口,输入“rtsp://192.168.1.241:8556/live1.sdp“
6 应用开发./3.yolo_trt_app
6.1 人员闯入应用开发
code ./3.yolo_trt_app
# 开启RTSP服务器,右击./3.yolo_trt_app/rtmp_server/start_server.sh,选择“在集成终端中打开”
start_server.sh
## 在bash中运行以下代码
./build/runtime ./weights/yolov5.engine rtsp 2 100 1 8000000
# 打开vlc media player的open source窗口,输入“rtmp://192.168.1.241:1936/live/mystream“## 分析代码 ./3.yolo_trt_app/task/gather.cpp
6.2 人员聚众应用开发
./build/runtime ./weights/yolov5.engine rtsp 2 100 1 8000000
'''
6.3 多线程
'''docker
./build/runtime_thread ./weights/yolov5.engine rtsp 2 100 1 8000000 # 57frame
