yolov8+deepsort tensorrt C++部署加速
yolov8地址:
https://github.com/ultralytics/ultralytics
yolov8+tensorrt部署加速
https://github.com/FeiYull/TensorRT-Alpha
一、基本环境安装(X86)
1.1 安装cuda和cudnn
参考我的另外一篇博客
Ubuntu 20.04 安装NVIDIA显卡驱动+cuda 11.7+cudnn 8.4
1.2 安装tensorrt8
官方地址:https://developer.nvidia.com/nvidia-tensorrt-8x-download
登录注册
下载tensorrt 8.4
我安装的cuda 11.7 ,然后准备安装tensorrt 8.4
下载TensorRT 8.4 GA Update 2 for Linux x86_64 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6 and 11.7 TAR Package
解压文件
后解压这个文件
cd /opt/nvidia/
sudo cp '/home/xxxx/Downloads/TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz' ./
sudo tar -zxvf TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
添加环境变量
sudo gedit ~/.bashrc
在最后添加一行
export LD_LIBRARY_PATH=/opt/nvidia/TensorRT-8.4.3.1/lib:$LD_LIBRARY_PATH
source ~/.bashrc
如果出现如下错误:
ImportError: libnvinfer.so.8: cannot open shared object file: No such file o
解决办法:
cd /etc/ld.so.conf.d
sudo vim Tensorrt-8-4-3.conf
#在Tensorrt-8-4-3.conf添加TensorRT lib 路径
/opt/nvidia/TensorRT-8.4.3.1/lib
# 更新配置
sudo ldconfig
1.3 安装pytorch GPU版本和其他基本库
参考我的yolov8工程
使用Yolov8进行目标检测并训练自己的数据集
1.4 安装onnx和onnxruntime
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
requirements.txt
numpy
onnx
onnxsim
#opencv-python
#torch
#torchvision
#ultralytics
# tensorrt
onnxruntime
二、Yolov8简介
YOLO (You Look Only Once) 是一种基于图像全局信息进行预测的目标检测系统,自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来,领域内的研究者们已经对 YOLO 进行了多次更新迭代,模型性能越来越强大, YOLOv8是目前最新的研究成果。YOLO v8 是由小型初创公司 Ultralytics 创建并维护的(值得注意的是 YOLO v5 也由该公司创建)。与先前几个版本相比,YOLO v8 抛弃了前几代模型的 Anchor, 模型更准确,同时为训练模型提供统一框架,以执行以下基本任务:(1)目标检测;(2)实例分割;(3)图像分类。Ultralytics 公司的工程化能力突出,旗下作品YOLO v5和YOLO v8均具备又快又好的特点。YOLOv8 项目地址:https://github.com/ultralytics/ultralytics。
YOLO v8的模型图如下所示:
三、通过导出ONNX模型生成TensorRT Engine文件
3.1 使用Python代码导出ONNX模型
yolov8s.pt——>yolov8s.onnx
使用如下Python命令导出ONNX模型。注意,只要网络畅通,并且能正常连接Github网站,该命令首先会自动下载yolov8s.pt
模型,然后再基于该模型生成对应ONNX模型:yolov8s.onnx
。
如果网络状况不太好,可通过如下命令手动下载YOLO v8
事先训练好的Pytorch模型(不必全部下载,若只关注yolov8s.pt
就仅下载该模型):
wget https://github.com/ultralytics/ultralytics/releases/download/v8.0.0/yolov8n.pt
wget https://github.com/ultralytics/ultralytics/releases/download/v8.0.0/yolov8s.pt
wget https://github.com/ultralytics/ultralytics/releases/download/v8.0.0/yolov8m.pt
wget https://github.com/ultralytics/ultralytics/releases/download/v8.0.0/yolov8l.pt
wget https://github.com/ultralytics/ultralytics/releases/download/v8.0.0/yolov8x.pt
可将yolov8s.pt
更换为yolov8n.pt
等其他模型
python3 export.py --weights ./weights/yolov8s.pt --iou-thres 0.65 --conf-thres 0.25 --topk 100 --opset 11 --sim --input-shape 1 3 640 640 --device cuda:0
上述命令中,各参数的含义如下:
--weights
: The PyTorch model you trained.--iou-thres
: IOU threshold for NMS plugin.--conf-thres
: Confidence threshold for NMS plugin.--topk
: Max number of detection bboxes.--opset
: ONNX opset version, default is 11.--sim
: Whether to simplify your onnx model.--input-shape
: Input shape for you model, should be 4 dimensions.--device
: The CUDA deivce you export engine .
日志如下:
(pytorch_gpu) huifeimao@CN-SHA-0132:~/Desktop/work/python_project/yolov8-tensorrt$ python3 export.py --weights ./weights/yolov8s.pt --iou-thres 0.65 --conf-thres 0.25 --topk 100 --opset 11 --sim --input-shape 1 3 640 640 --device cuda:0
YOLOv8s summary (fused): 168 layers, 11156544 parameters, 0 gradients, 28.6 GFLOPs
ONNX export success, saved as ./weights/yolov8s.onnx
可以看到在输入pt文件路径下生成了onnx文件
四、 导出TensorRT Engine文件——目标机器导出
yolov8s.onnx——> yolov8s.engine
4.2.1 使用Python脚本导出TensorRT Engine文件
通过如下Python脚本导出yolov8s.onnx
对应的TensorRT Engine文件yolov8s.engine
(该文件与硬件直接相关,不同的机器不能直接使用):
python3 build.py --weights ./weights/yolov8s.onnx --iou-thres 0.65 --conf-thres 0.25 --topk 100 --fp16 --device cuda:0
上述命令中,参数含义如下所示:
--weights
: The ONNX model you download.--iou-thres
: IOU threshold for NMS plugin.--conf-thres
: Confidence threshold for NMS plugin.--topk
: Max number of detection bboxes.--fp16
: Whether to export half-precision engine.--device
: The CUDA deivce you export engine .
可根据需要修改iou-thres
、conf-thres
、topk
等参数值。
使用tensorrt工具直接导出
使用tensorrt工具直接导出也行,只需要安装tensorrt即可。
五、模型推理
5.1 使用Python脚本推理
可通过infer.py
脚本进行推理,命令如下:
python3 infer.py \
--engine yolov8s.engine \
--imgs data \
--show \
--out-dir outputs \
--device cuda:0
上述命令中,参数含义如下所示:
--engine
: The Engine you export.--imgs
: The images path you want to detect.--show
: Whether to show detection results.--out-dir
: Where to save detection results images. It will not work when use--show
flag.--device
: The CUDA deivce you use.--profile
: Profile the TensorRT engine.
5.2 使用C++代码推理
C++推理代码位于src/detect
中,具体操作方法为:
5.2.1 构建工程
构建工程命令如下:
# ~/code/YOLOv8-TensorRT是我机的项目路径,在你的电脑上需根据需要修改
cd ~/code/YOLOv8-TensorRT/src/detect
# 创建build目录并进入build目录
# 注意,创建build目录只需执行一次
mkdir build && cd build
# 根据CMakeLists.txt生成Makefile
cmake ..
# 根据Makefile构建工程
make
# 将生成的可执行程序yolov8移动到项目根目录
mv yolov8 ~/code/YOLOv8-TensorRT
# 切换到项目根目录
cd ~/code/YOLOv8-TensorRT
5.2.2 执行推理
C++推理支持单幅JPEG图像、一个目录的多幅JPEG图像、一个视频文件和摄像头实时视频等多种方式的推理:
# 1. 推理单幅JPEG图像
./yolov8 yolov8s.engine data/bus.jpg
# 2. 推理data目录下的所有JPEG图像
./yolov8 yolov8s.engine data
# 3. 推理视频文件data/test.mp4
./yolov8 yolov8s.engine data/test.mp4
# 4. 推理摄像头实时视频(要求电脑自带摄像头并能正常打开)
./yolov8 yolov8s.engine
- 说明1:
可使用CUDA自带命令来分析程序各子模块的耗时:
nvprof ./yolov8 yolov8l.engine data/bus.jpg
yolov8+deesort 的Tensorrt 部署
下载代码:
转engine
./trtexec --onnx=/home/diyun/work/c++_project/yolov8_deepsort_tensorrt8_cpp/yolov8-deepsort-tensorrt-cpp/weights/yolov8s.onnx --saveEngine=/home/diyun/work/c++_project/yolov8_deepsort_tensorrt8_cpp/yolov8-deepsort-tensorrt-cpp/weights/yolov8s.engine --fp16
可能出现的错误:
1、fatal error: Eigen/Core: 没有那个文件或目录
fatal error: Eigen/Core: 没有那个文件或目录
28 | #include <Eigen/Core>
安装即可:
sudo apt-get install libeigen3-dev