寫(xiě)在最前邊(請(qǐng)務(wù)必看下)
- 寫(xiě)這篇文章的主要目的是分享一下自己在運(yùn)行YOLOv5_NCNN這個(gè)demo時(shí)遇到的各種問(wèn)題查牌,如果不是這個(gè)demo的話(huà)糖儡,可能無(wú)法解決你的問(wèn)題,僅做參考尼变。
- 幾乎所有的問(wèn)題和解決方案骂租,YOLOv5_NCNN的
README
和issues
上邊都有說(shuō)明蚊夫,所以建議大家以后在遇到問(wèn)題的時(shí)候券时,不妨先看看官方的說(shuō)明文檔上是否能找到解決方案~ - 本篇文章只針對(duì)demo進(jìn)行說(shuō)明,如果想了解什么是
YOLO
和ncnn
黄选,可以自行搜索蝇摸。 - 本篇文章會(huì)一步一步的幫助大家把項(xiàng)目運(yùn)行起來(lái)~
- 如果本篇文章有幫助到你,希望你順手點(diǎn)個(gè)贊办陷,滿(mǎn)足一下我的虛榮心~??
下面進(jìn)入正題~
運(yùn)行環(huán)境
- Xcode:15.1
- MacOS:14
- iOS:17.1.2
- 設(shè)備型號(hào):iPhone 15
親測(cè)項(xiàng)目是可以在最新的設(shè)備和系統(tǒng)下運(yùn)行的
前期準(zhǔn)備
首先貌夕,我們先把demo下載到本地,然后按照README中的說(shuō)明民镜,將android_YOLOV5_NCNN\app\src\main\assets
目錄下的.param
和.bin
文件復(fù)制到iOS_YOLOv5NCNN\YOLOv5NCNN\res
目錄下啡专。
運(yùn)行一下,果然有報(bào)錯(cuò):
提示找不到opencv2
的各種頭文件殃恒,看了一下植旧,項(xiàng)目中果然沒(méi)有opencv2.framework
:
要解決這個(gè)問(wèn)題,我們需要去github上邊下載OpenCV离唐。
我下載的是說(shuō)明文檔中提到的4.3.0
版本病附,大家可以根據(jù)需要下載其他的版本,或者下載作者提到的輕量級(jí)OpenCV:opencv-mobile亥鬓。
將opencv2.framework
添加到項(xiàng)目中完沪,重新運(yùn)行,再次報(bào)錯(cuò):
這個(gè)錯(cuò)誤作者有提到過(guò)嵌戈,需要去ncnn官網(wǎng)下載或自行編譯.framework(20201208)替換到工程中覆积。
這里建議將glslang
,openmp
熟呛,ncnn
宽档,三個(gè)framework全部替換,如果只替換ncnn
庵朝,則可能會(huì)引發(fā)其他問(wèn)題吗冤,這個(gè)下邊會(huì)提到又厉。
需要提一下的是,網(wǎng)址中可下載的framework有四種:
bitcode
就不說(shuō)了椎瘟,這里說(shuō)下vulkan
覆致。大概的意思就是,vulkan
庫(kù)是用來(lái)支持GPU
運(yùn)行的肺蔚,如果你需要運(yùn)行GPU
煌妈,就要下載vulkan
版本的庫(kù),默認(rèn)的庫(kù)是不支持GPU
的宣羊。
這里咱們下載不包含vulkan
的基本庫(kù)璧诵,添加到項(xiàng)目中,運(yùn)行一下段只,這次沒(méi)有錯(cuò)誤了...才怪腮猖!
解決Expected identifier錯(cuò)誤
按照說(shuō)明文檔配置了項(xiàng)目鉴扫,運(yùn)行還是會(huì)報(bào)錯(cuò):
這個(gè)錯(cuò)誤的大致意思是赞枕,編譯器無(wú)法識(shí)別這個(gè)NO
標(biāo)識(shí),仔細(xì)查看了一下坪创,發(fā)現(xiàn)這三個(gè)錯(cuò)誤都是在opencv2.framework
的頭文件中炕婶。
然后我發(fā)現(xiàn),在報(bào)錯(cuò)的.hpp
文件的最上方莱预,有一個(gè)警告信息:
翻譯過(guò)來(lái)就是柠掂,Apple的這個(gè)'NO'的宏定義,可能會(huì)導(dǎo)致構(gòu)建沖突依沮,需要在引入Apple的任何頭文件之前先引入這個(gè)頭文件涯贞。
也就是說(shuō),我們需要添加一個(gè)pch文件危喉,然后將用到的opencv2
頭文件引入:
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
如果這時(shí)候還有錯(cuò)誤宋渔,那大概是openmp.framework
沒(méi)有替換,可下載對(duì)應(yīng)版本的庫(kù)替換掉項(xiàng)目中的庫(kù)辜限。
好了皇拣,這下終于編譯成功了!
unknown file type in 'glslang.framework/glslang'
如果你沒(méi)有替換glslang.framework
薄嫡,并且你的xcode是15
以上的版本的話(huà)氧急,則可能會(huì)出現(xiàn)unknown file type in 'glslang.framework/glslang'
的問(wèn)題。
打開(kāi)項(xiàng)目中的glslang.framework
毫深,右鍵顯示包內(nèi)容查看吩坝,文件目錄如下:
雙擊打開(kāi)glslang
文件,發(fā)現(xiàn)該文件存儲(chǔ)的是真正的庫(kù)文件的路徑(其他文件也是一樣):
打開(kāi)其他的framework
對(duì)比發(fā)現(xiàn)哑蔫,包里的對(duì)應(yīng)文件是替身钉寝,而不是路徑:
所以手素,報(bào)錯(cuò)的原因大概是,xcode 15
之后瘩蚪,不再支持這種格式的framework
了(親測(cè)xcode 14.2沒(méi)問(wèn)題)泉懦。
將這個(gè)庫(kù)替換掉之后,問(wèn)題就解決了疹瘦。
如何使用GPU模式(vulkan)
寫(xiě)在前邊崩哩,這個(gè)demo的GPU
模式可能
有些問(wèn)題,項(xiàng)目在CPU
模式下運(yùn)行是沒(méi)問(wèn)題的言沐,但是切換到GPU
模式就會(huì)crash邓嘹。
我猜測(cè)應(yīng)該還是各種庫(kù)的版本問(wèn)題,但是我嘗試的將各種庫(kù)替換了不同的版本险胰,還是沒(méi)有解決問(wèn)題汹押。
我打算后續(xù)繼續(xù)嘗試更多的版本搭配,若還是不能解決的話(huà)起便,就試著問(wèn)下作者大大棚贾,如果有誰(shuí)解決了這個(gè)問(wèn)題,可以的話(huà)請(qǐng)告知在下解決辦法~
接著說(shuō)榆综,要使用GPU
模式妙痹,第一步要將庫(kù)替換成vulkan
版本的。
替換后嘗試運(yùn)行鼻疮,提示'vulkan/vulkan.h' file not found
:
雖然其他framework
都替換成vulkan
版本的了怯伊,但我們的項(xiàng)目里缺少vulkan sdk
本身,所以找不到相關(guān)頭文件判沟。
如何安裝vulkan sdk
耿芹,ncnn官網(wǎng)的FAQ
部分有說(shuō)明:
按照提示,打開(kāi)對(duì)應(yīng)的網(wǎng)址:
目前能下載到的最老版本是2021-12-03
發(fā)布的1.2.198.1
挪哄,和其他sdk作者推薦的版本發(fā)布日期(20201208)相差了將近一年吧秕,為了避免版本差異過(guò)大可能導(dǎo)致的未知問(wèn)題,這里我們就下載最老的版本中燥。
下載并安裝完畢后寇甸,打開(kāi)安裝目錄:
按照說(shuō)明,將MoltenVK.xcframework/ios-arm64/libMoltenVK.a(iOS只支持真機(jī))
和頭文件include
添加到項(xiàng)目當(dāng)中:
別忘了在Header Search Path
里添加對(duì)應(yīng)頭文件的路徑疗涉,不然還是會(huì)報(bào)vulkan.h找不到
的錯(cuò)的:
我遇到的問(wèn)題都在這里了拿霉,如果大家還遇到了別的問(wèn)題,歡迎留言討論~