C++模型部署:qt+yolov5/6+onnxruntime+opencv

这篇具有很好参考价值的文章主要介绍了C++模型部署:qt+yolov5/6+onnxruntime+opencv。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者平时主要是写 c++ 库的,界面方面了解不多,也没有发现“美”的眼镜,界面有点丑,大家多包涵。C++模型部署:qt+yolov5/6+onnxruntime+opencv本次介绍的项目主要是通过 cmake 构建一个 基于 c++ 语言的,以 qt 为框架的,包含 opencv 第三方库在内的,跨平台的,使用 ONNX RUNTIME 进行前向推理的 yolov5/6 演示平台。文章力求简单,不追求过多的细节,让同学们对整个流程有一个全面的认识,废话不多说,下面我们就开始一步步的进行介绍。

推理框架

各种支持 C++ 的前向推理库都有自己的一些优点与缺点。X86架构下常用的框架:OpenCV DNN,OpenVINO,OpenVINO,ONNX RUNTIME与TensorRT 也是。下面对他们进行简要的对比,混合使用方式较复杂,暂不考虑(例如:使用其他模块为 DNN 加速等)。

OpenCV DNN

OpenCV 中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,即模型训练好了,进行预测,支持多种深度学习框架,比如TensorFlow,Caffe,Torch和Darknet。

优点:

1.代码量及编译运行开销远小于其他深度学习模型框架;
2.DNN 模块提供了内建的 CPU 和 GPU 加速(不常用),OpenCV 内置,无需依赖第三方库;
3.一般不限制平台与 CPU ,通用性强。

缺点:

一般情况下 OpenCV DNN 速度最慢。

OpenVino

OpenVINO是英特尔推出的一款全面的工具套件,用于快速部署应用和解决方案,支持计算机视觉的CNN网络结构超过200余种。

优点

1.Linux、Windows、macOS 三大平台全覆盖;
2.对英特尔CPU有相应的优化(毕竟自家出品);
3.支持部分英特尔的独立显卡,同时支持英特尔核芯显卡的第 6 代至第 12 代智能英特尔 酷睿处理器,详细信息点击。

缺点

原则上只支持英特尔的CPU与显卡推理加速。

ONNX Runtime

ONNX Runtime 是一个微软公司的开源项目,旨在加速跨各种框架、操作系统和硬件平台的机器学习。

优点

1.Linux、Windows、macOS 三大平台全覆盖;
2.英特尔、amd CPU都可使用;
3.同时支持 CPU 和 GPU 加速。

缺点

1.个人感觉在 linux 下比在 windows 下速度慢(研究领域有限,对是否为设计问题保持怀疑);
2.一般情况下,速度同样较慢,对比 OpenCV DNN 加速效果提升不明显。

TensorRT

英伟达官方出品,TensorRT 以 NVIDIA 的并行编程模型 CUDA (所以暂时显卡还是只建议购买 N 卡,TPU 等不属于本文介绍范畴)为基础构建而成,使用英伟达显卡时的“唯一选择”。

优点

1.对英伟达显卡进行最有效利用。

缺点

1.需要英伟达GPU硬件的支持;
2.代码量较多,使用较复杂。

一般情况下CPU推理速度(可用条件下):

OpenVino > ONNX Runtime > OpenCV DNN

使用显卡的情况下(速度无比较意义):

英特尔显卡使用 OpenVino ,英伟达显卡使用 TensorRT 。

由于用来演示的笔记本是 amd cpu ,所以本次便使用 ONNX Runtime 给大家进行相应的介绍。

模型

yolov5/6 之前也有过相应的介绍,文章就不再赘述了,需要了解的同学可在公众号中进行搜索。因为使用 ONNX Runtime 进行推理,所以对于模型来说,最简单的方式就是将其转化为 .onnx ,这一步的操作一般都会包含在 yolov5/6 开源项目中,按照相应的介绍就可以很方面的完成。

OpenCV

OpenCV(开源的计算机视觉库)是基于BSD协议,因此它可免费用于学术和商业用途。其提供C++,C,Python和Java接口,支持Windows,Linux,Mac OS,iOS和Android。
opencv 提供的功能基本可以覆盖科研中的大部分场景,所以我们这次使用 opencv 来介绍一下如何使用第三方库。
本次使用cmake来设置依赖,详细的介绍在后面的文章中说明。

QT

Qt 是一个跨平台的 C++ 框架(C++库),目前最新的版本是 Qt6.4。其中推荐 Qt5.15 或 Qt6.2,这两个版本是 LTS 版本(即长期支持版本),Bug较少,相对稳定。

Qt 除了支持界面设计(GUI编程),还封装了与网络编程、多线程、数据库连接、视频音频等相关的功能。

C++模型部署:qt+yolov5/6+onnxruntime+opencv
一般情况下,如何我的项目中如果使用到 QT ,那么我就会以 QT 为框架,进行整个项目的搭建。这次我们就基于 qt6.2.4 来介绍一下整个项目的搭建。因为 qt 最开始支持的是 qmake ,可能很多同学听到的都是这个构建方式。但是现在 qt 已经支持 cmake 了,为了不增加多余的学习成本,我们这次使用 cmake 来进行相应的介绍。

CMake

CMake 允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件(Cmake 并不直接建构出最终的软件,而是产生标准的建构档),如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程,然后再依一般的建构方式使用。C++模型部署:qt+yolov5/6+onnxruntime+opencv

CMake 使用方法

CMake的所有的语句都写在一个叫:CMakeLists.txt的文件中(cmake会根据该文件中的配置完成最终的编译,构建,打包,测试等一系列任务)。当CMakeLists.txt文件确定后,可以用cmake命令对相关的变量值进行配置。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。

平台框架搭建

前面有介绍到,既然我们以 qt 为框架进行平台的搭建。那么我们第一步就是创建一个能运行的 qt 项目。
C++模型部署:qt+yolov5/6+onnxruntime+opencv这里注意不要选错,我们本次使用 cmake 构建。
C++模型部署:qt+yolov5/6+onnxruntime+opencv到这里,点击 “Finish”, qt 项目就创建完成
C++模型部署:qt+yolov5/6+onnxruntime+opencv在 windows 平台下,为了避免兼容性问题,建议使用 vs ,编译器为默认的 msvc 。后续的操作也使用 vs 进行演示。
整个项目结构如下图所示:
C++模型部署:qt+yolov5/6+onnxruntime+opencv至此,qt 框架搭建完成,运行一下看看(因为我有 qt 的开发环境,所以环境变量之前已经设置好了)。
C++模型部署:qt+yolov5/6+onnxruntime+opencv然后我们在 CMakeLists.txt 中加入第三方库(OpenCV ,onnx runtime)的依赖。

OpenCV 依赖

find_package(OpenCV REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})

需要在环境变量中进行相应的设置

onnx runtime 依赖(不同平台有微小区别)

if(UNIX)
    set(ONNXRUNTIME_DIR "/home/wobushimaomao/公共的/MyCode/CC++Code/onnxruntime-linux-x64-1.11.1")
    target_link_libraries(${PROJECT_NAME} PRIVATE "${ONNXRUNTIME_DIR}/lib/libonnxruntime.so")
elseif(WIN32)
    set(ONNXRUNTIME_DIR "D:/MyCode/CC++Code/onnxruntime-win-x64-1.11.1")
    target_link_libraries(${PROJECT_NAME} PRIVATE "${ONNXRUNTIME_DIR}/lib/onnxruntime.lib")
endif()
target_include_directories(${PROJECT_NAME} PRIVATE "${ONNXRUNTIME_DIR}/include")

windows平台有时会出现一些莫名其妙的问题,所以不常用的库我一般都是显式的设置,而不是加入环境变量。

再进行一些小的修改,得到最终的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.5)

project(yolo_ort_cxx VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)  # 自动将 CMAKE_CURRENT_SOURCE_DIR 和 CMAKE_CURRENT_BINARY_DIR 添加到每个目录的包含路径中

set(CMAKE_AUTOUIC ON)  # 自动翻译信号与槽
set(CMAKE_AUTOMOC ON)  # 自动翻译资源文件为cpp文件
set(CMAKE_AUTORCC ON)  # 自动翻译界面文件为cpp文件

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

file(GLOB_RECURSE PROJECT_SOURCES ./src/*)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(${PROJECT_NAME}
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
endif()

target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

# OpenCV
find_package(OpenCV REQUIRED)
# target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS})  # 一般不需要
target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})

# ONNXRUNTIME
if(UNIX)
    set(ONNXRUNTIME_DIR "/home/wobushimaomao/公共的/MyCode/CC++Code/onnxruntime-linux-x64-1.11.1")
    target_link_libraries(${PROJECT_NAME} PRIVATE "${ONNXRUNTIME_DIR}/lib/libonnxruntime.so")
elseif(WIN32)
    set(ONNXRUNTIME_DIR "D:/MyCode/CC++Code/onnxruntime-win-x64-1.11.1")
    target_link_libraries(${PROJECT_NAME} PRIVATE "${ONNXRUNTIME_DIR}/lib/onnxruntime.lib")
else()
    message(STATUS "未知的平台类型!")
endif()
target_include_directories(${PROJECT_NAME} PRIVATE "${ONNXRUNTIME_DIR}/include")

set_target_properties(${PROJECT_NAME} PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    # WIN32_EXECUTABLE TRUE # 打开时,可能出现windows下的vs不打印部分输出
)

# 屏蔽qDebug()调试信息
# add_compile_definitions(QT_NO_DEBUG_OUTPUT)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(${PROJECT_NAME})
endif()

add_subdirectory(src)

然后我们就可以按照自己的需求设置界面,并在合适的位置插入代码。最终的效果如下:
C++模型部署:qt+yolov5/6+onnxruntime+opencv至此,我们便完成了整个演示平台的介绍。

总结

文章的主要目的是基于 c++ 语言,搭建一个 yolov5/6 的前向推理演示平台。力求简单,不追求过多的细节,让同学们对整个设计有一个全面的理解。文中未介绍之处,如有需要大家可以善用搜索引擎或在公众号中搜索。

作者水平有限,如有问题或错误,欢迎评论区指正。文章来源地址https://www.toymoban.com/news/detail-446649.html

到了这里,关于C++模型部署:qt+yolov5/6+onnxruntime+opencv的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用c++onnxruntime部署yolov5模型并使用CUDA加速(超详细)

    前言 1.Yolo简介 2.onnxruntime简介 3.Yolov5模型训练及转换 4.利用cmake向C++部署该onnx模型 总结 接到一个项目,需要用c++和单片机通信,还要使用yolo模型来做到目标检测的任务,但目前网上的各种博客并没有完整的流程教程,让我在部署过程费了不少劲,也踩了不少坑(甚至一度把

    2024年02月02日
    浏览(33)
  • YOLOV8 Onnxruntime Opencv DNN C++部署

          OpenCV由各种不同组件组成。OpenCV源代码主要由OpenCV core(核心库)、opencv_contrib和opencv_extra等子仓库组成。近些年,OpenCV的主仓库增加了深度学习相关的子仓库:OpenVINO(即DLDT, Deep Learning Deployment Toolkit)、open_model_zoo,以及标注工具CVAT等。         OpenCV深度学习模块只

    2024年02月16日
    浏览(37)
  • 36、RK3399Pro 环境搭建和Yolov5 c++调用opencv进行RKNN模型部署和使用

    基本思想:记录rk3399 pro配置环境和c++ npu开发记录,主要想搞一份c++代码和其它图像算法结合一下,好进行部署,淘宝链接见附录  需要的python3.7对应的aarch64的whl包:包含opencv-whl 、h5py-whl包: 链接: https://pan.baidu.com/s/1cvCAmHBa_4KgEjrcFIYnig 提取码: 5ui4 链接: https://pan.baidu.com/s/1hrc

    2024年02月07日
    浏览(27)
  • 【模型部署 01】C++实现GoogLeNet在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度学习领域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。 以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下: 结论: GPU加速首选

    2024年02月06日
    浏览(36)
  • 【模型部署 01】C++实现分类模型(以GoogLeNet为例)在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度学习领域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。 以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下: 结论: GPU加速首选

    2024年02月06日
    浏览(40)
  • yolov5 opencv dnn部署自己的模型

    github开源代码地址 yolov5官网还提供的dnn、tensorrt推理链接 本人使用的opencv c++ github代码,代码作者非本人,也是上面作者推荐的链接之一 如果想要尝试直接运行源码中的yolo.cpp文件和yolov5s.pt推理sample.mp4,请参考这个链接的介绍 使用github源码结合自己导出的onnx模型推理自己的

    2024年01月23日
    浏览(35)
  • 用C++部署yolov5模型

    要在C语言中部署YoloV5模型,可以使用以下步骤: 安装C语言的深度学习库,例如Darknet或者ncnn。 下载训练好的YoloV5模型权重文件(.pt文件)和模型配置文件(.yaml文件)。 将下载的权重文件和配置文件移动到C语言深度学习库中指定的目录下。 在C语言中编写代码,使用深度学习库加

    2024年02月15日
    浏览(26)
  • YOLOv5 实例分割 用 OPenCV DNN C++ 部署

    如果之前从没接触过实例分割,建议先了解一下实例分割的输出是什么。 实例分割两个关键输出是:mask系数、mask原型 本文参考自该项目(这么优秀的代码当然要给star!):GitHub - UNeedCryDear/yolov5-seg-opencv-onnxruntime-cpp: yolov5 segmentation with onnxruntime and opencv 目录 Pre: 一、代码总结

    2024年02月12日
    浏览(23)
  • YOLOV5(二):将pt转为onnx模型并用opencv部署

    yolov5s 6.0自带export.py程序可将.pt转为.onnx等,只需配置需要的环境即可。 1. 安装环境 报错:NVIDIA-tensorrt安装失败! 解决:从源码安装TensorRt: ①安装CUDNN和CudaToolKit等GPU配置 ②从官网下载需要的rt版本:https://developer.nvidia.com/nvidia-tensorrt-8x-download ③解压后,将lib文件夹添加到

    2024年02月10日
    浏览(30)
  • 基于树莓派Qt+opencv+yolov5-Lite+C++部署深度学习推理

            本文是基于 qt和opencv的dnn 深度学习推理模块,在树莓派上部署YOLO系列推理,适用于yolov5-6.1以及yolov5-Lite,相比直接用python的onnxruntime,用基于opencv的dnn模块,利用训练生成的onnx模型,即可快速部署,不需要在树莓派上额外安装深度学习的一系列环境,因为我们知道

    2024年04月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包