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

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.dtcms.com/a/288830.html

相关文章:

  • linux ps -a与-e的区别
  • Spring Cloud Gateway高危隐患
  • 社交圈子系统开源社交源码 / 小程序+H5+APP 多端互通的底层技术分析
  • [特殊字符] 小程序 vs 智能体:下一代应用开发,谁主沉浮?
  • 「Java案例」利用方法打印乘法表
  • 传输层协议 TCP
  • 相机模型和对极几何
  • SparseTSF:用 1000 个参数进行长序列预测建模
  • 【no vue no bug】 npm : 无法加载文件 D:\software\nodeJS\node22\npm.ps1
  • 构建一种安全的老式测试仪,用于具有限流灯泡,模拟仪表和可变输出的交流设备
  • SpringBoot集成MyBatis的SQL拦截器实战
  • Shell脚本-grep工具
  • Node.js:函数、路由、全局对象
  • 5.2.4 指令执行过程
  • playwright 最佳实践
  • PostgreSQL实战:高效SQL技巧
  • 第三章-提示词-中级:进阶技巧与实践指南(12/36)
  • Java什么是原子性
  • 17.TaskExecutor与ResourceManager交互
  • 论文阅读:Instruct BLIP (2023.5)
  • 【Lua】多脚本引用
  • Java反射:打破静态限制的利器
  • 【笔记】Anaconda 重装后虚拟环境写入路径异常的完整排查与解决过程
  • MySQL—表设计和聚合函数以及正则表达式
  • LeetCode 1712.将数组分成三个子数组的方案数
  • ZooKeeper学习专栏(二):深入 Watch 机制与会话管理
  • BST(二叉搜索树)的笔试大题(C语言)
  • [硬件电路-59]:电源:电子存储的仓库,电能的发生地,电场的动力场所
  • 手推OpenGL相机的正交投影矩阵和透视投影矩阵(附源码)
  • 【AI】文生图文生视频