【Copy攻城獅日志】基于MindSpore Lite開發目標檢測的安卓APP實戰
基于MindSpore Lite開發目標檢測的安卓APP實戰
“零”基礎的Copy攻城獅居然敢實戰MindSpore Lite開發目標檢測的安卓APP,誰給的勇氣?是梁靜茹嗎?
前言
大家好,我是Copy攻城獅胡琦,有幸參與華為業界首個全場景AI實戰營,今天是第1天學習,也是從小白到大牛邁出的第一步,俗話說“萬事難開頭,只怕有心人”,但愿今天的實戰能一把過。先說說我的基本情況,本人男,今年27歲,屬猴,身高1米75,體重……不好意思,走錯片場了。說正經的,我是一只前端猿,掐指一算這是我從業的第四個年頭了,對于AI、Python完全是小白,更別說全場景深度學習框架MindSpore,在此之前,只完成了“Hello MindSpore”--在華為云虛擬主機上安裝MindSpore的Docker鏡像跑通了LeNet模型(視頻鏈接:https://www.bilibili.com/video/BV1G***1L7kU?),實實在在的H(ello)W(orld)攻城獅。對于安卓開發,也是一知半解,盡管有豐富的React Native開發經驗,但涉及到APP原生開發,思維邏輯基本靠蒙,實現代碼基本靠抄。這次基于MindSpore Lite開發目標檢測的安卓APP實戰,我是十分有信心拿下的,要是不簡單怎么可能放在第一課呢?不啰嗦,開始今日份的Copy學習吧!
準備
既然是端側AI(On-Device AI),本次用到的端側就是安卓設備啦。其他的我們按照實踐操作的流程捋一捋(感謝MindSpores實戰營助教的疼愛):
1??模型訓練導出與轉換
需要具備的軟件基礎
?編程基礎(Python):參考鏈接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017063413904832
?Docker基礎:參考鏈接:https://www.runoob.com/docker/docker-command-manual.html
需要準備的硬件環境
?Ubuntu 16.04及以上 (GPU Cuda 10.1)
2??端側推理框架編譯
需要具備的軟件基礎
?git及shell腳本命令基礎: 參考鏈接:https://www.runoob.com/git/git-tutorial.html
https://www.runoob.com/w3cnote/shell-quick-start.html
需要準備的硬件環境
?Ubuntu 16.04及以上 (GPU Cuda 10.1)
3??APP編譯與運行
需要具備的軟件基礎
?編程基礎(Java): 參考鏈接:https://www.runoob.com/java/java-tutorial.html
?Android基礎知識(開發工具也需準備): 參考鏈接:https://www.runoob.com/w3cnote/android-tutorial-intro.html
需要準備的硬件環境
?Window / MacBook Pro
?安卓手機
直播地址:在B站搜索『MindSpore官方』賬號,進直播間上課:https://live.bilibili.com/22127570
為了整這個GPU環境,一宿沒睡,嘗試了各種方案,終于采用了論壇大佬的windows安裝wsl ubuntu的方案--在Win10游戲本中搭建MindSpore-GPU的深度學習環境。雖然我的機器不是游戲本,而且還是4年前的筆記本,為了信仰,值得冒險!當然整個過程也并不是順利,最終環境搭建還是失敗了,這次的確是硬件的問題。我那老人筆記本,在安裝完Ubuntu之后,硬盤空間不到1G了,盡管能安裝mindspore-gpu鏡像,但由于一些nvida的依賴無法再安裝,導致無法使用GPU。總體來說,社區大佬的指導是有意義的,如果想在windows上體驗mindspore-gpu,按照他的教程指導做就行了,前提是硬件最好足夠硬!雖然,本地搭建環境失敗,離成功可能只有1%,正是這1%讓我意識到:“有多大能耐,吃多少飯”,差點撐死了!當然,Copy攻城獅有個不服輸的個性--屢敗屢戰,無論走多少彎路,我依舊還能勉強堅持,于是轉戰云環境,想通過ModelArts使用mindspore訓練一個模型出來,再進行轉換編譯給到安卓App端能夠調用,可惜,礙于自己的實力短缺,瞎折騰了幾天,最后萬念俱灰,只好悻悻離去,不經反問自己:小白學什么AI?
盡管對訓練物體檢測模型并轉換編譯為mindspore-lite可用的這次實踐,最終以失敗告終,但是沒有澆滅我學習mindspore的熱情,起碼加持mindspore-lite的安卓應用我還是能跑起來的。對于從模型訓練到模型轉換再到編譯整個過程,我也算是有一定的理解了,下面基于小白的理解,回顧并鞏固一下Mindspore 21天訓練營的第一天學習。
模型訓練導出與轉換
鑒于我本地環境沒有搭建成功,我直接使用官網提供的預置終端模型--ssd.ms。訪問https://download.mindspore.cn/model_zoo/official/lite/可以獲取更多mindspore-lite模型,如googlenet、resnext50等。當然您還可以使用預置模型做遷移學習,以實現自己的模型,不過需要將模型導出為.mindir格式。然后使用MindSpore Lite模型轉換工具將.mindir模型轉換成.ms格式。Mindspore當前支持基于靜態圖,且不包含控制流語義的推理網絡導出。導出.mindir格式的代碼以resnet50為例:
from?mindspore.train.serialization?import?exportimport?numpy?as?np resnet?=?ResNet50()#?return?a?parameter?dict?for?modelparam_dict?=?load_checkpoint("resnet50-2_32.ckpt")#?load?the?parameter?into?netload_param_into_net(resnet,?param_dict)input?=?np.random.uniform(0.0,?1.0,?size=[32,?3,?224,?224]).astype(np.float32)export(resnet,?Tensor(input),?file_name='resnet50-2_32.mindir',?file_format='MINDIR')
然后我們還需要將.mindir模型轉換為端側可用的.ms模型,也就一行代碼的事:
./converter_lite?--fmk=MINDIR?--modelFile=ssd.mindir?--outputFile=ssd.ms
不過這行代碼能夠正常的運行的基礎離不開基礎環境的搭建,由于我這邊沒有成功搭建環境,那就只能直接用官方提供的預置模型了。
端側推理框架編譯
轉換模型后執行推理前,我們可以使用Benchmark工具對MindSpore Lite模型進行基準測試。它不僅可以對MindSpore Lite模型前向推理執行耗時進行定量分析(性能),還可以通過指定模型輸出進行可對比的誤差分析(精度)。本次實踐由于環境受限,就沒有實操基準測試部分,有興趣的小伙伴請移步官方文檔,有詳細的指導。端側推理部分可以使用C++的Runtime或者java的Runtime進行推理,本次實踐采用MindSpore Lite C++ API(Android JNI)以及MindSpore Lite 目標檢測模型完成端側推理,代碼來自MindSpore gitee倉庫。大概涉及到以下幾個步驟:
文件準備
文件準備這里我們配置MindSpore Lite依賴項和下載及部署模型文件。Android JNI層調用MIndSpore C++ API時需要引入相關的依賴,如MIndSpore Lite源碼編譯生成mindspore-lite-{version}-minddata-{os}-{device}.tar.gz庫文件包并解壓縮(包含libmindspore-lite.so庫文件和相關頭文件)。當然,源碼中提供download.gradle自動下載MindSpore Lite 版本文件,并放置在app/src/main/cpp/目錄下,如果您遇到自動下載失敗的情況可手動下載解壓并放置在對應的位置。此外還需在app/build.gradle文件中配置CMake編譯支持,以及arm64-v8a的編譯支持,最后還需在app/CMakeLists.txt文件中建立.so庫文件鏈接。
同樣的在download.gradle文件中會自動下載模型文件并放置在app/src/main/assets目錄下,如自動下載失敗可手動下載模型文件。
讀取模型及創建會話
在MindSpore Lite中,模型文件是從模型轉換工具轉換得到的.ms文件。進行模型推理時,需要從文件系統加載模型,并進行模型解析。使用MindSpore Lite執行推理時,Session是推理的主入口,通過Session我們可以進行圖編譯、圖執行。盡管我是小白,不會寫也看不懂代碼,不過結合文檔說明勉強能找到代碼的注釋,那么究竟要不要學C++呢?
圖編譯
在圖執行前,需要調用LiteSession的CompileGraph接口進行圖編譯,進一步解析從文件中加載的Model實例,主要進行子圖切分、算子選型調度。這部分會耗費較多時間,官方文檔建議LiteSession創建一次,編譯一次,多次執行。
輸入數據
在圖執行前,需要將輸入數據拷貝到模型的輸入Tensor。MindSpore Lite提供兩種方法來獲取模型的輸入Tensor:使用GetInputsByTensorName方法,根據模型輸入Tensor的名稱來獲取模型輸入Tensor中連接到輸入節點的Tensor;使用GetInputs方法,直接獲取所有的模型輸入Tensor的vector。本次實踐采用的是后者。此外通過MutableData方法進行數據拷貝。
圖執行及獲取輸出
MindSpore Lite會話在進行圖編譯以后,即可使用LiteSession的RunGraph進行模型推理。MindSpore Lite在執行完推理后,就可以獲取模型的推理結果,MindSpore Lite提供四種方法來獲取模型的輸出MSTensor。這里使用GetOutputByTensorName方法,根據模型輸出Tensor的名稱來獲取對應的模型輸出MSTensor。
此外在src\main\cpp\ssd_util\ssd_util.cpp文件中我們還能進行設置輸出矩形框、置信度篩選等操作。
APP編譯與運行
APP編譯與運行不是本文的重點,鑒于本大獅有React Native的開發經驗,跑通安卓APP還算不是很吃力,基本只要環境到位、網絡到位,蹭蹭蹭一把梭!最后放上APP運行的結果吧,希望大家多多指點!最后希望參與MindSpore 21天實戰營的小伙伴都有收獲!
唯一的坑
坑,本地環境的安裝對于我來說全是坑,直到最后棄坑!所以,但從APP的編譯與安裝來說,唯一的一個坑就是:電腦千萬別開熱點!我遇到的問題jh就是電腦開了熱點運行APP就提示本機連接失敗,導致Build進行直接死掉。不知道有沒有遇到類似問題的小伙伴?關于AI學習,還請各位大佬多多指教!
Android Studio MindSpore Android
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。