在amd64与arm上用paddlelite部署paddelOCR(Ascend硬件)

news2024/11/25 9:24:52

由于部署的硬件是华为昇腾 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库,待续。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/478362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2. Java 异常体系

2.1 Throwable java.lang.Throwable 类是 Java 程序执行过程中发生的异常事件对应的类的根父类。 Throwable 中的常用方法: public void printStackTrace():打印异常的详细信息。 包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得…

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术 倾斜摄影超大场景的三维模型轻量化处理中纹理压缩是轻量化处理的重要手段之一,可以在保证模型真实感的前提下,减小数据体积、降低传输带宽和提高渲染性能。以下是几个关键的纹理压缩技术&#xff1a…

自然语言处理知识抽取(pkuseg、DDParser安装及使用)

一、分词简介 1.基本概念 分词是自然语言处理中的一个重要步骤,它可以帮助我们将文本分成一个个词语,以便更好地理解和分析文本。在计算机视觉、语音识别、机器翻译等领域,分词都扮演着重要的角色。 目前,常用的分词库包括 jie…

搭建Redis主从集群+哨兵+代理predixy

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Redis是什么?二、搭建Redis集群步骤1.环境和版本2.Redis 安装部署3.主从同步配置4.哨兵模式配置5.代理predixy配置 总结 前言 提示&#xff1a…

深度学习 -- Dataset与DataLoader

前言 在模型训练的步骤中,数据的部分非常重要,它的过程主要分为数据收集、数据划分、数据读取、数据预处理。 数据收集的有原始样本和标签(Img,label) 数据集的划分需要分为训练集、验证集、测试集。 训练集负责训练模型,验证集…

【C++】C++11常用特性总结

哥们哥们,把书读烂,困在爱里是笨蛋! 文章目录 一、统一的列表初始化1.统一的{}初始化2.std::initializer_list类型的初始化 二、简化声明的关键字1.decltype2.auto && nullptr 三、STL中的一些变化1.新增容器:array &…

趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)

练习 2 —— 顺序表/链表力扣刷题&#xff08;中等难度&#xff09; 1. 反转链表 II 力扣原题&#xff1a;https://leetcode.cn/problems/reverse-linked-list-ii/ 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从…

数据可视化大屏的页面布局以及自适应

在做数据可视化大屏之前&#xff0c;我们需要考虑到页面的布局问题以及页面缩放自适应问题&#xff0c;下面分别就这两个方面讲解。 页面布局 类似这种页面区块的明显划分&#xff0c;常用的布局方式有两种&#xff1a; 1、flex布局 2、grid布局 grid布局 grid布局可以按区块…

山东专升本计算机第二章-Windows7操作系统

Windows7操作系统 2.3Windows7的文件和文件夹管理 考点7 Windows7的基础知识 文件&#xff0c;是指存放在外存储器上的一组相关信息的•集合 文件名是操作系统中区分不同文件的唯一标志 文件名是由主文件名和扩展名两部分组成不能使用 ▏ < > * ? \ / &#xff1a; …

单向带头链表的添加修改删除操作

public class HeroNodeDemo {public static void main(String[] args) {HeroNode hero1 new HeroNode(1, "松江");HeroNode hero2 new HeroNode(2, "武松");HeroNode hero3 new HeroNode(3, "及时雨");HeroNode hero4 new HeroNode(4, "…

prometheus实战之一:用ansible部署

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于《prometheus实战》 《prometheus实战》是欣宸原创的系列文章&#xff0c;旨在通过实战操作来熟悉和掌握prometheus常规技能 本篇概览 本文是《promet…

spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式--综合解图

目录 Spring Spring 学习的核心内容 解读上图: Spring 几个重要概念 ● 传统的开发模式 解读上图 ● IOC 的开发模式 解读上图 代码示例—入门 xml代码 注意事项和细节 1、说明 2、解释一下类加载路径 3、debug 看看 spring 容器结构/机制 综合解图 Spring Spr…

使用SPY++查看窗口信息去分析C++客户端UI软件问题

目录 1、使用SPY查看窗口的信息 2、使用SPY查看某些软件UI窗口用什么UI组件实现的 2.1、查看海康视频监控客户端安装包程序 2.2、查看华为协同办公软件WeLink 2.3、查看字节协同办公软件飞书 2.4、查看最新版本的Chrome浏览器 2.5、查看小鱼易连视频会议客户端软件 2.6…

STM32H7 DMA

CubeMX配置 发送调用&#xff1a; 发送速度确实挺快的。 接收&#xff1a; HAL_UART_Receive_DMA(&huart1,Rxbuffer,sizeof(Rxbuffer)); 这个函数开启DMA接收,将收到的数据存放到Rxbuffer数组中去,当接收到了sizeof(Rxbuffer)个数据就会回调DMA1_Stream0_IRQHandler函数…

Linux-基本指令

文章目录 Centos用户新增及删除新增删除 两个理论概念管理贯穿 ls指令文件的操作-l (列出详细信息)-a&#xff08;显示所有的文件&#xff0c;包括隐藏文件&#xff09;-F&#xff08;在每个文件名后附上一个字符以说明该文件的类型&#xff09;-d&#xff08;将目录象文件一样…

CTF权威指南 笔记 -第二章二进制文件-2.1-汇编原理

目录 编译原理 GCC编译 四个阶段 (1)预处理阶段 (2)编译阶段 (3)汇编阶段 (4)链接阶段 预处理阶段 编译阶段 汇遍阶段 链接阶段 C语言的生命是从 源文件开始 的 每条C语言都必须要给翻译成 一系列的低级语言 最后 按照可执行文件格式打包 并且作为二进制文件保存起来…

【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南

带你深入分析Spring所提供的缓存Cache功能的开发实战指南 CacheManager管理器的扩展支持缓存技术类型与CacheManger缓存依赖application配置缓存注解EnableCachingCacheableCachePutCacheEvictCacheConfig SpEL上下文数据注意 SpEL提供了多种运算符 不同Cache的实现机制Concurr…

快速入门微服务保护框架Sentinel

文章目录 一、Sentinel1.1 雪崩问题1.1.1 介绍1.1.2 解决方案 1.2 初识Sentinel1.3 sentinel下载和整合1.4 流量控制1.4.1 簇点链路1.4.2 Sentinel簇点链路设置1.4.3 流控规则1.4.4 热点参数限流1.4.5 隔离和降级1.4.6 授权规则 一、Sentinel 1.1 雪崩问题 1.1.1 介绍 雪崩问…

掌握了这些,才算真正了解C语言数组

也许你认为&#xff0c;C语言中的数组非常好理解&#xff0c;就是把一组相同类型的元素存储在同一块空间里。但是你可能并没有真正理解数组的本质&#xff0c;不信的话请回答一下下面的几个小问题&#xff0c;如果你能非常清晰的回答这些问题&#xff0c;那么你对C语言中的数组…