91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何把Tengine Python API移植到Tengine Lite上

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-15 00:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大佬說選擇移植Tengine Python API這個任務(wù),一方面是因為他之前做過涉及Python和C++/C交互的開源項目工作,如 MXNet 中DLPack的Python API和他自己的開源項目 MobulaOP,這些工作讓他踩了不少的坑;另一方面是因為他認為,了解一個框架需要先把例子跑起來, 就像學(xué)習(xí)一門新的編程語言要先跑通它的Hello World程序。通過這次任務(wù),可以了解基于Tengine Lite的圖像分類實現(xiàn),對TengineLite有一個初始的、直觀的感受。

以下為大佬第一人稱自述/~

初探源碼

這個任務(wù)的工作可以用一句話來概括: 在Tengine跑起Python例子, 再在Tengine Lite跑起同樣的例子。

第一步需要找到Tengine Python API的例子。但Tengine沒有的Python例子, 也沒有Python API的文檔。想從單元測試入手,但也沒有Python API的單元測試,難怪移植Python API的任務(wù)難度比移植C++ API的任務(wù)難度高。還有什么方法可以了解Python API的用法呢? 閱讀源碼。Tengine的Python API放在pytengine文件夾, 里面有八個模塊,分別是:base、context、device、 graph、libinfo、node、tengine和tensor,可以重點關(guān)注base, graph和tensor。

從base.py源碼中可以看出Tengine使用ctypes的形式進行Python和C++/C的交互,把動態(tài)鏈接庫libtengine.so讀取后保存到變量/_LIB中,通過/_LIB.可以調(diào)用Tengine的C API. graph.py實現(xiàn)計算圖部分的API,tensor.py實現(xiàn)了作為輸入和輸出的張量API。

編譯和導(dǎo)入模塊

找到Python API代碼的位置后,編譯Tengine,并嘗試在Python中導(dǎo)入tengine模塊。從libinfo.py中可以了解到,Tengine Python API會在Python API目錄和環(huán)境變量LD/_LIBRARY/_PATH所指向的目錄中,查找動態(tài)鏈接庫libtengine.so.這時遇到了第一個Bug,我用的操作系統(tǒng)沒有定義LD/_LIBRARY/_PATH這個環(huán)境變量,而API里直接用下標(biāo)訪問的形式取這個環(huán)境變量的值,出現(xiàn)了KeyError的錯誤。改成os.environ.get('LD/_LIBRARY/_PATH', '')即可。設(shè)置好動態(tài)鏈接庫的路徑后,可以成功導(dǎo)入pytengine模塊了。

編寫Python分類示例

Tengine提供C++/C的分類示例代碼,在examples目錄下,可以作為編寫Python例子時的參考。其中,classification.cpp用了Tengine的C++ API,比C API多了Net類的封裝,Net類封裝了對于計算圖Graph的操作。而classification/_old/_api.cpp用的是Tengine的C API. 由于Tengine Python API調(diào)用的是Tengine C API,因此可以拿classification/_old/_api.cpp作為參考。Tengine Python API封裝得很簡潔,很容易能找到每個Python函數(shù)調(diào)用的C函數(shù)。C++分類示例代碼和Python API的代碼互相對照,就可以寫出Python分類示例的代碼。寫完后就可以嘗試運行了。

運行Python分類示例

運行Python分類示例并不順利,一開始就在構(gòu)建計算圖上出錯了。定位到Python API的源碼后, 發(fā)現(xiàn)是在以下兩行出錯。

# pytengine/tengine/graph.py:L24-L25 
params = [ c_str(item) for item in kwarg] 
self.graph = _LIB.create_graph(ctypes.c_void_p(context), c_str(model), *params)

create/_graph有三個參數(shù): 第一個參數(shù)context是模型執(zhí)行的上下文,第二個參數(shù)是模型的格式,第三個參數(shù)是模型的文件名。這兩行代碼看起來沒什么毛病,和C++例子里的調(diào)用方式是一模一樣的。但出錯的原因就在給變量params賦值的這一行,里面的item是一個臨時變量,當(dāng)這條語句結(jié)束時,item離開了作用域就被釋放了。而c/_str(item)是指向原來item的位置,變成了一個野指針。為了解決這個問題,可以把該行改為params = [ c/_str(kwarg[i]) for i in range(len(kwarg)) ],此時c/_str(kwarg[i])指向的是變量kwargs中存儲的值,變量kwargs在調(diào)用函數(shù)create/_graph時仍在作用域內(nèi)。

另外遇到的一個復(fù)雜的問題和Tensor類有關(guān), pytengine的Tensor類還不完善,無法取出Tensor里的數(shù)據(jù).。對照C語言寫的例子修改Tensor的buf函數(shù),得到數(shù)據(jù)內(nèi)存地址,占用的內(nèi)存大小,類型,尺寸后,轉(zhuǎn)換為NumPy數(shù)組。 需要注意一下Tengine Lite前端的執(zhí)行步驟:

# 建立計算圖并讀取模型文件
tm_file graph = tg.Graph(None, 'tengine', tm_file) 
# 取出輸入
Tensor input_tensor = graph.getInputTensor(0, 0) 
# 設(shè)置輸入Tensor的尺寸 
dims = [1, 3, img_h, img_w] 
input_tensor.shape = dims
# 預(yù)先運行以分配資源, 必須加上 
graph.preRun() 
# 設(shè)置輸入數(shù)據(jù)的內(nèi)存地址, 這里的data是尺寸為(3, img_h, img_w)的NumPy數(shù)組. 注意: 這里不會檢查shape 
input_tensor.buf = data
# 以同步方式讓網(wǎng)絡(luò)進行推斷(前向傳播), 其中1表示使用同步的方式 
graph.run(1) # 1 is blocking 
# 取出輸出的Tensor 
output_tensor = graph.getOutputTensor(0, 0) 
# 將Tensor轉(zhuǎn)為NumPy數(shù)組 
output = np.array(output_tensor.buf)

把這些問題解決后,就能在Tengine上運行Python示例了。

需要注意的是,Tengine Lite和Tengine在做推斷前,都需要調(diào)用preRun()函數(shù)對資源進行分配,這是必須要調(diào)用的。 雖然現(xiàn)在的Python API用起來有點復(fù)雜,但相信之后會封裝得更好的。

從Tengine到Tengine Lite

在Tengine上成功運行Python示例后,移植就變得方便了。直接把pytengine文件夾下的所有代碼, 以及Python分類示例復(fù)制粘貼到Tengine Lite中,將動態(tài)庫名稱從libtengine.so改為libtengine-lite.so, 然后運行Python分類示例。不出意料,出錯了。 原因是Tengine Lite在設(shè)置輸入Tensor的數(shù)據(jù)內(nèi)存地址時,也會檢查數(shù)據(jù)的大小,而之前的Python API的數(shù)據(jù)大小的計算是錯誤的。 修復(fù)Bug后, 成功在Tengine Lite上運行圖像分類示例。移植完成。不得不夸一下Tengine Lite的C API兼容性做得真好!

在EAIDK-310上運行Tengine Lite的Python圖像分類示例

之前參加OPEN AI LAB的活動,得到了一塊EAIDK-310開發(fā)板, 剛好可以在上面進行測試。
這里使用可愛的虎貓(Tiger Cat)作為測試圖片,模型采用MobileNet。 圖片和模型都可以在Tengine項目的頁面中找到鏈接 (Tengine快速上手指南)。

下載代碼

[openailab@localhost proj]$ git clone https://github.com/OAID/Tengine 
# 進入Tengine的目錄 
cd Tengine 
[openailab@localhost Tengine]$ git branch 
* tengine-lite

當(dāng)前Tengine的默認分支是Tengine Lite。

2. 編譯Tengine Lite

mkdir build 
cd build 
cmake .. 
make -j2

注意不要把編譯線程數(shù)設(shè)太大,因為在最后編譯MobileNet SSD例子時消耗顯存比較多。六分鐘多可以編譯完。

3. 配置Tengine Lite的Python API編輯/home/openailab/.bashrc,再最后一行后面加入:

export TENGINE_LITE_PATH=/home/openailab/proj/Tengine 
export PYTHONPATH=$PYTHONPATH:$TENGINE_LITE_PATH/pytengine 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TENGINE_LITE_PATH/build/src/

環(huán)境變量TENGINE_LITE_PATH設(shè)置為Tengine Lite的根目錄路徑, 設(shè)置好后重新打開終端。 打開Python, 能成功導(dǎo)入tengine。

[openailab@localhost examples]$ python 
Python 3.6.5 (default, Mar 29 2018, 17:45:40) 
[GCC 8.0.1 20180317 (Red Hat 8.0.1-0.19)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import tengine

4. 將三個文件cat.jpg/, mobilenet.tmfile/, synset/_words.txt放在examples的目錄下, 文件結(jié)構(gòu)如下所示:

[openailab@localhost examples]$ pwd 
/home/openailab/proj/Tengine/examples

[openailab@localhost examples]$ tree 
. 
├── cat.jpg 
├── classification.py 
├── mobilenet.tmfile 
├── synset_words.txt

5. 運行examples文件夾下的圖像分類示例classification.py

[openailab@localhost examples]$ python classification.py 
n02123159 tiger cat 8.5975923538208 
n02119022 red fox, Vulpes vulpes 7.954988956451416 
n02119789 kit fox, Vulpes macrotis 7.867891311645508 
n02113023 Pembroke, Pembroke Welsh corgi 7.427407264709473 
n02123045 tabby, tabby cat 6.364651679992676

由此,就能夠在Tengine Lite上正確預(yù)測出虎貓啦 : )

下一步工作

對于Tengine Lite Python API,我覺得在API設(shè)計方面可以進一步改進。比如把數(shù)據(jù)預(yù)處理, 計算圖構(gòu)建等操作隱藏起來,比如:

image = cv2.imread('./cat.jpg') 
model = tg.Model(tm_file) 
pred = model(image)

這樣可以減少出錯概率, 一些錯誤比如忘記對數(shù)據(jù)做預(yù)處理,使用的數(shù)據(jù)內(nèi)存分布(NCHW還是NHWC)不正確,忘記調(diào)用prerun。

本次Tengine Python API移植任務(wù),大佬做的工作是編寫一個Python的圖像分類示例,在Tengine上跑通代碼,再將pytengine移植(復(fù)制)到Tengine Lite上, 再在Tengine Lite上跑通代碼,其中還修復(fù)了pytengine中的一些bug。

更多Tengine相關(guān)內(nèi)容請關(guān)注Tengine-邊緣AI推理框架專欄。

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90076
  • Tengine
    +關(guān)注

    關(guān)注

    1

    文章

    47

    瀏覽量

    3253
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    淘寶評論API接入后

    API 調(diào)用與數(shù)據(jù)處理示例(Python) 1. 核心代碼(可直接運行) python 運行 ? import requ
    的頭像 發(fā)表于 02-24 15:24 ?79次閱讀

    1688 商品詳情 API 調(diào)用與數(shù)據(jù)解析 Python 實戰(zhàn)

    你想要的是 1688 商品詳情 APIPython 調(diào)用與數(shù)據(jù)解析實戰(zhàn)方案,核心是完成 API 憑證配置、接口請求(含簽名)、響應(yīng)數(shù)據(jù)解析、異常處理 的全流程落地,我會提供可直接運行的代碼,并
    的頭像 發(fā)表于 02-10 11:23 ?273次閱讀

    嘗試將oreboot移植visionfive,請問如何能將其刷內(nèi)存?

    我在嘗試將oreboot移植visionfive,請問如何能將其刷內(nèi)存?可以使用secondboot來替換uboot嘛?大小有限制的
    發(fā)表于 02-06 06:13

    淘寶API SDK快速開發(fā)指南

    ? 本文將指導(dǎo)開發(fā)者快速接入淘寶開放平臺API,通過官方SDK實現(xiàn)高效調(diào)用。以下為關(guān)鍵步驟: 1. 環(huán)境準(zhǔn)備 安裝Python SDK包: ? pip install
    的頭像 發(fā)表于 01-19 15:02 ?268次閱讀
    淘寶<b class='flag-5'>API</b> SDK快速開發(fā)指南

    微店商品列表API接口指南

    本文介紹關(guān)于微店商品列表 API 接口的完整指南,包含前言、接口概述、Python 請求示例和結(jié)語四個核心部分,我會按照這個結(jié)構(gòu)為你提供專業(yè)、易上手的指南,覆蓋接口調(diào)用的核心流程,適合編程新手
    的頭像 發(fā)表于 01-07 11:38 ?989次閱讀

    淘寶商品詳情API接口技術(shù)解析與實戰(zhàn)應(yīng)用

    出發(fā),系統(tǒng)解析淘寶商品詳情API接口的調(diào)用機制、數(shù)據(jù)結(jié)構(gòu)及典型應(yīng)用場景,并附上基于Python的完整調(diào)用示例,助力開發(fā)者高效集成商品數(shù)據(jù)服務(wù)。 關(guān)鍵詞 淘寶開放平臺;商品詳情API;RESTful接口;數(shù)據(jù)解析;
    的頭像 發(fā)表于 11-04 09:50 ?354次閱讀

    Python調(diào)用API教程

    兩個不同系統(tǒng)之間的信息交互。在這篇文章中,我們將詳細介紹Python調(diào)用API的方法和技巧。 一、用Requests庫發(fā)送HTTP請求 使用Python調(diào)用API的第一步是發(fā)送HTTP
    的頭像 發(fā)表于 11-03 09:15 ?896次閱讀

    移植蜂鳥e203內(nèi)核A7lite開發(fā)板上相關(guān)問題的解決辦法

    Include: 第六步:將上述的約束文件變更為自己所需要的約束規(guī)則。 最后: 分析綜合,將高級抽象層次的電路描述轉(zhuǎn)化為較低層次的描述 下圖為綜合報告: 完成布局布線: 至此,我們已經(jīng)完成并解決了蜂鳥e203移植A7l
    發(fā)表于 10-27 06:35

    Vue3組合式API最佳實踐:從Options APIComposition API

    簡介 在Vue.js中,Options API一直是主流的開發(fā)方式。不過隨著Vue3的推出,Composition API作為一種全新的開發(fā)方式引起了廣泛關(guān)注。本文將從Options API
    的頭像 發(fā)表于 10-20 13:36 ?542次閱讀

    如何移植rt-thread野火imx6ull開發(fā)板?

    求助如何將rt-thread移植野火imx6ull(coretex-A7)開發(fā)板,官方的bsp中沒有imx6ull
    發(fā)表于 09-29 06:25

    【上海晶珩睿莓1開發(fā)板試用體驗】將TensorFlow-Lite物體歸類(classify)的輸出圖片移植LVGL9.3界面中

    既然調(diào)通了TensorFlow-Lite物體歸類(classify)和LVGL9.3代碼,那么這兩個東西結(jié)合起來也是沒問題的,需要注意的是,TensorFlow-Lite是C++代碼,而
    發(fā)表于 09-21 00:39

    產(chǎn)品添加與API接口設(shè)計指南

    將以RESTful API為例,使用JSON數(shù)據(jù)格式,并提供Python代碼示例。 1. API接口概述 API接口允許開發(fā)者通過HTTP請求管理產(chǎn)品生命周期: 添加產(chǎn)品
    的頭像 發(fā)表于 07-24 14:45 ?680次閱讀
    產(chǎn)品添加與<b class='flag-5'>上</b>架<b class='flag-5'>API</b>接口設(shè)計指南

    鴻蒙開發(fā)API9 API12,有哪些不同

    ? ##HarmonyOS 應(yīng)用開發(fā)## 雖然API9已經(jīng)屬于過時了,但是現(xiàn)在很多學(xué)校里教的還是基于API9的鴻蒙開發(fā),當(dāng)學(xué)生需要在畢業(yè)設(shè)計中使用API12進行開發(fā)時,還是需要先掌握一些兩者的區(qū)別
    發(fā)表于 06-29 22:47

    無法將Tensorflow Lite模型轉(zhuǎn)換為OpenVINO?格式怎么處理?

    將 Tensorflow Lite 模型轉(zhuǎn)換為 OpenVINO? 格式。 遇到的錯誤: FrontEnd API failed with OpConversionFailure:No translator found for TFLite_Detection_PostP
    發(fā)表于 06-25 08:27

    Python從入門精通背記手冊

    電子發(fā)燒友網(wǎng)站提供《Python從入門精通背記手冊.pdf》資料免費下載
    發(fā)表于 03-28 17:43 ?108次下載