当前位置: 首页 > news >正文

OCR文字识别—基于PP-OCR模型实现ONNX C++推理部署

概述

PaddleOCR 是一款基于 PaddlePaddle 深度学习平台的开源 OCR 工具。PP-OCR是PaddleOCR自研的实用的超轻量OCR系统。它是一个两阶段的OCR系统,其中文本检测算法选用DB,文本识别算法选用CRNN,并在检测和识别模块之间添加文本方向分类器,以应对不同方向的文本识别。

PP-OCRv4 在速度可比的情况下,中文场景端到端 hmean 指标相比于 PP-OCRv3 提升 4.25%。英文数字场景,相比于 PP-OCRv3 英文模型提升 6%。在有评估集的四种语系识别准确率平均提升 5% 以上。对已支持的 80 余种语言识别模型进行了升级更新,优化了多语言场景下的识别效果,平均准确率提升超 8%。
在这里插入图片描述
官方代码:https://github.com/PaddlePaddle/PaddleOCR

模型下载

模型地址:https://paddlepaddle.github.io/PaddleOCR/latest/ppocr/model_list.html
PP-OCRv4提供了版面分析、表格识别、文本检测模型、文本方向分类器、文本识别等模型。在这里,笔者只下载检测、方向、识别三种轻量版本的推理模型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下载完成后,解压文件。
在这里插入图片描述
在这里插入图片描述
inference.pdparams:模型的参数文件,存储了模型的权重和偏置等信息,用于推理时加载模型的权重。
inference.pdmodel:模型的结构文件,存储了神经网络的架构信息(例如层的定义和计算方式),推理时通过此文件定义模型结构。

模型转换

首先将下载的 paddle 模型转换为 onnx模型。可以从这个地址https://github.com/paddlepaddle/paddle2onnx下载源码进行编译转换。
或者直接安装环境去转换:

conda create -n paddle2onnx python=3.8
activate paddle2onnx
pip install PaddlePaddle==2.6.0
pip install onnxruntime>=1.10.0
pip install paddle2onnx
paddle2onnx --model_dir ch_PP-OCRv4_det_infer --model_filename inference.pdmodel
--params_filename inference.pdiparams --save_file ch_PP-OCRv4_det_infer.onnx

在这里插入图片描述

模型部署

#include<iostream>
#include <io.h>
#include <fcntl.h>
#include<opencv2/opencv.hpp>
#include<onnxruntime_cxx_api.h>
#include"text_det.h"
#include"text_angle_cls.h"
#include"text_rec.h"
#include "utils.h"int main()
{std::string img_path = "images/1.jpg";cv::Mat src_img = cv::imread(img_path);cv::rotate(src_img, src_img, 1);const std::string det_model = "model/ch_PP-OCRv4_det_infer.onnx";const std::string cls_model = "model/ch_ppocr_mobile_v2.0_cls_infer.onnx";const std::string rec_model = "model/ch_PP-OCRv4_rec_infer.onnx";bool isGPU = true;TextDetector text_det(det_model, isGPU);TextClassifier text_cls(cls_model, isGPU);TextRecognizer text_rec(rec_model, isGPU);std::vector<std::vector<cv::Point2f>> results = text_det.detect(src_img);std::sort(results.begin(), results.end(), utils::compareBoxes);cv::Mat det_img = src_img.clone();for (const auto& polygon : results) {std::vector<cv::Point> intPolygon;for (const auto& point : polygon) {intPolygon.emplace_back(cv::Point(static_cast<int>(point.x), static_cast<int>(point.y)));}cv::polylines(det_img, intPolygon, true, cv::Scalar(0, 0, 255), 1);}//text_det.draw_pred(src_img, results);cv::imshow("Detected Text Boxes", det_img);cv::waitKey(0);for (size_t i = 0; i < results.size(); i++) {cv::Mat textimg = text_det.get_rotate_crop_image(src_img, results[i]);cv::imshow("single_text_box", textimg);cv::waitKey(0);if (text_cls.predict(textimg) == 1) {cv::rotate(textimg, textimg, 1); }cv::imshow("single_text_rotate", textimg);cv::waitKey(0);int textWidth = textimg.cols;std::string full_text = "";if (textWidth < 250) {std::string text = text_rec.predict_text(textimg);full_text = text;}else {int segmentWidth = 250; int numSegments = std::ceil((float)textWidth / segmentWidth); for (int seg = 0; seg < numSegments; ++seg) {int startX = seg * segmentWidth;int endX = std::min(startX + segmentWidth, textWidth); cv::Rect roi(startX, 0, endX - startX, textimg.rows);cv::Mat segment = textimg(roi);std::string segment_text = text_rec.predict_text(segment);full_text += segment_text;}}_setmode(_fileno(stdout), _O_U8TEXT);std::wstring w_text = utils::charToWstring(full_text.c_str());std::wcout << w_text << std::endl;}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

OCR文字识别—基于PP-OCR模型实现ONNX C++推理部署

概述 PaddleOCR 是一款基于 PaddlePaddle 深度学习平台的开源 OCR 工具。PP-OCR是PaddleOCR自研的实用的超轻量OCR系统。它是一个两阶段的OCR系统&#xff0c;其中文本检测算法选用DB&#xff0c;文本识别算法选用CRNN&#xff0c;并在检测和识别模块之间添加文本方向分类器&a…...

如何播放视频文件

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节3. 示例代码4. 内容总结我们在上一章回中介绍了"如何获取文件类型"相关的内容,本章回中将介绍如何播放视频.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用的功能,不过Flutter官方…...

MySQL -- 约束

1. 数据库约束 数据库约束时关系型数据库的一个重要功能,主要的作用是保证数据的有效性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确) 人工检查数据的完整性工作量非常大,在数据库中定义一些约束,那么数据在写入数据库的时候,就会帮我们做一些校验.并且约束一…...

php 使用simplexml_load_string转换xml数据格式失败

本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…...

net-http-transport 引发的句柄数(协程)泄漏问题

Reference 关于 Golang 中 http.Response.Body 未读取导致连接复用问题的一点研究https://manishrjain.com/must-close-golang-http-responsehttps://www.reddit.com/r/golang/comments/13fphyz/til_go_response_body_must_be_closed_even_if_you/?rdt35002https://medium.co…...

高级软件工程-复习

高级软件工程复习 坐标国科大&#xff0c;下面是老师说的考试重点。 Ruby编程语言的一些特征需要了解要能读得懂Ruby程序Git的基本命令操作知道Rails的MVC工作机理需要清楚&#xff0c;Model, Controller, View各司什么职责明白BDD的User Story需要会写&#xff0c;SMART要求能…...

eslint.config.js和.eslintrc.js有什么区别

eslint.config.js 和 .eslintrc.js 的主要区别在于它们所对应的 ESLint 版本和配置方法&#xff1a; 1. .eslintrc.js&#xff1a; 这是 ESLint v8 及更早版本使用的配置文件格式。 它使用层级式的配置系统。 现在被称为"旧版"配置格式 。 2. eslint.config.js&am…...

如何使用MVC模式设计和实现校园自助点餐系统的微信小程序

随着智慧校园的普及&#xff0c;校园自助点餐系统在提高学生用餐效率、减轻食堂运营压力方面发挥了重要作用。 在开发这类系统时&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;模式是一种非常适合的架构&#xff0c;它将系统的业务逻辑、用户界面和数据交互清晰…...

继续坚持与共勉

经过期末考试后&#xff0c;又要开始学习啦。 当时一直在刷算法题就很少写博客了&#xff0c;现在要继续坚持写博客&#xff0c;将每天对于题的感悟记录下来。 同时我将会在学习Linux操作系统&#xff0c;对于过去学习的内容进行回顾&#xff01;&#xff01; 在此&#xff…...

人机交互 | 期末复习(上)| 补档

文章目录 📚1-HCI Introduction🐇人机交互的定义,分别解释人-机-交互的概念🐇six ”mantras“ of UCD🐇Difference between User-Interface (UI) and User-Experience(UX)📚2-HCI history🐇WIMP🐇WYSIWYG📚3-Understanding User🐇Design Thinking Process的…...

Oracle 表分区简介

目录 一. 前置知识1.1 什么是表分区1.2 表分区的优势1.3 表分区的使用条件 二. 表分区的方法2.1 范围分区&#xff08;Range Partitioning&#xff09;2.2 列表分区&#xff08;List Partitioning&#xff09;2.3 哈希分区&#xff08;Hash Partitioning&#xff09;2.4 复合分…...

多并发发短信处理(头条项目-07)

1 pipeline操作 Redis数据库 Redis 的 C/S 架构&#xff1a; 基于客户端-服务端模型以及请求/响应协议的 TCP服务。客户端向服务端发送⼀个查询请求&#xff0c;并监听Socket返回。通常是以 阻塞模式&#xff0c;等待服务端响应。服务端处理命令&#xff0c;并将结果返回给客…...

网络编程的进程查看连接描述符信息等

一.查看当前进程的socket对应的fd信息 1. lsof lsof&#xff08;List Open Files&#xff09;命令可以列出系统中所有打开的文件的信息&#xff0c;包括 socket。 用法 要查看特定进程的 socket 信息&#xff0c;可以使用以下命令&#xff1a; lsof -p <pid> | grep…...

ChatGPT API快速搭建自己的第一个应用—文章摘要(单轮对话应用)

使用ChatGPT API快速搭建自己的第一个应用 1 安装库2 设置与导入3 文章摘要(单轮对话应用)3.1 任务简介:3.2 初始化3.3 点击发送3.4 保存3.5 检查并打印你的结果1 安装库 !pip install gradiogradio 是一个用于快速搭建交互式用户界面的 Python 库,特别适合展示机器学习模…...

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机&#xff0c;子弹&#xff0c;爆炸特效以及导出png序列图-优雅草央千澈 开发背景 优雅草央千澈所有的合集&#xff0c;系列文章可能是不太适合完全初学者的&#xff0c;因为课程不会非常细致的系统…...

软件测试预备知识④—NTFS权限管理、磁盘配额与文件共享

在软件测试的实际环境搭建与管理过程中&#xff0c;了解和掌握NTFS权限管理、磁盘配额以及文件共享等知识至关重要。这些功能不仅影响系统的安全性和稳定性&#xff0c;还对测试数据的存储、访问以及多用户协作测试有着深远的影响。 一、NTFS权限管理 1.1 NTFS简介 NTFS&am…...

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD&#xff08;持续交付/持续部署&#xff09;自动化流程示例&#xff1a; Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段&#xff1a;Jenkins 流水线实现CD 阶段&#xff1a;Jenkins 流水…...

【python3】 sqlite格式的db文件获得所有表和数据

【python3】 sqlite格式的db文件获得所有表和数据 1.背景2.代码3.解析1.背景 SQLite 格式的 .db 文件就是一个包含 SQLite 数据库的文件。 SQLite 格式的 .db 文件通常存储的是一个关系型数据库。 SQLite广泛用于应用程序、移动设备、浏览器等场景。它将整个数据库存储在一个文…...

【灵码助力安全3】——利用通义灵码辅助智能合约漏洞检测的尝试

前言 随着区块链技术的快速发展&#xff0c;智能合约作为去中心化应用&#xff08;DApps&#xff09;的核心组件&#xff0c;其重要性日益凸显。然而&#xff0c;智能合约的安全问题一直是制约区块链技术广泛应用的关键因素之一。由于智能合约代码一旦部署就难以更改&#xf…...

openEuler 22.04使用yum源最快速度部署k8s 1.20集群

本文目的 openEuler的官方源里有kubernetes 1.20&#xff0c;使用yum源安装是最快部署一个k8s集群的办法 硬件环境 主机名系统架构ipmasteropenEuler release 22.03 (LTS-SP2)arm192.168.3.11edgeopenEuler release 22.03 (LTS-SP2)arm192.168.3.12deviceopenEuler release 22.…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...