C++版本:最新Yolov5-Tensorrt-Clion-Ubuntu 包含全部代码

之前的博客中点我,介绍了笔者目前实现的一个Yolov5的推理加速,当时是展示性质的介绍,这里我会把详细的步骤一一介绍给大家,让大家都能亲自复现效果。

首先,介绍一下相关的环境:


  1. OS:Ubuntu16.04 (18.04未测试)
  2. CPU:Intel Gold [email protected] x 24
  3. GPU: GTX 1080Ti
  4. Cuda:10.1
  5. OpenCV:3.4.12
  6. C++实现【重要】
  7. IDE:Clion
  8. TensorRT:6.0.1.5(可用TensorRT-6或者是TensorRT-7,不可用5)

以上是笔者的环境,Ubuntu16.04C++实现。 

接着:介绍一下成果:

在Ubuntu16.04下,实现了C++版本的Yolov5的trt加速,并在Clion中完美运行。

【代码整理中,稍后会上传,大家耐心等待】

下载:CSDN免费

先说下流程:我们会下载2个repo和1个模型文件yolov5s.pt,然后利用repo里面的脚本先将yolov5s.pt->yolov5s.wts。接着编译工程。

用编译后的可执行文件生成yolov5.engine,最后用该engine进行推理。

好,下面进入正文环节:

1. repo-1:yolov5

最近有人实现了Yolov5检测算法,虽然没有得到官方的认证,但是笔者测试时发现,效果非常惊艳,所以准备入坑。

一键直达:yolov5

下载(准备白嫖)

看的出来,作者已经在移动设备上部署了。

有的人可能马上要问了,这不是C++的呀,这是python啊...

年轻人,别这么猴急,前戏要做足了....

为了重点突出,这里我们不自己训练模型了,就直接使用Yolov5 repo中提供的模型。

一键直达:yolov5s.pt

2:repo-2:tensorrt模型优化

一键直达:tensorrt

下载(准备白嫖)

TensorRTx aims to implement popular deep learning networks with tensorrt network definition APIs. As we know, tensorrt has builtin parsers, including caffeparser, uffparser, onnxparser, etc. But when we use these parsers, we often run into some "unsupported operations or layers" problems, especially some state-of-the-art models are using new type of layers.

So why don't we just skip all parsers? We just use TensorRT network definition APIs to build the whole network, it's not so complicated.

上面的摘要非常好,所以我搬运到了这里。大意是介绍了TensorRT以及使用API进行模型转换。

因为作者做了很多的工作,所以整个repo看起来很是复杂,不过不用怕,笔者已经理清了,跟着笔者一步步走即可。

3:模型转换

3.1: [yolov5s.pt -> yolov5s.wts]

git clone -b v5.0 https://github.com/ultralytics/yolov5.git
git clone https://github.com/wang-xinyu/tensorrtx.git
// download https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt
cp {tensorrtx}/yolov5/gen_wts.py {ultralytics}/yolov5
cd {ultralytics}/yolov5
python gen_wts.py yolov5s.pt
// a file 'yolov5s.wts' will be generated.

我来简单介绍下:下载上文链接中的yolov5tensorrt,以及原始的模型文件yolov5s.pt

然后将tensorrt中的gen_wts.py拷贝到yolov5中,然后运行:

python gen_wts.py yolov5s.pt

这样就完成了第一步:yolov5s.pt得到了yolov5s.wts

我们知道,yolov5s.pt是pytorch的模型文件,这个yolov5s.wts是什么呢?

可以看下这里的介绍:.wts文件解读

以上的操作你可以选择在终端中,也可以选择在IDE中,我就是在pycharm中操作的:

3.2: yolov5s.wts->yolov5.engine (这部是关键,步骤较多,略微复杂)

但是我们最终想得到的,其实是.engine,所以继续往下操作

cd {tensorrtx}/yolov5/
// update CLASS_NUM in yololayer.h if your model is trained on custom dataset
mkdir build
cd build
cp {ultralytics}/yolov5/yolov5s.wts {tensorrtx}/yolov5/build
cmake ..
make
// For example yolov5s
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s
sudo ./yolov5 -d yolov5s.engine ../samples

注意:我们的所有的操作,都是基于yolov5repo提供的yolov5s.pt模型,这里我们暂时不涉及自己训练模型。所以脚本中不需要修改。

然后我们在tensorrt/yolov5路径下新建build文件夹(存放编译结果)

然后将之前生成的yolov5s.wts拷贝至build中:

即:

/home/ll/tensorrtx-master/yolov5/build/yolov5s.wts

然后执行

cmake ..

多说一句,好多人只是机械的按照步骤操作,但是不明白其中的含义。其实这里的cmake就是检查一下配置的环境对不对,之所以要加上".."2个点,其实是cmake要操作的CMakeLists.txt文件在上一级目录中:

即:

/home/ll/tensorrtx-master/yolov5/CMakeLists.txt

当然一般这个时候会报错的,因为repo作者的电脑环境和你的是有差别的,3rd库的路径也不尽相同。为了方便大家,我把自己修改可用的文件列在这里,并加上注释。

cmake_minimum_required(VERSION 2.6)

project(yolov5)

add_definitions(-std=c++11) #支持c++11

option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)

find_package(CUDA REQUIRED)# 寻找cuda

include_directories(${PROJECT_SOURCE_DIR}/include)

# cuda路径,一般cuda默认安装的话,都是在这里的,我这里是cuda10.1
include_directories(/usr/local/cuda/include)
link_directories(/usr/local/cuda/lib64)

# tensorrt(deb方式安装)选这个
# include_directories(/usr/include/x86_64-linux-gnu/)
# link_directories(/usr/lib/x86_64-linux-gnu/)

#tensorrt(解压方式安装)选这个
include_directories(/home/les/Softwares/TensorRT-6.0.1.5/include/)
link_directories(/home/les/Softwares/TensorRT-6.0.1.5/lib/)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -Wfatal-errors -D_MWAITXINTRIN_H_INCLUDED")

cuda_add_library(myplugins SHARED ${PROJECT_SOURCE_DIR}/yololayer.cu)
target_link_libraries(myplugins nvinfer cudart)

#opencv的路径设置有很多中,这是笔者常用的一种
set(OpenCV_INCLUDE_DIRS "/usr/local/opencv-3412-gpu-opengl/include")
set(OpenCV_LIBS "/usr/local/opencv-3412-gpu-opengl/lib/libopencv_world.so.3.4")
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(yolov5 ${PROJECT_SOURCE_DIR}/calibrator.cpp ${PROJECT_SOURCE_DIR}/yolov5.cpp)
target_link_libraries(yolov5 nvinfer)
target_link_libraries(yolov5 cudart)
target_link_libraries(yolov5 myplugins)
target_link_libraries(yolov5 ${OpenCV_LIBS})

add_definitions(-O2 -pthread)


一般就3个注意点:

  1. cuda的设置:如果没有设置软连接,路径应为:
    include_directories(/usr/local/cuda10.x/include)
    link_directories(/usr/local/cuda10.x/lib64)
  2. tensorrt的设置: tensorrt就是一个3rd库,安装的时候可以选择deb安装也可以是解压安装的方式,2种方式的路径设置上面都有
  3. opencv的路径设置:这个方法比较多,笔者习惯用指定自己编译的opencv头文件和库文件的路径的方式

路径设置对了,Cmake ..没有报错的话,下面就是make环节

这个时候,也会出现不少的问题,笔者当时也是遇到过问题,比如文件找不到等等。大家遇到问题欢迎在下面留言。

如果一切顺利,下面就可以用make生成的可执行文件生成yolov5s.engine了。

sudo ./yolov5 -s yolov5s.wts yolov5.engine s

然后我们测试下:能用且好用,才能说明work。

sudo ./yolov5 -d yolov5.engine ../samples

看样子,推理结果很完美,至此就完成了yolov5的trt加速以及C++部署。

【yolov5s.pt->yolov5s.wts->yolov5.engine->inference】

到此,仍有点意犹未尽。目前只是是通过终端运行的,代码修改和调试起来也不是很方便。所以我就又进一步,将代码整理下,在clion中运行起来。


代码改进:

  1. 程序的输入源由图片改为本地avi视频
  2. 修改数据读入方式,每次只读入1帧图片
  3. 优化代码,删除engine生成代码,只保留engine推理部分

这样就可以直接在clion中对视频进行检测,同时更换视频或者是摄像头都很方便。

感兴趣的小伙伴可以关注微信,了解更多实战代码。

猜你喜欢

转载自blog.csdn.net/opencv_yys/article/details/117350893