GitHub源码下载地址QtNCNN_Applications
链接:https://pan.baidu.com/s/1VZ5mLXybw_5iGJde6gRmFg
提取码:olep
目录
问题2:PyTorch框架训练的模型需要转换为ONNX之后才能转换为第三方框架NCNN吗?
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 背后有广泛的社区支持,特别是在移动设备和嵌入式开发方面 |
问题2:PyTorch框架训练的模型需要转换为ONNX之后才能转换为第三方框架NCNN吗?
一般来说是的:NCNN不直接支持PyTorch模型格式,因此首先要转换为ONNX中间格式之后才能转换为第三方用于模型部署的NCNN框架(但是从PNNX来看,并不是一定需要中间格式ONNX的转换)。使用第三方库来做 PyTorch 部署优势,一个最主要的优势就是可以在你的目标平台上获得最快的推理速度,TensorRT 在 NVIDIA 的 GPU 上最快,OpenVINO 在 Intel 的 CPU 上最快,那比如可能 ncnn 或者 TNN 在手机端 CPU 会更快一点。
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库实现图像文件的处理
注: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