【yolov5系列】yolov5-onnxruntime在Ubuntu和RK芯片上运行

本文介绍如何在x64平台和移动端部署YOLOv5的ONNX模型,包括所需库的下载与安装、交叉编译器的使用、CMake配置及编译命令等关键技术步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这里yolov5的onnx模型的推理,分别在 x64上 和 移动端上运行,前者在自己本地Ubuntu系统上运行,后者在瑞芯微的rk3566上运行。
要完成如上工作我们需要一下步骤:

  • 1 下载onnxruntime编译好的库
  • 2 下载opencv库并安装
  • 3 下载交叉编译器
  • 4 下载yolov5-onnxruntime的工程并运行

1 下载onnxruntime库

github上搜索 onnxruntime,能看到微软提供的库。链接为 https://github.com/microsoft/onnxruntime
在这里插入图片描述
在这里插入图片描述

2 opencv的下载

https://opencv.org/releases/
在这里插入图片描述
opencv的编译比较容易 【OpenCV之路】ubuntu下的安装C++的opencv4、opencv_contrib、python中opencv的cuda加速、ubuntu下opencv的第一个工程 该链接下,只需要编译到【3.1 c++/opencv 的编译】章节即可。

3 交叉编译器的下载

下载链接为 gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu的下载
在这里插入图片描述
一般的,下载后解压到固定路径下,并添加到系统环境变量中即可使用。
这里只针对当前工程测试,暂不进行系统环境变量配置,下载解压即可。

4 下载yolov5的onnxruntime的工程并运行


4.1 工程下载与目录结构构建

使用的yolov5-onnxruntime的工程链接为 https://github.com/itsnine/yolov5-onnxruntime
在这里插入图片描述
创建某个路径,这里为【/home/xyy/LL_DATA/LL/YOLOV5】
解压并构建如下目录结构:

  • ├──yolov5-onnxruntime 【工程解压路径】
    ├──GCC_COMPILER
      ├── gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu 【交叉编译器解压文件】
    ├──libs
      ├── onnxruntime
        ├──onnxruntime-linux-x64-1.11.1   【库解压路径】  
        ├──onnxruntime-linux-aarch64-1.11.1 【库解压路径,用于移动端的库的编译】
      ├── opencv
        ├──opencv_x64       【编译好opencv的bin/include/lib64文件,拷贝到此】
        ├──opencv410_aarch64   【用于移动端库的编译,使用交叉编译器可编译,这里不展开介绍】

4.2 代码的修改

因为要在移动端运行,所以cv::imshow()无法使用,故将main.cpp中最后几行代码修改成如下(pc端运行时可不用修改)。
在这里插入图片描述


4.3 CMakeLists.txt 文件修改

修改【CMakeLists.txt】文件内的设置如下:

cmake_minimum_required(VERSION 3.0.0)
project(yolo_ort)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# onnxruntime api
option(ONNX_API_PATH "Path to built ONNX Runtime directory." STRING)
message(STATUS "ONNX_API_PATH: ${ONNX_API_PATH}")
# set(ONNX_API_PATH ${CMAKE_SOURCE_DIR}/../libs/onnxruntime/onnxruntime-linux-x64-1.11.1)
# message(${ONNX_API_PATH})
include_directories(${ONNX_API_PATH}/include)
set(ONNX_API_LIB ${ONNX_API_PATH}/lib/libonnxruntime.so)

# opencv
option(OPENCV_PATH "Path to built ONNX Runtime directory." STRING)
message(STATUS "OPENCV_PATH: ${OPENCV_PATH}")
# set(OPENCV_PATH ${CMAKE_SOURCE_DIR}/../libs/opencv/opencv_x64)
# message(${OPENCV_PATH}  )
include_directories(${OPENCV_PATH}/include/)
file(GLOB OpenCV_LIBS ${OPENCV_PATH}/lib64/*.so*)

##
include_directories("include/")

add_executable(yolo_ort
              src/main.cpp
              src/detector.cpp
              src/utils.cpp)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

target_include_directories(yolo_ort PRIVATE "${ONNXRUNTIME_DIR}/include")
# link_directories("${ONNXRUNTIME_DIR}/lib")
target_compile_features(yolo_ort PRIVATE cxx_std_14)
target_link_libraries(yolo_ort ${OpenCV_LIBS}
                               ${ONNX_API_LIB}
                               dl)

# install target and libraries
option(INSTALL_PATH "Path to built ONNX Runtime directory." STRING)
message(STATUS "INSTALL_PATH: ${INSTALL_PATH}")
set(CMAKE_INSTALL_PREFIX ${INSTALL_PATH})
install(TARGETS yolo_ort DESTINATION ./)
install(DIRECTORY models DESTINATION ./)
install(DIRECTORY images DESTINATION ./)
install(PROGRAMS ${ONNX_API_LIB} DESTINATION lib)
install(PROGRAMS ${OPENCV_LIBS} DESTINATION lib)

4.4 编译命令

本地Ubuntu上进行编译,方便期间这里将编译的命令写成sh文件【build_x64.sh】

rm -R build
set -e

ROOT_PWD=$(pwd)
echo ${ROOT_PWD}

# 进入build文件
mkdir ${ROOT_PWD}/build
cd ${ROOT_PWD}/build
cmake .. \
   -DONNX_API_PATH=${ROOT_PWD}/../libs/onnxruntime/onnxruntime-linux-x64-1.11.1 \
   -DOPENCV_PATH=${ROOT_PWD}/../libs/opencv/opencv_x64 \
   -DINSTALL_PATH=${ROOT_PWD}/install/yolov5_x64
   
make -j10
make install

echo "\n========================================="
md5sum yolo_ort
date +%Y/%m/%d%t%H:%M:%S

使用交叉编译器进行编译(然后在rk3566上运行),方便期间这里将编译的命令写成sh文件【build_aarch64_onnx.sh】

rm -R build
set -e

# for rk1808 aarch64
GCC_COMPILER_PATH=/home/xyy/LL_DATA/LL/YOLOV5/GCC_COMPILER/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
GCC_COMPILER=${GCC_COMPILER_PATH}/aarch64-linux-gnu

ROOT_PWD=$(pwd)
echo ${ROOT_PWD}

# 进入build文件
mkdir ${ROOT_PWD}/build
cd ${ROOT_PWD}/build
cmake .. \
   -DCMAKE_C_COMPILER=${GCC_COMPILER}-gcc \
   -DCMAKE_CXX_COMPILER=${GCC_COMPILER}-g++ \
   -DONNX_API_PATH=${ROOT_PWD}/../libs/onnxruntime/onnxruntime-linux-aarch64-1.11.1 \
   -DOPENCV_PATH=${ROOT_PWD}/../libs/opencv/opencv410_aarch64 \
   -DINSTALL_PATH=${ROOT_PWD}/install/yolov5_aarch64_onnx 

make -j10
make install

echo "\n========================================="
${GCC_COMPILER_PATH}/aarch64-linux-gnu-strip ${ROOT_PWD}/install/yolov5_aarch64_onnx/yolo_ort
md5sum yolo_ort
date +%Y/%m/%d%t%H:%M:%S

4.5 编译与运行

4.5.1 PC上的编译与推理

根目录打开终端运行

sh build_x64.sh

然后会生成路径【install/yolov5_x64/】,在另外一个终端进入到到该路径下,运行命令

./yolo_ort --model_path=./models/yolov5s.onnx --image=./images/bus.jpg --class_names=./models/coco.names

终端显示如下,便是成共运行了,在【install/yolov5_x64/】路径下会生成预测结果【result.jpg】
在这里插入图片描述在这里插入图片描述

4.5.2 移动端库的编译和推理

根目录打开终端运行

sh build_aarch64_onnx.sh

然后会生成路径【install/yolov5_aarch64_onnx/】
在这里插入图片描述
我们将该路径下的文件全部拷贝到rk3566主板上,然后终端进入主板中的工程路径下运行如下命令

export LD_LIBRARY_PATH=./lib
./yolo_ort --model_path=./models/yolov5s.onnx --image=./images/bus.jpg --class_names=./models/coco.names

如果文件有权限问题,修改权限后运行即可。

### RK3588平台上的YOLOv8语义分割实现配置 #### 一、环境准备 为了在RK3588平台上成功部署YOLOv8进行语义分割,需先搭建合适的开发环境。这通常涉及安装Linux操作系统(如Ubuntu),以及必要的依赖库,比如CUDA、cuDNN等用于加速计算的工具包。由于RK3588具备强大的NPU单元,在编译模型前应确认已正确安装对应的SDK版本。 #### 二、模型转换 YOLOv8原生支持PyTorch框架下的训练与推理流程。然而针对嵌入式设备的应用场景,则推荐将预训练好的权重文件通过ONNX作为中间表示形式导出[^1]。具体操作如下: ```bash from ultralytics import YOLO model = YOLO('path/to/yolov8n-seg.pt') # 加载官方提供的预训练模型 success = model.export(format='onnx', imgsz=640, simplify=True) # 导出为简化后的.onnx格式 ``` 上述命令会基于指定尺寸(此处设为640x640像素大小),把原始.pth格式转化为更易于移植至不同硬件架构上的通用描述——即ONNX格式,并开启图优化选项以提升性能表现。 #### 三、量化处理 考虑到实际应用场景中对资源消耗的要求较高,可以考虑采用INT8量化技术来减少内存占用量的同时保持较高的精度水平。此过程同样可以通过Python脚本完成: ```python import onnxruntime as ort from onnxruntime.quantization import quantize_dynamic, QuantType quantized_model_path = "yolov8_seg_quantized.onnx" quantize_dynamic(model_input=model_onnx, model_output=quantized_model_path, per_channel=True, reduce_range=False, weight_type=QuantType.QInt8) ``` 这段代码片段展示了如何利用`onnxruntime`库内的API接口执行动态范围内的整数化工作,从而获得更适合于边缘端使用的紧凑型模型版本。 #### 四、集成部署 最后一步就是要把经过前述步骤调整过的YOLOv8-Segmentation模型加载到RK3588芯片内部运行起来。鉴于该款处理器内置有专门设计用来加速神经网络运算效率的专用模块(NPU),因此建议优先选用由瑞芯微官方维护的支持库来进行最终封装。例如借助rknn-toolkit2工具链能够轻松达成目的: ```cpp #include <iostream> #include "rknn_api.h" int main() { rknn_context ctx; const char* modelPath = "./yolov8_seg_quantized.rknn"; /* 初始化 */ int ret = rknn_init(&ctx, modelPath, 0, 0, NULL); if (ret < 0){ std::cerr << "Failed to init rknn context." << std::endl; exit(-1); } // ...省略部分初始化参数设置... /* 执行推断 */ float input_data[] = {/* 输入图像数据 */}; rknn_tensor_attr output_attrs[OUTPUT_SIZE]; void *outputs[OUTPUT_SIZE]; ret = rknn_inputs_set(ctx, INPUT_COUNT, inputs); if(ret >= 0){ ret = rknn_run(ctx, nullptr); } if(ret >= 0){ ret = rknn_outputs_get(ctx, OUTPUT_SIZE, outputs, output_attrs); } // 处理输出... } ``` 以上C++程序段落给出了一个简单的例子说明怎样调用RKNNT API函数序列完成从创建上下文对象直至获取预测结果整个周期的操作逻辑。当然根据项目需求还可以进一步扩展功能特性,像加入图形界面交互组件或是视频流实时分析等功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值