PaddleOCR 与 PaddleX 调试

PaddleOCR 与 PaddleX 调试

  • 1.安装
    • 1.1 环境准备
    • 1.2用Conda创建虚拟环境
  • 2.测试
    • 2.1发票测试
    • 2.2 手写汉字识别
  • 3.PaddleOCR 与 PaddleX 对比
    • 3.1 基于 PaddleX 部署 OCR 服务

1.安装

PP OCR 文档

1.1 环境准备

根据自己操作系统按网上指导安装 ccache

ccache --version

是否已安装 ccache 测试

在这里插入图片描述

设置 Paddlex 环境变量 PADDLE_PDX_CACHE_HOME

以 Windows 为例

在这里插入图片描述

1.2用Conda创建虚拟环境

## 创建
conda create -n env-ocr python=3.10
## 激活
conda activate env-ocr
## 精简安装
pip install paddlepaddle==3.1.0
pip install paddleocr==3.1.0

非精简安装

## 下载源码
git clone https://github.com/PaddlePaddle/PaddleOCR.git
## 进入源码目录,并激活虚拟环境
conda activate env-ocr
## 安装
pip install -e . --no-deps

在这里插入图片描述

2.测试

使用 Git 提供的用例代码

from paddleocr import PaddleOCR
# Initialize PaddleOCR instance
ocr = PaddleOCR(use_doc_orientation_classify=False,use_doc_unwarping=False,use_textline_orientation=False)# Run OCR inference on a sample image 
result = ocr.predict(input="invoice.jpg")# Visualize the results and save the JSON results
for res in result:res.print()res.save_to_img("output")res.save_to_json("output")

首次执行会自动下载模型依赖

在这里插入图片描述

2.1发票测试

在这里插入图片描述
结果

在这里插入图片描述

2.2 手写汉字识别

在这里插入图片描述

结果(部分识别不准确

在这里插入图片描述

3.PaddleOCR 与 PaddleX 对比

维度​​​PaddleOCR ​​PaddleX
核心目标​​专用OCR算法库深度学习全流程工具链
​​使用场景​​需精细调优OCR模型时快速集成OCR到完整应用(含其他AI任务)
​​部署灵活性支持 Python/C++ 等原生部署提供 HTTP 服务、Docker 等标准化部署方案
​​开发复杂度​​需直接处理OCR技术细节低代码调用,简化流程

3.1 基于 PaddleX 部署 OCR 服务

## 安装服务插件
paddlex --install serving

在这里插入图片描述

## 以 API 服务形式启动(服务部署可以改成后台进程形式启动)
paddlex --serve --pipeline OCR --port 8800

在这里插入图片描述

查看接口文档:http://127.0.0.1:8800/docs

在这里插入图片描述

测试用脚本

import base64
import requests
import json
import os
import argparse
from typing import List, Dict, Any, Tupleclass PaddleXOCRApiClient:"""PaddleX OCR 服务的客户端类"""def __init__(self, host: str = "localhost", port: int = 8800) -> None:"""初始化 OCR 客户端Args:host: 服务主机地址port: 服务端口"""self.base_url = f"http://{host}:{port}"self.ocr_url = f"{self.base_url}/ocr"def recognize_text(self, image_path: str) -> Dict[str, Any]:"""从单张图像中识别文本Args:image_path: 图像文件路径Returns:包含识别结果的字典"""if not os.path.exists(image_path):raise FileNotFoundError(f"文件不存在: {image_path}")try:with open(image_path, "rb") as f:base64_data = base64.b64encode(f.read()).decode("utf-8")payload = {"file": base64_data,"fileType": 1# "useDocOrientationClassify": true,# "useDocUnwarping": true,# "useTextlineOrientation": true,# "textDetLimitSideLen": 0,# "textDetLimitType": "string",# "textDetThresh": 0,# "textDetBoxThresh": 0,# "textDetUnclipRatio": 0,# "textRecScoreThresh": 0,# "visualize": true}# print(payload)response = requests.post(self.ocr_url, json=payload,headers={"Accept": "application/json"})if response.status_code == 200:return response.json()else:raise Exception(f"请求失败,状态码: {response.status_code}, 错误信息: {response.text}")except Exception as e:print(f"识别过程发生错误: {str(e)}")return {"error": str(e), "results": []}def recognize_text_from_dir(self, dir_path: str) -> Dict[str, Dict[str, Any]]:"""从目录中的所有图像文件识别文本Args:dir_path: 图像目录路径Returns:包含所有图像识别结果的字典"""if not os.path.isdir(dir_path):raise NotADirectoryError(f"不是有效目录: {dir_path}")supported_extensions = {".jpg", ".jpeg", ".png", ".bmp", ".webp"}results = {}for filename in os.listdir(dir_path):ext = os.path.splitext(filename)[1].lower()if ext in supported_extensions:file_path = os.path.join(dir_path, filename)results[filename] = self.recognize_text(file_path)return resultsdef format_results(self, results: Dict[str, Any]) -> str:"""格式化识别结果为易读的文本Args:results: 识别结果字典Returns:格式化后的文本"""formatted_text = ""if results["errorCode"] != 0:formatted_text += f"错误: {results['errorMsg']}\n"return formatted_textresult = results['result']['ocrResults'][0]for text in result['prunedResult']['rec_texts']:formatted_text += text + "\n"return formatted_text if formatted_text else "未检测到文本"def main():parser = argparse.ArgumentParser(description="PaddleX OCR 服务客户端")parser.add_argument("--host", default="localhost", help="OCR 服务主机")parser.add_argument("--port", type=int, default=8800, help="OCR 服务端口")parser.add_argument("--image", help="待识别的图像文件路径")parser.add_argument("--dir", help="待识别的图像目录路径")parser.add_argument("--output", help="输出结果的 JSON 文件路径")parser.add_argument("--verbose", action="store_true", help="显示详细的识别结果")args = parser.parse_args()# 验证输入参数if not args.image and not args.dir:parser.error("请指定 --image 或 --dir 参数")if args.image and args.dir:parser.error("--image 和 --dir 参数不能同时使用")try:client = PaddleXOCRApiClient(args.host, args.port)if args.image:# 处理单张图像results = client.recognize_text(args.image)if args.verbose:print(f"图像: {args.image}")print(client.format_results(results))if args.output:with open(args.output, "w", encoding="utf-8") as f:json.dump(results, f, ensure_ascii=False, indent=2)print(f"结果已保存到: {args.output}")elif args.dir:# 处理目录中的所有图像all_results = client.recognize_text_from_dir(args.dir)if args.verbose:for filename, results in all_results.items():print(f"\n图像: {filename}")print(client.format_results(results))if args.output:with open(args.output, "w", encoding="utf-8") as f:json.dump(all_results, f, ensure_ascii=False, indent=2)print(f"所有结果已保存到: {args.output}")except Exception as e:print(f"执行过程中发生错误: {str(e)}")if __name__ == "__main__":main()    

Test 图片

在这里插入图片描述

Test-Hand

在这里插入图片描述

验证

## 打印字体
python test.py --image test.jpg --verbose --output result.json
## 手写字体
python test.py --image test-hand.jpg --verbose --output result.json

在这里插入图片描述

​​

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

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

相关文章

imx6ull-系统移植篇11——U-Boot 移植(下)

目录 前言 移植过程 添加开发板默认配置文件 添加开发板对应的头文件 添加开发板对应的板级文件夹 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 图形界面配置文件 编译 uboot LCD 驱动修改 修改源文件 修改头文…

30天打牢数模基础-模拟退火算法讲解

二、完整Python代码 import random import mathdef rastrigin(x, y):"""二维Rastrigin函数(目标函数,需最小化)参数:x: 自变量xy: 自变量y返回:函数值f(x,y)"""return 20 x**2 y**2 …

论文阅读 - FastInst

文章目录1 概述2 模型说明2.1 总体架构2.2 轻量pixel decoder2.3 实例激活引导的Query2.4 双路径更新策略2.5 GT掩码引导学习2.6 损失函数3 效果1 概述 FastInst是一种基于query的实时实例分割方法,它能以32.5FPS的实时速度在COCO测试集上达到40.5的AP。在实例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主节点 + 3 数据节点)

Elasticsearch 9.x 高可用集群部署教程(3 主节点 + 3 数据节点) 1. 集群架构规划 生产环境中的 Elasticsearch 集群需要高可用性和容错能力。以下是基于 3 主节点 + 3 数据节点的架构规划: 节点分布: 主节点(Master Nodes):3 台(master-node-1, master-node-2, maste…

Unity_通过鼠标点击屏幕移动屏幕里的一个对象

文章目录一、获取到点击物体的Tansform(摁下鼠标左键的瞬间)二、移动点击的物体(摁着鼠标左键不放)三、松开左键清理被移动对象属性总结注:本文章只是学习总结的笔记,视频链接 一、获取到点击物体的Tansfor…

UDP中的单播,多播,广播(代码实现)

文章目录1. UDP 单播(Unicast)示例2. UDP 广播(Broadcast)示例3. UDP 多播(Multicast)示例3.1 多播发送方示例3.2 多播接收方示例总结1. UDP 单播(Unicast)示例 发送方向指定单个目…

神经网络:卷积层

神经网络 卷积操作 例子: 输入:二维图像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷积核: [1,2,1] [0,1,0] [2,1,0] 然后需要将输入图像和卷积核转化为4维张量 为什么转为4维张量?因为卷积操作需要输入图像…

2.4 组件间通信Props(父传子)

父组件 在父组件模板上的子组件上加上属性值&#xff0c;属性值就是想要传递给子组件的信息。 例如&#xff1a; <template> <div class"Big-box"><testBox :personList"p"></testBox> </div> </template>子组件 子组…

从零开始学习 Redux:React Native 项目中的状态管理

Redux 是一个用于 JavaScript 应用程序的状态管理库&#xff0c;通常与 React 或 React Native 配合使用&#xff0c;帮助管理应用的状态和数据流。其核心原理是通过集中式的“单一数据源”来管理应用状态&#xff0c;避免组件之间的“层层传递”状态和副作用。 Redux 的原理单…

[特殊字符] CentOS 7 离线安装 MySQL 5.7 实验

&#x1f427; CentOS 7 离线安装 MySQL 5.7 实验 针对企业无互联网环境的系统&#xff0c;设计了如何在 CentOS 7 系统中&#xff0c;使用一台可以联网的主机&#xff08;NodeA&#xff09;为另一台无法联网的主机&#xff08;NodeB&#xff09;安装 MySQL 5.7 数据库及其依赖…

Redis 概率型数据结构实战指南

1. 为什么要用「近似」&#xff1f; 随着业务量爆发式增长&#xff0c;精确统计 的内存或 CPU 成本可能难以接受。例如&#xff1a; 统计一天内 唯一 IP 数 —— 用 SET 精确去重&#xff0c;百万 IP→占用数百 MB。统计海量商品销量、实时计算 P99 延迟、获取 TOP-N 热门页面……

Android开发工程师:Linux一条find grep命令通关搜索内容与文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多关键词搜索&#xff1a;使用正则表达式 pattern1|pattern2 同时搜索多个关键词&#xff08;如 activity|class&#xff09;单…

深入理解浏览器解析机制和XSS向量编码

URL 编码 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------浏览器解析不了。 页面识别在url解码之前&#xff0c;在…

ThinkPHP8极简上手指南:开启高效开发之旅

目录一、环境搭建1.1 安装 PHP1.2 安装 Composer二、安装 ThinkPHP8三、目录结构解析四、第一个简单示例&#xff1a;Hello, ThinkPHP84.1 创建控制器4.2 编写控制器方法4.3 配置路由4.4 访问测试五、进阶示例&#xff1a;数据库查询5.1 配置数据库连接5.2 创建模型5.3 编写查询…

智能制造之物料详解

在制造业业务系统中&#xff0c;物料流转贯穿“需求→采购→入库→生产→成品→交付”全流程&#xff0c;各系统通过数据协同实现物料状态、位置、数量的精准追踪。以下按流转阶段拆解&#xff1a;一、需求发起与计划阶段&#xff08;CRM/ERP/PLM主导&#xff09;1. 需求源头…

Qt的安装和环境配置

QT开发环境的搭建&#xff0c;需要安装3个部分&#xff0c;C编译器、Qt SDK(SDK是软件开发工具包)、QT的集成开发环境(IDE)Qt的3种集成开发环境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要额外的配置&#xff0c;但是有一些bug…

解析MCUboot的实现原理和Image结构

目录 概述 1 MCUboot的功能 1.1 代码包结构 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交换 2.5 Image 尾部数据结构 3 交换区 3.1 单交换区 3.2 Multiple Image boot 3.3 Image交换 4 交换状态&#xff08;swap statu…

YOLOv8目标检测项目代码详解与习题

YOLOv8目标检测项目代码详解与习题一、项目代码详解该代码是基于 YOLOv8 和 OpenCV 实现的图像目标检测项目&#xff0c;核心功能是加载预训练的 YOLOv8 模型&#xff0c;对指定图像进行目标检测&#xff0c;然后可视化检测结果并保存或显示。以下是逐行解析&#xff1a;# -*- …

gradle关于dependency-management的使用

1、相关文档Spring官方文档&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction仓库版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 对接FreeSwitch

1.增加Maven依赖<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…