寫在最前邊(請務必看下)
- 寫這篇文章的主要目的是分享一下自己在運行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找不到
的錯的:
我遇到的問題都在這里了,如果大家還遇到了別的問題,歡迎留言討論~