ARM NX上使用TensorRT进行YOLOV5部署(包括tensorRT_PRO库环境配置+yolov5+推理部署)

环境配置

本文主要在下述文章配置的环境基础上进一步进行相关的环境配置,完成模型的部署推理。
【详细|ARM NX】优雅的配置ego-planner到arm架构的Jetson Orin-NX机载电脑上(opencv3.4.18-cuda11.4+VINS-Fusion-GPU)_jetson ego planner-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_44408364/article/details/136764631?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171383904516800186592930%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171383904516800186592930&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-136764631-null-null.142%5Ev100%5Econtrol&utm_term=ARM%20%20NX&spm=1018.2226.3001.4187

1、检查cuda、cudnn、opencv等环境

若按照上述文章,安装了相关环境,则直接运行下述命令

jetson_release

 会出现如下截图

 若未安装相关环境,需要按照上述文章环境配置中的前三部分进行配置。

2、TensorRT安装

在下述连接中找到与CUDA、Ubuntu以及电脑架构相匹配的版本进行下载,我选择为8.5.2

NVIDIA TensorRT 8.x Download | NVIDIA Developer

下载好之后,输入下述命令进行安装:

sudo dpkg -i nv-tensorrt-(自己下载的包名)
sudo apt-get install tensorrt

使用jetop查看环境,

jetson_release

显示如下图

3、protobuf安装

参考Ubuntu20.04部署YOLOv5_ubuntu20.04 yolov5-CSDN博客

后续tensorRT需要protobuf,故需要进行安装编译特定版本的 protobuf-3.11.4,过程与上述链接类似

下载:

 在baidu-pan中下载安装包

解压:
cd ~/Download
unzip protobuf-3.11.4.zip
修改CMakeLists.txt

后期如果想要使用tensorRT_PRO的python接口,需要修改CMakeLists.txt,才能使后续编译通过。

cd ~/Downloads/protobuf-3.11.4/cmake/
gedit CMakeLists.txt 

## 在CMakeLists.txt中的30行之后加入下面两句
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
编译:
cd protobuf-3.11.4/cmake
cmake . -Dprotobuf_BUILD_TESTS=OFF
cmake --build .
安装:
##在home 目录下创建文件夹并安装,方便后续引用
mkdir protobuf
make install DESTDIR=/home/amov/protobuf  //此处为自己电脑的地址

需要将编译好的 home/protobuf/user/local 下的 bin、include、lib 文件夹复制/到 home/protobuf 当前文件夹下,如下图

之后,protobuf 文件夹结构如下

yolov5配置

1、conda安装

参考https://www.cnblogs.com/caozewen/p/14462588.html  

由于配置的板卡为ARM架构,所以安装Archiconda3

首先,下载Archiconda3,在下方连接进行下载

https://github.com/Archiconda/build-tools/releases/download/0.2.2/Archiconda3-0.2.2-Linux-aarch64.sh

之后,运行下述命令进行安装,

 bash Archiconda3-0.2.2-Linux-aarch64.sh

 安装完成后,可以看到home文件夹下有Archiconda3文件夹

将 conda 配置到 ~/.bashrc 中

sudo gedit ~/.bashrc
##在末尾加入
export PATH=$PATH:/home/amov/archiconda3/bin

2、下载并配置yolov5

本次使用v7.0版本 

git clone -b v7.0 https://github.com/ultralytics/yolov5.git

下载之后,配置相关的运行环境

## 此处我配置的是python3.8版本,环境名称为yolo
conda create -n your_env_name python=x.x
conda create -n yolo python=3.8

## 激活环境,由于conda写入了bashrc,所以用source进行激活
source activate yolo (or your_env_name)

## 配置yolo
pip install -r requirements.txt  

进行 yolo 的检测运行

cd yolov5
python detect.py --weights yolov5s.pt 

如果运行成功,则在runs/detect/exp中看到运行的结果图,则yolov5配置完成

 如果想训练自己的模型,则可以参考文章Ubuntu20.04部署YOLOv5_ubuntu20.04 yolov5-CSDN博客

3、 模型导出

需要导出ONNX模型,进行TensorRT加速推理,为了减少推理错误,我们对 yolo 进行修改,实现动态宽高,之后导出ONNX

# yolov5-7.0/models/yolo.py第60行,forward函数
# bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
# x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
# 修改为:

bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
bs = -1
ny = int(ny)
nx = int(nx)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

# yolov5-7.0/export.py第141行
# output_names = ['output0', 'output1'] if isinstance(model, SegmentationModel) else ['output0']
# if dynamic:
#     dynamic = {'images': {0: 'batch', 2: 'height', 3: 'width'}}  # shape(1,3,640,640)
#     if isinstance(model, SegmentationModel):
#         dynamic['output0'] = {0: 'batch', 1: 'anchors'}  # shape(1,25200,85)
#         dynamic['output1'] = {0: 'batch', 2: 'mask_height', 3: 'mask_width'}  # shape(1,32,160,160)
#         elif isinstance(model, DetectionModel):
#             dynamic['output0'] = {0: 'batch', 1: 'anchors'}  # shape(1,25200,85)
output_names = ['output0', 'output1'] if isinstance(model, SegmentationModel) else ['output']
if dynamic:
    dynamic = {'images': {0: 'batch'}}  # shape(1,3,640,640)
    if isinstance(model, SegmentationModel):
        dynamic['output0'] = {0: 'batch', 1: 'anchors'}  # shape(1,25200,85)
        dynamic['output1'] = {0: 'batch', 2: 'mask_height', 3: 'mask_width'}  # shape(1,32,160,160)
    elif isinstance(model, DetectionModel):
        dynamic['output'] = {0: 'batch'}  # shape(1,25200,85)

之后,运行下述命令完成模型导出

cd yolov5-7.0
python export.py --weights=./yolov5s.pt --dynamic --include=onnx --opset=11

 tensorRT_PRO配置

1、tensorRT_PRO下载

 git clone https://github.com/shouxieai/tensorRT_Pro.git

2、修改CMakeLists.txt

根据自己电脑的配置,进行路径的修改,如果和我的配置一致,则直接按照下述修改

# 如果要支持python则设置python路径
set(HAS_PYTHON ON)
set(PythonRoot "/home/amov/archiconda3/envs/yolo")
set(PythonName "python3.8")

# 如果你是不同显卡,请设置为显卡对应的号码参考这里:https://developer.nvidia.com/zh-cn/cuda-gpus#compute
set(CUDA_GEN_CODE "-gencode=arch=compute_87,code=sm_87")

# 如果你的opencv找不到,可以自己指定目录
set(OpenCV_DIR   "/home/amov/Downloads/opencv-3.4.18")

set(CUDA_TOOLKIT_ROOT_DIR     "/usr/local/cuda")
set(CUDNN_DIR    "/usr/include/")
set(TENSORRT_DIR "/usr/src/tensorrt")

3、源码修改

YOLO模型的推理代码主要在 src/application/app_yolo.cpp 文件中,需要推理的图片放在 workspace/inference 文件夹中,将上述修改后导出的 ONNX 文件放在 workspace 文件夹下。源码修改较简单主要有以下几点:

打开  src/application/app_yolo.cpp 

//test(Yolo::Type::V7, TRT::Mode::FP32, "yolov7");   //修改1 注释177行
test(Yolo::Type::V5, TRT::Mode::FP32, "yolov5s");    //修改2 取消注释178行

4、编译

cd tensorRT_PRO
source activate yolo  //需要编译python接口,就需要进入yolo环境;否则不用
mkdir build && cd build
cmake ..
make -j16

由于我是8核CPU,所以-j16,以CPU数量两倍为优,参考自make -j参数简介

python 接口安装

make pyinstall -j8

 5、模型构建推理

cd workspace  // 进入可执行文件目录下
./pro yolo	  // 构建模型并推理 

如下图所示则推理完成

在 workspace/inference 。

6、python接口调用

workspace/python_test.ipynb 脚本是关于python接口调用的示例,运行过程中会报如下错误,这是因为libffi的版本不一致问题

参考下述链接完成相关修改Conda虚拟环境下libp11-kit.so.0: undefined symbol: ffi_type_pointer...问题解决_importerror: /lib/x86_64-linux-gnu/libp11-kit.so.0-CSDN博客

ImportError: /lib/aarch64-linux-gnu/libgobject-2.0.so.0: undefined symbol: ffi_type_uint32, version LIBFFI_BASE_7.0 

运行如下命令,可以看到libffi.so.7链接到的是libffi.so.8,链接出现错误

cd archiconda3/envs/yolo/lib
ls -l |grep libffi

此时将libffi.so.7重命名备份,并运行下述命令,即可完成修改

sudo ln -s /lib/aarch64-linux-gnu/libffi.so.7.1.0 libffi.so.7
sudo ldconfig

正常情况应如下图所示: 

 此时,就可以运行python接口了。

参考

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值