由于部署的硬件是華為昇騰 NPU(Ascend310),參考網址https://www.paddlepaddle.org.cn/lite/v2.10/demo_guides/huawei_ascend_npu.html#npu-paddle-lite
先拉取paddlelite用來編譯庫
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
先在amd64上部署的,于是編譯并生成 PaddleLite+NNAdapter+HuaweiAscendNPU for amd64 and arm64 的部署庫
./lite/tools/build_linux.sh --arch=x86 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON --nnadapter_with_huawei_ascend_npu=ON --nnadapter_huawei_ascend_npu_sdk_root=/home/ds/Ascend/ascend-toolkit/6.0.RC1.alpha003
編譯到一半的時候會出現未知原因的編譯錯誤,并不會報error而是直接停止,于是放棄編譯HuaweiAscendNPU庫,只編譯PaddleLite+NNAdapter
./lite/tools/build_linux.sh --arch=x86 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON
編譯出來的庫與頭文件在該地址中
- (該步可省略)下載測試案例demo
https://paddlelite-demo.bj.bcebos.com/devices/generic/PaddleLite-generic-demo_v2_10_0.tar.gz
里面有這幾個案例代碼可以供學習
cd /home/ds/Desktop/paddleModel/PaddleLite-generic-demo/image_classification_demo/shell
案例目錄結構
./run.sh mobilenet_v1_fp32_224 linux amd64
輸入上述命令行即可開始測試
這些案例中就有編譯好的各個平臺的庫與頭文件,如果測試通過的話說明相對應的庫可以在該平臺直接用。如果不可以用,就用上面源碼直接編譯出來的庫。
然后下載Paddle-Lite-Demo,這個里面有很多案例,包括ocr的案例
下載地址
https://github.com/PaddlePaddle/Paddle-Lite-Demo
https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/develop/ocr/armlinux/shell/cxx/ppocr_demo
由于涉及到多平臺的適配性,原項目目錄結構比較復雜,cmakeList文件也寫的很復雜,我把項目結構進行了重新排布
CMakeLists.txt也重新改寫了,只保留了必要的部分
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 17)
project(Ocr_Ascend)
add_definitions(-g)
# 默認arm
#set(path lib/arm)
set(opencvVersion opencv410)#設置opencv版本
# 頭文件
include_directories(./include)
include_directories(./PaddleLite/include)
include_directories(/home/ds/Desktop/opencv-4.1.0/include/opencv4)
include_directories(/home/ds/Desktop/opencv-4.1.0/include/opencv2)
# 庫文件
link_directories(./PaddleLite/lib)
link_directories(/home/ds/Desktop/opencv-4.1.0/build/lib)
aux_source_directory (src SRC_LIST)
add_executable (AscendOcr ${SRC_LIST})
# c++17
# target_link_libraries(AscendOcr opencv_highgui opencv_core opencv_imgproc opencv_imgcodecs opencv_calib3d opencv_features2d opencv_videoio protobuf glog gflags paddle_inference pthread paddle_light_api_shared paddle_api_full_bundled)
target_link_libraries(AscendOcr opencv_highgui opencv_core opencv_imgproc opencv_imgcodecs opencv_calib3d opencv_features2d opencv_videoio paddle_light_api_shared)
# 注意測試
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
原demo項目每次運行,終端需要輸入的參數過于繁雜
容易出現意外的錯誤,于是我在代碼中將這些參數寫死了
由原始的Paddle格式模型到paddlelite可以使用的格式模型需要使用opt轉換工具進行轉模型,opt轉換工具可以直接在該地址的assets里面下載,在那個平臺就下載那個平臺的
https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.13-rc
下完之后可以直接運行
./opt --model_file=./en_number_mobile_v2.0_rec_slim_infer/inference.pdmodel --param_file=./en_number_mobile_v2.0_rec_slim_infer/inference.pdiparams --optimize_out=./en_number_mobile_v2.0_rec_slim_infer_opt --valid_targets=x86 --optimize_out_type=naive_buffer
注意valid_targets這個參數要隨著使用平臺進行修改,使用上述命令就可產生nb格式的模型
如果要在華為NPU上執(zhí)行模型,需要在opt工具轉換的時候將如下選項設置成valid_targets=arm,huawei_ascend_npu。如果只是在CPU上執(zhí)行,需要設置如下選項valid_targets=arm
paddle_lite_opt --model_file=./MobileNetV2/inference.pdmodel --param_file=./MobileNetV2/inference.pdiparams --valid_targets=arm,huawei_ascend_npu --optimize_out=./MobileNetV2/MobileNetV2
參考網址:https://zhuanlan.zhihu.com/p/432033215
然后運行,會報莫名其妙的錯,Run() double free or corruption (!prev)或者Segmentation fault (core dumped),后來我一個地方一個地方的手動打斷點,發(fā)現是字符識別的時候,如果一張圖有多個detection模型識別出來的區(qū)域,往往第一個detection識別出來的字符是對的,然后從第二個就開始出問題,最后Run() double free or corruption (!prev)或者Segmentation fault (core dumped)終止,甚至看了paddlelite的源碼,并沒有什么可以修改的地方,我認為這是paddlelite或者這個項目在x86平臺中有bug,需要paddlelite相關人員進行修復。
雖然不能順利運行,但是我想到了一個方法,既然只有第一次能成功識別,后面的都不能,那我每次for循環(huán)一次都初始化一下那個識別容器
然后能夠順利執(zhí)行完成!
然后在arm平臺上運行,重新編譯了arm平臺上的paddlelite庫。文章來源:http://www.zghlxwxcb.cn/news/detail-738658.html
sudo ./lite/tools/build_linux.sh --arch=armv8 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON
然后同樣步驟運行我改寫的ocr項目,發(fā)現就不會出現我上面提到的錯誤,看來這個錯誤僅僅在amd64 平臺用x86庫時會出現。
之后我會嘗試編譯出HuaweiAscendNPU庫,待續(xù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-738658.html
到了這里,關于在amd64與arm上用paddlelite部署paddelOCR(Ascend硬件)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!