偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

為什么加班的總是我:那個(gè)天天12點(diǎn)到崗的程序員,又準(zhǔn)點(diǎn)下班陪女友了?!

人工智能
不懂NCNN的組件設(shè)計(jì),即使一頓操作猛如虎,你可能最后也只有兩塊五。那它的組件是什么嘞?NCNN組件的設(shè)計(jì)理念是組件里不包含具體的業(yè)務(wù)邏輯,只包含對NCNN接口的封裝和調(diào)用。

作為我司頭發(fā)儲量前三的程序員始終仗著頭發(fā)多奮斗在加班的第一線時(shí)時(shí)靈魂拷問自己年輕人,你憑什么不加班?雖然我沒有女朋友

但是,我有代碼呀 

[[283573]] 

但我不明白的是,隔壁工位那個(gè),到崗比我遲,下班比我早,天天準(zhǔn)點(diǎn)兒下班接女朋友,工作還完成的不錯(cuò)的樣子,當(dāng)然,頭發(fā)也還不錯(cuò)。除了長得比我顯老,難道他有什么制勝法寶嗎?趁著午休,以一禮拜咖啡為代價(jià),我偷師了他的制勝法寶。

GET了秘訣,或許我也可以事業(yè)愛情雙豐收了。 

 

直接集成NCNN的缺點(diǎn)

直接集成NCNN熬老少男顏哇,想當(dāng)年我一邊淚流滿面地集成,一邊想用女友的SK2給自己的臉補(bǔ)補(bǔ)(不,你沒有,both SK2和女友),咋回事兒呢,為SqueezeNet接入NCNN,把相關(guān)的模型文件,NCNN的頭文件和庫,JNI調(diào)用,前處理和后處理相關(guān)業(yè)務(wù)邏輯等。把這些內(nèi)容都放在SqueezeNet Sample工程里。這樣簡單直接的集成方法,問題也很明顯,和業(yè)務(wù)耦合比較多,不具有通用性,前處理后處理都和SqueezeNcnn這個(gè)Sample有關(guān),不能很方便地提供給其他業(yè)務(wù)組件使用。深入思考一下,如果我們把AI業(yè)務(wù),作為一個(gè)一個(gè)單獨(dú)的AI組件提供給業(yè)務(wù)的同學(xué)使用,會發(fā)生這樣的情況: 

每個(gè)組件都要依賴和包含NCNN的庫,而且每個(gè)組件的開發(fā)同學(xué),都要去熟悉NCNN的接口,寫C的調(diào)用代碼,寫JNI。所以我們很自然地會想到要提取一個(gè)NCNN的組件出來,提取以后呢長得順眼了很多,大概是這個(gè)樣子。 

 

AOE SDK里的NCNN組件

有了AOE SDK,我也可以一頓操作猛如虎了!在AOE開源SDK里,我們提供了NCNN組件,下面我們從4個(gè)方面來講一講NCNN組件:

  • NCNN組件的設(shè)計(jì)
  • 對SqueezeNet Sample的改造
  • 應(yīng)用如何接入NCNN組件
  • 對NCNN組件的一些思考

NCNN組件的設(shè)計(jì)

不懂NCNN的組件設(shè)計(jì),即使一頓操作猛如虎,你可能最后也只有兩塊五。那它的組件是什么嘞?NCNN組件的設(shè)計(jì)理念是組件里不包含具體的業(yè)務(wù)邏輯,只包含對NCNN接口的封裝和調(diào)用。具體的業(yè)務(wù)邏輯,由業(yè)務(wù)方在外部實(shí)現(xiàn)。在接口定義和設(shè)計(jì)上,我們參考了TF Lite的源碼和接口設(shè)計(jì)。目前提供的對外調(diào)用接口,長這個(gè)樣子:

  1. // 加載模型和param 
  2. void loadModelAndParam(...) 
  3. // 初始化是否成功 
  4. boolean isLoadModelSuccess() 
  5. // 輸入rgba數(shù)據(jù) 
  6. void inputRgba(...) 
  7. // 進(jìn)行推理 
  8. void run(...) 
  9. // 多輸入多輸出推理 
  10. void runForMultipleInputsOutputs(...) 
  11. // 得到推理結(jié)果 
  12. Tensor getOutputTensor(...) 
  13. // 關(guān)閉和清理內(nèi)存 
  14. void close() 

而機(jī)智騷年本人,用的是這個(gè): 

  1. ├── AndroidManifest.xml 
  2. ├── cpp 
  3. │   └── ncnn 
  4. │       ├── c_api_internal.h 
  5. │       ├── include 
  6. │       ├── interpreter.cpp 
  7. │       ├── Interpreter.h 
  8. │       ├── jni_util.cpp 
  9. │       ├── jni_utils.h 
  10. │       ├── nativeinterpreterwrapper_jni.cpp 
  11. │       ├── nativeinterpreterwrapper_jni.h 
  12. │       ├── tensor_jni.cpp 
  13. │       └── tensor_jni.h 
  14. ├── java 
  15. │   └── com 
  16. │       └── didi 
  17. │           └── aoe 
  18. │               └── runtime 
  19. │                   └── ncnn 
  20. │                       ├── Interpreter.java 
  21. │                       ├── NativeInterpreterWrapper.java 
  22. │                       └── Tensor.java 
  23. └── jniLibs 
  24.     ├── arm64-v8a 
  25.     │   └── libncnn.a 
  26.     └── armeabi-v7a 
  27.         └── libncnn.a 
  • Interpreter,提供給外部調(diào)用,提供模型加載,推理這些方法。
  • NativeInterpreterWrapper是具體的實(shí)現(xiàn)類,里面對native進(jìn)行調(diào)用。
  • Tensor,主要是一些數(shù)據(jù)和native層的交互。

AOE NCNN用的好,任務(wù)完成早,奧秘在此。

  • 支持多輸入多輸出。
  • 使用ByteBuffer來提升效率。
  • 使用Object作為輸入和輸出(實(shí)際支持了ByteBuffer和多維數(shù)組)。

光說不練假把式,AOE NCNN的實(shí)現(xiàn)過程,且聽我細(xì)細(xì)道來。

★ 如何支持多輸入多輸出

為了支持多輸入和多輸出,我們在Native層創(chuàng)建了一個(gè)Tensor對象的列表,每個(gè)Tensor對象里保存了相關(guān)的輸入和輸出數(shù)據(jù)。Native層的Tensor對象,通過tensor_jni提供給java層調(diào)用,java層維護(hù)這個(gè)指向native層tensor的“指針”地址。這樣在有多輸入和多輸出的時(shí)候,只要拿到這個(gè)列表里的對應(yīng)的Tensor,就可以就行數(shù)據(jù)的操作了。

★ ByteBuffer的使用

ByteBuffer,字節(jié)緩存區(qū)處理子節(jié)的,比傳統(tǒng)的數(shù)組的效率要高。

DirectByteBuffer,使用的是堆外內(nèi)存,省去了數(shù)據(jù)到內(nèi)核的拷貝,因此效率比用ByteBuffer要高。

當(dāng)然ByteBuffer的使用方法不是我們要說的重點(diǎn),我們說說使用了ByteBuffer以后,給我們帶來的好處:

1.接口里的字節(jié)操作更加便捷,例如里面的putInt,getInt,putFloat,getFloat,flip等一系列接口,可以很方便的對數(shù)據(jù)進(jìn)行操作。

2.和native層做交互,使用DirectByteBuffer,提升了效率。我們可以簡單理解為java層和native層可以直接對一塊“共享”內(nèi)存進(jìn)行操作,減少了中間的字節(jié)的拷貝過程。

★ 如何使用Object作為輸入和輸出

目前我們只支持了ByteBuffer和MultiDimensionalArray。在實(shí)際的操作過程中,如果是ByteBuffer,我們會判斷是否是direct buffer,來進(jìn)行不同的讀寫操作。如果是MultiDimensionalArray,我們會根據(jù)不同的數(shù)據(jù)類型(例如int, float等),維度等,來對數(shù)據(jù)進(jìn)行讀寫操作。

★ 對SqueezeNet Sample的改造

集成AOE NCNN組件以后,讓SqueezeNet依賴NCNN Module,SqueezeNet Sample里面只包含了模型文件,前處理和后處理相關(guān)的業(yè)務(wù)邏輯,前處理和后處理可以用java,也可以用c來實(shí)現(xiàn),由具體的業(yè)務(wù)實(shí)現(xiàn)來決定。新的代碼結(jié)構(gòu)變得非常簡潔,目錄如下:

  1. ├── AndroidManifest.xml 
  2. ├── assets 
  3. │   └── squeeze 
  4. │       ├── model.config 
  5. │       ├── squeezenet_v1.1.bin 
  6. │       ├── squeezenet_v1.1.id.h 
  7. │       ├── squeezenet_v1.1.param.bin 
  8. │       └── synset_words.txt 
  9. └── java 
  10.     └── com 
  11.         └── didi 
  12.             └── aoe 
  13.                 └── features 
  14.                 │       ├── squeezenet_v1.1.id.h 
  15. │       ├── squeezenet_v1.1.param.bin 
  16. │       └── synset_words.txt 
  17. └── java 
  18.     └── com 
  19.         └── didi   
  20.          └── aoe 
  21.                 └── features 
  22.                     └── squeeze 
  23.                         └── SqueezeInterpreter.java 

↑ 本Sample也適用于其他的AI業(yè)務(wù)組件對NCNN組件的調(diào)用。

(牛逼就完事兒)

★ 應(yīng)用如何接入NCNN組件

對NCNN組件的接入,有兩種方式

●直接接入 

 

●通過AOE SDK接入

 

▲兩種接入方式比較: 

 

不BATTLE了,我單方面宣布,AOE SDK完勝!

★ 對NCNN組件的總結(jié)和思考

通過對NCNN組件的封裝,現(xiàn)在業(yè)務(wù)集成NCNN更加快捷方便了。之前我們一個(gè)新的業(yè)務(wù)集成NCNN,可能需要半天到一天的時(shí)間。使用AOE NCNN組件以后,可能只需要1-2小時(shí)的時(shí)間。當(dāng)然NCNN組件目前還存在很多不完善的地方,我們對NCNN還需要去加深學(xué)習(xí)和理解。后面會通過不斷的學(xué)習(xí),持續(xù)的對NCNN組件進(jìn)行改造和優(yōu)化。 

 

責(zé)任編輯:龐桂玉 來源: 普惠出行產(chǎn)品技術(shù)
相關(guān)推薦

2019-10-24 09:32:51

程序員python語言

2014-08-15 11:07:09

程序員

2018-09-10 09:18:30

程序員領(lǐng)導(dǎo)加班

2011-04-19 09:59:47

工資程序員

2017-11-10 10:18:42

程序員

2013-01-14 09:36:54

程序員程序員價(jià)值

2020-06-28 14:36:27

程序員技能開發(fā)者

2017-12-11 09:27:14

2012-08-07 09:24:57

程序員項(xiàng)目

2020-11-09 10:25:32

數(shù)據(jù)分析雙十一手機(jī)

2014-06-05 09:28:26

項(xiàng)目開發(fā)程序員

2017-07-26 10:57:29

程序員加班原因

2015-08-11 09:18:44

程序員最好

2020-12-02 10:37:35

程序員java開發(fā)

2020-11-23 08:31:02

程序員加班互聯(lián)網(wǎng)

2019-03-11 08:56:50

程序員美國工作

2019-09-27 15:54:04

程序員人生第一份工作跳槽那些事兒

2018-07-24 11:21:25

程序員加班月薪

2013-03-19 10:18:07

程序員

2017-12-15 13:07:35

程序員代碼練習(xí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號