TensorRT开发环境搭建

0. 安装TensorRT

在TensorRT的官方安装教程中,提供了多种方式来安装TensorRT。今天介绍使用tar FileUbuntu18.04上的安装方式,具体步骤如下:

  1.  检查主机的环境,具体参考链接
  2. 下载TensorRT的tar文件

    3.   安装tar文件,将TensorRT的tar文件解压,具体如图一所示:

图一 TensorRT的文件结构

 其中include和lib目录下的文件是开发中需要用到的头文件和动态库,极为重要。至此,基于tar包安装TensorRT的过程结束,下面搭建开发环境来使用TensorRT。

1.  生成动态库

应用TensorRT的数据结构和API,构建相应的功能,并打包成动态库,包含两部分:源代码+Makefile文件编写。

1.1 源代码

该文的主要目的是介绍如何搭建TensorRT的开发环境,因此源代码的功能特别简单。代码的功能是使用opencv读取图像,TensorRT的DimsHW数据结构表示图像的宽高。

  • testshared.h
#ifndef _TEST_SHARED_H_
#define _TEST_SHARED_H_
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>

using namespace std;
using namespace cv;

Mat read_data(string& image_path);

#endif
  • testshared.cpp
#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;
} 

1.2 编写Makefile文件

  • arm和x86平台判断
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

Makefile整体内容

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文件,后续会用到。

2. 生成静态链接库

静态链接库的功能是:将传入的Mat数据另存为图像。

2.1 源代码

  • teststatic.h
#ifndef _TEST_STATIC_H_
#define _TEST_STATIC_H_


#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>
// #include <opencv2/core.hpp>

using namespace std;
using namespace cv;

bool write_data(Mat image, string dst_path);

#endif
  • teststatic.cpp
#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;
}

2.2 Makefile文件编写

与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静态库文件。

3. 生成可执行文件

该代码功能是调用libshared.so和libstatic.a文件,对图像进行读写,并打印图像的宽高。

 3.1 源代码

#include <iostream>

#include "testshared.h"
#include "teststatic.h"

#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>

#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;
}

3.2 Makefile文件

与上述两个Makefile文件的区别:

  • 链接shared和static库
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为输出图像文件名。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值