前言
这里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
如果文件有权限问题,修改权限后运行即可。