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接口了。

参考

<think>好的,我需要帮助用户了解如何在机械臂中集成YOLOv5。首先,我应该回顾用户提供的引用内容。根据引用[2],YOLOv5被用于农业机器人系统,结合了物体检测和机械臂控制,特别是用于幼苗或种物的拾取。这说明YOLOv5在机械臂应用中的主要作用是目标检测,然后将检测结果传递给控制系统来操作机械臂。 接下来,我需要整理出集成YOLOv5到机械臂的基本步骤。通常这样的系统包括硬件部分和软件部分。硬件方面需要摄像头、机械臂以及控制单元如树莓派或工控机。软件方面需要YOLOv5的模型训练、与机械臂的通信接口,以及控制算法的开发。 用户可能想知道具体的实现步骤,比如如何训练模型、如何将检测结果转换为机械臂的动作指令。引用中提到使用CMUSphinx进行语音识别,但用户的问题主要集中在YOLOv5和机械臂的集成,所以可以暂时忽略语音部分,专注于检测与控制。 另外,用户提供的引用[1]比较了YOLOv5YOLOv8的性能,指出YOLOv5在复杂对象类别上表现更好,这可能对用户选择模型有帮助。所以在回答中应该提到YOLOv5的优势,比如成熟的架构和优化,适合机械臂需要高精度的场景。 还需要考虑实际应用中的问题,比如实时性要求。机械臂操作需要快速响应,因此模型推理速度很重要。可能需要优化YOLOv5的模型大小,比如使用较小的版本(如YOLOv5s),或者使用TensorRT加速。 然后,我应该列举具体的集成步骤,从环境配置到模型训练,再到通信和控制。同时,用户可能需要示例代码或流程图,但根据系统级指令,代码需要正确使用LaTeX格式,并且行内公式用$...$,独立公式用$$...$$。不过用户的问题可能不需要太多数学公式,但如果有涉及坐标转换,可能需要用到。 最后,生成相关问题,帮助用户深入探讨,比如硬件选型、实时性优化、坐标转换方法等。确保回答结构清晰,分步骤说明,并引用提供的资料来支持观点,比如引用[2]中的农业机器人案例。</think>### 如何在机械臂中集成YOLOv5 #### 1. **系统架构设计** 机械臂与YOLOv5的集成方案通常包含以下核心模块: - **视觉模块**:摄像头(RGB/深度)实时采集图像,YOLOv5进行目标检测与定位 - **控制模块**:将检测结果转换为机械臂坐标系下的运动指令 - **通信接口**:ROS(机器人操作系统)或TCP/UDP协议实现模块间通信 - **执行机构**:机械臂本体+末端执行器(夹爪/吸盘等) 引用案例中,农业机器人通过YOLOv5识别幼苗后,通过机械臂运动学算法计算抓取轨迹[^2]。 #### 2. **关键技术实现步骤** **步骤1:环境配置** ```python # 安装YOLOv5依赖 git clone https://github.com/ultralytics/yolov5 pip install -r yolov5/requirements.txt ``` **步骤2:模型训练与优化** - 使用机械臂工作场景的定制数据集(建议2000+标注样本) - 调整锚框参数适应目标物体尺寸 - 输出检测结果的坐标格式应为:$(x_{center}, y_{center}, width, height)$ **步骤3:坐标转换** 通过透视变换将图像坐标系转换为机械臂基坐标系: $$ \begin{bmatrix} X_{arm} \\ Y_{arm} \\ 1 \end{bmatrix} = H \cdot \begin{bmatrix} x_{pixel} \\ y_{pixel} \\ 1 \end{bmatrix} $$ 其中$H$为通过标定获得的单应性矩阵 **步骤4:运动控制** ```python # 伪代码示例:检测到目标后生成运动指令 if detect_objects: target_pos = coordinate_transformation(detection_result) robotic_arm.move_to(target_pos) end_effector.grab() ``` #### 3. **硬件选型建议** | 组件 | 推荐配置 | 功能要求 | |-------|---------|---------| | 摄像头 | Intel Realsense D435i | 支持RGB-D数据采集 | | 控制板 | NVIDIA Jetson Xavier NX | 边缘计算+ROS支持 | | 机械臂 | UR3e/Dobot Magician | 高精度协作型机械臂 | #### 4. **性能优化策略** - 使用TensorRT加速推理(提升3-5倍FPS) - 采用多线程架构:分离图像采集、推理计算、运动控制线程 - 实施模型剪枝:通过`python prune.py --model yolov5s.pt --prune 0.3`压缩模型体积
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值