PPOCRv3在ncnn端部署

文章目录

  • 前言
  • 一、paddle -> pth -> pt
  • 二、pt -> pnnx -> ncnn
  • 三、ncnn模型部署
  • 参考文档


前言

之前尝试使用paddle -> onnx -> ncnn的方案,遇到了转ncnn过程中,某些层不支持的问题,经过修改ncnn模型参数,可实现部署,但是修改较复杂,很不易用,现在自己都忘了之前怎么修改的了。
参考文档:
PP-OCRv3 文本识别模型转ncnn模型
PPOCRV3文本识别模型精度损失问题解决
ncnn部署PP-OCRv3

现在尝试利用paddle -> pth -> pt -> pnnx -> ncnn 的方式实现ncnn模型部署,且不需要对PPOCRv3的模型进行修改


一、paddle -> pth -> pt

  1. 开源工程路径:PaddleOCR2Pytorch
  2. 下载工程后,找到"./pytorchocr/base_ocr_v20.py"文件,对其中save_pytorch_weights函数修改:
    def save_pytorch_weights(self, weights_path):"转torchsprit"input_size = torch.randn(1,3,48, 320)mod = torch.jit.trace(self.net, input_size)torch.jit.save(mod, "ch_PP-OCRv3_rec_infer.pt")try:torch.save(self.net.state_dict(), weights_path, _use_new_zipfile_serialization=False)except:torch.save(self.net.state_dict(), weights_path) # _use_new_zipfile_serialization=False for torch>=1.6.0print('model is saved: {}'.format(weights_path))
  1. 运行代码(注意该工程默认加载的是训练模型best_accuracy)
python converter/ch_ppocr_v3_rec_converter.py --src_model_path "./PaddleOCR-2.7.2/output/01_20240326_ppv3_train/"
  1. 第三方依赖
train@train:/Projects/ocr/PaddleOCR2Pytorch-main$ pip list | grep -w torch
torch                        1.7.1+cu101
  1. 最终生成文件
train@train:/Projects/ocr/PaddleOCR2Pytorch-main$ ls -l ch_*
-rwxr--r-- 1 nobody nogroup 10944466 47 08:59 ch_PP-OCRv3_rec_infer.pt
-rwxr--r-- 1 nobody nogroup 10660036 47 08:59 ch_ptocr_v3_rec_infer.pth

二、pt -> pnnx -> ncnn

  1. 利用第三方库pnnx,ncnn,生成ncnn模型文件(这里应用了2个inputshape是为了实现动态输入,H维上的值是任意设置的)
pnnx ch_PP-OCRv3_rec_infer.pt inputshape=[1,3,48,320] inputshape2=[1,3,48,480]
  1. 第三方依赖
train@train:/Projects/ocr/PaddleOCR2Pytorch-main$ pip list | grep -E "pnnx|ncnn"
ncnn                         1.0.20230223
pnnx                         20240226
  1. 最终生成文件(其中ch_PP_OCRv3_rec_infer_ncnn.py为验证脚本,可直接运行验证ncnn模型是否正常)
train@train:/Projects/ocr/PaddleOCR2Pytorch-main/pnnx2ncnn/last_best$ ls -l *ncnn*
-rw-r--r-- 1 train train    5285788 47 09:23 ch_PP_OCRv3_rec_infer.ncnn.bin
-rw-r--r-- 1 train train   10159       47 09:23 ch_PP_OCRv3_rec_infer.ncnn.param
-rw-r--r-- 1 train train   667            47 09:23 ch_PP_OCRv3_rec_infer_ncnn.py

三、ncnn模型部署

生成ncnn模型主要为了在PC端或者移动端部署,当前使用vs2019实现了对文本识别模型的推理测试,主要利用开源ncnn库、opencv库实现对ncnn模型的推理,之后有时间会开源demo工程。


参考文档

  1. layer 65 not exists or registered
  2. opencv x86(32位) windows下vs2019编译问题

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

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

相关文章

springboot+websocket+微信小程序实现评论区功能

springbootwebsocket微信小程序实现评论区功能 WebSocketSTOMP协议具体实现1.在pom文件中添加Spring WebSocket依赖2. 创建WebSocket配置类3.接收发送消息4.前端 参考 WebSocket 1. 什么是WebSocket? WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双…

深入浅出 -- 系统架构之性能优化的核心思维

“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。Java语言作为企业应用中的…

ArcGIS Server 安装教程

​​​​​​​ 一、环境与文件准备 1.软件环境 已安装arcgis Desktop 10.2 2.安装及授权文件 二、安装步骤 1.下载安装包和授权文件,解压后打开ArcGIS Server10.2文件夹,打开ESRI.exe。 2.点击ArcGIS for Server后的Setup,开始安装。 3.…

labelme安装和使用

源码地址: git clone https://github.com/labelmeai/labelme.git 描述 是一个图形图像注释工具,灵感来自 http://labelme.csail.mit.edu . 它是用比顿编写的,并使用QT进行图形化接口。 实例分割的VOC数据集示例。 其他例子(语义分割、B箱检测和分类)。 各种原语(多…

Flutter 使用flutter_swiper_null_safety 实现轮播图

目录 引入flutter_swiper_null_safety 在pubspec.yaml文件中dependencies下添加以下依赖 然后执行命令进行下载 实现轮播图 引入flutter_swiper_null_safety 在pubspec.yaml文件中dependencies下添加以下依赖 flutter_swiper_null_safety: ^1.0.2 然后执行命令进行下载 flu…

manga-ocr漫画日文ocr

github 下载 解压 anaconda新建环境 conda create -n manga_ocr python3.8 激活环境 conda activate manga_ocr cd到解压目录 cd /d manga-ocr-master 安装依赖包 pip install -r requirements.txt pip3 install manga-ocr 下载离线model huggingface 123云盘 解压到一个目录…

宏集PLC如何为楼宇自动化行业提供空调、供暖与通风的解决方案?

一、应用背景 楼宇自动化行业是通过将先进的技术和系统应用于建筑物中,以提高其运营效率、舒适度和能源利用效率的行业,其目标是使建筑物能够自动监控、调节和控制各种设备和系统,包括照明系统、空调系统、安全系统、通风系统、电力供应系统…

rsync 远程同步 基础介绍

目录 一 Rsync 简介 1,rsync 是什么 2,rsync 中的发起端 同步源 3,同步方式 4,备份的方式 5,常用Rsync命令 6, 配置源的两种表达方法 7,rsync做本地复制时与cp 对比 二&#xff…

【4036】基于小程序+ssm实现的软件学院会议室管理系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:ssm 【…

Vue中的键盘事件

目 录 1. 概述 2. JavaScript 键盘事件 2.1 键盘事件类型 2.1.1 keydown 事件2.1.2 keypress 事件2.1.3 keyup 事件2.1.4 input 事件 2.2 键盘事件的响应顺序 3. Vue 键盘事件监听与处理 3.1 获取按键的 键码(keyCode)3.2 监听按键事件 4. Vue 按键…

java理论小作业(2)--类

第一题 1.题目: 2.解析: 首先,我们来分析Hello1类的结构和给定代码的执行流程: Hello1类中有两个成员变量,一个静态的a和一个非静态的b。静态变量a属于类本身,而非静态变量b属于类的每一个实例&#xff…

开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

图书管理系统 一、设计思路 1、首先需要区分两类人,图书管理员和借书用户,不同的用户要展现不同的界面,利用继承和多态可以将其实现。 2、要将不同的操作封装起来,单独设计成为一个类,为了规范实现,需要…

gcc/g++:预编译阶段取消宏定义

预编译阶段取消宏定义,可分为两种情况:1)内部取消,2)外部取消。 示例: 1)用户程序 /*brief test demo-for-precompile-to-undef? show you hereauthor wenxuanpeiemail 15873152445163.com(q…

synchronized-锁优化

自旋锁 自旋锁是一种基于忙等待的同步机制,用于保护临界区代码的并发访问。与互斥锁相比,自旋锁尝试通过忙等待来避免线程的切换和阻塞,从而减少开销。 自旋锁的定义:自旋锁是一种基于忙等待的同步机制,在线程无法获…

蓝桥杯 第 9 场 小白入门赛 字符迁移

题目&#xff1a; 3.字符迁移【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 此题通过把小写字母映射成数字&#xff0c;进行差分即可。 AC代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm>using namespace std;typed…

LeetCode-33. 搜索旋转排序数组【数组 二分查找】

LeetCode-33. 搜索旋转排序数组【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;二分查找。1.找哨兵节点&#xff08;nums[0]或nums[-1]&#xff09;可以确定nums[mid]位于前一段或后一段有序数组中。2. 就是边界left和right的变换&#xff0c;具体看代码。解题思…

基于SpringBoot的“民宿管理平台系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“民宿管理平台系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 用户首页界面图 民宿信息管理界面图 房间预订…

IFC文件分析工具Top 5

分析行业基础类 (IFC) 文件是确保建筑信息模型 (BIM) 数据准确性和一致性的关键步骤。 在验证这些文件期间需要考虑各个方面&#xff0c;以避免错误并确保项目的最佳运行。 在本文中&#xff0c;我们将介绍验证 IFC 文件的五种有效方法&#xff0c;帮助你对 IFC 文件的质量充…

python开发poc2,爆破脚本

#本课知识点和目的&#xff1a; ---协议模块使用&#xff0c;Request 爬虫技术&#xff0c;简易多线程技术&#xff0c;编码技术&#xff0c;Bypass 后门技术 下载ftp服务器模拟器 https://lcba.lanzouy.com/iAMePxl378h 随便创建一个账户&#xff0c;然后登录进去把ip改成…

AI大模型下的策略模式与模板方法模式对比解析

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;设计模式深度解析&#xff1a;AI大模型下…