假設(shè)您已經(jīng)使用了mediapipe一段時間肠仪,是否和我的想法一樣著摔。
為什么是mediapipe
1)對ML開發(fā)者來說坊饶,MP(mediapipe)可以大大簡化工程架構(gòu)方面的開發(fā)工作洞渔。
2)對于Google來說,MP可以幫助tensorflow的推廣驾锰,形成矩陣產(chǎn)品。
極致的優(yōu)雅
優(yōu)雅的架構(gòu)理念走越,優(yōu)雅的OOP程序設(shè)計椭豫,優(yōu)化的代碼編寫細(xì)節(jié),能遇到你真棒旨指!
數(shù)據(jù)結(jié)構(gòu)--packet
packet是MP中傳遞數(shù)據(jù)的封裝格式赏酥。MP已有算子中的packet均使用共享指針的方式傳遞內(nèi)存對象。
數(shù)據(jù)結(jié)構(gòu)--stream
stream是算子多線程運行的核心思想淤毛,算子的運行時依靠數(shù)據(jù)驅(qū)動的今缚,當(dāng)算子需要的所有數(shù)據(jù)到齊后算子開始process。stream巧妙的完成了算子的多線程調(diào)度低淡。
數(shù)據(jù)結(jié)構(gòu)--calculator
calculator的存在是為了復(fù)用姓言。當(dāng)積木足夠多時,就可以搭建漂亮的大樓蔗蹋,算子就是積木何荚。如果你想使用一大塊木料直接制作大樓,將其直接作為一大塊積木猪杭,這樣也挺不錯的餐塘,只是缺乏復(fù)用性。
MP的優(yōu)雅很大程度上體現(xiàn)在算子的拆分上皂吮,一個通用的計算就值得封裝成一個算子戒傻。
數(shù)據(jù)結(jié)構(gòu)--graph
graph就是算子拼成的大廈,一個合法的graph不能存在數(shù)據(jù)流轉(zhuǎn)的環(huán)裝結(jié)構(gòu)蜂筹,graph描述的有向圖使用類似json的文本配置需纳,在初始化時就確定了,它是靜態(tài)的艺挪。
有向圖配置的合法性校驗僅在初始化時做一次不翩,后續(xù)可能出現(xiàn)數(shù)據(jù)斷流引發(fā)的卡死問題,這和graph無關(guān)麻裳,每個算子都要保證在任意情況下都要將數(shù)據(jù)傳遞下去口蝠,即便是無意義的數(shù)據(jù),因為數(shù)據(jù)驅(qū)動津坑。
graph可以嵌套使用妙蔗,這一切都是為了復(fù)用。子graph就如同一個大算子疆瑰。
配套設(shè)施
MP提供了一些工具眉反,包括graph可視化工具狞谱,這是一個web應(yīng)用。
并且提供了profile和tracing的工具禁漓。
這些工具都不太好用。也許MP的用戶量足夠大孵睬,才值得擁有完善的工具鏈播歼。
性能
MP是深度基于tensorflow和opencv的,性能一方面取決于算子邏輯掰读,一方面取決于opencv和TF在此平臺上的運行性能秘狞。
MP現(xiàn)有的ML demo如果用于學(xué)習(xí)交流,性能是足夠的蹈集。
跨平臺
MP的代碼組織基于bazel烁试,framework的設(shè)計編寫盡量避免平臺相關(guān)性。
是否跨平臺很大取決于:
1)算子使用到的算方庫是否跨平臺拢肆。
2)目標(biāo)平臺的硬件性能是否足夠减响。
代碼復(fù)用
從架構(gòu)上來說,算子的復(fù)用非常方便郭怪。
算子的編寫應(yīng)該考慮復(fù)用性問題支示,包括跨平臺的復(fù)用性。設(shè)計之初即在注釋中聲明目標(biāo)適配平臺鄙才、輸入輸出颂鸿,以便于復(fù)用。
MP的代碼是bazel組織的攒庵,一般來說很難直接被VS嘴纺、Android studio、Xcode直接使用浓冒≡钥剩可以使用bazel編譯成sdk的方式提供給app開發(fā)者,無法整體聯(lián)編裆蒸。IDE一般來說對cmake兼容性較好熔萧,bazel plugin在IntelliJ上(包括AS)并不易用,bazel plugin被設(shè)計成使用全部使用bazel來編譯工程僚祷,而非bazel佛致、gradle、cmake辙谜、ninja相互配合俺榆,對于Android開發(fā)者來說放棄gradle開發(fā)app是不太現(xiàn)實的。
同類型框架比較
DStream装哆,線性數(shù)據(jù)流轉(zhuǎn)罐脊,待補充定嗓。。
優(yōu)缺點
方便算子開發(fā)萍桌,復(fù)用宵溅。這里包括:
- 方便的算子單測方案
- 方便的算子profile
- 方便的算子性能標(biāo)準(zhǔn)設(shè)定
方便控制算子并行串行運算關(guān)系
通過類似json的文本配置就可以做到,非常優(yōu)雅
深度基于TF
對于希望更換inference庫的ML開發(fā)者來說很不友好上炎,將TF連根拔起至少需要刪除70%的代碼恃逻。
靜態(tài)圖
為什么不是動態(tài)圖呢?有些時候某個算子是否運算是需要根據(jù)實際來數(shù)據(jù)決定的藕施,如果檢測不到人臉就不需要提取人臉關(guān)鍵點和位姿信息寇损,但是對于靜態(tài)圖來說為了滿足數(shù)據(jù)確定,我們必須要傳遞數(shù)據(jù)進入關(guān)鍵點算子和位姿算子裳食,實際上些算子僅做了判斷和跳過矛市。我們希望沒有人臉時就直接返回結(jié)果,這就需要動態(tài)圖诲祸。
對于移動端來說過于笨重
MP framework將近10M浊吏,這還是將TF裁去之后。