PaddleOCR本地部署 (Python+Flask)

article/2025/8/22 13:44:17
查看配置:

win10系统+Python 3.9.13 + NVIDIA GeForce RTX 3080 Ti
在这里插入图片描述

安装环境:
1)下载 CUDA Toolkit 12.6
2)安装 CUDA Toolkit

查看是否安装成功

nvcc --version
3)安装 PaddlePaddle GPU 版本(配合 CUDA 12.6)

PaddlePaddle安装指令
查看 PaddlePaddle 版本:

import paddle
print(paddle.__version__)
4)安装paddleocr

虚拟环境安装:

# 创建并激活虚拟环境
python -m venv venv
venv\Scripts\activate# 安装 paddleocr 到当前虚拟环境中
pip install paddleocr# 或者指定国内镜像
pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple 

查看paddleocr版本:

import paddleocr
print(paddleocr.__version__)

版本错误可安装指定版本:

pip install paddleocr==2.10.0
目录
TestPaddle/
├── ocr_server.py
├── ch_PP-OCRv4_det_server_infer
|	├── inference.pdiparams
|	├── inference.pdiparams.info
|	└── inference.pdmodel
├── ch_PP-OCRv4_rec_server_infer
|	├── inference.pdiparams
|	├── inference.pdiparams.info
|	└── inference.pdmodel
└── cls
|	├── inference.pdiparams
|	├── inference.pdiparams.info
|	└── inference.pdmodel
└── 001.jpg
ocr_server.py:
from flask import Flask, request, jsonify
from paddleocr import PaddleOCR
import cv2
import os
import time
import numpy as np
import json
from datetime import datetime
import requests
import urllib.parse# 测试命令:curl "http://localhost:8082/image-ocr?templateCode=23&path=001.jpg"
# 现场 虚拟环境激活  py38\Scripts\activate
app = Flask(__name__)# # 获取当前脚本所在目录作为基础路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))# 初始化 OCR 引擎(使用本地模型路径)
ocr_engine = PaddleOCR(use_angle_cls=False,lang="ch",det_model_dir=os.path.join(BASE_DIR, 'ch_PP-OCRv4_det_server_infer'),rec_model_dir=os.path.join(BASE_DIR, 'ch_PP-OCRv4_rec_server_infer'),cls_model_dir=os.path.join(BASE_DIR, 'cls'),use_gpu=True,use_pdserving=False,det_limit_side_len=3264,det_db_thresh=0.8,det_db_box_thresh=0.6,det_db_unclip_ratio=3,rec_image_shape="3, 48, 64",e2e_limit_side_len=3264,e2e_pgnet_score_thresh=0.0001,download_model=False
)@app.route('/image-ocr', methods=['GET'])
def image_ocr():try:# 获取查询参数template_code = request.args.get('templateCode')image_path = request.args.get('path')# 检查参数是否为空if not image_path:return jsonify({'Status': 'Error','Message': 'Missing required parameter: path','ReceivedAt': get_current_time_with_ms()}), 400# 可选:打印 templateCode(但不参与 OCR 处理)print(f"Template Code: {template_code}")# # 检查图像是否存在# if not os.path.exists(image_path):#     return jsonify({#         'Status': 'Error',#         'Message': f'Image file does not exist: {image_path}',#         'ReceivedAt': get_current_time_with_ms()#     }), 400# 读取图像# img = cv2.imread(image_path)img = read_image(image_path)if img is None:return jsonify({'Status': 'Error','Message': 'Failed to load image.','ReceivedAt': get_current_time_with_ms()}), 400# 设置边缘裁剪距离gap = 10closingPix = 5gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)height, width = gray_image.shape[:2]# 设置边缘10个像素为255height, width = gray_image.shape[:2]gray_image[:, :gap] = 255gray_image[:, width - 10:] = 255gray_image[:gap, :] = 255gray_image[height - gap:, :] = 255# 二值化处理_, binary = cv2.threshold(gray_image, 254, 255, cv2.THRESH_BINARY_INV)# 先膨胀5次,再腐蚀5次kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))morphed = cv2.dilate(binary, kernel, iterations=closingPix)morphed = cv2.erode(morphed, kernel, iterations=closingPix)# 寻找连通域num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(morphed, connectivity=8)# 收集所有灰度为 0 的区域对应的矩形(排除背景)rectangles = []for i in range(1, num_labels):  # 从1开始跳过背景x, y, w, h, _ = stats[i]rectangles.append((x, y, w, h))# print("Rectangle", i)# 按照先 y(行),再 x(列)排序merged_rects_sorted = sorted(rectangles, key=lambda r: (r[1], r[0]))sum_message = ""final_message_parts = []for idx, rect in enumerate(merged_rects_sorted, start=1):x, y, w, h = rect# 创建一个全白的图像(与原图大小一致)mask = np.ones_like(img) * 255  # 灰度图为 255 的白色背景图像# 将 rect 区域替换为原图中的内容mask[y:y + h, x:x + w] = img[y:y + h, x:x + w]# img = mask# cv2.imwrite("test Rectangle"+str(idx)+".jpeg", mask)print(f"Rectangle {idx}: x={x}, y={y}, w={w}, h={h}")# 执行 OCRresult = ocr_engine.ocr(mask, cls=False)# 格式化结果message_lines = []for line in result:if line is not None:for word_info in line:text = word_info[1][0]coords = word_info[0]coord_str = ",".join([f"({int(x)},{int(y)})" for x, y in coords])message_lines.append(f"{text}:{coord_str}")message = "Rectangle"+str(idx)+"{" + ";".join(message_lines) + "}"sum_message = sum_message + messagereturn jsonify({'Status': 'Success','Message': sum_message,'ReceivedAt': get_current_time_with_ms()})except Exception as e:return jsonify({'Status': 'Error','Message': str(e),'ReceivedAt': get_current_time_with_ms()}), 500def get_current_time_with_ms():"""返回当前系统时间,格式为 YYYY-MM-DD HH:MM:SS.sss"""return time.strftime('%Y-%m-%d %H:%M:%S.') + f"{int(time.time() * 1000) % 1000:03d}"def read_image(image_source):"""读取图像,支持 HTTP URL 和本地路径:param image_source: 图像地址,可以是 URL 或本地路径:return: OpenCV 图像对象,失败返回 None"""if urllib.parse.urlparse(image_source).scheme in ('http', 'https'):# 是网络URL,使用 requests 下载try:response = requests.get(image_source, timeout=10)response.raise_for_status()image_array = np.frombuffer(response.content, dtype=np.uint8)image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)except Exception as e:print(f"读取网络图像失败: {e}")return Noneelse:# 当作本地路径处理if os.path.exists(image_source):image = cv2.imread(image_source)else:print(f"本地路径不存在: {image_source}")return Nonereturn imageif __name__ == '__main__':app.run(host='0.0.0.0', port=8082, threaded=True)

在这里插入图片描述
测试:
在这里插入图片描述


http://www.hkcw.cn/article/UkwnMpXgTN.shtml

相关文章

CSformer:结合通道独立性和混合的稳健多变量时间序列预测

原文地址:2312.06220 发表会议:AAAI 2025 代码地址:暂无 作者:王浩鑫 团队:四川大学 本博客内容主要介绍了此论文到底做了什么?以及我阅读中遇到的一些问题。 因为我本人就是时序预测方向的所以我直接借用AI助手对…

springcloud openfeign 请求报错 java.net.UnknownHostException:

现象 背景 项目内部服务之间使用openfeign通过eureka注册中心进行服务间调用,与外部通过http直接调用。外部调用某个业务方提供的接口需要证书校验,因对方未提供证书故设置了忽略证书校验代码如下 Configuration public class IgnoreHttpsSSLClient {B…

深度学习核心网络架构详解:从 CNN 到 LSTM

深度学习领域中,不同的网络架构适用于处理各种复杂的任务。本文将深入探讨几种必须掌握的核心网络架构,包括卷积神经网络 (CNN)、循环神经网络 (RNN) 及其变体长短时记忆网络 (LSTM) 和门控循环单元 (GRU),并结合具体案例和代码实现进行详细讲解。 一、卷积神经网络 (CNN) …

美国上诉法院暂时恢复实施特朗普政府关税政策

当地时间5月29日,美国联邦巡回上诉法院批准特朗普政府的请求,暂时搁置美国国际贸易法院此前做出的禁止执行特朗普政府依据《国际紧急经济权力法》对多国加征关税措施的行政令的裁决。联邦巡回上诉法院在裁决书中说,美国政府的请求已获批准,在本法院审议相关动议文件期间,美…

全球最大医院原院长涉嫌严重违纪违法 医疗界震动

全球最大医院原院长涉嫌严重违纪违法!今日,河南省纪委监委发布消息,河南省政协人口资源环境委员会主任阚全程因涉嫌严重违纪违法,正接受纪律审查和监察调查。此消息在医疗领域引发广泛关注。阚全程曾长期执掌“亚洲最大医院”郑大一附院,使得该事件备受瞩目。阚全程1963年…

“亚洲最大医院”原院长被查 医疗反腐再掀波澜

“亚洲最大医院”原院长被查 医疗反腐再掀波澜!河南省纪委监委今日发布消息,河南省政协人口资源环境委员会主任阚全程因涉嫌严重违纪违法,正接受纪律审查和监察调查。这一消息在医疗领域引起广泛关注。阚全程曾长期担任“亚洲最大医院”郑大一附院的院长,使得该事件更加引人…

设计模式:观察者模式 - 实战

一、观察者模式场景 1.1 什么是观察者模式? 观察者模式(Observer Pattern)观察者模式是一种行为型设计模式,用于定义一种一对多的依赖关系,当对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更…

首发!PPIO派欧云上线DeepSeek-R1-0528

今天凌晨,“小版本试升级”的 DeepSeek-R1-0528 在 Hugging Face 正式开源。 经 PPIO派欧云工程师测试,这个所谓的“小版本”更新在代码领域大幅增强,凭借简单朴素的提示词就能生成小游戏、图片、精美的网页,生成效果可媲美 Claud…

国务院任免21名干部 涉及多个重要职位调整

国务院任免21名干部 涉及多个重要职位调整!据人社部网站5月29日消息,国务院任免了21名国家工作人员。郭彩云(女)被任命为审计署副审计长,王军为海关总署副署长,蔡自力为国家税务总局副局长,邹晓东为国务院参事室主任,赵世通为国务院台湾事务办公室副主任,李长喜为国家…

【STM32开发板】电源设计(电压基准、滤波电容)

一、基准电压源 基准电压源是一种能提供稳定、精确、不随温度、负载、电源电压变化而波动的电压源。它广泛应用于电子电路中,尤其是在需要高精度和稳定性的场合,如模数转换(ADC)、 数模转换(DAC)、稳压电路…

男大学生正在批量减少:教育竞争中的性别差异显现

男大学生正在批量减少:教育竞争中的性别差异显现!毕业季即将来临,校园里随处可见穿着学位服的毕业生在草坪上拍照。她们对着镜头比出剪刀手,或是抱着鲜花和室友笑成一团。图书馆前台阶上,三五成群的学生捧着论文材料匆匆走过,教室里答辩结束的学生红着眼眶与导师拥抱。仔…

K8S StatefulSet 快速开始

其实这篇文章的梗概已经写了很久了,中间我小孩出生了,从此人间多了一份牵挂。抽出一些时间去办理新生儿相关手续。初为人父确实艰辛,就像学技术一样,都需要有极大的耐心,付出很多的时间。 一、引子 1.1、独立的存储 …

【笔记】suna部署之获取 Daytona API key 及 Daytona Sandbox 设置

#工作记录 Daytona 注册 Daytona 账户 访问Daytona 官方网站。点击注册按钮,按照提示填写相关信息完成注册。 获取 Daytona API 密钥 登录 Daytona 账户。进入账户设置页面,查找生成 API 密钥的选项,生成并复制 API 密钥,用于 S…

昇腾首发支持,阶跃星辰 “改图大师” Step1X-Edit开源并上线魔乐社区

4月27日,阶跃星辰正式发布并开源图像编辑大模型 Step1X-Edit ,性能达到开源 SOTA 。该模型总参数量为19B (7B MLLM 12B DiT),具备语义精准解析、身份一致性保持、高精度区域级控制三项关键能力;支持11类高频图像编辑任务类型&…

int和Integer的区别

Java是面向对象的语言,一切操作都以对象为基础,像集合里面也只支持存储Object类型数据,普通类型无法通过集合存储, 在Java中,int和Integer是两种不同的类型,它们有以下主要区别: 一、类型分类…

Oracle/openGauss中,DATE/TIMESTAMP与数字日期/字符日期比较

ORACLE 运行环境 openGauss 运行环境 0、前置知识 ORACLE:DUMP()函数用于返回指定表达式的数据类型、字节长度及内部存储表示的详细信息 SELECT DUMP(123) FROM DUAL; -- Typ2 Len3: 194,2,24 SELECT DUMP(123) FROM DUAL;-- Typ96 Len3: 49,50,51 -- ASCII值&am…

应用于公路路面破损状况检测的视觉系统

随着公路交通的日益发展,公路交通也是经济命脉,路面病害检测直接关系到交通安全,公路路面检测是养护管理的核心环节,及时识别裂缝、坑槽、车辙等病害,避免因路面损坏引发交通事故。 公路路面基病害检测系统是基于数字图…

ZeroSearch: 无需搜索即可激发LLM的搜索能力

论文地址:https://arxiv.org/abs/2505.04588v2 摘要 有效的的信息搜索对于增强大型语言模型 (LLM) 的推理和生成能力至关重要。 最近的研究探索了使用强化学习 (RL) 通过与现实世界环境中的实时搜索引擎交互来提高 LLM 的搜索能力。 虽然这些方法显示出可喜的结果&…

Linux实操篇-进程管理

目录 传送门前言一、进程管理概念二、进程管理实战1. **查看进程**ps 命令top 命令htop 命令 2. **进程的启动和终止**启动进程停止进程使用 pkill 或 killall 3. **进程优先级管理**nice 和 renice 命令top 中调整进程优先级 4. **进程的查看与控制**pgrep 命令pstree 命令str…

DAY 14 SHAP库的绘制

上面这个图就是一个比较直观的解释。机器学习模型一般都是一个黑盒。比如某个模型要进行一些预测任务,首先对模型输入一些已知条件(Age65,SexF,BP180,BMI40),然后模型根据输入进行训练,最终训练完的模型可以对该条件输…