色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

3天內不再提示

詳談PyTorch OCR模型的安卓端部署

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-08 23:07 ? 次閱讀
文章轉載于微信公眾號:GiantPandaCV
作者: 阿呆

開發(fā)環(huán)境選擇

  1. 本文操作系統(tǒng)為Windows,因為Windows上的安卓模擬器選擇較多,并且真機調試也比較方便;
  2. 交叉編譯在Windows和Ubuntu上都進行了嘗試,都可行,但是如果是Ubuntu上交叉編譯之后再挪到Windows的話,容易出幺蛾子;
  3. 我目前使用的最穩(wěn)定的工具版本組合是:ndk18、androidstudio4.1、cmake3.10、gradle6.5、MinGW(CodeBlocks自帶)。

1. PyTorch模型轉NCNN

這一小節(jié)是介紹如何將自己重新訓練過的PyTorch模型轉成ncnn,如果沒有重訓練需求的話,可以直接跳過這一節(jié)。

(1) 整體步驟

理想情況下,從PyTorch轉到ncnn只需要下面兩步:

  • PyTorch轉ONNX
torch.onnx._export(model,x,path,opset_version=11)  
  • ONNX轉NCNN
./onnx2ncnnmodel.onnxmodel.parammodel.bin  

遇到問題的適合解決思路如下:

convert.png

下面介紹一下我在做ChineseOCRLite中的PSENet模型轉換的過程中遇到的問題。

(2)實際操作的時候可能會遇到各種問題

問題1:ReLU6不支持

概述:ReLU6算子在轉換的時候容易出現不支持的情況,需要使用其他算子替代

解決:使用torch.clamp替代(雖然ReLU6可以通過組合ReLU的方式實現,但是組合得到的ReLU6在NCNN中容易轉換失敗,不建議使用。)

defrelu6(x,inplace=True):  
returntorch.clamp(x,0,6)  

問題2:Resize算子轉換問題

概述:因為各個框架對Resize算子的支持都不盡相同,在轉換過程中總會出現一些問題,pytorch中的interpolate算子轉換成ONNX之后變成很多零散的算子,如cast、shape等,這些在ncnn里面不支持。你可以選擇手動修改文件,也可以使用下面這個自動的方法:

解決:使用onnx/_simplifier對onnx模型進行簡化,可以合并這些零散的算子。

python-monnxsimmodel.onnxmodel_sim.onnx  

問題3:關于轉ONNX及使用onnx/_simplifier過程中出現的一系列奇怪問題

概述:使用不同版本的ONNX可能會遇到不同的問題,比如提示conv層無輸入等(具體錯誤名稱記不清了)。

解決:下載最新ONNX源碼編譯安裝(onnx/_simplifier中出現的一些錯誤也可以通過安裝最新ONNX來解決)

gitclonehttps://github.com/onnx/onnx.git  
sudoapt-getinstallprotobuf-compilerlibprotoc-dev  
cdONNX  
pythonsetup.pyinstall  

問題4:模型輸出結果的尺寸固定

概述:直接轉換得到的onnx模型的Resize算子都是固定輸出尺寸的,無論輸入多大的圖片都會輸出同樣大小的特征圖,這無疑會影響到模型的精度及靈活性。

解決:修改NCNN模型的param文件,將Resize算子修改成按比例resize。

直接轉換得到的param文件中的Interp算子是這樣的:

Interp913119019130=21=1.000000e+002=1.000000e+003=6404=640  

從下面的ncnn源碼中可以看到,0代表resize/_type,1和2分別是高和寬的縮放比例,3和4分別是輸出的高和寬。

intInterp::load_param(constParamDict&pd)  
{  
resize_type=pd.get(0,0);  
height_scale=pd.get(1,1.f);  
width_scale=pd.get(2,1.f);  
output_height=pd.get(3,0);  
output_width=pd.get(4,0);  
return0;  
}  

我們只需將其修改成如下格式即可實現按比例resize:

Interp913119019130=11=4.000000e+002=4.000000e+00  

問題5:NCNN模型輸出結果與ONNX模型不同

解決:逐層對比NCNN與onnx模型的輸出結果

使用onnxruntime(Python)和NCNN(C++)分別提取每個節(jié)點的輸出,進行對比。對于ncnn比較簡單,可以使用

extractor.extract(node_name,preds);  

來提取不同節(jié)點的輸出。

問題5衍生問題1:ONNX沒有提供提取中間層輸出的方法

解決:給要提取的層添加一個輸出節(jié)點,代碼如下:

deffind_node_by_name(graph,node_name):  
fornodeingraph.node:  
ifnode.output[0]==node_name:  
returnnode  
returnNone  
  
defadd_extra_output_node(model,target_node,output_name):  
extra_output=helper.make_empty_tensor_value_info(output_name)  
target_output=target_node.output[0]  
identity_node=helper.make_node("Identity",inputs=[target_output],outputs=[output_name],name=output_name)  
model.graph.node.append(identity_node)  
model.graph.output.append(extra_output)  
returnmodel  

修改模型之后再使用

out=sess.run([output_name],{"input.1":img.astype(np.float32)})  

就可以獲取到模型的中間層輸出了。

問題5衍生問題2:發(fā)現最后一個Resize層的輸出有差異

解決:參考chineseocr/_lite里面的代碼把mode由bilinear改成了nearest(這里錯誤的原因可能是wenmuzhou/PSENet.pytorch中的模型最后一個F.interpolate中的align/_corners參數設置成了True。據說NCNN只實現了align/_corners為False的情況)。

這里修改之后的模型跟原模型之間是會有少許誤差的,如果誤差不可接受,就要重新訓練才行。

2. 交叉編譯opencv與ncnn

交叉編譯工作可以在windows上進行,使用的是MinGW + cmkae3.10 + AndroidNDK18??梢詤⒖糤indows下編譯OpenCV android(https://www.cnblogs.com/zhxmdefj/p/13094954.html)

沒有windows C++環(huán)境的話,也可以選擇在linux上進行。

如果是在linux交叉編譯,然后復制到windows的話,需要修改一下opencv中cmake配置文件中的路徑。

(1)android ndk下載

最初選擇的是r20b,因為和CMake之間的兼容問題,切換到了18b。

wgethttps://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip?hl=zh_cn  
mvandroid-ndk-r18b-linux-x86_64.zip?hl=zh_cnandroid-ndk-r18b-linux-x86_64.zip  
unzipandroid-ndk-r18b-linux-x86_64.zip  

(2)編譯opencv

利用android中提供的android.toolchain.cmake 工具鏈可以快速的編譯opencv的arm版。

這里選擇的arm平臺是armeabi-v7a,便于在老舊手機上運行。

folde  
if[[!-d"$folder"]];then  
echo"$foldernotfound,creatingfolder..."  
mkdirbuild_arm  
fi  
cdbuild_arm  
cmake/  
-DCMAKE_TOOLCHAIN_FILE=/  
/home/dai/soft/android-ndk-r18b/build/cmake/android.toolchain.cmake/  
-DANDROID_NDK=/home/dai/soft/android-ndk-r18b/  
-DCMAKE_BUILD_TYPE=Release/  
-DBUILD_ANDROID_PROJECTS=OFF/  
-DBUILD_ANDROID_EXAMPLES=OFF/  
-DANDROID_ABI=armeabi-v7a/  
-DANDROID_NATIVE_API_LEVEL=21..  
make-j4  

(3)編譯ncnn

編譯選項參考ncnn wiki(https://github.com/Tencent/nc...

folde  
if[[!-d"$folder"]];then  
echo"$foldernotfound,creatingfolder..."  
mkdirbuild_arm  
fi  
cdbuild_arm  
cmake/  
-DCMAKE_TOOLCHAIN_FILE=/  
/home/dai/soft/android-ndk-r18b/build/cmake/android.toolchain.cmake/  
-DANDROID_AB/  
-DANDROID_ARM_NEON=ON/  
-DANDROID_PLATFORM=android-14/  
..  
make-j4  

(4)chineseocr/_lite的PC端測試

與ncnn有關的代碼位于ncnn/_project目錄下。在有opencv和ncnn庫的基礎上,可以先在pc端跑一下識別代碼。

cdncnn_project/ocr  
mkdirbuild_arm  
cdbuild_arm  
cmake..  
make-j4  

編譯完成之后

./TextRecognition../test1.jpg  

可以看到輸出結果:

psenet前向時間:0.462291s  
psenetdecode時間:0.0604791s  
boxzie10  
預測結果:  
一  
統(tǒng)  
;名  
稱  
丹正珍  
類住  
型  
有限責  
所  
中山市  
角度檢測和文字識別總時間:1.52042s  

3. NCNN模型的安卓端部署

因為代碼較長,這一部分只介紹把PC端代碼遷移到安卓端的思路,想看詳細代碼的同學請移步文末的Github地址。

遷移的整體思路如下圖所示:


android/_flow.png

下面一一介紹圖中內容

UI界面

這個demo的UI界面中至少應包含三個元件:

Button——用于選擇相冊圖片

ImageView——用于展示圖片及文本檢測框

TextView——用于展示識別結果

界面截圖如下(TextView在沒有文字的時候是不顯示的):


UI.jpg

界面res/layout/activity/_main.xml文件修改。

Java部分

模型推理是在C++中完成的,Java部分的代碼主要是利用安卓的API實現圖片讀取、文本檢測框繪制和結果展示等功能。

需要傳入到C++函數的內容包括Bitmap圖片和AssetManager對象。

從C++接收到的是一個包含文本框和識別結果的字符串。

C++部分

C++負責模型推理,推理代碼與PC端無異,只是安卓端的文件讀取與PC端不同,需要修改文件讀取代碼,比如crnn的模型加載代碼就需要改成下面的樣子:

intmodel::init(AAssetManager*mgr,conststd::stringcrnn_param,conststd::stringcrnn_bin)  
{  
intret1=crnn.load_param(mgr,crnn_param.c_str());  
intret2=crnn.load_model(mgr,crnn_bin.c_str());  
LOGI("ret1is%d,ret2is%d",ret1,ret2);  
return(ret1||ret2);  
}  

另外還需要把Java部分傳過來的Bitmap轉換成cv::Mat,代碼如下:

//convertbitmaptomat  
int*data=NULL;  
AndroidBitmapInfoinfo={0};  
AndroidBitmap_getInfo(env,bitmap,&info);  
AndroidBitmap_lockPixels(env,bitmap,(void**)&data);  
  
//這里偷懶只寫了RGBA格式的轉換  
LOGI("infoformatRGBA?%d",info.format==ANDROID_BITMAP_FORMAT_RGBA_8888);  
cv::Mattest(info.height,info.width,CV_8UC4,(char*)data);//RGBA  
cv::Matimg_bgr;  
cvtColor(test,img_bgr,CV_RGBA2BGR);  

最終識別結果

最終得到的demo識別結果如下圖所示:

result.jpg

本項目完整代碼請移步github:

https://github.com/Arctanxy/D...

推薦閱讀

更多嵌入式AI技術干貨請關注嵌入式AI專欄。

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

    關注

    88

    文章

    34589

    瀏覽量

    276230
  • 深度學習
    +關注

    關注

    73

    文章

    5557

    瀏覽量

    122583
  • pytorch
    +關注

    關注

    2

    文章

    809

    瀏覽量

    13814
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    AI大模型部署正當時:移遠端側AI大模型解決方案,激活場景智能新范式

    在AI技術飛速發(fā)展的當下,AI大模型的應用正從云端向側加速滲透。作為全球領先的物聯(lián)網整體解決方案供應商,移遠通信憑借深厚的技術積累與前瞻性的戰(zhàn)略布局,在AI大模型
    的頭像 發(fā)表于 03-26 19:05 ?399次閱讀
    AI大<b class='flag-5'>模型</b><b class='flag-5'>端</b>側<b class='flag-5'>部署</b>正當時:移遠端側AI大<b class='flag-5'>模型</b>解決方案,激活場景智能新范式

    自制 AirTag,支持/鴻蒙/PC/Home Assistant,無需擁有 iPhone

    蘋果的 AirTag 很貴,雖然某強北有平價代替品,但是仍需要蘋果設備才能綁定,才能查看位置。不支持/鴻蒙/PC ,也不支持集成到 Home Assistant 中。 AirTag
    發(fā)表于 02-25 11:22

    AI模型部署邊緣設備的奇妙之旅:目標檢測模型

    以及邊緣計算能力的增強,越來越多的目標檢測應用開始直接在靠近數據源的邊緣設備上運行。這不僅減少了數據傳輸延遲,保護了用戶隱私,同時也減輕了云端服務器的壓力。然而,在邊緣部署高效且準確的目標檢測模型
    發(fā)表于 12-19 14:33

    如何在 PyTorch 中訓練模型

    PyTorch 是一個流行的開源機器學習庫,廣泛用于計算機視覺和自然語言處理等領域。它提供了強大的計算圖功能和動態(tài)圖特性,使得模型的構建和調試變得更加靈活和直觀。 數據準備 在訓練模型之前,首先需要
    的頭像 發(fā)表于 11-05 17:36 ?884次閱讀

    使用PyTorch在英特爾獨立顯卡上訓練模型

    PyTorch 2.5重磅更新:性能優(yōu)化+新特性》中的一個新特性就是:正式支持在英特爾獨立顯卡上訓練模型!
    的頭像 發(fā)表于 11-01 14:21 ?1938次閱讀
    使用<b class='flag-5'>PyTorch</b>在英特爾獨立顯卡上訓練<b class='flag-5'>模型</b>

    新手小白怎么通過云服務器跑pytorch

    安裝PyTorch的步驟可以根據不同的操作系統(tǒng)和需求有所差異,通過云服務器運行PyTorch的過程主要包括選擇GPU云服務器平臺、配置服務器環(huán)境、部署和運行PyTorch
    的頭像 發(fā)表于 09-25 11:35 ?537次閱讀

    基于Pytorch訓練并部署ONNX模型在TDA4應用筆記

    電子發(fā)燒友網站提供《基于Pytorch訓練并部署ONNX模型在TDA4應用筆記.pdf》資料免費下載
    發(fā)表于 09-11 09:24 ?0次下載
    基于<b class='flag-5'>Pytorch</b>訓練并<b class='flag-5'>部署</b>ONNX<b class='flag-5'>模型</b>在TDA4應用筆記

    PyTorch中搭建一個最簡單的模型

    PyTorch中搭建一個最簡單的模型通常涉及幾個關鍵步驟:定義模型結構、加載數據、設置損失函數和優(yōu)化器,以及進行模型訓練和評估。
    的頭像 發(fā)表于 07-16 18:09 ?2749次閱讀

    pytorch中有神經網絡模型

    當然,PyTorch是一個廣泛使用的深度學習框架,它提供了許多預訓練的神經網絡模型。 PyTorch中的神經網絡模型 1. 引言 深度學習是一種基于人工神經網絡的機器學習技術,它在圖像
    的頭像 發(fā)表于 07-11 09:59 ?1627次閱讀

    PyTorch神經網絡模型構建過程

    PyTorch,作為一個廣泛使用的開源深度學習庫,提供了豐富的工具和模塊,幫助開發(fā)者構建、訓練和部署神經網絡模型。在神經網絡模型中,輸出層是尤為關鍵的部分,它負責將
    的頭像 發(fā)表于 07-10 14:57 ?862次閱讀

    基于AX650N/AX630C部署側大語言模型Qwen2

    本文將分享如何將最新的側大語言模型部署到超高性價比SoC上,向業(yè)界對側大模型部署的開發(fā)者提供
    的頭像 發(fā)表于 07-06 17:43 ?4493次閱讀
    基于AX650N/AX630C<b class='flag-5'>部署</b><b class='flag-5'>端</b>側大語言<b class='flag-5'>模型</b>Qwen2

    解讀PyTorch模型訓練過程

    PyTorch作為一個開源的機器學習庫,以其動態(tài)計算圖、易于使用的API和強大的靈活性,在深度學習領域得到了廣泛的應用。本文將深入解讀PyTorch模型訓練的全過程,包括數據準備、模型
    的頭像 發(fā)表于 07-03 16:07 ?1785次閱讀

    如何使用PyTorch建立網絡模型

    PyTorch是一個基于Python的開源機器學習庫,因其易用性、靈活性和強大的動態(tài)圖特性,在深度學習領域得到了廣泛應用。本文將從PyTorch的基本概念、網絡模型構建、優(yōu)化方法、實際應用等多個方面,深入探討使用
    的頭像 發(fā)表于 07-02 14:08 ?808次閱讀

    使用PyTorch搭建Transformer模型

    Transformer模型自其問世以來,在自然語言處理(NLP)領域取得了巨大的成功,并成為了許多先進模型(如BERT、GPT等)的基礎。本文將深入解讀如何使用PyTorch框架搭建Transformer
    的頭像 發(fā)表于 07-02 11:41 ?2515次閱讀

    請問電腦Pytorch訓練的模型如何轉化為能在ESP32S3平臺運行的模型

    由題目, 電腦Pytorch訓練的模型如何轉化為能在ESP32S3平臺運行的模型? 如何把這個Pytorch
    發(fā)表于 06-27 06:06
    主站蜘蛛池模板: 日本久久黄色 | 国产亚洲精品精品精品 | 午夜福利视频极品国产83 | 欧洲-级毛片内射八十老太婆 | 伊人久久综合网站 | a级成人免费毛片完整版 | 久久精品亚洲精品国产欧美 | 久久亚洲免费视频 | 蜜芽视频在线观看视频免费播放 | yellow日本动漫观看免费 | 婷婷综合久久狠狠色 | 91区国产福利在线观看午夜 | 色欲国产麻豆一精品一AV一免费 | 歪歪漫画羞羞漫画国产 | 男人桶女人j的视频在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲视频在线看 | 18禁黄无遮挡禁游戏在线下载 | 久久精品国产首叶 | 夜色福利院在线看 | 久久天天躁狠狠躁夜夜呲 | 国产亚洲精品久久久久 | japanese幼儿videos| 国产中文视频无码成人精品 | 506070老熟肥妇bbwxx视频 4虎最新网址 | 啊轻点啊再深点视频免费 | 朝鲜黄色录像 | 亚洲国产精品嫩草影院久久 | 青草伊人网 | 欧美乱妇日本无乱码特黄大片 | 无码国产精品高潮久久9 | 国产AV精品无码免费看 | xx69中国| 精品区2区3区4区产品乱码9 | 99re5久久热在线 | 全黄H全肉细节文NP 全黄h全肉细节全文 | 少妇高潮惨叫久久久久久欧美 | 国产精品久久大陆 | 国产欧美一区二区精品性色tv | 日韩在线 无码 精品 | 538prom精品视频我们不只是 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品