介绍
本篇文章将介绍如何把Yolov5和Alphapose进行Tensorrt部署
环境
Ubuntu18
Cuda11.1
Cudnn8.0
Tensorrt7.2.2
此三者安装可参考我的其他文章
Alphapose中的Fast pose的模型部署
git clone https://github.com/oreo-lp/AlphaPose_TRT.git
如果已经安装原版的Alphapose库需要pip卸载
按照readme的教程安装好alphapose库
git clone https://github.com/NVIDIA/trt-samples-for-hackathon-cn.git
把该库下的plugins文件夹和Makefile文件都放到AlphaPose_TRT的目录下
在AlphaPose_TRT目录下运行make
对build目录下的Makefile做修改,参考如下
请注意tensorrt的路径和GENCODE要根据情况而定
SHELL=/bin/bash
CUDA_PATH = /usr/local/cuda
TRT_PATH = /home/leo/TensorRT-7.2.2.3
GENCODE = -gencode arch=compute_61,code=sm_61
GCC = g++
NVCC = $(CUDA_PATH)/bin/nvcc
CCFLAGS = -g -DNDEBUG -std=c++17
INCLUDES := -I../include -isystem $(CUDA_PATH)/include -isystem $(TRT_PATH)/include
LDFLAGS := -L$(CUDA_PATH)/lib64 -L$(TRT_PATH)/lib -Wl,-rpath=$(CUDA_PATH)/lib64
LDFLAGS += -lnvinfer -lnvonnxparser -lcudart -ldl -lpthread -lcuda
OBJ_DIR = obj
OBJ = $(shell find $(OBJ_DIR) -name *.o 2>/dev/null)
DEP = $(OBJ:.o=.d)
SO = AddPlugin.so GridSamplerPlugin.so ScatterND.so GatherND.so OnehotPlugin.so
all: $(SO)
AddPlugin.so: $(addprefix $(OBJ_DIR)/, AddPlugin.o)
GridSamplerPlugin.so: $(addprefix $(OBJ_DIR)/, GridSamplerPlugin.o)
ScatterND.so: $(addprefix $(OBJ_DIR)/, ScatterND.o)
GatherND.so: $(addprefix $(OBJ_DIR)/, GatherND.o)
-include $(DEP)
clean:
rm -rf $(BIN) $(SO) $(DEP) $(OBJ_DIR) out.trt int8_cache.*
rm -rf ../python/resnet50.{onnx,trt} ../python/resnet50.dynamic_shape.{onnx,trt} ../python/{custom.onnx,custom_surgeon.onnx} ../python/out.trt ../python/__pycache__
VPATH = ../include:../samples:../plugins
$(OBJ_DIR)/%.o: %.cpp
@mkdir -p $(@D)
$(GCC) $(CCFLAGS) -fPIC -MD -MP $(INCLUDES) -o $@ -c $<
$(OBJ_DIR)/%.o: %.cu
@mkdir -p $(@D)
$(NVCC) $(CCFLAGS) -M -MT $@ $(INCLUDES) -o $(@:.o=.d) $<
$(NVCC) $(CCFLAGS) $(INCLUDES) -Xcompiler -fPIC $(GENCODE) -o $@ -c $<
$(SO):
$(GCC) $(CCFLAGS) -shared -o $@ $+ $(LDFLAGS)
$(BIN):
$(GCC) $(CCFLAGS) -o $@ $+ $(LDFLAGS)
$(CUDA_BIN):
$(NVCC) $(NVCCFLAGS) -o $@ $+ $(LDFLAGS)
在ALphapose_TRT的目录下make一下,会在build下生成plugins的链接库
参考README中FastPose(PyTorch) to engine 的部分进行模型转换操作,而YOLOV3的部分可以跳过,因为本文将使用YOLOV5s
YOLOV5的TRT部署
首先需要跑通YOLOV54.0的官方库
主要参考https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5下的教程进行部署
tensorrtx/yolov5目录下的CMakeLists.txt参考如下进行修改,注意Tensorrt路径的设置
cmake_minimum_required(VERSION 2.6)
project(yolov5)
add_definitions(-std=c++11)
option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
find_package(CUDA REQUIRED)
include_directories(${PROJECT_SOURCE_DIR}/include)
# include and link dirs of cuda and tensorrt, you need adapt them if yours are different
# cuda
include_directories(/usr/local/cuda/include)
link_directories(/usr/local/cuda/lib64)
# tensorrt
include_directories(/usr/include/x86_64-linux-gnu/)
include_directories(/home/leo/TensorRT-7.2.2.3/include/)
link_directories(/usr/lib/x86_64-linux-gnu/)
link_directories(/home/leo/TensorRT-7.2.2.3/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)
find_package(OpenCV)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp)
# 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)