由于部署的硬件是华为昇腾 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格式的模型
然后运行,会报莫名其妙的错,Run() double free or corruption (!prev)或者Segmentation fault (core dumped),后来我一个地方一个地方的手动打断点,发现是字符识别的时候,如果一张图有多个detection模型识别出来的区域,往往第一个detection识别出来的字符是对的,然后从第二个就开始出问题,最后Run() double free or corruption (!prev)或者Segmentation fault (core dumped)终止,甚至看了paddlelite的源码,并没有什么可以修改的地方,我认为这是paddlelite或者这个项目在x86平台中有bug,需要paddlelite相关人员进行修复。
虽然不能顺利运行,但是我想到了一个方法,既然只有第一次能成功识别,后面的都不能,那我每次for循环一次都初始化一下那个识别容器
然后能够顺利执行完成!
然后在arm平台上运行,重新编译了arm平台上的paddlelite库。
sudo ./lite/tools/build_linux.sh --arch=armv8 --with_extra=ON --with_log=ON --with_exception=ON --with_nnadapter=ON
然后同样步骤运行我改写的ocr项目,发现就不会出现我上面提到的错误,看来这个错误仅仅在amd64 平台用x86库时会出现。
之后我会尝试编译出HuaweiAscendNPU库,待续。