QT 6.6.0 中腾讯优图NCNN环境配置以及基于ONNX转NCNN模型文件实现图像分类

GitHub源码下载地址QtNCNN_Applications

B站视频讲解


链接:https://pan.baidu.com/s/1VZ5mLXybw_5iGJde6gRmFg 
提取码:olep

NCNN官方源码下载地址

NCNN相关介绍

NCNN介绍总结

ONNX相关介绍

目录

问题1:pnnx和ncnn之间的关系?

问题2:PyTorch框架训练的模型需要转换为ONNX之后才能转换为第三方框架NCNN吗?

Windows11 NCNN官方预编译库

Windows11 下NCNN源码编译

ONNX模型文件转NCNN模型文件

注意事项1:cv::imerad加载的图像不可过大

图像分类

方式一:使用simpleocv.h库实现图像文件的处理

方式二:使用OpenCV库实现图像文件的处理


QT初学案例
QT6.6.0实现打开电脑摄像头或其他的外接摄像头(实现拍照功能)
QT6.6.0实现简单的录音器
QT6.6.0实现一个简单的视频和音频播放器
QT6.6.0实现简单的视频录制(包含语音录制)器
QT6.6.0关于QMediaMetaData功能以及列子说明使用方法
QT6.6.0实现QtCamera功能(拍照,录像以及图像和视频的相关配置)
T6.6.0实现更好的视频播放器(前期改进)
QT6.6.0实现图表如饼图,柱状图,散点图以及盒图等的基本使用
QT6.6.0实现客户端Socket编程以及socket测试软件通信
QT6.6.0 实现服务端Server和多个客户端Client通信以及socket测试软件通信
QT6.6.0 实现QNetworkAccessManager的基本应用以及其拓展使用
QT6.6.0 实现服务端Server和多个客户端Client互相发送文件信息
QT6.6.0和QT6.0以下的版本实现FTP文件上传和下载(过程详解)
QT6.6.0实现QNetworkInterface网络接口,QHostAddress网络地址IP以及域名解析等相关信息查询。
QT6.6.0基于QTcpSocket和QTcpServer实现多个客户端群聊
QT6.6.0实现基于UDP协议的简单通信(过程详解)
QT 6.6.0基于UDP协议实现广播和多播机制(过程详解)
QT 6.6.0基于UDP协议实现群聊功能(过程详解)
QT 6.6.0中OpenCV两种环境的配置方法以及基本使用例子
QT 6.6.0 中基于OpenCV的图像变换以及基于鼠标点击移动事件的图像绘制
QT 6.6.0 基于OpenCV对图像进行旋转,缩放和裁剪等操作
QT 6.6.0 基于OpenCV实现图像风格的改变(add和subtract)
PyTorch 训练之后的网络模型.pth转.onnx文件并对图像进行预测
QT 6.6.0 基于OpenCV加载.pth模型文件转换之后的ONNX模型文件,并且实现图像分类
QT 6.6.0 基于OpenCV中的cv::dnn::ClassificationModel实现图像分类
yolov5目标检测和QT 6.6.0 基于OpenCV加载yolov5.onnx模型文件实现目标检测
FCN图像分割和QT 6.6.0 加载分割FCN_Resnet50.ONNX模型文件进行图像分割(过程详解)
QT 6.6.0 中基于SDL2库实现WAV音频格式的播放(过程详解)
QT 6.6.0 中SDL2库的基本使用以及利用SDL2库创建的界面实现音频播放(过程详解)
QT 6.6.0 中基于SDL2,SDL2_ttf,SDL2_image,SDL2_mixer实现音频播放器(改进版)
QT 6.6.0 + SDL2 + SDL2_mixer实现音频播放器(改进)
QT 6.6.0 中基于FFmpeg + SDL2 + SDL2_mixer实现音频录音(过程详解)
QT 6.6.0 + FFmpeg + SDL2实现MP4视频播放(过程详解)
QT 6.6.0 + FFmpeg + SDL2实现视频播放器(视频和音频同时播放-改进)
QT 6.6.0 + FFmpeg + SDL2实现音频视频播放(改进)
QT 6.6.0 + FFmpeg + SDL2实现音频视频播放(视频帧播放多线程改进)
QT 6.6.0 + FFmpeg + SDL2实现音频视频播放(音视频播放同步改进)
QT 6.6.0 + FFmpeg + SDL2实现音频视频播放(音视频播放改进-快进和快退)

        NCNN从2012开创之初作为移动端轻量级的模型部署框架,对其总结如下:

        ncnn从设计之初就深刻考虑了手机端的部署和使用,具有无第三方依赖、跨平台的特点,手机端CPU的速度快于目前所有已知的开源框架。框架由‌腾讯优图实验室推出,旨在为移动设备提供高效的神经网络计算能力。ncnn支持卷积神经网络,支持多输入和多分支结构,能够处理复杂的网络结构,如vgg、‌googlenet、resnet、squeezenet等。此外,ncnn不依赖任何第三方库,完全使用‌C++实现,支持跨平台编译和运行,包括‌Linux、‌Windows、‌MacOS、‌Android、‌iOS等系统。为了优化性能,ncnn利用了‌ARM NEON汇编级优化,充分利用硬件资源,提供极快的计算速度。这些特性使得ncnn成为移动端神经网络计算的优选框架。

问题1:pnnx和ncnn之间的关系?

框架介绍场景性能优化支持社区支持
PNNX
PNNX可以避开 ONNX 中间商,导出比较干净的高层 OP算子PNNX: PyTorch Neural Network Exchange
NCNN高性能的神经网络前向推理框架,主要用于移动端和嵌入式设备,支持从Caffe/TensorFlow/PyTorch等多种格式的模型转换为NCNN格式。在资源受限的环境(如手机、边缘设备等)上进行高效推理,优化了内存和计算性能。对硬件和资源进行了专门优化,提供了一些针对特定设备的加速技术,比如使用了单精度计算,8bit量化数。

 NCNN 有自己定义的操作和层,可能在某些情况下与ONNX不完全兼容

 NCNN 背后有广泛的社区支持,特别是在移动设备和嵌入式开发方面

注:PNNX: PyTorch 神经网络交换格式!

问题2:PyTorch框架训练的模型需要转换为ONNX之后才能转换为第三方框架NCNN吗?

        一般来说是的:NCNN不直接支持PyTorch模型格式,因此首先要转换为ONNX中间格式之后才能转换为第三方用于模型部署的NCNN框架(但是从PNNX来看,并不是一定需要中间格式ONNX的转换)。使用第三方库来做 PyTorch 部署优势,一个最主要的优势就是可以在你的目标平台上获得最快的推理速度,TensorRT 在 NVIDIA 的 GPU 上最快,OpenVINO 在 Intel 的 CPU 上最快,那比如可能 ncnn 或者 TNN 在手机端 CPU 会更快一点。

NCNN相关链接
https://github.com/Tencent/ncnn/wiki/use-ncnn-with-alexnet.zh
squeezeNet_API
SqueezeNet_nonAPI
build-for-windows-x64-using-mingw-w64

Windows11 NCNN官方预编译库

https://github.com/Tencent/ncnn/releases/download/20240820/ncnn-20240820-windows-vs2022.zip

注:关于QT中怎么导入依赖库和头文件,请看以下例子:QT 6.6.0中OpenCV三种环境的配置方法以及基本使用例子 

Windows11 下NCNN源码编译

QT 6.6.0中OpenCV三种环境的配置方法以及基本使用例子 :可以看这篇博文,怎么对源码进行编译,但是在cmake-gui工具configure过程中会出现以下问题:

这里表明protobuf没有找到,然后就不能在编译完成之后得到onnx转ncnn的onnx2ncnn.exe文件,看这篇博文解决问题:window11下编译protobuf源码以及解决编译过程中遇到的问题

ncnn库的CMakeLists.txt的一些参数设置如下:

option(NCNN_SHARED_LIB "shared library support" NO)
option(NCNN_ENABLE_LTO "enable link-time optimization" OFF)
option(NCNN_OPENMP "openmp support" OFF)
option(NCNN_STDIO "load model from external file" ON)
option(NCNN_STRING "plain and verbose string" ON)
option(NCNN_INSTALL_SDK "install ncnn library and headers" ON)
option(NCNN_SIMPLEOCV "minimal opencv structure emulation" ON)
option(NCNN_SIMPLEOMP "minimal openmp runtime emulation" OFF)
option(NCNN_SIMPLESTL "minimal cpp stl structure emulation" OFF)
option(NCNN_SIMPLEMATH "minimal cmath" OFF)
option(NCNN_THREADS "build with threads" ON)
option(NCNN_BENCHMARK "print benchmark information for every layer" ON)
option(NCNN_C_API "build with C api" ON)
option(NCNN_PLATFORM_API "build with platform api candy" ON)
option(NCNN_PIXEL "convert and resize from/to image pixel" ON)
option(NCNN_PIXEL_ROTATE "rotate image pixel orientation" ON)
option(NCNN_PIXEL_AFFINE "warp affine image pixel" ON)
option(NCNN_PIXEL_DRAWING "draw basic figure and text" ON)
option(NCNN_CMAKE_VERBOSE "print verbose cmake messages" OFF)
option(NCNN_VULKAN "vulkan compute support" NO)
option(NCNN_SIMPLEVK "minimal in-house vulkan loader" ON)
option(NCNN_SYSTEM_GLSLANG "use system glslang library" OFF)
option(NCNN_RUNTIME_CPU "runtime dispatch cpu routines" ON)
option(NCNN_DISABLE_PIC "disable position-independent code" OFF)
option(NCNN_BUILD_TESTS "build tests" OFF)
option(NCNN_COVERAGE "build for coverage" OFF)
option(NCNN_ASAN "build for address sanitizer" OFF)
option(NCNN_BUILD_BENCHMARK "build benchmark" ON)
option(NCNN_PYTHON "build python api" OFF)
option(NCNN_INT8 "int8 inference" ON)
option(NCNN_BF16 "bf16 inference" ON)
option(NCNN_FORCE_INLINE "force inline some function" ON)

最后,重新进行configure配置即可,可能会出现一些警告,这些暂时不管(关于OpenCV源码的编译以及在QT中导入依赖库和头文件请看上面给出的OpenCV环境配置链接)。

使用mingw32-make和mingw32-make install编译完成之后可以得到bin,include,lib三个文件,然后用于QT中添加依赖库和头文件:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../conda3/Transfer_Learning/NCNN/installed/lib/ -lncnn
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../conda3/Transfer_Learning/NCNN/installed/lib/ -lncnn

# win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../conda3/Transfer_Learning/NCNN/installed/bin/ -lncnn
# else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../conda3/Transfer_Learning/NCNN/installed/bin/ -lncnn

INCLUDEPATH += $$PWD/../../../../../conda3/Transfer_Learning/NCNN/installed/include
DEPENDPATH += $$PWD/../../../../../conda3/Transfer_Learning/NCNN/installed/include

注:QT中依赖库和头文件的添加方式已经在上面的OpenCV环境配置博文中给出。

ONNX模型文件转NCNN模型文件

QT 6.6.0 基于OpenCV加载.pth模型文件转换之后的ONNX模型文件,并且实现图像分类

PyTorch加载预训练目标检测模型实现物体检测,同时将预训练模型转换为ONNX模型文件(过程详解) 

注:根据将编译得到的bin目录添加到PATH系统环境变量中。

onnx转ncnn:onnx2ncnn custom_model.onnx ./ncnn/custom_model.param ./ncnn/custom_model.bin

custom_model.bin包含了相关的的权重参数,custom_model.param保存了网络模型结构描述(读者可以使用记事本打开看一下就知道了)。

注意事项1:cv::imerad加载的图像不可过大

         QT中导入ncnn编译的依赖库和头文件之后,比如使用#include<ncnn/simpleocv.h>头文件,其中包含了类似OpenCV的一些功能,读取图像cv::imread,创建保存图像的变量cv::Mat image等功能。但是使用其读取图像的时候,图像的高宽不可过大,否则读者失败,比如图像在500 x 666内可以读取成功(关于这个问题在解决过程中可以说是非常的折磨人)

图像分类

方式一:使用simpleocv.h库实现图像文件的处理

QtNCNN_Classification_v1

注:OpenCV和ncnn相关同时导入导致的问题。因为在simpleocv.h和OpenCV相同名称中冲突了,其实如果读者去看simpleocv.h的源码的话,会发现里面很多的对图像处理,包含图像的读取cv::imread等函数名称和OpenCV里面函数一样的名称,导致冲突。

QT 6.6.0 中NCNN实现图像分类

方式二:使用OpenCV库实现图像文件的处理

       既然simpleocv.h可以实现加载图像以及基本图像的处理,为什么还要自己加入外部OpenCV库呢?主要还是因为想尝试一下加载外部OpenCV库和simpleocv.h的功能没有OpenCV本身完善。

        虽然OpenCV库里面包含了mat.hpp和ncnn里面包含了mat.h,它们具有相同的类名Mat,包含了一些相似的功能,但是由于是不同的命名空间:cv::Mat和ncnn::Mat,因此应该是不相冲突的。

        导入OpenCV头文件会产生如下的错误:

解决方法如下,原因在于上面导入的OpenCV最开始是通过MSVC编译器编译的,因此QT这里也需要选择MSVC:QT 6.6.0中OpenCV三种环境的配置方法以及基本使用例子(这里提到过)

注:虽然OpenCV的问题解决了,但是同时也会报“:-1: error: LNK1104: 无法打开文件“ncnn.lib”,主要是因为我们的OpenCV是通过MSVC编译的,而NCNN是通过MinGW编译的,因此对OpenCV也采用MinGW来编译(怎么编译请看:QT 6.6.0中OpenCV三种环境的配置方法以及基本使用例子)。

QT 6.6.0 中基于NCNN实现图像分类v2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值