PaddlePaddle / PaddleOCR踩坑记,动手实现一个OCR服务器
一、环境搭建
1、官网
https://gitee.com/paddlepaddle/PaddleOCR#/paddlepaddle/PaddleOCR/blob/main/doc/doc_ch/quickstart.md
2、准备环境
本地环境坑太多了,好在官网还有一种基于docker搭建的环境:
https://gitee.com/paddlepaddle/PaddleOCR/blob/main/doc/doc_ch/environment.md#132-docker%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE
# 切换到工作目录下
cd /home/Projects
# 首次运行需创建一个docker容器,再次运行时不需要运行当前命令
# 创建一个名字为ppocr的docker容器,并将当前目录映射到容器的/paddle目录下#如果您希望在CPU环境下使用docker,使用docker而不是nvidia-docker创建docker
sudo docker run --name ppocr -v $PWD:/paddle --network=host -it registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash# ctrl+P+Q可退出docker 容器,重新进入docker 容器使用如下命令
sudo docker container exec -it ppocr /bin/bash
运行docker环境之后,还需要下载对应的包:
https://gitee.com/paddlepaddle/PaddleOCR/blob/main/doc/doc_ch/quickstart.md#paddleocr-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
pip install "paddleocr>=2.0.1"
安装完成之后,就可以用了。我这里是简单搭建了一个基于CPU的服务器,都是用CPU处理的。
因为要下载的东西太多,我这里将容器打包了一下:
# 提交镜像
docker commit -m "ocr" -a="cxf" 4cc5a24c2d57 cxf/ocr:1.0# 运行我的镜像,并指定端口映射,方便http请求 调试
sudo docker run --name cxfocr -p 8080:8080 -v $PWD:/paddle -it cxf/ocr:1.0 /bin/bash
二、编码实现一个web程序
import requests
from flask import Flask
from flask import jsonify
from flask import request
import urllib.parse
from paddleocr import PaddleOCR, draw_ocr
app = Flask(__name__)
# 在Flask的config是一个存储了各项配置的字典
# 该操作是进行等效于ensure_ascii=False的配置
app.config['JSON_AS_ASCII'] = False@app.route("/exec", methods=['POST'])
def login():if request.method == 'POST':# 接收json数据,这个data就是json对象了data = request.get_json()imageUrl = data['url']if not imageUrl:return jsonify({"error": "缺少url参数"})# 图片下载到本地img_path = '/home/myocr/test.jpg'urllib.request.urlretrieve(url=imageUrl, filename=img_path)# 本地ocr识别ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memoryreturnResult = '';result = ocr.ocr(img_path, cls=True)for idx in range(len(result)):res = result[idx]for line in res:returnResult = returnResult + ' ' + line[1][0]print(returnResult)# todo 删除图片# 调用大模型,这里用的讯飞星火url = "https://spark-api-open.xf-yun.com/v1/chat/completions"data = {"model": "generalv3.5", # 指定请求的模型"messages": [{"role": "user","content": "你是一个ocr身份证识别的系统,并且只会给我标准的json格式数据,我需要根据你返回的标准的json格式数据进行下一步解析,返回的json数据的key为英文," +"下是一张身份证中的内容,请解析信息,并以json字符串给我返回:" + returnResult}]}header = {"Authorization": "Bearer xx:xxx"# 注意此处替换自己的key和secret}response = requests.post(url, headers=header, json=data)# {"code":0,"message":"Success","sid":"cha1234312473@dx1913097b491b8f3532","choices":[{"message":{"role":"assistant","content":"{\n \"name\": \"张三\",\n \"gender\": \"男\",\n \"ethnicity\": \"汉\",\n \"birthdate\": \"1992年3月11日\",\n \"address\": \"山东省青岛市市南区172号\",\n \"id_number\": \"37023319860123291X\"\n}"},"index":0}],"usage":{"prompt_tokens":122,"completion_tokens":97,"total_tokens":219}}print(response.text)# todo 解析jsonbigModelResultContent = response.text.replace('\n', '')print(bigModelResultContent)bigModelResultJson = json.loads(bigModelResultContent)msg = jsonpath.jsonpath(json.loads(bigModelResultContent),'$..content')[0]msg = msg.replace('[\'```json\n','')msg = msg.replace('\n```\']','')msg = msg.replace('[\n','')print(msg)# 将对象返回为jsonreturn jsonify({"result": msg})if __name__ == '__main__':app.run()
相关文章:
PaddlePaddle / PaddleOCR踩坑记,动手实现一个OCR服务器
文章目录 一、环境搭建1、官网2、准备环境 二、编码实现一个web程序 一、环境搭建 1、官网 https://gitee.com/paddlepaddle/PaddleOCR#/paddlepaddle/PaddleOCR/blob/main/doc/doc_ch/quickstart.md 2、准备环境 本地环境坑太多了,好在官网还有一种基于docker搭…...

JeecgBoot低代码平台简单记录
BasicModal弹窗 Usage 由于弹窗内代码一般作为单文件组件存在,也推荐这样做,所以示例都为单文件组件形式 注意v-bind"$attrs"记得写,用于将弹窗组件的attribute传入BasicModal组件 attribute:是属性的意思,…...

零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)
零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因) 目录 零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)1. xgboost基础知识2. xgboost(Rstudio)——代码实操2. 1 数据…...

C#开发常见面试题三(浅复制和深复制的区别)
C#开发常见面试题三(浅复制和深复制的区别) 一.浅复制和深复制定义 (1)浅复制:复制一个对象的时候,仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。(新对象和原对象将共享所有引用类型成员的实…...

Linux/C 高级——Linux命令
从这里开始,我们展开对Linux/c 高级的学习,首先介绍的是在Linux/c高级中,Linux的部分 目录 1.Linux简介 1.1Linux起源 1.2查看系统版本命令 1.3分层结构 1.4系统关机重启命令 2.Linux安装工具 2.1软件包安装 2.1.1软件包的管理机制 …...
怎么在 tailwindcss 项目中自定义一些可复用的样式
在 Tailwind CSS 项目中自定义可复用的样式有几种常用方法: 使用 apply 指令 你可以在 CSS 文件中使用 apply 指令来创建可复用的样式类: layer components {.btn-primary {apply py-2 px-4 bg-blue-500 text-white font-semibold rounded-lg shadow-md hover:bg-blue-700 f…...
在vue3中 引入echarts
安装:npm install echarts --save 方式一:直接在组件中引用 <template><divref"myChart"id"myChart":style"{ width: 800px, height: 400px }"></div></template><script>import * as echa…...

栈和队列(数据结构)
1. 栈(Stack) 1.1 概念 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO ( Last In First Out )的原…...

如何实现ElementUI表单项label的文字提示?
在Vue和ElementUI的丰富组件库中,定制化表单是常见的需求之一。那么如何在表单项label后添加文字提示,以提升用户体验呢? 首先我们来看一下效果图: 这里我们鼠标移动到❓图标上就会出现提示 在 ElementUI 中,el-form-item 组件允许使用 slot 自定义 label。通过在 el-fo…...
c++中的标准库
前言 hello,我是文宇。 正文 C标准库是C编程语言的基本组成部分之一,它为开发人员提供了一套丰富和强大的工具和功能,以便快速开发高效、可靠和可移植的应用程序。C标准库由两个主要部分组成:STL(Standard Template…...

洛谷 B2145 digit 函数 B2146 Hermite 多项式 题解
题目目录: No.1 B2145 digit 函数 No.2 B2146 Hermite 多项式 OK,开始正文! 第一题:B2145 digit 函数 题目描述 在程序中定义一函数 digit(n,k),它能分离出整数 n 从右边数第 k 个数字。 输入格式 正整数 n …...
tailwindcss @apply 和 @layer 有什么区别
在 Tailwind CSS 中,apply 和 layer 是两个不同的指令,它们各自有不同的用途和功能。以下是它们的区别和使用方法: apply 指令 apply 指令用于将一组现有的 Tailwind CSS 工具类应用到一个自定义的 CSS 类中。这对于简化和复用复杂的样式非…...
React 中的 useMemo 和 useCallback
1. useMemo语法 const memoizedValue useMemo(() > computeExpensiveValue(a, b), deps); 1. 传入一个函数进去,会返回一个 memoized 值,需要注意的是,函数内必须有返回值; 2. 第二个参数会依赖值,当依赖值更新…...

idea社区版lombok总是突然失效:log未知的变量
用maven打包运行就没问题,就是idea的原因 有这么个参数 -Djps.track.ap.dependenciesfalse 是用来配置 IntelliJ IDEA 的 JVM 参数,它控制着 IntelliJ IDEA 是否跟踪处理器相关的依赖关系。具体来说,-Djps.track.ap.dependenciesfalse 参数的…...

Java语言程序设计基础篇_编程练习题*16.13(比较不同利率的贷款)
目录 题目:*16.13(比较不同利率的贷款) 习题思路 代码示例 结果展示 题目:*16.13(比较不同利率的贷款) 改写编程练习题5.21,创建一个图形用户界面,如图16-41b所示。程序应该允许…...

正点原子imx6ull-mini-Linux驱动之Regmap API 实验
我们在前面学习 I2C 和 SPI 驱动的时候,针对 I2C 和 SPI 设备寄存器的操作都是通过相关 的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质 上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C…...
postgresql 双重排序后 重复项 标识次序
postgresql 双重排序后 重复项 标识次序 在PostgreSQL中,如果你想要在双重排序后标识重复项的次序,可以使用窗口函数(window functions)。一个常见的方法是使用ROW_NUMBER()窗口函数,它会为每个分组内的行分配一个唯一…...

线程池ThreadPoolExecutor使用
文章目录 一、基础-Java中线程创建的方式1.1、继承Thread类创建线程1.2、实现Runnable接口创建线程1.3、实现Calable接口创建线程1.4、使用线程池创建线程二、概念-线程池基本概念2.1、并发和井行的主要区别2.1.1、处理任务不同2.1.2、存在不同2.1.3、CPU资源不同2.2、什么是线…...

Codeforces Round 963 (Div. 2)
A题:Question Marks 题目: Tim正在做一个由 4n 个问题组成的测试,每个问题都有 4 个选项:“A”、“B”、“C”和“D”。对于每个选项,有 n 个正确答案对应于该选项,这意味着有 n 个问题的答案为“A”。 n…...
Mysql函数学习笔记
MySQL 字符串函数 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码。 //返回 CustomerName 字段第一个字母的 ASCII 码 SELECT ASCII(CustomerName) AS NumCodeOfFirstChar FROM Customers;CHAR_LENGTH(s)-返回字符串 s 的字符数 //返回字符串 RUNOOB 的字符数 SELECT CHAR…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...