这里的代码参考ultralytics代码库里面的examples文件夹下面的openvino和onnxruntime使用案例部署yolo11检测模型的代码。这两种部署框架和前面的tensorRT框架都是类似的,只是使用的接口不太一样。
PART A -- onnxruntime的使用
1.下载onnxruntime的推理框架
(1) 进入onnxruntime的官方仓库https://github.com/microsoft/onnxruntime.git
点击Releases部分,如下图所示:
(2) 进入后,下滑选择自己需要的版本,下载
文件名字带有gpu的表示使用gpu做推理,否则使用cpu做推理;这里有不同系统的onnxruntime的推理框架,根据自己需求下载。如下图
(3) 下载后直接解压即可以使用,解压后的文件夹包含了头文件和库文件,如下图
2.把解压好的文件复制到onnxruntime推理的项目文件夹
修改CMakeLists.txt的配置文件
其中23行option(USE_CUDA "Enable CUDA support" ON)这里的ON表示使用cuda推理,如果不使用cuda的话,需要把这里的参数修改为OFF;
35行set(ONNXRUNTIME_VERSION 1.15.1)表示设定onnxruntime的版本,根据自己下载release版本修改这里1.15.1参数就可以啦。
原文件的配置显得有些多余,这里做了简单的修改,我的配置文件如下:
cmake_minimum_required(VERSION 3.5)
set(PROJECT_NAME Yolov8OnnxRuntimeCPPInference)
project(${PROJECT_NAME} VERSION 0.0.1 LANGUAGES CXX)
# -------------- Support C++17 for using filesystem ------------------#
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# -------------- OpenCV ------------------#
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# -------------- Compile CUDA for FP16 inference if needed ------------------#
# -------------- 设置是否使用cuda ------------------#
option(USE_CUDA "Enable CUDA support" ON) # 控制使用 cuda
if (NOT APPLE AND USE_CUDA)
find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
add_definitions(-DUSE_CUDA)
else ()
set(USE_CUDA OFF)
endif ()
# -------------- ONNXRUNTIME ------------------#
# Set ONNXRUNTIME_VERSION
set(ONNXRUNTIME_VERSION 1.15.1) # 设置onnxruntime的版本信息
if (WIN32)
if (USE_CUDA)
set(ONNXRUNTIME_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime-win-x64-gpu-${ONNXRUNTIME_VERSION}")
else ()
set(ONNXRUNTIME_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime-win-x64-${ONNXRUNTIME_VERSION}")
endif ()
elseif (LINUX)
if (USE_CUDA)
set(ONNXRUNTIME_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime-linux-x64-gpu-${ONNXRUNTIME_VERSION}")
else ()
set(ONNXRUNTIME_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime-linux-x64-${ONNXRUNTIME_VERSION}")
endif ()
elseif (APPLE)
set(ONNXRUNTIME_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime-osx-arm64-${ONNXRUNTIME_VERSION}")
# Apple X64 binary
# set(ONNXRUNTIME_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime-osx-x64-${ONNXRUNTIME_VERSION}")
# Apple Universal binary
# set(ONNXRUNTIME_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime-osx-universal2-${ONNXRUNTIME_VERSION}")
else ()
message(SEND_ERROR "Variable ONNXRUNTIME_ROOT is not set properly. Please check if your cmake project \
is not compiled with `-D WIN32=TRUE`, `-D LINUX=TRUE`, or `-D APPLE=TRUE`!")
endif ()
include_directories(${PROJECT_NAME} ${ONNXRUNTIME_ROOT}/include)
set(PROJECT_SOURCES
main.cpp
inference.h
inference.cpp
)
add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})
if (WIN32)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${ONNXRUNTIME_ROOT}/lib/onnxruntime.lib)
if (USE_CUDA)
target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
endif ()
elseif (LINUX)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${ONNXRUNTIME_ROOT}/lib/libonnxruntime.so)
if (USE_CUDA)
target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
endif ()
elseif (APPLE)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${ONNXRUNTIME_ROOT}/lib/libonnxruntime.dylib)
endif ()
# For windows system, copy onnxruntime.dll to the same folder of the executable file
if (WIN32)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${ONNXRUNTIME_ROOT}/lib/onnxruntime.dll"
$<TARGET_FILE_DIR:${PROJECT_NAME}>)
endif ()
# Download https://raw.githubusercontent.com/ultralytics/ultralytics/main/ultralytics/cfg/datasets/coco.yaml
# and put it in the same folder of the executable file
# configure_file(coco.yaml ${CMAKE_CURRENT_BINARY_DIR}/coco.yaml COPYONLY)
# # Copy yolov8n.onnx file to the same folder of the executable file
# configure_file(weight/yolo11s.onnx ${CMAKE_CURRENT_BINARY_DIR}/weight/yolo11s.onnx COPYONLY)
# # Create folder name images in the same folder of the executable file
# add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
# COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/images
# )
在我的项目文件中下载了多个版本的onnxruntime的推理框架,以下是我的项目文件。具体如下图:
这里使用onnxruntime的gpu方式推理模型的话,需要手动编译带有cuda的opencv方式,由于我的电脑安装了很多版本的cuda和tensorRT,如果配置cuda的opencv不方便不同版本之间的切换,这里主要使用cpu的onnxruntime来推理检测模型。
由于这个代码比较简单,这里不做代码的解读。
PART B -- openvino的使用
openvino的下载链接:https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html?PACKAGE=OPENVINO_BASE&VERSION=v_2024_3_0&OP_SYSTEM=WINDOWS&DISTRIBUTION=PIP
点击这个下载连接后出现如下所示,根据自己电脑的系统和版本,选择合适进行下载,我的下载如下:
随后,解压这个文件夹,tar -xvf ***.tar.gz就可以啦,解压后的文件
这里可以和onnxruntime的一样设置,直接复制整个runtime文件夹到自己的项目中。我在我自己的项目中建openvino的文件夹,然后把刚刚复制的openvino的文件夹复制到这个文件夹内就可以正常使用。
以下是我的cmakelist.txt的配置文件
cmake_minimum_required(VERSION 3.12)
project(yolov8_openvino_example)
set(CMAKE_CXX_STANDARD 14)
find_package(OpenCV REQUIRED)
include_directories(
${OpenCV_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/openvino/runtime/include
)
add_executable(detect
main.cc
inference.cc
)
target_link_libraries(detect
${OpenCV_LIBS}
${CMAKE_CURRENT_SOURCE_DIR}/openvino/runtime/lib/intel64/libopenvino.so
)
在我的项目文件组织是这样的:
然后直接运行就可以正常使用了。
这里的部署代码也比较简单,不做代码的解释。
直接使用头文件+库文件的方式很便捷实用。