一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-08 23:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

文章轉(zhuǎn)載于微信公眾號(hào):GiantPandaCV
作者: 阿呆

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

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

1. PyTorch模型轉(zhuǎn)NCNN

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

(1) 整體步驟

理想情況下,從PyTorch轉(zhuǎn)到ncnn只需要下面兩步:

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

遇到問(wèn)題的適合解決思路如下:

convert.png

下面介紹一下我在做ChineseOCRLite中的PSENet模型轉(zhuǎn)換的過(guò)程中遇到的問(wèn)題。

(2)實(shí)際操作的時(shí)候可能會(huì)遇到各種問(wèn)題

問(wèn)題1:ReLU6不支持

概述:ReLU6算子在轉(zhuǎn)換的時(shí)候容易出現(xiàn)不支持的情況,需要使用其他算子替代

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

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

問(wèn)題2:Resize算子轉(zhuǎn)換問(wèn)題

概述:因?yàn)楦鱾€(gè)框架對(duì)Resize算子的支持都不盡相同,在轉(zhuǎn)換過(guò)程中總會(huì)出現(xiàn)一些問(wèn)題,pytorch中的interpolate算子轉(zhuǎn)換成ONNX之后變成很多零散的算子,如cast、shape等,這些在ncnn里面不支持。你可以選擇手動(dòng)修改文件,也可以使用下面這個(gè)自動(dòng)的方法:

解決:使用onnx/_simplifier對(duì)onnx模型進(jìn)行簡(jiǎn)化,可以合并這些零散的算子。

python-monnxsimmodel.onnxmodel_sim.onnx  

問(wèn)題3:關(guān)于轉(zhuǎn)ONNX及使用onnx/_simplifier過(guò)程中出現(xiàn)的一系列奇怪問(wèn)題

概述:使用不同版本的ONNX可能會(huì)遇到不同的問(wèn)題,比如提示conv層無(wú)輸入等(具體錯(cuò)誤名稱(chēng)記不清了)。

解決:下載最新ONNX源碼編譯安裝(onnx/_simplifier中出現(xiàn)的一些錯(cuò)誤也可以通過(guò)安裝最新ONNX來(lái)解決)

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

問(wèn)題4:模型輸出結(jié)果的尺寸固定

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

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

直接轉(zhuǎn)換得到的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;  
}  

我們只需將其修改成如下格式即可實(shí)現(xiàn)按比例resize:

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

問(wèn)題5:NCNN模型輸出結(jié)果與ONNX模型不同

解決:逐層對(duì)比NCNN與onnx模型的輸出結(jié)果

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

extractor.extract(node_name,preds);  

來(lái)提取不同節(jié)點(diǎn)的輸出。

問(wèn)題5衍生問(wèn)題1:ONNX沒(méi)有提供提取中間層輸出的方法

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

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)})  

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

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

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

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

2. 交叉編譯opencv與ncnn

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

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

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

(1)android ndk下載

最初選擇的是r20b,因?yàn)楹虲Make之間的兼容問(wèn)題,切換到了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平臺(tái)是armeabi-v7a,便于在老舊手機(jī)上運(yùn)行。

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

編譯選項(xiàng)參考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端測(cè)試

與ncnn有關(guān)的代碼位于ncnn/_project目錄下。在有opencv和ncnn庫(kù)的基礎(chǔ)上,可以先在pc端跑一下識(shí)別代碼。

cdncnn_project/ocr  
mkdirbuild_arm  
cdbuild_arm  
cmake..  
make-j4  

編譯完成之后

./TextRecognition../test1.jpg  

可以看到輸出結(jié)果:

psenet前向時(shí)間:0.462291s  
psenetdecode時(shí)間:0.0604791s  
boxzie10  
預(yù)測(cè)結(jié)果:  
一  
統(tǒng)  
;名  
稱(chēng)  
丹正珍  
類(lèi)住  
型  
有限責(zé)  
所  
中山市  
角度檢測(cè)和文字識(shí)別總時(shí)間:1.52042s  

3. NCNN模型的安卓端部署

因?yàn)榇a較長(zhǎng),這一部分只介紹把PC端代碼遷移到安卓端的思路,想看詳細(xì)代碼的同學(xué)請(qǐng)移步文末的Github地址。

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


android/_flow.png

下面一一介紹圖中內(nèi)容

UI界面

這個(gè)demo的UI界面中至少應(yīng)包含三個(gè)元件:

Button——用于選擇相冊(cè)圖片

ImageView——用于展示圖片及文本檢測(cè)框

TextView——用于展示識(shí)別結(jié)果

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


UI.jpg

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

Java部分

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

需要傳入到C++函數(shù)的內(nèi)容包括Bitmap圖片和AssetManager對(duì)象。

從C++接收到的是一個(gè)包含文本框和識(shí)別結(jié)果的字符串。

C++部分

C++負(fù)責(zé)模型推理,推理代碼與PC端無(wú)異,只是安卓端的文件讀取與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部分傳過(guò)來(lái)的Bitmap轉(zhuǎn)換成cv::Mat,代碼如下:

//convertbitmaptomat  
int*data=NULL;  
AndroidBitmapInfoinfo={0};  
AndroidBitmap_getInfo(env,bitmap,&info);  
AndroidBitmap_lockPixels(env,bitmap,(void**)&data);  
  
//這里偷懶只寫(xiě)了RGBA格式的轉(zhuǎn)換  
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);  

最終識(shí)別結(jié)果

最終得到的demo識(shí)別結(jié)果如下圖所示:

result.jpg

本項(xiàng)目完整代碼請(qǐng)移步github:

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

推薦閱讀

更多嵌入式AI技術(shù)干貨請(qǐng)關(guān)注嵌入式AI專(zhuān)欄。

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

    關(guān)注

    88

    文章

    35109

    瀏覽量

    279607
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5561

    瀏覽量

    122793
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    809

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    如何實(shí)現(xiàn)與恩智浦i.MX RT1170的無(wú)線投屏與控制

    Scrcpy是一款免費(fèi)開(kāi)源的軟件,支持將屏幕投影到其他設(shè)備,并支持被投屏設(shè)備對(duì)的反向控制。基于ADB工具,
    的頭像 發(fā)表于 06-26 09:53 ?1255次閱讀
    如何實(shí)現(xiàn)<b class='flag-5'>安</b><b class='flag-5'>卓</b>與恩智浦i.MX RT1170的無(wú)線投屏與控制

    如何使用Docker部署模型

    隨著深度學(xué)習(xí)和大模型的快速發(fā)展,如何高效地部署這些模型成為了一個(gè)重要的挑戰(zhàn)。Docker 作為一種輕量級(jí)的容器化技術(shù),能夠?qū)?b class='flag-5'>模型及其依賴(lài)環(huán)境打包成一個(gè)可移植的容器,極大地簡(jiǎn)化了
    的頭像 發(fā)表于 05-24 16:39 ?338次閱讀

    使用OpenVINO優(yōu)化并部署飛槳PP-OCRv4模型

    算法,在此基礎(chǔ)上打造產(chǎn)業(yè)級(jí)特色模型系列:PP-OCR、PP-Structure和PP-ChatOCR,打通了模型訓(xùn)練、壓縮、部署全流程
    的頭像 發(fā)表于 04-03 18:07 ?1209次閱讀
    使用OpenVINO優(yōu)化并<b class='flag-5'>部署</b>飛槳PP-OCRv4<b class='flag-5'>模型</b>

    AI大模型側(cè)部署正當(dāng)時(shí):移遠(yuǎn)端側(cè)AI大模型解決方案,激活場(chǎng)景智能新范式

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

    AI大模型側(cè)部署正當(dāng)時(shí):移遠(yuǎn)端側(cè)AI大模型解決方案,激活場(chǎng)景智能新范式

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

    K230D部署模型失敗的原因?

    MicroPython部署的無(wú)法正常運(yùn)行,采用C++版本的無(wú)法實(shí)現(xiàn)部署 嘗試解決過(guò)程 1.考慮到可能是固件不匹配的問(wèn)題,重新燒錄了流程(生成模型后給的readme)中要求的固件,依舊無(wú)法成功
    發(fā)表于 03-11 06:19

    使用OpenVINO? 2021.4將經(jīng)過(guò)訓(xùn)練的自定義PyTorch模型加載為IR格式時(shí)遇到錯(cuò)誤怎么解決?

    使用 OpenVINO? 2021.4 將經(jīng)過(guò)訓(xùn)練的自定義 PyTorch 模型加載為 IR 格式時(shí)遇到錯(cuò)誤: RuntimeError: [ GENERAL_ERROR ] Failed
    發(fā)表于 03-05 08:40

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

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

    AI模型部署邊緣設(shè)備的奇妙之旅:目標(biāo)檢測(cè)模型

    以及邊緣計(jì)算能力的增強(qiáng),越來(lái)越多的目標(biāo)檢測(cè)應(yīng)用開(kāi)始直接在靠近數(shù)據(jù)源的邊緣設(shè)備上運(yùn)行。這不僅減少了數(shù)據(jù)傳輸延遲,保護(hù)了用戶(hù)隱私,同時(shí)也減輕了云端服務(wù)器的壓力。然而,在邊緣部署高效且準(zhǔn)確的目標(biāo)檢測(cè)模型
    發(fā)表于 12-19 14:33

    如何在 PyTorch 中訓(xùn)練模型

    PyTorch 是一個(gè)流行的開(kāi)源機(jī)器學(xué)習(xí)庫(kù),廣泛用于計(jì)算機(jī)視覺(jué)和自然語(yǔ)言處理等領(lǐng)域。它提供了強(qiáng)大的計(jì)算圖功能和動(dòng)態(tài)圖特性,使得模型的構(gòu)建和調(diào)試變得更加靈活和直觀。 數(shù)據(jù)準(zhǔn)備 在訓(xùn)練模型之前,首先需要
    的頭像 發(fā)表于 11-05 17:36 ?926次閱讀

    使用PyTorch在英特爾獨(dú)立顯卡上訓(xùn)練模型

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

    AIC3262 CODEC能否在下運(yùn)用?

    我們有多路音頻混音應(yīng)用需求(雙路MIC. LINE IN, I2S 音源輸入,耳機(jī)輸出監(jiān)聽(tīng)及混音后錄音),針對(duì)混音還有通過(guò)DSP 作混響, 10段EQ應(yīng)用, 該裝置需要在環(huán)境下運(yùn)行。不知TI AIC3262 CODEC能否在
    發(fā)表于 10-29 08:19

    旗艦手機(jī)告別8GB,轉(zhuǎn)向更高規(guī)格的內(nèi)存配置

    10月28日資訊,隨著人工智能大模型的普及應(yīng)用,智能手機(jī)制造商正積極調(diào)整其旗艦機(jī)型的內(nèi)存配置策略。近期推出的多款旗艦已悄然舍棄8GB
    的頭像 發(fā)表于 10-28 15:34 ?1110次閱讀

    新手小白怎么通過(guò)云服務(wù)器跑pytorch

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

    基于Pytorch訓(xùn)練并部署ONNX模型在TDA4應(yīng)用筆記

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