前言

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

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

1 下载onnxruntime库

github上搜索 onnxruntime,能看到微软提供的库。链接为 https://github.com/microsoft/onnxruntime

opencv 加载 pythorch opencv加载onnx_ubuntu

opencv 加载 pythorch opencv加载onnx_linux_02

2 opencv的下载

https://opencv.org/releases/

opencv 加载 pythorch opencv加载onnx_opencv 加载 pythorch_03

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的下载

opencv 加载 pythorch opencv加载onnx_opencv 加载 pythorch_04

一般的,下载后解压到固定路径下,并添加到系统环境变量中即可使用。

这里只针对当前工程测试,暂不进行系统环境变量配置,下载解压即可。

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

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

使用的yolov5-onnxruntime的工程链接为 https://github.com/itsnine/yolov5-onnxruntime

opencv 加载 pythorch opencv加载onnx_opencv 加载 pythorch_05

创建某个路径,这里为【/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端运行时可不用修改)。

opencv 加载 pythorch opencv加载onnx_linux_06

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 buildset -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 buildset -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】

opencv 加载 pythorch opencv加载onnx_YOLO_07

opencv 加载 pythorch opencv加载onnx_opencv 加载 pythorch_08

4.5.2 移动端库的编译和推理

根目录打开终端运行

sh build_aarch64_onnx.sh

然后会生成路径【install/yolov5_aarch64_onnx/】

opencv 加载 pythorch opencv加载onnx_YOLO_09

我们将该路径下的文件全部拷贝到rk3566主板上,然后终端进入主板中的工程路径下运行如下命令

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

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