基于ncnn的YOLOv5 demo iOS端问题汇总

2024-02-17  本文已影响0人  樂幽

写在最前边(请务必看下)

  1. 写这篇文章的主要目的是分享一下自己在运行YOLOv5_NCNN这个demo时遇到的各种问题,如果不是这个demo的话,可能无法解决你的问题,仅做参考。
  2. 几乎所有的问题和解决方案,YOLOv5_NCNNREADMEissues上边都有说明,所以建议大家以后在遇到问题的时候,不妨先看看官方的说明文档上是否能找到解决方案~
  3. 本篇文章只针对demo进行说明,如果想了解什么是YOLOncnn,可以自行搜索。
  4. 本篇文章会一步一步的帮助大家把项目运行起来~
  5. 如果本篇文章有帮助到你,希望你顺手点个赞,满足一下我的虚荣心~😁

下面进入正题~

运行环境

亲测项目是可以在最新的设备和系统下运行的

前期准备

首先,我们先把demo下载到本地,然后按照README中的说明,将android_YOLOV5_NCNN\app\src\main\assets目录下的.param.bin文件复制到iOS_YOLOv5NCNN\YOLOv5NCNN\res目录下。

运行一下,果然有报错:


提示找不到opencv2的各种头文件,看了一下,项目中果然没有opencv2.framework

要解决这个问题,我们需要去github上边下载OpenCV

我下载的是说明文档中提到的4.3.0版本,大家可以根据需要下载其他的版本,或者下载作者提到的轻量级OpenCV:opencv-mobile

opencv2.framework添加到项目中,重新运行,再次报错:

这个错误作者有提到过,需要去ncnn官网下载或自行编译.framework(20201208)替换到工程中。

这里建议将glslangopenmpncnn,三个framework全部替换,如果只替换ncnn,则可能会引发其他问题,这个下边会提到。

需要提一下的是,网址中可下载的framework有四种:


bitcode就不说了,这里说下vulkan。大概的意思就是,vulkan库是用来支持GPU运行的,如果你需要运行GPU,就要下载vulkan版本的库,默认的库是不支持GPU的。

这里咱们下载不包含vulkan的基本库,添加到项目中,运行一下,这次没有错误了...才怪!

解决Expected identifier错误

按照说明文档配置了项目,运行还是会报错:


这个错误的大致意思是,编译器无法识别这个NO标识,仔细查看了一下,发现这三个错误都是在opencv2.framework的头文件中。

然后我发现,在报错的.hpp文件的最上方,有一个警告信息:

翻译过来就是,Apple的这个'NO'的宏定义,可能会导致构建冲突,需要在引入Apple的任何头文件之前先引入这个头文件。

也就是说,我们需要添加一个pch文件,然后将用到的opencv2头文件引入:

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

如果这时候还有错误,那大概是openmp.framework没有替换,可下载对应版本的库替换掉项目中的库。

好了,这下终于编译成功了!

unknown file type in 'glslang.framework/glslang'

如果你没有替换glslang.framework,并且你的xcode是15以上的版本的话,则可能会出现unknown file type in 'glslang.framework/glslang'的问题。

打开项目中的glslang.framework,右键显示包内容查看,文件目录如下:

双击打开glslang文件,发现该文件存储的是真正的库文件的路径(其他文件也是一样):

打开其他的framework对比发现,包里的对应文件是替身,而不是路径:

所以,报错的原因大概是,xcode 15之后,不再支持这种格式的framework了(亲测xcode 14.2没问题)。

将这个库替换掉之后,问题就解决了。

如何使用GPU模式(vulkan)

写在前边,这个demo的GPU模式可能有些问题,项目在CPU模式下运行是没问题的,但是切换到GPU模式就会crash。

我猜测应该还是各种库的版本问题,但是我尝试的将各种库替换了不同的版本,还是没有解决问题。

我打算后续继续尝试更多的版本搭配,若还是不能解决的话,就试着问下作者大大,如果有谁解决了这个问题,可以的话请告知在下解决办法~

接着说,要使用GPU模式,第一步要将库替换成vulkan版本的。

替换后尝试运行,提示'vulkan/vulkan.h' file not found

虽然其他framework都替换成vulkan版本的了,但我们的项目里缺少vulkan sdk本身,所以找不到相关头文件。

如何安装vulkan sdkncnn官网的FAQ部分有说明:

按照提示,打开对应的网址:

目前能下载到的最老版本是2021-12-03发布的1.2.198.1,和其他sdk作者推荐的版本发布日期(20201208)相差了将近一年,为了避免版本差异过大可能导致的未知问题,这里我们就下载最老的版本。

下载并安装完毕后,打开安装目录:


路径一般是“/Users/你的账户名/VulkanSDK/版本号”

按照说明,将MoltenVK.xcframework/ios-arm64/libMoltenVK.a(iOS只支持真机)和头文件include添加到项目当中:

别忘了在Header Search Path里添加对应头文件的路径,不然还是会报vulkan.h找不到的错的:

我遇到的问题都在这里了,如果大家还遇到了别的问题,欢迎留言讨论~

上一篇下一篇

猜你喜欢

热点阅读