基于ncnn的YOLOv5 demo iOS端问题汇总
写在最前边(请务必看下)
- 写这篇文章的主要目的是分享一下自己在运行YOLOv5_NCNN这个demo时遇到的各种问题,如果不是这个demo的话,可能无法解决你的问题,仅做参考。
- 几乎所有的问题和解决方案,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)相差了将近一年,为了避免版本差异过大可能导致的未知问题,这里我们就下载最老的版本。
下载并安装完毕后,打开安装目录:
路径一般是“/Users/你的账户名/VulkanSDK/版本号”
按照说明,将MoltenVK.xcframework/ios-arm64/libMoltenVK.a(iOS只支持真机)
和头文件include
添加到项目当中:
别忘了在Header Search Path
里添加对应头文件的路径,不然还是会报vulkan.h找不到
的错的:
我遇到的问题都在这里了,如果大家还遇到了别的问题,欢迎留言讨论~