添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

使用腾讯的NCNN框架推理YOLOX

2024 年 8 月 26 日 星期一 (已编辑)
/ , ,
435
摘要
ncnn是腾讯开发的开源神经网络推理框架,设计初衷是为了手机端应用,现已支持多平台(Android、鸿蒙、iOS、MacOS、Linux)和多种架构(x86、ARM、riscv、loongarch)。ncnn纯C++编写,无需第三方库,支持大小核调度优化和Vulkan API GPU 加速。相比OpenCV的DNN,ncnn更易用,无需手动编译CUDA,减少系统包臃肿。 使用步骤包括下载预编译文件、转换模型(如将yolox的Torch文件转换为Onnx文件并再转为ncnn格式)、修改模型(包括删除和添加层)、在代码中实现自定义层并创建工厂函数,最终进行推理。ncnn支持Vulkan加速和fp16精度操作。 测试表明,ncnn在推理速度和内存使用率上均优于OpenCV DNN,尤其是在多线程优化和内存占用方面。
这篇文章上次修改于 2024 年 9 月 9 日 星期一 ,可能部分内容已经不适用,如有疑问可询问作者。

使用腾讯的NCNN框架推理YOLOX

ncnn是腾讯自己开发的一款开源神经网络推理框架,从设计之初就是为了手机端的应用,现在已经支持全平台(Android、鸿蒙、iOS、MacOS、Linux)、(x86、ARM、riscv、loongarch),提供的预编译二进制文件基本上是囊括了市面上能见到的所有系统和架构,如果没有还能自己编译需要的版本 https://github.com/Tencent/ncnn/wiki/how-to-build

纯C++、无第三方库,还支持大小核调度优化,并且支持Vulkan API GPU 加速!

适用性多么好我就不说了,简直就是,具体可以看官方的README https://github.com/Tencent/ncnn

原本我是使用了OpenCV的DNN来推理,但是官方发布的预编译文件不提供包含CUDA,所以都得手动编译来获得CUDA加速特性。而且平时使用时经常会更换CUDA版本,为此还得给每个版本都编译一个OpenCV,不仅是CUDA版本,OpenCV在版本之间也是不兼容的,所以现在使用的预编译好的库早已是八百年前的版本。在发布时还得带上CUDA Runtime,整个系统包就显得十分臃肿。

尽早脱离编译苦海才是正道,所以ncnn简直是完美的替代方案。

使用前准备

首先下载ncnn提供的预编译文件: https://github.com/Tencent/ncnn/releases

根据自己的目标来下载,里面包含了二进制库文件,还有工具文件

比如下载了windows的预编译包,则包含arm、arm64、x64、x86四种架构的预编译文件

每个架构下都提供了编译完成的库文件和工具文件,内含一系列的模型转换工具、量化工具、优化模型文件工具和合并模型文件工具等。

转化模型

首先将yolox训练完的Torch文件转换为Onnx文件:

python tools/export_onnx.py --output-name yolox_1280.onnx -f .\exps\example\yolox_voc\yolox_voc_l_1280x.py -c D:\python\model\best_ckpt.pth

使用 onnx2ncnn.exe 将onnx转为ncnn格式模型文件 onnx2ncnn.exe D:\python\YOLOX\yolox_1280.onnx model.param model.bin

此时会提示 Unsupported slice step ! 因为注意力模块在ncnn中并不支持,所以需要自己在代码中实现这一层。

修改模型

打开model.param

我使用的是yolox-l,这看起来和官方给的转化demo有点不一样,但是实际上结构是完全相同的。

删除Input层后的10层,添加自定义层 YoloV5Focus

images 输出到 YoloV5Focus 层,处理后再输出到 /backbone/backbone/stem/Concat_output_0 层。

再修改第二行的359层数为350,因为删除了10层并添加了一层。

在代码中实现YoloV5Focus

同时创建一个工厂函数用于ncnn来调用