成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么加班的總是我:那個天天12點到崗的程序員,又準點下班陪女友了?!

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

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

但是,我有代碼呀 

[[283573]] 

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

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

 

直接集成NCNN的缺點

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

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

 

AOE SDK里的NCNN組件

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

  • NCNN組件的設計
  • 對SqueezeNet Sample的改造
  • 應用如何接入NCNN組件
  • 對NCNN組件的一些思考

NCNN組件的設計

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

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

而機智騷年本人,用的是這個: 

  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,提供給外部調用,提供模型加載,推理這些方法。
  • NativeInterpreterWrapper是具體的實現類,里面對native進行調用。
  • Tensor,主要是一些數據和native層的交互。

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

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

光說不練假把式,AOE NCNN的實現過程,且聽我細細道來。

★ 如何支持多輸入多輸出

為了支持多輸入和多輸出,我們在Native層創建了一個Tensor對象的列表,每個Tensor對象里保存了相關的輸入和輸出數據。Native層的Tensor對象,通過tensor_jni提供給java層調用,java層維護這個指向native層tensor的“指針”地址。這樣在有多輸入和多輸出的時候,只要拿到這個列表里的對應的Tensor,就可以就行數據的操作了。

★ ByteBuffer的使用

ByteBuffer,字節緩存區處理子節的,比傳統的數組的效率要高。

DirectByteBuffer,使用的是堆外內存,省去了數據到內核的拷貝,因此效率比用ByteBuffer要高。

當然ByteBuffer的使用方法不是我們要說的重點,我們說說使用了ByteBuffer以后,給我們帶來的好處:

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

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

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

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

★ 對SqueezeNet Sample的改造

集成AOE NCNN組件以后,讓SqueezeNet依賴NCNN Module,SqueezeNet Sample里面只包含了模型文件,前處理和后處理相關的業務邏輯,前處理和后處理可以用java,也可以用c來實現,由具體的業務實現來決定。新的代碼結構變得非常簡潔,目錄如下:

  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業務組件對NCNN組件的調用。

(牛逼就完事兒)

★ 應用如何接入NCNN組件

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

●直接接入 

 

●通過AOE SDK接入

 

▲兩種接入方式比較: 

 

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

★ 對NCNN組件的總結和思考

通過對NCNN組件的封裝,現在業務集成NCNN更加快捷方便了。之前我們一個新的業務集成NCNN,可能需要半天到一天的時間。使用AOE NCNN組件以后,可能只需要1-2小時的時間。當然NCNN組件目前還存在很多不完善的地方,我們對NCNN還需要去加深學習和理解。后面會通過不斷的學習,持續的對NCNN組件進行改造和優化。 

 

責任編輯:龐桂玉 來源: 普惠出行產品技術
相關推薦

2019-10-24 09:32:51

程序員python語言

2014-08-15 11:07:09

程序員

2018-09-10 09:18:30

程序員領導加班

2011-04-19 09:59:47

工資程序員

2017-11-10 10:18:42

程序員

2013-01-14 09:36:54

程序員程序員價值

2020-06-28 14:36:27

程序員技能開發者

2017-12-11 09:27:14

2012-08-07 09:24:57

程序員項目

2020-11-09 10:25:32

數據分析雙十一手機

2014-06-05 09:28:26

項目開發程序員

2017-07-26 10:57:29

程序員加班原因

2015-08-11 09:18:44

程序員最好

2020-12-02 10:37:35

程序員java開發

2020-11-23 08:31:02

程序員加班互聯網

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

程序員代碼練習
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区在线 | 青青久在线视频 | 老司机久久| 久久精品中文字幕 | 99精品视频免费在线观看 | 激情91| 亚洲综合第一页 | 久久激情网 | 99爱国产| 久久伊人精品一区二区三区 | 国产一区二区在线免费视频 | 日韩一区二区三区在线视频 | 香蕉国产在线视频 | 黄色大片在线免费观看 | 亚洲最大av网站 | 男女网站在线观看 | 色就是色欧美 | 国产99视频精品免费播放照片 | 最新中文字幕在线播放 | 中文字幕在线第一页 | 精品日韩 | 国内自拍视频在线观看 | 欧美激情视频一区二区三区在线播放 | 阿v视频在线观看 | av中文字幕在线观看 | 玖玖免费| 国产精品久久久久久久久久久久 | a级大毛片 | 午夜影院在线播放 | 国产精品我不卡 | 一级片视频免费 | 99热在线播放| 久久一区二区精品 | 中文字幕视频在线观看 | 91看国产 | 婷婷在线免费 | 亚洲高清在线观看 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 成人免费黄视频 | 国产一区精品在线 | 欧美日韩中文在线 |