写在最前边(请务必看下)
- 写这篇文章的主要目的是分享一下自己在运行YOLOv5_NCNN这个demo时遇到的各种问题,如果不是这个demo的话,可能无法解决你的问题,仅做参考。
- 这个demo运行YOLOv8也是没问题的,本人亲测~
- 几乎所有的问题和解决方案,YOLOv5_NCNN的README和issues上边都有说明,所以建议大家以后在遇到问题的时候,不妨先看看官方的说明文档上是否能找到解决方案~
- 本篇文章只针对demo进行说明,如果想了解什么是YOLO和ncnn,可以自行搜索。
- 本篇文章会一步一步的帮助大家把项目运行起来~
- 如果本篇文章有帮助到你,希望你顺手点个赞,满足一下我的虚荣心~😁
下面进入正题~
运行环境
- Xcode:15.1
- MacOS:14
- iOS:17.1.2
- 设备型号:iPhone 15
亲测项目是可以在最新的设备和系统下运行的
前期准备
首先,我们先把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)替换到工程中。
这里建议将glslang,openmp,ncnn,三个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 sdk,ncnn官网的FAQ部分有说明:


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

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

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

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

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