QT 6.6.0 中腾讯优图NCNN环境配置以及基于PNNX转NCNN模型文件实现目标检测

GitHub源码下载地址

视频讲解

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

yolov5目标检测和QT 6.6.0 基于OpenCV加载yolov5.onnx模型文件实现目标检测 

NCNN官方源码下载地址

NCNN模型文件参数介绍

ncnn operation param weight table  

ncnn low-level operation api 

how to implement custom layer step by step 

目录

问题1:PyTorch官方目标检测模型和分割模型ONNX转NCNN报错

问题2:NCNN执行yolov5s推理过程中卷积中途出现异常?

问题3:可视化.param和.bin模型结构

onnx转ncnn总结一点

正式进入主题PNNX

方式一:使用PNNX官方提供的转换工具

实现单张图像和实时检测效果:

方式二:对PNNX源码进行编译


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实现音频视频播放(音视频播放改进-快进和快退)
QT 6.6.0 中腾讯优图NCNN环境配置以及基于ONNX转NCNN模型文件实现图像分类

        上一篇博文我们已经讲解了NCNN的相关应用介绍,NCNN的源码编译以及在QT 6.6.0中使用NCNN等相关问题和注意事项,最终通过加载自定义模型和PyTorch官方提供的的分类模型实现了简单的图像分类。本文主要是基于上一篇文章环境的配置实现NCNN在QT中的目标检测,目标检测相比于图像分类的实现过程相对复杂,尽管我们之前有很多文章都列举了目标检测的应用。除了图像分类和目标检测,像其他领域的如图像分割读者也可以进行尝试。

        这里就不多说了,直接进入正题,以下最终实现界面的结果,和我们之前基于ONNX在QT中实现的效果界面是一样的,只不过是使用了不同的框架(yolov5s.pnnx -> (yolov5s.param,yolov5s.bin)):

问题1:PyTorch官方目标检测模型和分割模型ONNX转NCNN报错

        首先将PyTorch官方提供的fcos_resnet50_fpn目标检测模型和deeplabv3_mobilenet_v3_large分割模型从.pth转换为.onnx中间格式之后,最后使用onnx2ncnn工具转换为NCNN格式,但是会报以下的错误:

注:针对这个问题,网上也有部分给出了解决方案,其中NCNN作者本人给出的解决方案:手工优化ncnn模型结构 ,但是我对NCNN框架目前只是了解一部分,所以并不会去尝试使用这种方式,使用这种方式去解决这个问题等后期再去解决。而且作者推荐目前开源的PNNX工具进行转换,不再需要ONNX中间商表示。下一篇博文会尝试这个PNNX转NCNN,不知道能不能弥补上面截图提到转换失败的问题。

        当你为庆幸yolov5还没有进行尝试时,那就是崩溃的开始,从这个问题1到问题2就是崩溃的根源。当yolov5s.onnx转换为ncnn时,如下结果:

也许你可能回想是不是yolov5版本的原因,我这里从yolov5-6.0到yolov5-最新版本都试过了,问题依然存在(至于6.0以前的版本比较久了),到这里就已经是崩溃的开始了。没有办法只能硬着头皮按照NCNN作者提出的“手工优化NCNN模型结构”来尝试一下,对.param文件按照转换过程中存在的问题进行了修改,优化结果如下:

你以为到这里就结束了吗?远远没有,这里优化到没有任何出错之后,到QT中加载模型,幸运的是模型加载成功了,但是在检测图像的时候卷积异常了,问题2。 

 

问题2:NCNN执行yolov5s推理过程中卷积中途出现异常?

        首先这个图像的预处理没有问题,并且是指定模型输入图像大小。 

手工对yolov5s.param进行优化之后,可以正常的加载模型.param和.bin,但是会报以下的错误,针对这个错误查看了文件许久,依然没有解决(崩溃)。 

通过这个截图可以看到,在输入图像推理的时候出现卷积中途异常呢?,从而导致程序崩溃。对于这个问题,说实话我也不清楚是什么原因。

问题3:可视化.param和.bin模型结构

        https://netron.app/ 使用网页版的打开.param文件,同时会自动找到对应的.bin文件从而实现可视化效果。如果是下载客户端到本地安装,我这里打不开(建议使用这个网页版的打开)。

onnx转ncnn总结一点

        上面的问题1和问题2只是一个失败的案例,至于其他的目标检测算法能否转换ncnn成功,大家尽可去尝试,尝试了才知道会不会失败。对于这个失败案例,大家看一下即可,重点看下面PNNX的使用。按照作者所说的,建议使用pnnx转ncnn。

正式进入主题PNNX

PNNX相关链接

https://github.com/pnnx/pnnx

https://github.com/Tencent/ncnn/tree/master/tools/pnnx
PNNX转换工具(Windows,Linux,macOS)
pnnx源码下载地址以及相关介绍

以下是官方推出PNNX的理由:

PNNX推出三种转换方式,我们这里就使用对源码进行编译,然后将编译得到的可执行文件(用于pnnx转换的工具)对其模型进行转换。

方式一:使用PNNX官方提供的转换工具

Windows平台下的pnnx转换工具下载

通过yolov5官方提供的7.0版本代码仓库将下载的yolov5s.pt通过代码export.py转换为yolov5s.torchscript.pt格式(官方在export.py中提供的转换为torchscript格式,我们这里在后面.pt,转换为pt格式)。

命令:pnnx yolov5s.torchscript.pt inputshape=[1,3,640,640]

实现单张图像和实时检测效果:

QT 6.6.0 中基于PNNX转NCNN模型实现目标检测

 

方式二:对PNNX源码进行编译

pnnx源码下载地址(需编译)

源码编译方式请看这里(建议初学者先尝试使用官方提供的预编译好的pnnx工具)

编译之前的准备

  • torch的安装目录:D:\conda3\anaconda3\envs\Pytorch_lightning\Lib\site-packages\torch\share\cmake\Torch(其中Pytorch_lightning是创建的虚拟环境名称)
  • torchvision的安装目录:同上。

如果读者不清楚安装目录,通过以下步骤来查看具体信息:

  • 查看具体有哪些虚拟环境:conda env list
  • 激活具体的环境:activate Pytorch_lightning
  • 查看包的具体信息:pip show torchvision

注意:编译所使用的torchvision和torch是不需要GPU版本的(不支持)PNNX作者本人的描述

也可以下载​​​​​​​libtorchtorchvisionhttps://download.pytorch.org/libtorch/cpu/ 和https://github.com/pytorch/vision/archive/refs/tags/v0.18.1.zip (注意libtorchtorchvision之间版本要对应)。

注意CMakeLists.txt中的torchtorchvision路径问题:

除了上面这种去修改CMakeLists.txt文件中的torchtorchvision的路径之外,我们还可以使用pnnx官方提供的命令行方式(推荐): 

GitHub - pnnx/pnnx: PyTorch Neural Network eXchange(推荐这种方式编译)

https://zhuanlan.zhihu.com/p/431833958

git clone https://github.com/Tencent/ncnn.git
mkdir ncnn/tools/pnnx/build
cd ncnn/tools/pnnx/build
cmake -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=<your libtorch install dir> -DTorchVision_INSTALL_DIR=<your torchvision install dir> ..
cmake --build . --config Release -j 4
cmake --build . --config Release --target install

上面的命令根据下载的libtorch或者torch目录提供的路径,以及torchvision的路径,命令对应如下:

git clone https://github.com/Tencent/ncnn.git
mkdir ncnn/tools/pnnx/build
cd ncnn/tools/pnnx/build

cmake .. -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=D:\conda3\Transfer_Learning\NCNN\ncnn-master\tools\libtorch -DTorchvision_INSTALL_DIR=D:\conda3\Transfer_Learning\NCNN\vision-0.18.1

cmake --build . --config Release -j 4
cmake --build . --config Release --target install

第一步执行:cmake .. -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=D:\conda3\Transfer_Learning\NCNN\ncnn-master\tools\libtorch -DTorchvision_INSTALL_DIR=D:\conda3\Transfer_Learning\NCNN\vision-0.18.1

第二步执行:cmake --build . --config Release -j 4(执行之后会出现如下颜色的输出结果,不用管,一直让它编译,结束)

第三步:cmake --build . --config Release --target install

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值