在TensorRT的官方安装教程中,提供了多种方式来安装TensorRT。今天介绍使用tar File在Ubuntu18.04上的安装方式,具体步骤如下:
3. 安装tar文件,将TensorRT的tar文件解压,具体如图一所示:
其中include和lib目录下的文件是开发中需要用到的头文件和动态库,极为重要。至此,基于tar包安装TensorRT的过程结束,下面搭建开发环境来使用TensorRT。
应用TensorRT的数据结构和API,构建相应的功能,并打包成动态库,包含两部分:源代码+Makefile文件编写。
该文的主要目的是介绍如何搭建TensorRT的开发环境,因此源代码的功能特别简单。代码的功能是使用opencv读取图像,TensorRT的DimsHW数据结构表示图像的宽高。
#ifndef _TEST_SHARED_H_
#define _TEST_SHARED_H_
#include
#include
#include
#include
using namespace std;
using namespace cv;
Mat read_data(string& image_path);
#endif
#include "testshared.h"
#include "NvInfer.h" // DimsHw
using namespace nvinfer1;
Mat read_data(string& image_path)
{
Mat data = imread(image_path);
DimsHW dim(data.cols, data.rows);
cout << "shared " << "height: " << dim.h() << " widht: " << dim.w() << endl;
return data;
}
TARGET_DEVICE = $(shell gcc -dumpmachine | cut -f1 -d -)
ifeq ($(TARGET_DEVICE),aarch64)
CFLAGS:= -DPLATFORM_TEGRA
endif
CUDA_VER?=10.2
ifeq ($(CUDA_VER),)
$(error "CUDA_VER is not set")
endif
CC:= g++
NVCC:=/usr/local/cuda-$(CUDA_VER)/bin/nvcc
# -Wall 生成所有警告信息
# -w 不生成任何警告信息
# -std 确定编译语言的标准
# -shared 生成共享目标文件,通常用于构建共享库时
# -fPIC 编译器输出位置无关的目标文件
# compile options
CFLAGS:= -Wall -std=c++11 -shared -fPIC -Wno-error=deprecated-declarations
# opencv
CFLAGS += -I/usr/include/opencv4/ -I/usr/include/opencv4/opencv2
# cuda
CFLAGS += -I/usr/local/cuda-$(CUDA_VER)/include
# TensorRT
TRT_ROOT?=
CFLAGS += -I$(TRT_ROOT)/include
# cuda
LIBS := -L/usr/local/cuda-$(CUDA_VER)/lib64 -lcudart -lcublas -lstdc++fs
# opencv
LIBS += -L/usr/lib/aarch64-linux-gnu/ -lopencv_core -lopencv_imgcodecs
# tensorrt
LIBS += -L$(TRT_ROOT)/lib -lnvinfer
# linking options
LFLAGS:= -shared -Wl,--start-group $(LIBS) -Wl,--end-group
# header files
INCS:= $(wildcard *.h)
# cpp files
SRCFILES:= testshared.cpp
TARGET_OBJS:= $(SRCFILES:.cpp=.o)
TARGET_OBJS:= $(TARGET_OBJS:.cu=.o)
# for dynamic
TARGET := libshared.so
CUDA_VER?=10.2
ifeq ($(CUDA_VER),)
$(error "CUDA_VER is not set")
endif
CC:= g++
NVCC:=/usr/local/cuda-$(CUDA_VER)/bin/nvcc
# NVDS_VERSION:=6.0
# -Wall 生成所有警告信息
# -w 不生成任何警告信息
# -std 确定编译语言的标准
# -shared 生成共享目标文件,通常用于构建共享库时
# -fPIC 编译器输出位置无关的目标文件
# compile options
CFLAGS:= -Wall -std=c++11 -shared -fPIC -Wno-error=deprecated-declarations
# opencv
CFLAGS += -I/usr/include/opencv4/ -I/usr/include/opencv4/opencv2
CFLAGS += -I/opt/nvidia/deepstream/deepstream-$(NVDS_VERSION)/sources/includes \
-I/usr/local/cuda-$(CUDA_VER)/include
LIBS:= -L/usr/local/cuda-$(CUDA_VER)/lib64 -lcudart -lcublas -lstdc++fs -L/usr/lib/aarch64-linux-gnu/ -lopencv_core -lopencv_imgcodecs
# linking options
# LFLAGS:= -shared -Wl,--start-group $(LIBS) -Wl,--end-group
LFLAGS:= -shared -Wl,--start-group $(LIBS) -Wl,--end-group
INCS:= $(wildcard *.h)
# SRCFILES:= nvdsparsebbox_Yolov5.cpp \
# yololayer.cu
SRCFILES:= testshared.cpp
# target for shared lib
# TARGET_LIB:= libnvdsinfer_custom_impl_Yolo.so
# target for
TARGET := libshared.so
TARGET_OBJS:= $(SRCFILES:.cpp=.o)
TARGET_OBJS:= $(TARGET_OBJS:.cu=.o)
# all: $(TARGET_LIB)
all: $(TARGET)
# compile
%.o: %.cpp $(INCS) Makefile
$(CC) -c -o $@ $(CFLAGS) $<
%.o: %.cu $(INCS) Makefile
$(NVCC) -c -o $@ --compiler-options '-fPIC' $<
# linking
# $(TARGET_LIB) : $(TARGET_OBJS)
$(TARGET) : $(TARGET_OBJS)
$(CC) -o $@ $(TARGET_OBJS) $(LFLAGS)
clean:
rm -rf $(TARGET)
rm -rf $(TARGET_OBJS)
make
即可在当前运行的目录下生成libshared.so文件,后续会用到。
静态链接库的功能是:将传入的Mat数据另存为图像。
#ifndef _TEST_STATIC_H_
#define _TEST_STATIC_H_
#include
#include
#include
#include
// #include
using namespace std;
using namespace cv;
bool write_data(Mat image, string dst_path);
#endif
#include "teststatic.h"
#include "NvInfer.h"
using namespace nvinfer1;
bool write_data(Mat image, string dst_path)
{
DimsHW dim(image.cols, image.rows);
cout << "static " << "height: " << dim.h() << " widht: " << dim.w() << endl;
bool flag = imwrite(dst_path, image);
return flag;
}
与1.2类似,两者之前的区别如下:
$(TARGET) : $(TARGET_OBJS)
$(AR) -cr $@ $(TARGET_OBJS) $^
TARGET := libstatic.a
AR = ar
CUDA_VER?=10.2
ifeq ($(CUDA_VER),)
$(error "CUDA_VER is not set")
endif
CC:= g++
NVCC:=/usr/local/cuda-$(CUDA_VER)/bin/nvcc
# NVDS_VERSION:=6.0
# -Wall 生成所有警告信息
# -w 不生成任何警告信息
# -std 确定编译语言的标准
# -shared 生成共享目标文件,通常用于构建共享库时
# -fPIC 编译器输出位置无关的目标文件
# compile options
CFLAGS:= -Wall -std=c++11 -shared -fPIC -Wno-error=deprecated-declarations
# opencv
CFLAGS += -I/usr/include/opencv4/ -I/usr/include/opencv4/opencv2
# CFLAGS+= -I/opt/nvidia/deepstream/deepstream-$(NVDS_VERSION)/sources/includes \
# -I/usr/local/cuda-$(CUDA_VER)/include
LIBS:= -L/usr/local/cuda-$(CUDA_VER)/lib64 -lcudart -lcublas -lstdc++fs -L/usr/lib/aarch64-linux-gnu/ -lopencv_core -lopencv_imgcodecs
# linking options
# LFLAGS:= -shared -Wl,--start-group $(LIBS) -Wl,--end-group
# LFLAGS:= -Wl,--start-group $(LIBS) -Wl,--end-group
INCS:= $(wildcard *.h)
# SRCFILES:= nvdsparsebbox_Yolov5.cpp \
# yololayer.cu
SRCFILES:= teststatic.cpp
# target for shared lib
# TARGET_LIB:= libnvdsinfer_custom_impl_Yolo.so
# target for
TARGET := libstatic.a
AR = ar
TARGET_OBJS:= $(SRCFILES:.cpp=.o)
TARGET_OBJS:= $(TARGET_OBJS:.cu=.o)
# all: $(TARGET_LIB)
all: $(TARGET)
# compile
%.o: %.cpp $(INCS) Makefile
$(CC) -c -o $@ $(CFLAGS) $<
%.o: %.cu $(INCS) Makefile
$(NVCC) -c -o $@ --compiler-options '-fPIC' $<
# linking
# $(TARGET_LIB) : $(TARGET_OBJS)
$(TARGET) : $(TARGET_OBJS)
$(AR) -cr $@ $(TARGET_OBJS) $^
clean:
rm -rf $(TARGET)
rm -rf $(TARGET_OBJS)
运行make命令,得到libstatics.a静态库文件。
该代码功能是调用libshared.so和libstatic.a文件,对图像进行读写,并打印图像的宽高。
#include
#include "testshared.h"
#include "teststatic.h"
#include
#include
#include "NvInfer.h"
using namespace std;
using namespace cv;
using namespace nvinfer1;
int main(int argc, char* argv[])
{
if(argc < 3)
{
cout << "./main [input path] [output path]. " << endl;
return -1;
}
string input_path(argv[1]);
Mat image = read_data(input_path);
// Mat image = imread(input_path);
DimsHW dim(image.cols, image.rows);
cout << "height: " << dim.h() << " widht: " << dim.w() << endl;
string output_path(argv[2]);
if(write_data(image, output_path))
{
cout << "write image Done." << endl;
}
return 0;
}
与上述两个Makefile文件的区别:
LIBS += -L./shared -lshared ./static/libstatic.a -Wl,-rpath=./shared
LFLAGS:= -Wl,--start-group $(LIBS) -Wl,--end-group
TARGET := main
CUDA_VER?=10.2
ifeq ($(CUDA_VER),)
$(error "CUDA_VER is not set")
endif
# 编译器选择
CC:= g++
NVCC:=/usr/local/cuda-$(CUDA_VER)/bin/nvcc
# NVDS_VERSION:=6.0
# -Wall 生成所有警告信息
# -w 不生成任何警告信息
# -std 确定编译语言的标准
# -shared 生成共享目标文件,通常用于构建共享库时
# -fPIC 编译器输出位置无关的目标文件
# compile options
CFLAGS:= -Wall -std=c++11 -fPIC -Wno-error=deprecated-declarations
# CFLAGS+= -I/opt/nvidia/deepstream/deepstream-$(NVDS_VERSION)/sources/includes \
# -I/usr/local/cuda-$(CUDA_VER)/include
# header path
CFLAGS += -I./shared -I./static -I/usr/include/opencv4/ -I/usr/include/opencv4/opencv2 -I/usr/include/aarch64-linux-gnu
# library path
LIBS:= -lnvinfer_plugin -lnvinfer -lnvparsers -L/usr/local/cuda-$(CUDA_VER)/lib64 -lcudart -lcublas -lstdc++fs
LIBS += -L/usr/lib/aarch64-linux-gnu/ -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_imgcodecs
LIBS += -L./shared -lshared ./static/libstatic.a -Wl,-rpath=./shared
# linking options
# LFLAGS:= -shared -Wl,--start-group $(LIBS) -Wl,--end-group
LFLAGS:= -Wl,--start-group $(LIBS) -Wl,--end-group
INCS:= $(wildcard *.h)
# SRCFILES:= nvdsparsebbox_Yolov5.cpp \
# yololayer.cu
SRCFILES:= main.cpp
# target for shared lib
# TARGET_LIB:= libnvdsinfer_custom_impl_Yolo.so
# target for
TARGET := main
TARGET_OBJS:= $(SRCFILES:.cpp=.o)
TARGET_OBJS:= $(TARGET_OBJS:.cu=.o)
# all: $(TARGET_LIB)
all: $(TARGET)
# compile
%.o: %.cpp $(INCS) Makefile
$(CC) -c -o $@ $(CFLAGS) $<
%.o: %.cu $(INCS) Makefile
$(NVCC) -c -o $@ --compiler-options '-fPIC' $<
# linking
# $(TARGET_LIB) : $(TARGET_OBJS)
$(TARGET) : $(TARGET_OBJS)
$(CC) -o $@ $(TARGET_OBJS) $(LFLAGS)
clean:
rm -rf $(TARGET)
rm -rf $(TARGET_OBJS)
make
./main input.jpg out.jpg
# output
# shared height: 1920 widht: 1080
# main height: 1920 widht: 1080
# static height: 1920 widht: 1080
# write image Done.
input.jpg为输入图像文件名,out.jpg为输出图像文件名。