PaddleOCR項目實戰(1):Python腳本中使?PaddleOCR

1 項目介紹

項目架構如下:

  • APP/WEB/?程序為OCR識別接?調?端,調?OCR接?,實現OCR功能。本項?我們只實現Android APP開發。
  • Nginx反向代理和負載均衡功能,通過Nginx實現對外?暴露接?,對內負載均衡SpringBoot實現的OCR服務。
  • OCR服務通過Springboot實現,主要功能是提供具體的OCR接?實現,其流程是調?內部PaddleOCR服務,解析和處理返回結果,最終返回結果給接?調?者。為了穩定性和安全性,添加了熔斷限流、Token認證功能。為了?便部署,會以Docker形式部署該服務。
  • PaddleOCR是OCR識別的具體實現,會提供?個OCR識別接?,供內部調?。由于不同的部署?式(普通部署和paddleocr serving?式部署),PaddleOCR在普通部署?式下,?法利?CPU多核(Servering?式不存在該問題),因此會在同?個服務器部署多個實例,解決CPU利?率差以提升性能。為了?便PaddleOCR部署,會以Docker形式部署。后邊會講解普通?式部署和Servering?式部署,如何構建docker鏡像及部署流程。

2 python開發PaddleOCR內部接口

2.1 安裝 Flask

pip install flask==3.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 編寫簡單Flask接口進行測試

新建python文件,編寫接口如下:

@app.route("/learn/hello")
def hello_world():return "Hello,World!"

結果如下:

接口代碼如下:

@app.route("/learn/path/<string:name>")
def learn_path(name):return name

結果如下:

接口代碼如下:

@app.route("/learn/m-get", methods=["GET"])
def learn_get_method():age = request.args.get("age")name = request.args.get("name")logging.info("learn m-get age 是:%s, name是:%s", age, name)return "SUCCESS", 200

結果如下:

接口代碼如下:

# 通過POST方式獲取參數,參數時jsOn符中
@app.route("/learn/m-post", methods=["POST"])
def learn_post_method():data = request.datalogging.info("learn post-m data :%s", data)data = json.loads(data)age = data["age"]name = data["name"]logging.info("learn post-m age:%s name:%s", age, name)return jsonify(data), 200

結果如下:

上面都成功說明Flask沒問題。

完整代碼如下:

import json
import logging
from flask import Flask, request, jsonifydef init_log():# 設置打印到控制臺的格式和等級logging.basicConfig(format='%(asctime)s %(filename)s %(levelname)s %(message)s', datefmt='%a %d %b %Y %H:%M:%S',level=logging.INFO)# 設置輸出到的文件和編碼file_handler = logging.FileHandler("ocr.log", encoding="utf-8")# 設置輸出等級file_handler.setLevel(logging.INFO)# 設置輸出到文件的日志格式file_handler.setFormatter(logging.Formatter('%(asctime)s %(filename)s %(levelname)s %(message)s'))logger = logging.getLogger()logger.handlers.append(file_handler)init_log()# name是python中的特殊變量,如果文件作為主程序執行(例如直接技行),那么..name.的值就是_main_-,如果是被其它模塊引入,那么__name-就是模塊名稱
app = Flask(__name__)@app.route("/learn/hello")
def hello_world():return "Hello,World!"@app.route("/learn/path/<string:name>")
def learn_path(name):return name@app.route("/learn/m-get", methods=["GET"])
def learn_get_method():age = request.args.get("age")name = request.args.get("name")logging.info("learn m-get age 是:%s, name是:%s", age, name)return "SUCCESS", 200# 通過POST方式獲取參數,參數時jsOn符中
@app.route("/learn/m-post", methods=["POST"])
def learn_post_method():data = request.datalogging.info("learn post-m data :%s", data)data = json.loads(data)age = data["age"]name = data["name"]logging.info("learn post-m age:%s name:%s", age, name)return jsonify(data), 200if __name__ == '__main__':# 接收所有的IP請求,debug=True表示代列修改web容器公業啟app.run(host='0.0.0.0', debug=True, port=8888)

2.3 Flask集成PaddleOCR

檢測+?向分類器+識別全流程,只需要下?三?代碼

#導?依賴
from paddleocr import PaddleOCR
#創建PaddleOCR對象,只需要在初始化時執??次該語句
ocr = PaddleOCR(use_angle_cls=True, det=False, use_gpu=False)
#識別圖?返回結果,cls=True 表示識別旋轉180度的?字,如果沒有?字旋轉180度,那么
#可以cls=False,這樣會提升性能,旋轉90度和270度也能夠識別
result = ocr.ocr(imgPath, cls=True)

完整的PaddleOCR內部接口開發如下:

下?這段python代碼主要是實現:通過flask創建web容器,并通過/ocr 接?調? paddleocr進?圖?識別,并通過json格式返回識別結果。

import json
import logging
from flask import Flask, request, jsonify
from paddleocr import PaddleOCRdef init_log():# 設置打印到控制臺的格式和等級logging.basicConfig(format='%(asctime)s %(filename)s %(levelname)s %(message)s', datefmt='%a %d %b %Y %H:%M:%S',level=logging.INFO)# 設置輸出到的文件和編碼file_handler = logging.FileHandler("ocr.log", encoding="utf-8")# 設置輸出等級file_handler.setLevel(logging.INFO)# 設置輸出到文件的日志格式file_handler.setFormatter(logging.Formatter('%(asctime)s %(filename)s %(levelname)s %(message)s'))logger = logging.getLogger()logger.handlers.append(file_handler)init_log()# name 是python中的特殊變量,如果文件作為主程序執行(例如直接執行),那么__name__的值就是__main__,如果是被其它模塊引入,那么__name__就是模塊名稱
app = Flask(__name__)# 創建一個PaddleOCR對象,使用方向識別器,不使用gpu進行技術,通過cpu進行計算。PaddleOCR我們只需要初始化一次,會將模型加載到內存,會將相關模型下載如果是第一次使用
ocr = PaddleOCR(usr_angle_cls=True, use_gpu=False)# 通過POST方法識別圖片,傳入參數為圖片的路徑
@app.route("/ocr", methods=["POST"])
def learn_post_method():try:data = json.loads(request.data)img_path = data["imgPath"]logging.info("ocr imgPath : %s", img_path)ocr_result = ocr.ocr(img_path)return jsonify({"code": 0, "msg": "ok", "data": ocr_result}), 200except Exception as e:logging.error("ocr error: %s", str(e))ocr_result = {"code": -1, "msg": str(e)}return jsonify(ocr_result), 200if __name__ == '__main__':# 可以返回中文字符app.config['JSON_AS_ASCII'] = False# 接收所有的IP請求,debug=True表示代碼修改web容器會重啟app.run(host='0.0.0.0', debug=True, port=8888)
  • import 表示導?整個module(模塊),?個.py?件就是?個module
  • from A import B 表示導?A模塊中的B(可以為?法、類)
  • flask是python實現的web框架,類似Tomcat

  1. 如果是json格式的請求數據,則是采?request.data來獲取請求體的字符串。
  2. 如果是form表單的請求體,那么則可以使?request.form來獲取參數。
  3. 如果是url參數,例如:url?param1=xx?m2=xx,那么則可以使?request.args來獲取參數。
  4. 如果需要區分GET\POST請求?法,則可以使?request.method來進?判斷區分
  5. 參考:https://cloud.tencent.com/developer/article/1539199,解釋的很清楚
  6. @app.route 聲明?個接?,指定請求?法和U請求路徑
  • 作為 Python 的內置變量,__name__它是每個 Python 模塊必備的屬性,但它的值取決于你是如何執?這段代碼。通過__name__變量,可以判斷出這時代碼是被直接運?,還是被導?到其他程序中去了。當直接執??段腳本的時候,這段腳本的 __name__變量等于 '__main__',當這段腳本被導?其他程序的時候,__name__ 變量等于腳本本身的名字。

接口測試,如下:

結果如下:

{"code": 0,"data": [[[[[1.0,12.0],[222.0,12.0],[222.0,35.0],[1.0,35.0]],["2.安裝tesseract-ocr",0.9961034059524536]],[[[4.0,55.0],[384.0,54.0],[384.0,72.0],[4.0,73.0]],["OCR(OpticalCharacterRecognition,光學字符識別)軟件",0.9673566222190857]],[[[1.0,88.0],[382.0,87.0],[382.0,103.0],[1.0,104.0]],["安裝包含兩個部分:ORC引擎本身以及對應語言的訓練數據",0.9957185387611389]],[[[0.0,155.0],[389.0,153.0],[389.0,172.0],[0.0,174.0]],["githubttt址:https://github.com/tesseract-ocr/tesseract",0.9804431200027466]],[[[0.0,186.0],[576.0,187.0],[576.0,207.0],[0.0,206.0]],["You can either Install Tesseract via pre-built binary package or build it from source.",0.9568857550621033]],[[[1.0,221.0],[86.0,224.0],[85.0,241.0],[1.0,239.0]],["windows:",0.9869498014450073]],[[[1.0,256.0],[915.0,258.0],[915.0,278.0],[1.0,276.0]],["The latest installer can be downloaded here: tesseract-ocr-setup-3.05.01.exe and tesseract-ocr-setup-4.00.00dev.exe (experimental).",0.9753488898277283]]]],"msg": "ok"
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84071.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84071.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84071.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Reranker + BM25 + FAISS 構建高效的多階段知識庫檢索系統一

一、什么是知識庫檢索&#xff1f; 在構建基于大語言模型的問答系統&#xff08;如 RAG&#xff09;中&#xff0c;知識庫檢索&#xff08;Retrieval&#xff09; 是第一步&#xff0c;也是影響最終回答質量的關鍵環節。它負責從大規模文檔中快速定位與用戶問題最相關的 top-k…

Walle-Web:打造輕量級高效的DevOps自動化部署平臺

在當今快速迭代的開發環境中,高效的代碼部署工具已成為團隊不可或缺的基礎設施。Walle-Web作為一款免費開源的DevOps平臺,專注解決"部署難、管理亂"的痛點問題,為開發團隊提供了簡潔而強大的自動化部署解決方案。 1. 什么是Walle-Web? Walle-Web是一款專注于代碼…

力扣LeetBook數組和字符串--二維數組

1.旋轉矩陣 題目鏈接 想了那么久的各種旋轉&#xff0c;對角線&#xff0c;其實把問題搞復雜了。 旋轉90度的本質無非就是轉置鏡像對稱 轉置是什么&#xff1f;&#xff1a;將矩陣的行和列互換。 鏡像對稱&#xff1a;把矩陣從中間對折&#xff0c;互換位置 矩陣 A A [ 1 3 0…

圖論水題2

div2 361 D. Tree Requests 題意 對于一顆 n n n節點的樹&#xff0c;每個節點有一個字母&#xff0c;有 m m m次詢問&#xff0c;每次詢問求對于頂點 v v v的子樹中深度為 h h h的結點能否組成一個回文串$ (1 \leq n \leq m \leq 5 \cdot 10^5) $ 思路 關于 v v v的子樹結…

Redis 過期了解

Redis 版本&#xff1a;5.0 &#xff1a; 一&#xff1a;過期監聽&#xff1a; Spring Data Redis 封裝了 Redis 的 Pub/Sub 功能&#xff0c;提供了對 key 過期事件的監聽支持。 1. 核心類&#xff1a;KeyExpirationEventMessageListener 這個抽象類是 Spring 提供的&#x…

OA工程自動化辦公系統 – 免費Java源碼

概述 功能完備的OA工程自動化辦公系統Java源碼&#xff0c;采用主流技術棧開發&#xff0c;無論是學習SpringBoot框架還是開發企業級應用&#xff0c;都是不可多得的優質資源。 主要內容 技術架構 ??后端技術棧??&#xff1a; 核心框架&#xff1a;SpringBoot 2.xORM框…

嵌入式SDK技術EasyRTC音視頻實時通話助力即時通信社交/教育等多場景創新應用

一、引言? 在數字化時代&#xff0c;即時通信已成為人們生活和工作中不可或缺的部分。音視頻功能作為即時通信的核心&#xff0c;能實現更加直觀、高效的信息傳遞。EasyRTC作為一款強大的實時通信框架&#xff0c;具備諸多優勢&#xff0c;為即時通信的音視頻應用提供了優質解…

BEV和OCC學習-5:數據預處理流程

參考&#xff1a;自定義數據預處理流程 — MMDetection3D 1.4.0 文檔 數據預處理流程的設計 預處理流程中的各項操作主要分為數據加載、預處理、格式化、測試時的數據增強。 接下來將展示一個用于 PointPillars 模型的數據集預處理流程的例子。 train_pipeline [dict(type…

OGG 23ai for DAA 部署與補丁升級

創建ogg 用戶 /usr/sbin/groupadd -g 1002 dba /usr/sbin/groupadd -g 1001 oinstall /usr/sbin/groupadd -g 1003 oper useradd -u 1001 -g oinstall -G dba,oper oracle echo "oracle" |passwd oracle --stdin創建ogg安裝目錄 mkdir -p /u01/app/ogg/soft mkdir …

【LangchainAgent】Agent基本構建與使用

目錄 一、功能簡述 代碼功能概括 &#x1f3af; 核心能力 二、運作流程 三、核心代碼 四、運行結果 五、代碼功能拆解 ? 1. 環境準備與依賴導入 ? 2. 加載網頁文檔并處理為向量 ? 3. 創建檢索工具與搜索工具 ? 4. 初始化語言模型與 Agent ? 5. 封裝支持多輪記…

【云安全】以Aliyun為例聊云廠商服務常見利用手段

目錄 OSS-bucket_policy_readable OSS-object_public_access OSS-bucket_object_traversal OSS-Special Bucket Policy OSS-unrestricted_file_upload OSS-object_acl_writable ECS-SSRF 云攻防場景下對云廠商服務的利用大同小異&#xff0c;下面以阿里云為例 其他如騰…

完成一個可交互的k8s管理平臺的頁面開發

使用deepseek完成設計一個k8s管理平臺&#xff0c;關鍵詞如下&#xff1a; 完成一個可交互的k8s管理平臺的頁面開發Kubernetes 管理平臺頁面設計 下面是一個基于現代Web技術的可交互Kubernetes管理平臺的頁面設計方案&#xff0c;使用React作為前端框架&#xff0c;配合Ant De…

TDengine 支持的平臺匯總

TDengine 服務端支持的平臺列表 注&#xff1a;1) ● 表示經過官方測試驗證&#xff0c; ○ 表示非官方測試驗證&#xff0c;E 表示僅企業版支持。 2) 社區版僅支持主流操作系統的較新版本&#xff0c;包括 Ubuntu 18/CentOS 7/CentOS Stream/RedHat/Debian/CoreOS/FreeBSD/Op…

使用 HTML + JavaScript 實現文章逐句高亮朗讀功能

在這個信息爆炸的時代&#xff0c;我們每天都要面對大量的文字閱讀。無論是學習、工作還是個人成長&#xff0c;閱讀都扮演著至關重要的角色。然而&#xff0c;在快節奏的生活中&#xff0c;我們往往難以找到足夠的安靜時間專注于閱讀。本文用 HTML JavaScript 實現了一個基于…

理解非結構化文檔:將 Reducto 解析與 Elasticsearch 結合使用

作者&#xff1a;來自 Elastic Adel Wu 演示如何將 Reducto 的文檔處理與 Elasticsearch 集成以實現語義搜索。 Elasticsearch 與業界領先的生成式 AI 工具和提供商有原生集成。歡迎觀看我們的網絡研討會&#xff0c;了解如何超越 RAG 基礎&#xff0c;或使用 Elastic 向量數據…

從Copilot到Agent,AI Coding是如何進化的?

編程原本是一項具有一定門檻的技能&#xff0c;但借助 AI Coding 產品&#xff0c;新手也能寫出可運行的代碼&#xff0c;非專業人員如業務分析師、產品經理&#xff0c;也能在 AI 幫助下直接生成簡單應用。 這一演變對軟件產業產生了深遠影響。當 AI 逐步參與代碼生成、調試乃…

UGUI Text/TextMeshPro字體組件

UGUI Text組件的不當使用及其性能瓶頸與優化 在Unity UGUI系統中&#xff0c;Text 組件&#xff08;或其升級版 TextMeshPro&#xff09;是顯示文本信息的核心元素。然而&#xff0c;如果不當使用&#xff0c;它極易成為UI性能瓶頸的罪魁禍首&#xff0c;尤其是在預制體、屬性…

淺談 React Hooks

React Hooks 是 React 16.8 引入的一組 API&#xff0c;用于在函數組件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通過簡潔的函數接口&#xff0c;解決了狀態與 UI 的高度解耦&#xff0c;通過函數式編程范式實現更靈活 Rea…

【個人筆記】數據庫原理(西電)

寫在前面&#xff1a;文中提到的頁面指向&#xff08;如“p45”&#xff09;&#xff0c;除特別說明&#xff0c;都是指對應ppt上的頁面&#xff0c;非同款ppt的友友可忽略 第一章 ER圖和關系分解見課本p69 ER圖是常用的 概念模型 方形&#xff1a;實體圓形&#xff1a;屬性…

SDC命令詳解:使用set_propagated_clock命令進行約束

相關閱讀 SDC命令詳解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目錄 指定端口列表/集合 簡單使用 注意事項 傳播時鐘是在進行了時鐘樹綜合后&#xff0c;使用set_propagated_clock命令可以將一個理想時鐘轉換為傳播時鐘&#x…