美文网首页
基于ncnn的YOLOv5 demo iOS端问题汇总

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

作者: 樂幽 | 来源:发表于2024-02-17 22:59 被阅读0次

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

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

    下面进入正题~

    运行环境

    • 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)替换到工程中。

    这里建议将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找不到的错的:

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

    相关文章

      网友评论

          本文标题:基于ncnn的YOLOv5 demo iOS端问题汇总

          本文链接:https://www.haomeiwen.com/subject/gehvodtx.html