环境配置
1、检查cuda、cudnn、opencv等环境
若按照上述文章,安装了相关环境,则直接运行下述命令
jetson_release
会出现如下截图
若未安装相关环境,需要按照上述文章环境配置中的前三部分进行配置。
2、TensorRT安装
在下述连接中找到与CUDA、Ubuntu以及电脑架构相匹配的版本进行下载,我选择为8.5.2
下载好之后,输入下述命令进行安装:
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安装
由于配置的板卡为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的版本不一致问题
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接口了。